From 401b2d4abc60db4d5739dbdc54428ce16f61911c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 13 May 2016 10:12:28 +0200 Subject: [PATCH 001/290] package/ci: remove unused AppVeyor build matrix. --- package/ci/appveyor.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/package/ci/appveyor.yml b/package/ci/appveyor.yml index e8efe86fc..66ec95060 100644 --- a/package/ci/appveyor.yml +++ b/package/ci/appveyor.yml @@ -8,10 +8,6 @@ clone_depth: 1 os: Visual Studio 2015 -environment: - matrix: - - BUILD_STATIC: OFF - notifications: - provider: Webhook url: https://webhooks.gitter.im/e/415ae90928ba0dbd3df4 @@ -44,7 +40,7 @@ install: - cd corrade - mkdir build - cd build -- cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=C:/Sys -DBUILD_STATIC=%BUILD_STATIC% -G Ninja +- cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=C:/Sys -G Ninja - cmake --build . - cmake --build . --target install - cd .. @@ -53,7 +49,7 @@ install: build_script: - mkdir build - cd build -- cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=C:/Sys -DCMAKE_PREFIX_PATH="%APPVEYOR_BUILD_FOLDER%/SDL;%APPVEYOR_BUILD_FOLDER%/openal" -DWITH_AUDIO=ON -DWITH_SDL2APPLICATION=ON -DWITH_WINDOWLESSWGLAPPLICATION=ON -DWITH_WGLCONTEXT=ON -DWITH_MAGNUMFONT=ON -DWITH_MAGNUMFONTCONVERTER=ON -DWITH_OBJIMPORTER=ON -DWITH_TGAIMAGECONVERTER=ON -DWITH_TGAIMPORTER=ON -DWITH_WAVAUDIOIMPORTER=ON -DWITH_DISTANCEFIELDCONVERTER=ON -DWITH_FONTCONVERTER=ON -DWITH_MAGNUMINFO=ON -DBUILD_STATIC=%BUILD_STATIC% -DBUILD_TESTS=ON -DBUILD_GL_TESTS=ON -G Ninja +- cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=C:/Sys -DCMAKE_PREFIX_PATH="%APPVEYOR_BUILD_FOLDER%/SDL;%APPVEYOR_BUILD_FOLDER%/openal" -DWITH_AUDIO=ON -DWITH_SDL2APPLICATION=ON -DWITH_WINDOWLESSWGLAPPLICATION=ON -DWITH_WGLCONTEXT=ON -DWITH_MAGNUMFONT=ON -DWITH_MAGNUMFONTCONVERTER=ON -DWITH_OBJIMPORTER=ON -DWITH_TGAIMAGECONVERTER=ON -DWITH_TGAIMPORTER=ON -DWITH_WAVAUDIOIMPORTER=ON -DWITH_DISTANCEFIELDCONVERTER=ON -DWITH_FONTCONVERTER=ON -DWITH_MAGNUMINFO=ON -DBUILD_TESTS=ON -DBUILD_GL_TESTS=ON -G Ninja - cmake --build . - cmake --build . --target install - cmake . -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/Deploy -DBUILD_TESTS=OFF From 6af22cfbbec640a03ae1f601e8f9167db1e07b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 13 May 2016 10:15:50 +0200 Subject: [PATCH 002/290] package/ci: cache downloaded files on AppVeyor. Hopefully resolves the timeout errors. --- package/ci/appveyor.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/package/ci/appveyor.yml b/package/ci/appveyor.yml index 66ec95060..02fa8c73b 100644 --- a/package/ci/appveyor.yml +++ b/package/ci/appveyor.yml @@ -23,7 +23,7 @@ install: - cinst ninja # OpenAL -- appveyor DownloadFile http://kcat.strangesoft.net/openal-binaries/openal-soft-1.17.2-bin.zip +- IF NOT EXIST %APPVEYOR_BUILD_FOLDER%\openal-soft-1.17.2-bin.zip appveyor DownloadFile http://kcat.strangesoft.net/openal-binaries/openal-soft-1.17.2-bin.zip - 7z x openal-soft-1.17.2-bin.zip - ren openal-soft-1.17.2-bin openal - ren openal\bin\Win32\soft_oal.dll OpenAL32.dll @@ -31,7 +31,7 @@ install: - echo drivers=null >> %APPDATA%/alsoft.ini # SDL2 -- appveyor DownloadFile http://www.libsdl.org/release/SDL2-devel-2.0.3-VC.zip +- IF NOT EXIST %APPVEYOR_BUILD_FOLDER%\SDL2-devel-2.0.3-VC.zip appveyor DownloadFile http://www.libsdl.org/release/SDL2-devel-2.0.3-VC.zip - 7z x SDL2-devel-2.0.3-VC.zip - ren SDL2-2.0.3 SDL @@ -46,6 +46,10 @@ install: - cd .. - cd .. +cache: +- SDL2-devel-2.0.3-VC.zip +- openal-soft-1.17.2-bin.zip + build_script: - mkdir build - cd build From 471b7a58f63cd74cf1a09441b28bcd2712f4d916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 13 May 2016 10:37:24 +0200 Subject: [PATCH 003/290] Math: fix narrowing conversion in ColorTest. MSVC complained. --- src/Magnum/Math/Test/ColorTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Math/Test/ColorTest.cpp b/src/Magnum/Math/Test/ColorTest.cpp index 8140b757a..dde5d53fc 100644 --- a/src/Magnum/Math/Test/ColorTest.cpp +++ b/src/Magnum/Math/Test/ColorTest.cpp @@ -233,8 +233,8 @@ void ColorTest::literals() { CORRADE_COMPARE(b, (Color4ub{0x33, 0xb2, 0x7f, 0xcc})); /* Not constexpr yet */ - CORRADE_COMPARE(0x33b27f_rgbf, (Color3{0.2, 0.698039f, 0.498039f})); - CORRADE_COMPARE(0x33b27fcc_rgbaf, (Color4{0.2, 0.698039f, 0.498039f, 0.8f})); + CORRADE_COMPARE(0x33b27f_rgbf, (Color3{0.2f, 0.698039f, 0.498039f})); + CORRADE_COMPARE(0x33b27fcc_rgbaf, (Color4{0.2f, 0.698039f, 0.498039f, 0.8f})); } void ColorTest::colors() { From 67bd8a9b99387fde13bddd8c09eae7942a0c3553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 13 May 2016 18:36:58 +0200 Subject: [PATCH 004/290] modules: don't expose internal variables of FindSDL2.cmake in cache. --- modules/FindSDL2.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/FindSDL2.cmake b/modules/FindSDL2.cmake index 172965181..20fc72037 100644 --- a/modules/FindSDL2.cmake +++ b/modules/FindSDL2.cmake @@ -80,6 +80,7 @@ if(CORRADE_TARGET_IOS) set(_SDL2_FRAMEWORK_LIBRARIES ) foreach(framework ${_SDL2_FRAMEWORKS}) find_library(_SDL2_${framework}_LIBRARY ${framework}) + mark_as_advanced(_SDL2_${framework}_LIBRARY) list(APPEND _SDL2_FRAMEWORK_LIBRARIES ${_SDL2_${framework}_LIBRARY}) list(APPEND _SDL2_FRAMEWORK_LIBRARY_NAMES _SDL2_${framework}_LIBRARY) endforeach() From 6da8da79a861a98ff7ad49da2d4069b3b1c1a158 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 18 May 2016 12:51:03 +0200 Subject: [PATCH 005/290] Platform: properly prefix private member variables. --- src/Magnum/Platform/Sdl2Application.cpp | 8 ++++---- src/Magnum/Platform/Sdl2Application.h | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index aeb6b981c..60486cbf2 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -500,14 +500,14 @@ Sdl2Application::Configuration::Configuration(): Sdl2Application::Configuration::~Configuration() = default; Sdl2Application::InputEvent::Modifiers Sdl2Application::MouseEvent::modifiers() { - if(modifiersLoaded) return _modifiers; - modifiersLoaded = true; + if(_modifiersLoaded) return _modifiers; + _modifiersLoaded = true; return _modifiers = fixedModifiers(Uint16(SDL_GetModState())); } Sdl2Application::InputEvent::Modifiers Sdl2Application::MouseMoveEvent::modifiers() { - if(modifiersLoaded) return _modifiers; - modifiersLoaded = true; + if(_modifiersLoaded) return _modifiers; + _modifiersLoaded = true; return _modifiers = fixedModifiers(Uint16(SDL_GetModState())); } diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index 7c3c34277..7878376d6 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -1143,11 +1143,11 @@ class Sdl2Application::MouseEvent: public Sdl2Application::InputEvent { Modifiers modifiers(); private: - constexpr MouseEvent(Button button, const Vector2i& position): _button(button), _position(position), modifiersLoaded(false) {} + constexpr MouseEvent(Button button, const Vector2i& position): _button{button}, _position{position}, _modifiersLoaded{false} {} const Button _button; const Vector2i _position; - bool modifiersLoaded; + bool _modifiersLoaded; Modifiers _modifiers; }; @@ -1201,11 +1201,11 @@ class Sdl2Application::MouseMoveEvent: public Sdl2Application::InputEvent { Modifiers modifiers(); private: - constexpr MouseMoveEvent(const Vector2i& position, const Vector2i& relativePosition, Buttons buttons): _position(position), _relativePosition(relativePosition), modifiersLoaded(false), _buttons(buttons) {} + constexpr MouseMoveEvent(const Vector2i& position, const Vector2i& relativePosition, Buttons buttons): _position{position}, _relativePosition{relativePosition}, _buttons{buttons}, _modifiersLoaded{false} {} const Vector2i _position, _relativePosition; - bool modifiersLoaded; - Buttons _buttons; + const Buttons _buttons; + bool _modifiersLoaded; Modifiers _modifiers; }; From e36b5e351778c7ec2d8968a176175f6d1dd3c3e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 18 May 2016 13:02:44 +0200 Subject: [PATCH 006/290] Platform: added Sdl2Application::MouseEvent::clickCount(). --- src/Magnum/Platform/Sdl2Application.cpp | 4 ++-- src/Magnum/Platform/Sdl2Application.h | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index 60486cbf2..573a19b49 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -374,13 +374,13 @@ void Sdl2Application::mainLoop() { case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { - MouseEvent e(static_cast(event.button.button), {event.button.x, event.button.y}); + MouseEvent e(static_cast(event.button.button), {event.button.x, event.button.y}, event.button.clicks); event.type == SDL_MOUSEBUTTONDOWN ? mousePressEvent(e) : mouseReleaseEvent(e); } break; case SDL_MOUSEWHEEL: if(event.wheel.y != 0) { - MouseEvent e(event.wheel.y > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {event.wheel.x, event.wheel.y}); + MouseEvent e(event.wheel.y > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {event.wheel.x, event.wheel.y}, 0); mousePressEvent(e); } break; diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index 7878376d6..3af264851 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -1135,6 +1135,13 @@ class Sdl2Application::MouseEvent: public Sdl2Application::InputEvent { /** @brief Position */ constexpr Vector2i position() const { return _position; } + /** + * @brief Click count + * + * Ignored for wheel events. + */ + constexpr Int clickCount() const { return _clickCount; } + /** * @brief Modifiers * @@ -1143,10 +1150,11 @@ class Sdl2Application::MouseEvent: public Sdl2Application::InputEvent { Modifiers modifiers(); private: - constexpr MouseEvent(Button button, const Vector2i& position): _button{button}, _position{position}, _modifiersLoaded{false} {} + constexpr MouseEvent(Button button, const Vector2i& position, Int clickCount): _button{button}, _position{position}, _clickCount{clickCount}, _modifiersLoaded{false} {} const Button _button; const Vector2i _position; + const Int _clickCount; bool _modifiersLoaded; Modifiers _modifiers; }; From a22f9555824ad4ba70aae5eb828865f02c18e2f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 18 May 2016 13:03:48 +0200 Subject: [PATCH 007/290] Platform: SDL2 text editing *is* available in Emscripten. --- src/Magnum/Platform/Sdl2Application.cpp | 3 --- src/Magnum/Platform/Sdl2Application.h | 11 ----------- 2 files changed, 14 deletions(-) diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index 573a19b49..b68cf3433 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -476,11 +476,8 @@ void Sdl2Application::keyReleaseEvent(KeyEvent&) {} void Sdl2Application::mousePressEvent(MouseEvent&) {} void Sdl2Application::mouseReleaseEvent(MouseEvent&) {} void Sdl2Application::mouseMoveEvent(MouseMoveEvent&) {} - -#ifndef CORRADE_TARGET_EMSCRIPTEN void Sdl2Application::textInputEvent(TextInputEvent&) {} void Sdl2Application::textEditingEvent(TextEditingEvent&) {} -#endif Sdl2Application::Configuration::Configuration(): #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_IOS) diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index 3af264851..7c3aa831b 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -331,10 +331,8 @@ class Sdl2Application { class KeyEvent; class MouseEvent; class MouseMoveEvent; - #ifndef CORRADE_TARGET_EMSCRIPTEN class TextInputEvent; class TextEditingEvent; - #endif /** * @brief Default constructor @@ -585,7 +583,6 @@ class Sdl2Application { /*@}*/ - #ifndef CORRADE_TARGET_EMSCRIPTEN /** @{ @name Text input handling */ public: /** @@ -593,7 +590,6 @@ class Sdl2Application { * * If text input is active, text input events go to @ref textInputEvent() * and @ref textEditingEvent(). - * @note Not available in @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten". * @see @ref startTextInput(), @ref stopTextInput() */ bool isTextInputActive() { return SDL_IsTextInputActive(); } @@ -603,7 +599,6 @@ class Sdl2Application { * * Starts text input that will go to @ref textInputEvent() and * @ref textEditingEvent(). - * @note Not available in @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten". * @see @ref stopTextInput(), @ref isTextInputActive(), * @ref setTextInputRect() */ @@ -612,7 +607,6 @@ class Sdl2Application { /** * @brief Stop text input * - * @note Not available in @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten". * @see @ref startTextInput(), @ref isTextInputActive(), @ref textInputEvent() * @ref textEditingEvent() */ @@ -647,7 +641,6 @@ class Sdl2Application { virtual void textEditingEvent(TextEditingEvent& event); /*@}*/ - #endif private: enum class Flag: UnsignedByte { @@ -1217,11 +1210,9 @@ class Sdl2Application::MouseMoveEvent: public Sdl2Application::InputEvent { Modifiers _modifiers; }; -#ifndef CORRADE_TARGET_EMSCRIPTEN /** @brief Text input event -@note Not available in @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten". @see @ref TextEditingEvent, @ref textInputEvent() */ class Sdl2Application::TextInputEvent { @@ -1266,7 +1257,6 @@ class Sdl2Application::TextInputEvent { /** @brief Text editing event -@note Not available in @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten". @see @ref textEditingEvent() */ class Sdl2Application::TextEditingEvent { @@ -1314,7 +1304,6 @@ class Sdl2Application::TextEditingEvent { Int _start, _length; bool _accepted; }; -#endif /** @hideinitializer @brief Entry point for SDL2-based applications From 1fc6be2a64797935d8810c64995f9ec111974df9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 18 May 2016 13:04:23 +0200 Subject: [PATCH 008/290] Platform: added Sdl2Application::multiGestureEvent(). --- src/Magnum/Platform/Sdl2Application.cpp | 7 +++ src/Magnum/Platform/Sdl2Application.h | 83 +++++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index b68cf3433..3de708987 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -390,6 +390,12 @@ void Sdl2Application::mainLoop() { break; } + case SDL_MULTIGESTURE: { + MultiGestureEvent e({event.mgesture.x, event.mgesture.y}, event.mgesture.dTheta, event.mgesture.dDist, event.mgesture.numFingers); + multiGestureEvent(e); + break; + } + #ifndef CORRADE_TARGET_EMSCRIPTEN case SDL_TEXTINPUT: { TextInputEvent e{{event.text.text, std::strlen(event.text.text)}}; @@ -476,6 +482,7 @@ void Sdl2Application::keyReleaseEvent(KeyEvent&) {} void Sdl2Application::mousePressEvent(MouseEvent&) {} void Sdl2Application::mouseReleaseEvent(MouseEvent&) {} void Sdl2Application::mouseMoveEvent(MouseMoveEvent&) {} +void Sdl2Application::multiGestureEvent(MultiGestureEvent&) {} void Sdl2Application::textInputEvent(TextInputEvent&) {} void Sdl2Application::textEditingEvent(TextEditingEvent&) {} diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index 7c3aa831b..110a62436 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -331,6 +331,7 @@ class Sdl2Application { class KeyEvent; class MouseEvent; class MouseMoveEvent; + class MultiGestureEvent; class TextInputEvent; class TextEditingEvent; @@ -583,6 +584,19 @@ class Sdl2Application { /*@}*/ + /** @{ @name Touch gesture handling */ + + /** + * @brief Multi gesture event + * + * Called when the user performs a gesture using multiple fingers. + * Default implementation does nothing. + * @experimental + */ + virtual void multiGestureEvent(MultiGestureEvent& event); + + /*@}*/ + /** @{ @name Text input handling */ public: /** @@ -1210,6 +1224,75 @@ class Sdl2Application::MouseMoveEvent: public Sdl2Application::InputEvent { Modifiers _modifiers; }; +/** +@brief Multi gesture event + +@experimental +@see @ref multiGestureEvent() +*/ +class Sdl2Application::MultiGestureEvent { + friend Sdl2Application; + + public: + /** @brief Copying is not allowed */ + MultiGestureEvent(const MultiGestureEvent&) = delete; + + /** @brief Moving is not allowed */ + MultiGestureEvent(MultiGestureEvent&&) = delete; + + /** @brief Copying is not allowed */ + MultiGestureEvent& operator=(const MultiGestureEvent&) = delete; + + /** @brief Moving is not allowed */ + MultiGestureEvent& operator=(MultiGestureEvent&&) = delete; + + /** @brief Whether the event is accepted */ + constexpr bool isAccepted() const { return _accepted; } + + /** + * @brief Set event as accepted + * + * If the event is ignored (i.e., not set as accepted), it might be + * propagated elsewhere, for example to another screen when using + * @ref BasicScreenedApplication "ScreenedApplication". By default is + * each event ignored and thus propagated. + */ + void setAccepted(bool accepted = true) { _accepted = accepted; } + + /** @brief Gesture center */ + Vector2 center() const { return _center; } + + /** + * @brief Relative rotation + * + * Rotation relative to previous event. + */ + Float relativeRotation() const { return _relativeRotation; } + + /** + * @brief Relative distance + * + * Distance of the fingers relative to previous event. + */ + Float relativeDistance() const { return _relativeDistance; } + + /** + * @brief Finger count + * + * Count of fingers performing the gesture. + */ + Int fingerCount() const { return _fingerCount; } + + private: + constexpr MultiGestureEvent(const Vector2& center, Float relativeRotation, Float relativeDistance, Int fingerCount): _center{center}, _relativeRotation{relativeRotation}, _relativeDistance{relativeDistance}, _fingerCount{fingerCount}, _accepted{false} {} + + Vector2 _center; + Float _relativeRotation, + _relativeDistance; + Int _fingerCount; + bool _accepted; +}; + /** @brief Text input event From 9a7908523d1c7b7b731bda2663012e0409b5133b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 18 May 2016 13:05:17 +0200 Subject: [PATCH 009/290] Use hex color literal for describing clear color value. --- src/Magnum/Renderer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Renderer.cpp b/src/Magnum/Renderer.cpp index fba5e0ec1..ef9338896 100644 --- a/src/Magnum/Renderer.cpp +++ b/src/Magnum/Renderer.cpp @@ -208,7 +208,8 @@ Renderer::GraphicsResetStatus Renderer::graphicsResetStatus() { void Renderer::initializeContextBasedFunctionality() { /* Set some "corporate identity" */ - setClearColor(Color3(0.125f)); + using namespace Magnum::Math::Literals; + setClearColor(0x1f1f1f_rgbf); } #ifndef MAGNUM_TARGET_GLES From 53d80a77f94bf7f1e75135a268072805c99893a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 23 May 2016 11:31:00 +0200 Subject: [PATCH 010/290] doc: remove outdated info about module dir for toolchains. --- doc/building.dox | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/doc/building.dox b/doc/building.dox index fc853a21e..30cf47620 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -455,9 +455,7 @@ to find the compiler. NaCl currently supports only OpenGL ES 2, thus `TARGET_GLES` and `TARGET_GLES2` is always enabled. Then create build directories for x86-32 and x86-64 and run cmake and build -command in them. The toolchains need access to the platform file, so be sure to -properly set **absolute** path to `modules/` directory containing -`Platform/NaCl.cmake`. Also adapt `CMAKE_INSTALL_PREFIX` to the same value as +command in them. Be sure to adapt `CMAKE_INSTALL_PREFIX` to the same value as in `NACL_PREFIX` in toolchain file and specify path where Corrade is installed in `CMAKE_PREFIX_PATH`. @@ -501,10 +499,8 @@ to path where Emscripten is installed. Default is `/usr/lib/emscripten`. Emscripten supports dynamic libraries only to simplify porting and they are generally slower, thus `BUILD_STATIC` is implicitly enabled. -Then create build directory and run cmake and build command in it. The -toolchain needs access to its platform file, so be sure to properly set **absolute** -path to `modules/` directory containing `Platform/Emscripten.cmake`. Also set -`CMAKE_INSTALL_PREFIX` to path contained in `EMSCRIPTEN_TOOLCHAIN_PATH`. +Then create build directory and run cmake and build command in it. Be sure to +set `CMAKE_INSTALL_PREFIX` to path contained in `EMSCRIPTEN_TOOLCHAIN_PATH`. WebGL 1.0 (GLES 2.0 equivalent) is enabled by default, switch to 2.0 (GLES 3.0 equivalent) by disabling `TARGET_GLES2`. @@ -536,10 +532,8 @@ building your projects for Emscripten. You will need OSX and Xcode installed. Set `CMAKE_OSX_ROOT` to SDK you want to target and enable all desired -architectures in `CMAKE_OSX_ARCHITECTURES`. The toolchain needs access to its -platform file, so be sure to properly set **absolute** path to `modules/` -directory containing `Platform/iOS.cmake`. Set `CMAKE_INSTALL_PREFIX` to prefix -where you store other iOS dependencies such as Corrade or SDL2. +architectures in `CMAKE_OSX_ARCHITECTURES`. Be sure to set `CMAKE_INSTALL_PREFIX` +to prefix where you store other iOS dependencies such as Corrade or SDL2. As every application is in its own sandbox, it doesn't make sense to build shared libraries (although it is supported). Enable `BUILD_STATIC` to build @@ -575,11 +569,9 @@ where NDK is installed. Default is `/opt/android-ndk`. Adapt also `ANDROID_SYSROOT` to your preferred API level. You might also need to update `ANDROID_TOOLCHAIN_PREFIX` and `ANDROID_TOOLCHAIN_ROOT` to fit your system. -Then create build directory and run cmake and build command in it. The -toolchain needs access to its platform file, so be sure to properly set **absolute** -path to `modules/` directory containing `Platform/Android.cmake`. Also set -`CMAKE_INSTALL_PREFIX` to `/usr` subdirectory of `ANDROID_SYSROOT` and specify -path where Corrade is installed in `CMAKE_PREFIX_PATH`. +Then create build directory and run cmake and build command in it. Be sure to +set `CMAKE_INSTALL_PREFIX` to `/usr` subdirectory of `ANDROID_SYSROOT` and +specify path where Corrade is installed in `CMAKE_PREFIX_PATH`. Note that `BUILD_STATIC` is implicitly enabled, because manually loading all depending shared libraries using JNI would be too inconvenient. The engine is From 258ab1a92cd41bac8052f3207fd50b0efb724efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 26 May 2016 17:14:16 +0200 Subject: [PATCH 011/290] Disallow calling data() on rvalue Image and Trade::ImageData. That would cause accessing freed data. Use release() instead (and then you are on your own). The AbstractShaderProgram GL test now fails to compile. --- src/Magnum/Image.h | 18 ++++++++++++++++-- src/Magnum/Trade/ImageData.h | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/Magnum/Image.h b/src/Magnum/Image.h index f5af9a50b..50762aadf 100644 --- a/src/Magnum/Image.h +++ b/src/Magnum/Image.h @@ -144,10 +144,24 @@ template class Image { * * @see @ref release() */ - Containers::ArrayView data() { return _data; } + Containers::ArrayView data() + #ifndef CORRADE_GCC47_COMPATIBILITY + & + #endif + { return _data; } + #ifndef CORRADE_GCC47_COMPATIBILITY + Containers::ArrayView data() && = delete; /**< @overload */ + #endif /** @overload */ - Containers::ArrayView data() const { return _data; } + Containers::ArrayView data() const + #ifndef CORRADE_GCC47_COMPATIBILITY + & + #endif + { return _data; } + #ifndef CORRADE_GCC47_COMPATIBILITY + Containers::ArrayView data() const && = delete; /**< @overload */ + #endif /** @overload */ template T* data() { diff --git a/src/Magnum/Trade/ImageData.h b/src/Magnum/Trade/ImageData.h index 7ff2e5561..2c6492aa0 100644 --- a/src/Magnum/Trade/ImageData.h +++ b/src/Magnum/Trade/ImageData.h @@ -221,10 +221,24 @@ template class ImageData { * * @see @ref release() */ - Containers::ArrayView data() { return _data; } + Containers::ArrayView data() + #ifndef CORRADE_GCC47_COMPATIBILITY + & + #endif + { return _data; } + #ifndef CORRADE_GCC47_COMPATIBILITY + Containers::ArrayView data() && = delete; /**< @overload */ + #endif /** @overload */ - Containers::ArrayView data() const { return _data; } + Containers::ArrayView data() const + #ifndef CORRADE_GCC47_COMPATIBILITY + & + #endif + { return _data; } + #ifndef CORRADE_GCC47_COMPATIBILITY + Containers::ArrayView data() const && = delete; /**< @overload */ + #endif /** @overload */ template T* data() { From ad962415a211307f1292f2f02f8739dfa4ae4370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 26 May 2016 17:06:44 +0200 Subject: [PATCH 012/290] Oh, so it weren't NVidia drivers' fault after all. Just me trying to compare freed memory and, of course, failing. --- src/Magnum/Test/AbstractShaderProgramGLTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Test/AbstractShaderProgramGLTest.cpp b/src/Magnum/Test/AbstractShaderProgramGLTest.cpp index 5edeb0b12..d8f29e80c 100644 --- a/src/Magnum/Test/AbstractShaderProgramGLTest.cpp +++ b/src/Magnum/Test/AbstractShaderProgramGLTest.cpp @@ -711,7 +711,7 @@ void AbstractShaderProgramGLTest::compute() { /** @todo Test on ES */ #ifndef MAGNUM_TARGET_GLES - const auto data = out.image(0, {PixelFormat::RGBAInteger, PixelType::UnsignedByte}).data(); + const auto data = out.image(0, {PixelFormat::RGBAInteger, PixelType::UnsignedByte}).release(); MAGNUM_VERIFY_NO_ERROR(); From a5f2eece48252ce280dc168aa70d078bd0c6301b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 26 May 2016 17:56:09 +0200 Subject: [PATCH 013/290] external: up-to-date generated GL header for NaCl. --- src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h b/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h index d711c9d21..bdcf3e2ae 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h @@ -695,6 +695,11 @@ typedef khronos_ssize_t GLsizeiptr; #define GL_BGRA_EXT 0x80E1 #define GL_BGRA8_EXT 0x93A1 +/* GL_ARM_shader_framebuffer_fetch */ + +#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 +#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 + /* GL_EXT_texture_filter_anisotropic */ #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE @@ -721,6 +726,10 @@ typedef khronos_ssize_t GLsizeiptr; #define GL_SAMPLER 0x82E6 #define GL_TRANSFORM_FEEDBACK 0x8E22 +/* GL_EXT_shader_framebuffer_fetch */ + +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 + /* GL_EXT_disjoint_timer_query */ #define GL_QUERY_COUNTER_BITS_EXT 0x8864 @@ -956,6 +965,10 @@ typedef khronos_ssize_t GLsizeiptr; #define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x82FC #define GL_NONE 0 +/* GL_KHR_no_error */ + +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 + /* GL_NV_texture_border_clamp */ #define GL_TEXTURE_BORDER_COLOR_NV 0x1004 @@ -1050,6 +1063,16 @@ GL_APICALL void GL_APIENTRY GLES2ResolveMultisampleFramebufferAPPLE(void); #define GL_ARM_rgba8 1 #endif +/* GL_ARM_shader_framebuffer_fetch */ +#ifndef GL_ARM_shader_framebuffer_fetch +#define GL_ARM_shader_framebuffer_fetch 1 +#endif + +/* GL_ARM_shader_framebuffer_fetch_depth_stencil */ +#ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil +#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1 +#endif + /* GL_ES_VERSION_2_0 */ #ifndef GL_ES_VERSION_2_0 #define GL_ES_VERSION_2_0 1 @@ -1595,6 +1618,11 @@ GL_APICALL void GL_APIENTRY GLES2ValidateProgramPipelineEXT(GLuint); #define glValidateProgramPipelineEXT GLES2ValidateProgramPipelineEXT #endif +/* GL_EXT_shader_framebuffer_fetch */ +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_EXT_shader_framebuffer_fetch 1 +#endif + /* GL_EXT_shader_texture_lod */ #ifndef GL_EXT_shader_texture_lod #define GL_EXT_shader_texture_lod 1 @@ -1722,6 +1750,11 @@ GL_APICALL void GL_APIENTRY GLES2PushDebugGroupKHR(GLenum, GLuint, GLsizei, cons #define glPushDebugGroupKHR GLES2PushDebugGroupKHR #endif +/* GL_KHR_no_error */ +#ifndef GL_KHR_no_error +#define GL_KHR_no_error 1 +#endif + /* GL_KHR_robust_buffer_access_behavior */ #ifndef GL_KHR_robust_buffer_access_behavior #define GL_KHR_robust_buffer_access_behavior 1 From 80dc656cccf60c010006493c52652cb619058e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 26 May 2016 18:02:10 +0200 Subject: [PATCH 014/290] Recognize OES_fbo_render_mipmap ES2 and WebGL 1 extension. --- doc/opengl-support.dox | 2 ++ src/Magnum/Context.cpp | 2 ++ src/Magnum/Extensions.h | 2 ++ src/Magnum/Framebuffer.h | 10 ++++++++++ .../OpenGL/GLES2/Emscripten/extensions.txt | 1 + src/MagnumExternal/OpenGL/GLES2/extensions.txt | 1 + src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h | 5 +++++ 7 files changed, 23 insertions(+) diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index 2e90d25e8..cf33b9bb1 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -323,6 +323,7 @@ Extension | Status @es_extension{NV,shadow_samplers_cube} | done (shading language only) @es_extension{OES,depth24} | done @es_extension{OES,element_index_uint} | done +@es_extension{OES,fbo_render_mipmap} | done @es_extension{OES,rgb8_rgba8} | done (desktop-compatible subset) @es_extension{OES,texture_3D} | done @es_extension2{OES,texture_half_float_linear,OES_texture_float_linear} | done @@ -427,6 +428,7 @@ Extension | Status @webgl_extension{OES,element_index_uint} | done @webgl_extension{OES,texture_float_linear} | done @webgl_extension{OES,texture_half_float_linear} | done +@webgl_extension{OES,fbo_render_mipmap} | done @webgl_extension{WEBGL,depth_texture} | done @webgl_extension{WEBGL,draw_buffers} | done diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index b8bf0590e..b922a3991 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -241,6 +241,7 @@ const std::vector& Extension::extensions(Version version) { _extension(GL,OES,element_index_uint), _extension(GL,OES,texture_float_linear), _extension(GL,OES,texture_half_float_linear), + _extension(GL,OES,fbo_render_mipmap), _extension(GL,WEBGL,compressed_texture_s3tc), _extension(GL,WEBGL,depth_texture), _extension(GL,WEBGL,draw_buffers)}; @@ -355,6 +356,7 @@ const std::vector& Extension::extensions(Version version) { _extension(GL,NV,shadow_samplers_cube), _extension(GL,OES,depth24), _extension(GL,OES,element_index_uint), + _extension(GL,OES,fbo_render_mipmap), _extension(GL,OES,rgb8_rgba8), _extension(GL,OES,texture_3D), _extension(GL,OES,texture_half_float_linear), diff --git a/src/Magnum/Extensions.h b/src/Magnum/Extensions.h index a9ef8042f..c674846c8 100644 --- a/src/Magnum/Extensions.h +++ b/src/Magnum/Extensions.h @@ -265,6 +265,7 @@ namespace GL { _extension(GL,OES,element_index_uint, GLES200, GLES300) // #10 _extension(GL,OES,texture_float_linear, GLES200, GLES300) // #20 _extension(GL,OES,texture_half_float_linear, GLES200, GLES300) // #21 + _extension(GL,OES,fbo_render_mipmap, GLES200, GLES300) // #28 #endif } namespace WEBGL { #ifdef MAGNUM_TARGET_GLES2 @@ -407,6 +408,7 @@ namespace GL { _extension(GL,OES,depth32, GLES200, None) // #25 #ifdef MAGNUM_TARGET_GLES2 _extension(GL,OES,element_index_uint, GLES200, GLES300) // #26 + _extension(GL,OES,fbo_render_mipmap, GLES200, GLES300) // #27 #endif _extension(GL,OES,mapbuffer, GLES200, None) // #29 #ifdef MAGNUM_TARGET_GLES2 diff --git a/src/Magnum/Framebuffer.h b/src/Magnum/Framebuffer.h index 196fa63d3..7a0580c0b 100644 --- a/src/Magnum/Framebuffer.h +++ b/src/Magnum/Framebuffer.h @@ -621,6 +621,10 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * @fn_gl_extension{NamedFramebufferTexture2D,EXT,direct_state_access}, * eventually @fn_gl{BindFramebuffer} and * @fn_gl2{FramebufferTexture2D,FramebufferTexture} + * @requires_gles30 Extension @es_extension{OES,fbo_render_mipmap} to + * render to @p level different than `0` in OpenGL ES 2.0. + * @requires_webgl20 Extension @webgl_extension{OES,fbo_render_mipmap} + * to render to @p level different than `0` in WebGL 1.0. */ Framebuffer& attachTexture(BufferAttachment attachment, Texture2D& texture, Int level); @@ -659,6 +663,10 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * @fn_gl2{NamedFramebufferTextureLayer,FramebufferTextureLayer}, * @fn_gl_extension{NamedFramebufferTexture2D,EXT,direct_state_access}, * eventually @fn_gl{BindFramebuffer} and @fn_gl2{FramebufferTexture2D,FramebufferTexture} + * @requires_gles30 Extension @es_extension{OES,fbo_render_mipmap} to + * render to @p level different than `0` in OpenGL ES 2.0. + * @requires_webgl20 Extension @webgl_extension{OES,fbo_render_mipmap} + * to render to @p level different than `0` in WebGL 1.0. */ Framebuffer& attachCubeMapTexture(BufferAttachment attachment, CubeMapTexture& texture, CubeMapCoordinate coordinate, Int level); @@ -682,6 +690,8 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * OpenGL ES 2.0 * @requires_gles30 Extension @es_extension{OES,texture_3D} in OpenGL * ES 2.0. + * @requires_gles30 Extension @es_extension{OES,fbo_render_mipmap} to + * render to @p level different than `0` in OpenGL ES 2.0. * @requires_webgl20 Only 2D textures are available in WebGL 1.0. */ Framebuffer& attachTextureLayer(BufferAttachment attachment, Texture3D& texture, Int level, Int layer); diff --git a/src/MagnumExternal/OpenGL/GLES2/Emscripten/extensions.txt b/src/MagnumExternal/OpenGL/GLES2/Emscripten/extensions.txt index 8a4eb5925..b1a229f11 100644 --- a/src/MagnumExternal/OpenGL/GLES2/Emscripten/extensions.txt +++ b/src/MagnumExternal/OpenGL/GLES2/Emscripten/extensions.txt @@ -13,6 +13,7 @@ extension OES_texture_half_float optional extension OES_texture_float optional extension OES_standard_derivatives optional extension OES_vertex_array_object optional +extension OES_fbo_render_mipmap optional # These are used as a base for WEBGL_* extensions extension ANGLE_depth_texture optional extension EXT_draw_buffers optional diff --git a/src/MagnumExternal/OpenGL/GLES2/extensions.txt b/src/MagnumExternal/OpenGL/GLES2/extensions.txt index 9abbd3b66..81b986dcb 100644 --- a/src/MagnumExternal/OpenGL/GLES2/extensions.txt +++ b/src/MagnumExternal/OpenGL/GLES2/extensions.txt @@ -35,6 +35,7 @@ extension NV_shadow_samplers_array optional extension NV_shadow_samplers_cube optional extension OES_depth24 optional extension OES_element_index_uint optional +extension OES_fbo_render_mipmap optional extension OES_rgb8_rgba8 optional extension OES_texture_3D optional extension OES_texture_half_float_linear optional diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h b/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h index bdcf3e2ae..6f447311a 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h @@ -1896,6 +1896,11 @@ GL_APICALL void GL_APIENTRY GLES2ReadBufferNV(GLenum); #define GL_OES_element_index_uint 1 #endif +/* GL_OES_fbo_render_mipmap */ +#ifndef GL_OES_fbo_render_mipmap +#define GL_OES_fbo_render_mipmap 1 +#endif + /* GL_OES_mapbuffer */ #ifndef GL_OES_mapbuffer #define GL_OES_mapbuffer 1 From 72a7a79959df98f65948060d099486a135b31043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 28 May 2016 01:49:01 +0200 Subject: [PATCH 015/290] CMake: set proper bundle identifier prefix for test cases on iOS. --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 76873776f..9cd179519 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -145,6 +145,9 @@ option(BUILD_TESTS "Build unit tests" OFF) cmake_dependent_option(BUILD_GL_TESTS "Build unit tests for OpenGL code" OFF "BUILD_TESTS" OFF) if(BUILD_TESTS) find_package(Corrade REQUIRED TestSuite) + if(CORRADE_TARGET_IOS) + set(CORRADE_TESTSUITE_BUNDLE_IDENTIFIER_PREFIX "cz.mosra.magnum") + endif() enable_testing() endif() From 5b82162a4d823562fc4df334462d8d26893a875e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 23 May 2016 11:55:59 +0200 Subject: [PATCH 016/290] package/ci: build for iOS on Travis CI. What's done: * The build matrix now has four targets -- Linux desktop, OSX desktop, iOS GLES2 and iOS GLES3. * Putting the commands into separate bash scripts, which are called based on what's the actual build matrix item. * Displaying *all* test output (colored) for visual verification. --- package/ci/travis-desktop.sh | 37 ++++++++++++++++ package/ci/travis-ios-simulator.sh | 70 ++++++++++++++++++++++++++++++ package/ci/travis.yml | 53 +++++++++++++--------- 3 files changed, 139 insertions(+), 21 deletions(-) create mode 100755 package/ci/travis-desktop.sh create mode 100755 package/ci/travis-ios-simulator.sh diff --git a/package/ci/travis-desktop.sh b/package/ci/travis-desktop.sh new file mode 100755 index 000000000..a20664a6c --- /dev/null +++ b/package/ci/travis-desktop.sh @@ -0,0 +1,37 @@ +#!/bin/bash +set -ev + +# Corrade +git clone --depth 1 git://github.com/mosra/corrade.git +cd corrade +mkdir build && cd build +cmake .. \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps \ + -DCMAKE_INSTALL_RPATH=$HOME/deps/lib \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_INTERCONNECT=OFF \ +make -j install +cd ../.. + +mkdir build && cd build +cmake .. \ + -DCMAKE_PREFIX_PATH="$HOME/deps;$HOME/sdl2;$HOME/glfw" \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_AUDIO=ON \ + -DWITH_GLFWAPPLICATION=ON \ + -DWITH_SDL2APPLICATION=ON \ + -DWITH_WINDOWLESS${PLATFORM_GL_API}APPLICATION=ON \ + -DWITH_${PLATFORM_GL_API}CONTEXT=ON \ + -DWITH_MAGNUMFONT=ON \ + -DWITH_MAGNUMFONTCONVERTER=ON \ + -DWITH_OBJIMPORTER=ON \ + -DWITH_TGAIMAGECONVERTER=ON \ + -DWITH_TGAIMPORTER=ON \ + -DWITH_WAVAUDIOIMPORTER=ON \ + -DWITH_DISTANCEFIELDCONVERTER=ON \ + -DWITH_FONTCONVERTER=ON \ + -DWITH_MAGNUMINFO=ON \ + -DBUILD_TESTS=ON \ + -DBUILD_GL_TESTS=ON +make -j${JOBS_LIMIT} +CORRADE_TEST_COLOR=ON ctest -V -E GLTest diff --git a/package/ci/travis-ios-simulator.sh b/package/ci/travis-ios-simulator.sh new file mode 100755 index 000000000..c921a30f8 --- /dev/null +++ b/package/ci/travis-ios-simulator.sh @@ -0,0 +1,70 @@ +#!/bin/bash +set -ev + +git submodule update --init + +# Corrade +git clone --depth 1 git://github.com/mosra/corrade.git +cd corrade + +# Build native corrade-rc +mkdir build && cd build +cmake .. \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps \ + -DCMAKE_INSTALL_RPATH=$HOME/deps/lib \ + -DWITH_INTERCONNECT=OFF \ + -DWITH_PLUGINMANAGER=OFF \ + -DWITH_TESTSUITE=OFF \ + -DCMAKE_BUILD_TYPE=Release +make -j install +cd .. + +# Crosscompile Corrade +mkdir build-ios && cd build-ios +cmake .. \ + -DCMAKE_TOOLCHAIN_FILE=../../toolchains/generic/iOS.cmake \ + -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk \ + -DCMAKE_OSX_ARCHITECTURES="x86_64" \ + -DCORRADE_RC_EXECUTABLE=$HOME/deps/bin/corrade-rc \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps-ios \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_STATIC=ON \ + -DTESTSUITE_TARGET_XCTEST=ON \ + -DWITH_INTERCONNECT=OFF \ + -G Xcode +cmake --build . --config Release --target install | xcpretty +cd ../.. + +ls -lR $TRAVIS_BUILD_DIR/sdl2 + +# Crosscompile Magnum +mkdir build-ios && cd build-ios +cmake .. \ + -DCMAKE_TOOLCHAIN_FILE=../toolchains/generic/iOS.cmake \ + -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk \ + -DCMAKE_OSX_ARCHITECTURES="x86_64" \ + -DCORRADE_RC_EXECUTABLE=$HOME/deps/bin/corrade-rc \ + -DCMAKE_PREFIX_PATH="$HOME/deps-ios;$TRAVIS_BUILD_DIR/sdl2" \ + -DCMAKE_BUILD_TYPE=Release \ + -DTARGET_GLES2=$TARGET_GLES2 \ + -DWITH_AUDIO=ON \ + -DWITH_SDL2APPLICATION=ON \ + -DWITH_WINDOWLESSIOSAPPLICATION=ON \ + -DWITH_EGLCONTEXT=ON \ + -DWITH_MAGNUMFONT=ON \ + -DWITH_MAGNUMFONTCONVERTER=ON \ + -DWITH_OBJIMPORTER=ON \ + -DWITH_TGAIMAGECONVERTER=ON \ + -DWITH_TGAIMPORTER=ON \ + -DWITH_WAVAUDIOIMPORTER=ON \ + -DWITH_DISTANCEFIELDCONVERTER=ON \ + -DWITH_FONTCONVERTER=ON \ + -DWITH_MAGNUMINFO=ON \ + -DBUILD_STATIC=ON \ + -DBUILD_PLUGINS_STATIC=ON \ + -DBUILD_TESTS=ON \ + -DBUILD_GL_TESTS=ON \ + -G Xcode +cmake --build . --config Release | xcpretty +cmake --build . --config Release --target install | xcpretty +CORRADE_TEST_COLOR=ON ctest -V -C Release -E GLTest diff --git a/package/ci/travis.yml b/package/ci/travis.yml index b49d85c3b..be4179143 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -1,8 +1,26 @@ # kate: indent-width 2; -os: -- linux -- osx +language: cpp + +matrix: + include: + - os: linux + compiler: gcc + env: + - TARGET=desktop + # Otherwise the job gets killed (probably because using too much memory) + - JOBS_LIMIT=4 + - os: osx + compiler: clang + env: TARGET=desktop + - os: osx + env: + - TARGET=ios-simulator + - TARGET_GLES2=ON + - os: osx + env: + - TARGET=ios-simulator + - TARGET_GLES2=OFF addons: apt: @@ -32,29 +50,22 @@ install: - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export CXX=g++-4.7; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export PLATFORM_GL_API=GLX; fi - if [ "$TRAVIS_OS_NAME" == "osx" ]; then export PLATFORM_GL_API=CGL; fi -- printf "[General]\ndrivers=null" > ~/.alsoftrc +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then gem install xcpretty; fi +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then brew upgrade cmake; fi +- if [ "$TARGET" == "desktop" ]; then printf "[General]\ndrivers=null" > ~/.alsoftrc; fi # SDL (cached) -- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install sdl2; fi +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then brew install sdl2; fi +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then curl -O https://www.libsdl.org/release/SDL2-2.0.4.tar.gz && tar -xzvf SDL2-2.0.4.tar.gz && cd SDL2-2.0.4/Xcode-iOS/SDL && xcodebuild -sdk iphonesimulator8.1 | xcpretty && mkdir -p ../../../sdl2/lib && cp build/Release-iphonesimulator/libSDL2.a ../../../sdl2/lib && mkdir -p ../../../sdl2/include/SDL2 && cp -R ../../include/* ../../../sdl2/include/SDL2 && cd ../../..; fi - if [ "$TRAVIS_OS_NAME" == "linux" ] && [ ! -e "$HOME/sdl2/include" ]; then curl -O http://www.libsdl.org/release/SDL2-2.0.4.tar.gz && tar -xzvf SDL2-2.0.4.tar.gz && cd SDL2-2.0.4 && mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/sdl2 -DCMAKE_BUILD_TYPE=Release && cmake --build . --target install && cd ../..; fi # GLFW (cached) -- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install homebrew/versions/glfw3; fi +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then brew install homebrew/versions/glfw3; fi - if [ "$TRAVIS_OS_NAME" == "linux" ] && [ ! -e "$HOME/glfw/include" ]; then wget https://github.com/glfw/glfw/releases/download/3.1.2/glfw-3.1.2.zip && unzip glfw-3.1.2.zip && cd glfw-3.1.2 && mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/glfw -DCMAKE_BUILD_TYPE=Release -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF -DGLFW_BUILD_DOCS=OFF && cmake --build . --target install && cd ../..; fi -# Corrade -- git clone --depth 1 git://github.com/mosra/corrade.git -- cd corrade -- mkdir build -- cd build -- cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/deps -DCMAKE_INSTALL_RPATH=$HOME/deps/lib -DCMAKE_BUILD_TYPE=Release -- cmake --build . -- cmake --build . --target install -- cd .. -- cd .. - script: -- mkdir build && cd build -- cmake .. -DCMAKE_PREFIX_PATH="$HOME/deps;$HOME/sdl2;$HOME/glfw" -DCMAKE_BUILD_TYPE=Release -DWITH_AUDIO=ON -DWITH_GLFWAPPLICATION=ON -DWITH_SDL2APPLICATION=ON -DWITH_WINDOWLESS${PLATFORM_GL_API}APPLICATION=ON -DWITH_${PLATFORM_GL_API}CONTEXT=ON -DWITH_MAGNUMFONT=ON -DWITH_MAGNUMFONTCONVERTER=ON -DWITH_OBJIMPORTER=ON -DWITH_TGAIMAGECONVERTER=ON -DWITH_TGAIMPORTER=ON -DWITH_WAVAUDIOIMPORTER=ON -DWITH_DISTANCEFIELDCONVERTER=ON -DWITH_FONTCONVERTER=ON -DWITH_MAGNUMINFO=ON -DBUILD_TESTS=ON -DBUILD_GL_TESTS=ON -- cmake --build . -- ctest --output-on-failure -E GLTest +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then ./package/ci/travis-desktop.sh; fi +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then ./package/ci/travis-desktop.sh; fi +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then ./package/ci/travis-ios-simulator.sh; fi +# Travis somehow is not able to gather all output, try to force it using this +- sync From 102b5bf7b636410536f4817f186e204c03f5ee82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 23 May 2016 13:15:45 +0200 Subject: [PATCH 017/290] package/ci: work around iOS Simulator not finding OpenGLES.framework. --- package/ci/travis-ios-simulator.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package/ci/travis-ios-simulator.sh b/package/ci/travis-ios-simulator.sh index c921a30f8..2ca875087 100755 --- a/package/ci/travis-ios-simulator.sh +++ b/package/ci/travis-ios-simulator.sh @@ -67,4 +67,7 @@ cmake .. \ -G Xcode cmake --build . --config Release | xcpretty cmake --build . --config Release --target install | xcpretty -CORRADE_TEST_COLOR=ON ctest -V -C Release -E GLTest +# TODO: find a better way to avoid +# Library not loaded: /System/Library/Frameworks/OpenGLES.framework/OpenGLES +# error +DYLD_FALLBACK_LIBRARY_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/OpenGLES.framework/ DYLD_FALLBACK_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks CORRADE_TEST_COLOR=ON ctest -V -C Release -E GLTest From 8677465379eb7f96938f01a59cdc9b470fabaed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 23 May 2016 13:46:18 +0200 Subject: [PATCH 018/290] Work around Xcode project limitations in more cases. Not sure why this wasn't a problem with OSX build, only iOS. --- src/Magnum/CMakeLists.txt | 2 +- src/Magnum/Platform/CMakeLists.txt | 2 +- src/MagnumPlugins/MagnumFont/CMakeLists.txt | 4 +++- src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt | 4 +++- src/MagnumPlugins/ObjImporter/CMakeLists.txt | 4 +++- src/MagnumPlugins/TgaImageConverter/CMakeLists.txt | 4 +++- src/MagnumPlugins/TgaImporter/CMakeLists.txt | 4 +++- src/MagnumPlugins/WavAudioImporter/CMakeLists.txt | 4 +++- src/{Magnum => }/dummy.cpp | 0 9 files changed, 20 insertions(+), 8 deletions(-) rename src/{Magnum => }/dummy.cpp (100%) diff --git a/src/Magnum/CMakeLists.txt b/src/Magnum/CMakeLists.txt index 52257c48f..0365a75d4 100644 --- a/src/Magnum/CMakeLists.txt +++ b/src/Magnum/CMakeLists.txt @@ -323,7 +323,7 @@ if(BUILD_TESTS) # Library with graceful assert for testing add_library(MagnumMathTestLib ${SHARED_OR_STATIC} $ - dummy.cpp) # XCode workaround, see file comment for details + ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details target_include_directories(MagnumMathTestLib PUBLIC $) target_compile_definitions(MagnumMathTestLib PRIVATE "CORRADE_GRACEFUL_ASSERT") set_target_properties(MagnumMathTestLib PROPERTIES DEBUG_POSTFIX "-d") diff --git a/src/Magnum/Platform/CMakeLists.txt b/src/Magnum/Platform/CMakeLists.txt index 1a1dbca71..2eec28899 100644 --- a/src/Magnum/Platform/CMakeLists.txt +++ b/src/Magnum/Platform/CMakeLists.txt @@ -645,7 +645,7 @@ if(NEED_EGLCONTEXT OR WITH_EGLCONTEXT) if(WITH_EGLCONTEXT) add_library(MagnumEglContext STATIC $ - ../dummy.cpp) # XCode workaround, see file comment for details + ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details set_target_properties(MagnumEglContext PROPERTIES DEBUG_POSTFIX "-d") if(BUILD_STATIC_PIC) set_target_properties(MagnumEglContext PROPERTIES POSITION_INDEPENDENT_CODE ON) diff --git a/src/MagnumPlugins/MagnumFont/CMakeLists.txt b/src/MagnumPlugins/MagnumFont/CMakeLists.txt index a5cab2251..3a0c799d3 100644 --- a/src/MagnumPlugins/MagnumFont/CMakeLists.txt +++ b/src/MagnumPlugins/MagnumFont/CMakeLists.txt @@ -65,7 +65,9 @@ if(BUILD_GL_TESTS) ${MagnumFont_HEADERS}) target_compile_definitions(MagnumMagnumFontTestLib PRIVATE "MAGNUM_TGAIMPORTER_BUILD_STATIC") else() - add_library(MagnumMagnumFontTestLib STATIC $) + add_library(MagnumMagnumFontTestLib STATIC + $ + ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details endif() target_link_libraries(MagnumMagnumFontTestLib Magnum MagnumText MagnumTgaImporterTestLib) diff --git a/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt b/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt index 7f2a5661b..0140e479e 100644 --- a/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt +++ b/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt @@ -65,7 +65,9 @@ if(BUILD_GL_TESTS) ${MagnumFontConverter_HEADERS}) target_compile_definitions(MagnumMagnumFontConverterTestLib PRIVATE "MAGNUM_TGAIMAGECONVERTER_BUILD_STATIC") else() - add_library(MagnumMagnumFontConverterTestLib STATIC $) + add_library(MagnumMagnumFontConverterTestLib STATIC + $ + ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details endif() target_link_libraries(MagnumMagnumFontConverterTestLib Magnum MagnumText MagnumTgaImageConverterTestLib) diff --git a/src/MagnumPlugins/ObjImporter/CMakeLists.txt b/src/MagnumPlugins/ObjImporter/CMakeLists.txt index 8973e22c2..558cbfabf 100644 --- a/src/MagnumPlugins/ObjImporter/CMakeLists.txt +++ b/src/MagnumPlugins/ObjImporter/CMakeLists.txt @@ -51,7 +51,9 @@ target_link_libraries(ObjImporter Magnum MagnumMeshTools) install(FILES ${ObjImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/ObjImporter) if(BUILD_TESTS) - add_library(MagnumObjImporterTestLib STATIC $) + add_library(MagnumObjImporterTestLib STATIC + $ + ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details target_link_libraries(MagnumObjImporterTestLib Magnum MagnumMeshTools) add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt b/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt index 2895f4618..3228c3c70 100644 --- a/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt +++ b/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt @@ -62,7 +62,9 @@ install(FILES ${TgaImageConverter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/TgaImageConverter) if(BUILD_TESTS) - add_library(MagnumTgaImageConverterTestLib STATIC $) + add_library(MagnumTgaImageConverterTestLib STATIC + $ + ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details target_link_libraries(MagnumTgaImageConverterTestLib Magnum) add_subdirectory(Test) diff --git a/src/MagnumPlugins/TgaImporter/CMakeLists.txt b/src/MagnumPlugins/TgaImporter/CMakeLists.txt index b2ebfb43e..1a62d4e8d 100644 --- a/src/MagnumPlugins/TgaImporter/CMakeLists.txt +++ b/src/MagnumPlugins/TgaImporter/CMakeLists.txt @@ -63,7 +63,9 @@ install(FILES ${TgaImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTAL install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/TgaImporter) if(BUILD_TESTS) - add_library(MagnumTgaImporterTestLib STATIC $) + add_library(MagnumTgaImporterTestLib STATIC + $ + ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details target_link_libraries(MagnumTgaImporterTestLib Magnum) add_subdirectory(Test) diff --git a/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt index adb4a558d..8e4837619 100644 --- a/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt @@ -54,7 +54,9 @@ target_link_libraries(WavAudioImporter Magnum MagnumAudio) install(FILES ${WavAudioImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/WavAudioImporter) if(BUILD_TESTS) - add_library(MagnumWavAudioImporterTestLib STATIC $) + add_library(MagnumWavAudioImporterTestLib STATIC + $ + ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details target_link_libraries(MagnumWavAudioImporterTestLib Magnum MagnumAudio) add_subdirectory(Test) endif() diff --git a/src/Magnum/dummy.cpp b/src/dummy.cpp similarity index 100% rename from src/Magnum/dummy.cpp rename to src/dummy.cpp From 598b5fdc1be50e8485dbf81fe7f076f9cce6c0f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 23 May 2016 17:36:10 +0200 Subject: [PATCH 019/290] external: remove extension functions that are not in GLES2. Moreover iOS GLES2 header doesn't have these defined, breaking the build. --- .../OpenGL/GLES2/extensions.txt | 36 +++++++++++++++++ src/MagnumExternal/OpenGL/GLES2/flextGL.cpp | 18 --------- src/MagnumExternal/OpenGL/GLES2/flextGL.h | 36 ----------------- src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h | 30 -------------- .../OpenGL/GLES2/flextGLPlatform.cpp | 18 --------- .../OpenGL/GLES2/flextGLPlatformIOS.cpp | 39 ++----------------- .../GLES2/flextGLPlatformIOS.cpp.template | 3 ++ 7 files changed, 42 insertions(+), 138 deletions(-) diff --git a/src/MagnumExternal/OpenGL/GLES2/extensions.txt b/src/MagnumExternal/OpenGL/GLES2/extensions.txt index 81b986dcb..9c290dfcd 100644 --- a/src/MagnumExternal/OpenGL/GLES2/extensions.txt +++ b/src/MagnumExternal/OpenGL/GLES2/extensions.txt @@ -90,3 +90,39 @@ extension OES_mapbuffer optional extension OES_stencil1 optional extension OES_stencil4 optional extension OES_texture_stencil8 optional + +begin functions blacklist + # These are listed in EXT_separate_shader_objects with only the comment + # saying "Depends on OpenGL ES 3.0 or GL_NV_non_square_matrices". No way to + # parse that so I have to disable them manually. iOS extension header + # doesn't provide these for GLES2. + ProgramUniform1uiEXT + ProgramUniform2uiEXT + ProgramUniform3uiEXT + ProgramUniform4uiEXT + ProgramUniform1uivEXT + ProgramUniform2uivEXT + ProgramUniform3uivEXT + ProgramUniform4uivEXT + ProgramUniformMatrix2x3fvEXT + ProgramUniformMatrix3x2fvEXT + ProgramUniformMatrix2x4fvEXT + ProgramUniformMatrix4x2fvEXT + ProgramUniformMatrix3x4fvEXT + ProgramUniformMatrix4x3fvEXT + + # These are listed in EXT_texture_storage with a comment saying "Not clear + # all of these enums should be here for OpenGL ES. Many are only defined if + # other extensions also requiring them are supported". iOS extension header + # doesn't provide this one and TexStorage3DEXT, however I need the 3D for + # OES_texture_3D so I'm having an ugly workaround in flextGLPlatformIOS.cpp. + TexStorage1DEXT + + # These are listed in EXT_texture_storage with a comment saying "Supported + # only if GL_EXT_direct_state_access is supported". Again impossible to + # parse so I have to disable them manually. iOS extension header doesn't + # provide these for GLES2. + TextureStorage1DEXT + TextureStorage2DEXT + TextureStorage3DEXT +end functions blacklist diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGL.cpp b/src/MagnumExternal/OpenGL/GLES2/flextGL.cpp index de1caad84..a0d0f33d8 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGL.cpp +++ b/src/MagnumExternal/OpenGL/GLES2/flextGL.cpp @@ -96,35 +96,21 @@ FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fEXT)(GLuint, GLint, GLfloat FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1iEXT)(GLuint, GLint, GLint) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uiEXT)(GLuint, GLint, GLuint) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fEXT)(GLuint, GLint, GLfloat, GLfloat) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2iEXT)(GLuint, GLint, GLint, GLint) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uiEXT)(GLuint, GLint, GLuint, GLuint) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3iEXT)(GLuint, GLint, GLint, GLint, GLint) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uiEXT)(GLuint, GLint, GLuint, GLuint, GLuint) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4iEXT)(GLuint, GLint, GLint, GLint, GLint, GLint) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uiEXT)(GLuint, GLint, GLuint, GLuint, GLuint, GLuint) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglUseProgramStagesEXT)(GLuint, GLbitfield, GLuint) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgramPipelineEXT)(GLuint) = nullptr; @@ -139,12 +125,8 @@ FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIivEXT)(GLenum, GLenum, const G FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIuivEXT)(GLenum, GLenum, const GLuint *) = nullptr; /* GL_EXT_texture_storage */ -FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage1DEXT)(GLenum, GLsizei, GLenum, GLsizei) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage2DEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage3DEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage1DEXT)(GLuint, GLenum, GLsizei, GLenum, GLsizei) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage2DEXT)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr; -FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage3DEXT)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei) = nullptr; /* GL_KHR_blend_equation_advanced */ FLEXTGL_EXPORT void(APIENTRY *flextglBlendBarrierKHR)(void) = nullptr; diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGL.h b/src/MagnumExternal/OpenGL/GLES2/flextGL.h index 606c85332..aaefc5153 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGL.h +++ b/src/MagnumExternal/OpenGL/GLES2/flextGL.h @@ -1347,10 +1347,6 @@ GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1iEXT)(GLuint, GLint, G #define glProgramUniform1iEXT flextglProgramUniform1iEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1ivEXT)(GLuint, GLint, GLsizei, const GLint *); #define glProgramUniform1ivEXT flextglProgramUniform1ivEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uiEXT)(GLuint, GLint, GLuint); -#define glProgramUniform1uiEXT flextglProgramUniform1uiEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uivEXT)(GLuint, GLint, GLsizei, const GLuint *); -#define glProgramUniform1uivEXT flextglProgramUniform1uivEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fEXT)(GLuint, GLint, GLfloat, GLfloat); #define glProgramUniform2fEXT flextglProgramUniform2fEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fvEXT)(GLuint, GLint, GLsizei, const GLfloat *); @@ -1359,10 +1355,6 @@ GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2iEXT)(GLuint, GLint, G #define glProgramUniform2iEXT flextglProgramUniform2iEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2ivEXT)(GLuint, GLint, GLsizei, const GLint *); #define glProgramUniform2ivEXT flextglProgramUniform2ivEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uiEXT)(GLuint, GLint, GLuint, GLuint); -#define glProgramUniform2uiEXT flextglProgramUniform2uiEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uivEXT)(GLuint, GLint, GLsizei, const GLuint *); -#define glProgramUniform2uivEXT flextglProgramUniform2uivEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat); #define glProgramUniform3fEXT flextglProgramUniform3fEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fvEXT)(GLuint, GLint, GLsizei, const GLfloat *); @@ -1371,10 +1363,6 @@ GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3iEXT)(GLuint, GLint, G #define glProgramUniform3iEXT flextglProgramUniform3iEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3ivEXT)(GLuint, GLint, GLsizei, const GLint *); #define glProgramUniform3ivEXT flextglProgramUniform3ivEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uiEXT)(GLuint, GLint, GLuint, GLuint, GLuint); -#define glProgramUniform3uiEXT flextglProgramUniform3uiEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uivEXT)(GLuint, GLint, GLsizei, const GLuint *); -#define glProgramUniform3uivEXT flextglProgramUniform3uivEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat); #define glProgramUniform4fEXT flextglProgramUniform4fEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fvEXT)(GLuint, GLint, GLsizei, const GLfloat *); @@ -1383,28 +1371,12 @@ GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4iEXT)(GLuint, GLint, G #define glProgramUniform4iEXT flextglProgramUniform4iEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4ivEXT)(GLuint, GLint, GLsizei, const GLint *); #define glProgramUniform4ivEXT flextglProgramUniform4ivEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uiEXT)(GLuint, GLint, GLuint, GLuint, GLuint, GLuint); -#define glProgramUniform4uiEXT flextglProgramUniform4uiEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uivEXT)(GLuint, GLint, GLsizei, const GLuint *); -#define glProgramUniform4uivEXT flextglProgramUniform4uivEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); #define glProgramUniformMatrix2fvEXT flextglProgramUniformMatrix2fvEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix2x3fvEXT flextglProgramUniformMatrix2x3fvEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix2x4fvEXT flextglProgramUniformMatrix2x4fvEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); #define glProgramUniformMatrix3fvEXT flextglProgramUniformMatrix3fvEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix3x2fvEXT flextglProgramUniformMatrix3x2fvEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix3x4fvEXT flextglProgramUniformMatrix3x4fvEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); #define glProgramUniformMatrix4fvEXT flextglProgramUniformMatrix4fvEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix4x2fvEXT flextglProgramUniformMatrix4x2fvEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix4x3fvEXT flextglProgramUniformMatrix4x3fvEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUseProgramStagesEXT)(GLuint, GLbitfield, GLuint); #define glUseProgramStagesEXT flextglUseProgramStagesEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgramPipelineEXT)(GLuint); @@ -1431,18 +1403,10 @@ GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIuivEXT)(GLenum, GLenum, /* GL_EXT_texture_storage */ -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage1DEXT)(GLenum, GLsizei, GLenum, GLsizei); -#define glTexStorage1DEXT flextglTexStorage1DEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage2DEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei); #define glTexStorage2DEXT flextglTexStorage2DEXT GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage3DEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei); #define glTexStorage3DEXT flextglTexStorage3DEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage1DEXT)(GLuint, GLenum, GLsizei, GLenum, GLsizei); -#define glTextureStorage1DEXT flextglTextureStorage1DEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage2DEXT)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei); -#define glTextureStorage2DEXT flextglTextureStorage2DEXT -GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage3DEXT)(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei); -#define glTextureStorage3DEXT flextglTextureStorage3DEXT /* GL_KHR_blend_equation_advanced */ diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h b/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h index 6f447311a..abae35d93 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h @@ -1554,10 +1554,6 @@ GL_APICALL void GL_APIENTRY GLES2ProgramUniform1iEXT(GLuint, GLint, GLint); #define glProgramUniform1iEXT GLES2ProgramUniform1iEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniform1ivEXT(GLuint, GLint, GLsizei, const GLint *); #define glProgramUniform1ivEXT GLES2ProgramUniform1ivEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniform1uiEXT(GLuint, GLint, GLuint); -#define glProgramUniform1uiEXT GLES2ProgramUniform1uiEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniform1uivEXT(GLuint, GLint, GLsizei, const GLuint *); -#define glProgramUniform1uivEXT GLES2ProgramUniform1uivEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniform2fEXT(GLuint, GLint, GLfloat, GLfloat); #define glProgramUniform2fEXT GLES2ProgramUniform2fEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniform2fvEXT(GLuint, GLint, GLsizei, const GLfloat *); @@ -1566,10 +1562,6 @@ GL_APICALL void GL_APIENTRY GLES2ProgramUniform2iEXT(GLuint, GLint, GLint, GLint #define glProgramUniform2iEXT GLES2ProgramUniform2iEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniform2ivEXT(GLuint, GLint, GLsizei, const GLint *); #define glProgramUniform2ivEXT GLES2ProgramUniform2ivEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniform2uiEXT(GLuint, GLint, GLuint, GLuint); -#define glProgramUniform2uiEXT GLES2ProgramUniform2uiEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniform2uivEXT(GLuint, GLint, GLsizei, const GLuint *); -#define glProgramUniform2uivEXT GLES2ProgramUniform2uivEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniform3fEXT(GLuint, GLint, GLfloat, GLfloat, GLfloat); #define glProgramUniform3fEXT GLES2ProgramUniform3fEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniform3fvEXT(GLuint, GLint, GLsizei, const GLfloat *); @@ -1578,10 +1570,6 @@ GL_APICALL void GL_APIENTRY GLES2ProgramUniform3iEXT(GLuint, GLint, GLint, GLint #define glProgramUniform3iEXT GLES2ProgramUniform3iEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniform3ivEXT(GLuint, GLint, GLsizei, const GLint *); #define glProgramUniform3ivEXT GLES2ProgramUniform3ivEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniform3uiEXT(GLuint, GLint, GLuint, GLuint, GLuint); -#define glProgramUniform3uiEXT GLES2ProgramUniform3uiEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniform3uivEXT(GLuint, GLint, GLsizei, const GLuint *); -#define glProgramUniform3uivEXT GLES2ProgramUniform3uivEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniform4fEXT(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat); #define glProgramUniform4fEXT GLES2ProgramUniform4fEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniform4fvEXT(GLuint, GLint, GLsizei, const GLfloat *); @@ -1590,28 +1578,12 @@ GL_APICALL void GL_APIENTRY GLES2ProgramUniform4iEXT(GLuint, GLint, GLint, GLint #define glProgramUniform4iEXT GLES2ProgramUniform4iEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniform4ivEXT(GLuint, GLint, GLsizei, const GLint *); #define glProgramUniform4ivEXT GLES2ProgramUniform4ivEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniform4uiEXT(GLuint, GLint, GLuint, GLuint, GLuint, GLuint); -#define glProgramUniform4uiEXT GLES2ProgramUniform4uiEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniform4uivEXT(GLuint, GLint, GLsizei, const GLuint *); -#define glProgramUniform4uivEXT GLES2ProgramUniform4uivEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniformMatrix2fvEXT(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); #define glProgramUniformMatrix2fvEXT GLES2ProgramUniformMatrix2fvEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniformMatrix2x3fvEXT(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix2x3fvEXT GLES2ProgramUniformMatrix2x3fvEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniformMatrix2x4fvEXT(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix2x4fvEXT GLES2ProgramUniformMatrix2x4fvEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniformMatrix3fvEXT(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); #define glProgramUniformMatrix3fvEXT GLES2ProgramUniformMatrix3fvEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniformMatrix3x2fvEXT(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix3x2fvEXT GLES2ProgramUniformMatrix3x2fvEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniformMatrix3x4fvEXT(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix3x4fvEXT GLES2ProgramUniformMatrix3x4fvEXT GL_APICALL void GL_APIENTRY GLES2ProgramUniformMatrix4fvEXT(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); #define glProgramUniformMatrix4fvEXT GLES2ProgramUniformMatrix4fvEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniformMatrix4x2fvEXT(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix4x2fvEXT GLES2ProgramUniformMatrix4x2fvEXT -GL_APICALL void GL_APIENTRY GLES2ProgramUniformMatrix4x3fvEXT(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -#define glProgramUniformMatrix4x3fvEXT GLES2ProgramUniformMatrix4x3fvEXT GL_APICALL void GL_APIENTRY GLES2UseProgramStagesEXT(GLuint, GLbitfield, GLuint); #define glUseProgramStagesEXT GLES2UseProgramStagesEXT GL_APICALL void GL_APIENTRY GLES2ValidateProgramPipelineEXT(GLuint); @@ -1682,8 +1654,6 @@ GL_APICALL void GL_APIENTRY GLES2TexParameterIuivEXT(GLenum, GLenum, const GLuin /* GL_EXT_texture_storage */ #ifndef GL_EXT_texture_storage #define GL_EXT_texture_storage 1 -GL_APICALL void GL_APIENTRY GLES2TexStorage1DEXT(GLenum, GLsizei, GLenum, GLsizei); -#define glTexStorage1DEXT GLES2TexStorage1DEXT GL_APICALL void GL_APIENTRY GLES2TexStorage2DEXT(GLenum, GLsizei, GLenum, GLsizei, GLsizei); #define glTexStorage2DEXT GLES2TexStorage2DEXT GL_APICALL void GL_APIENTRY GLES2TexStorage3DEXT(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei); diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp index d7df7679f..0bc5c6371 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp @@ -100,35 +100,21 @@ void flextGLInit() { flextglProgramUniform1fvEXT = reinterpret_cast(loader.load("glProgramUniform1fvEXT")); flextglProgramUniform1iEXT = reinterpret_cast(loader.load("glProgramUniform1iEXT")); flextglProgramUniform1ivEXT = reinterpret_cast(loader.load("glProgramUniform1ivEXT")); - flextglProgramUniform1uiEXT = reinterpret_cast(loader.load("glProgramUniform1uiEXT")); - flextglProgramUniform1uivEXT = reinterpret_cast(loader.load("glProgramUniform1uivEXT")); flextglProgramUniform2fEXT = reinterpret_cast(loader.load("glProgramUniform2fEXT")); flextglProgramUniform2fvEXT = reinterpret_cast(loader.load("glProgramUniform2fvEXT")); flextglProgramUniform2iEXT = reinterpret_cast(loader.load("glProgramUniform2iEXT")); flextglProgramUniform2ivEXT = reinterpret_cast(loader.load("glProgramUniform2ivEXT")); - flextglProgramUniform2uiEXT = reinterpret_cast(loader.load("glProgramUniform2uiEXT")); - flextglProgramUniform2uivEXT = reinterpret_cast(loader.load("glProgramUniform2uivEXT")); flextglProgramUniform3fEXT = reinterpret_cast(loader.load("glProgramUniform3fEXT")); flextglProgramUniform3fvEXT = reinterpret_cast(loader.load("glProgramUniform3fvEXT")); flextglProgramUniform3iEXT = reinterpret_cast(loader.load("glProgramUniform3iEXT")); flextglProgramUniform3ivEXT = reinterpret_cast(loader.load("glProgramUniform3ivEXT")); - flextglProgramUniform3uiEXT = reinterpret_cast(loader.load("glProgramUniform3uiEXT")); - flextglProgramUniform3uivEXT = reinterpret_cast(loader.load("glProgramUniform3uivEXT")); flextglProgramUniform4fEXT = reinterpret_cast(loader.load("glProgramUniform4fEXT")); flextglProgramUniform4fvEXT = reinterpret_cast(loader.load("glProgramUniform4fvEXT")); flextglProgramUniform4iEXT = reinterpret_cast(loader.load("glProgramUniform4iEXT")); flextglProgramUniform4ivEXT = reinterpret_cast(loader.load("glProgramUniform4ivEXT")); - flextglProgramUniform4uiEXT = reinterpret_cast(loader.load("glProgramUniform4uiEXT")); - flextglProgramUniform4uivEXT = reinterpret_cast(loader.load("glProgramUniform4uivEXT")); flextglProgramUniformMatrix2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2fvEXT")); - flextglProgramUniformMatrix2x3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2x3fvEXT")); - flextglProgramUniformMatrix2x4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2x4fvEXT")); flextglProgramUniformMatrix3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3fvEXT")); - flextglProgramUniformMatrix3x2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3x2fvEXT")); - flextglProgramUniformMatrix3x4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3x4fvEXT")); flextglProgramUniformMatrix4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4fvEXT")); - flextglProgramUniformMatrix4x2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4x2fvEXT")); - flextglProgramUniformMatrix4x3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4x3fvEXT")); flextglUseProgramStagesEXT = reinterpret_cast(loader.load("glUseProgramStagesEXT")); flextglValidateProgramPipelineEXT = reinterpret_cast(loader.load("glValidateProgramPipelineEXT")); @@ -143,12 +129,8 @@ void flextGLInit() { flextglTexParameterIuivEXT = reinterpret_cast(loader.load("glTexParameterIuivEXT")); /* GL_EXT_texture_storage */ - flextglTexStorage1DEXT = reinterpret_cast(loader.load("glTexStorage1DEXT")); flextglTexStorage2DEXT = reinterpret_cast(loader.load("glTexStorage2DEXT")); flextglTexStorage3DEXT = reinterpret_cast(loader.load("glTexStorage3DEXT")); - flextglTextureStorage1DEXT = reinterpret_cast(loader.load("glTextureStorage1DEXT")); - flextglTextureStorage2DEXT = reinterpret_cast(loader.load("glTextureStorage2DEXT")); - flextglTextureStorage3DEXT = reinterpret_cast(loader.load("glTextureStorage3DEXT")); /* GL_KHR_blend_equation_advanced */ flextglBlendBarrierKHR = reinterpret_cast(loader.load("glBlendBarrierKHR")); diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformIOS.cpp b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformIOS.cpp index d94dd06d4..1c99e7def 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformIOS.cpp +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformIOS.cpp @@ -59,35 +59,21 @@ #undef glProgramUniform1fvEXT #undef glProgramUniform1iEXT #undef glProgramUniform1ivEXT -#undef glProgramUniform1uiEXT -#undef glProgramUniform1uivEXT #undef glProgramUniform2fEXT #undef glProgramUniform2fvEXT #undef glProgramUniform2iEXT #undef glProgramUniform2ivEXT -#undef glProgramUniform2uiEXT -#undef glProgramUniform2uivEXT #undef glProgramUniform3fEXT #undef glProgramUniform3fvEXT #undef glProgramUniform3iEXT #undef glProgramUniform3ivEXT -#undef glProgramUniform3uiEXT -#undef glProgramUniform3uivEXT #undef glProgramUniform4fEXT #undef glProgramUniform4fvEXT #undef glProgramUniform4iEXT #undef glProgramUniform4ivEXT -#undef glProgramUniform4uiEXT -#undef glProgramUniform4uivEXT #undef glProgramUniformMatrix2fvEXT -#undef glProgramUniformMatrix2x3fvEXT -#undef glProgramUniformMatrix2x4fvEXT #undef glProgramUniformMatrix3fvEXT -#undef glProgramUniformMatrix3x2fvEXT -#undef glProgramUniformMatrix3x4fvEXT #undef glProgramUniformMatrix4fvEXT -#undef glProgramUniformMatrix4x2fvEXT -#undef glProgramUniformMatrix4x3fvEXT #undef glUseProgramStagesEXT #undef glValidateProgramPipelineEXT #undef glGetSamplerParameterIivEXT @@ -98,12 +84,8 @@ #undef glSamplerParameterIuivEXT #undef glTexParameterIivEXT #undef glTexParameterIuivEXT -#undef glTexStorage1DEXT #undef glTexStorage2DEXT #undef glTexStorage3DEXT -#undef glTextureStorage1DEXT -#undef glTextureStorage2DEXT -#undef glTextureStorage3DEXT #undef glBlendBarrierKHR #undef glDebugMessageCallbackKHR #undef glDebugMessageControlKHR @@ -146,6 +128,9 @@ #include void flextGLInit() { + /* Work around missing glTexStorage3D (can't be used anyway because GLES2 + on iOS doesn't support OES_texture_3D) */ + constexpr void(*glTexStorage3DEXT)() = nullptr; /* GL_ANGLE_framebuffer_blit */ #if GL_ANGLE_framebuffer_blit @@ -272,35 +257,21 @@ void flextGLInit() { flextglProgramUniform1fvEXT = reinterpret_cast(glProgramUniform1fvEXT); flextglProgramUniform1iEXT = reinterpret_cast(glProgramUniform1iEXT); flextglProgramUniform1ivEXT = reinterpret_cast(glProgramUniform1ivEXT); - flextglProgramUniform1uiEXT = reinterpret_cast(glProgramUniform1uiEXT); - flextglProgramUniform1uivEXT = reinterpret_cast(glProgramUniform1uivEXT); flextglProgramUniform2fEXT = reinterpret_cast(glProgramUniform2fEXT); flextglProgramUniform2fvEXT = reinterpret_cast(glProgramUniform2fvEXT); flextglProgramUniform2iEXT = reinterpret_cast(glProgramUniform2iEXT); flextglProgramUniform2ivEXT = reinterpret_cast(glProgramUniform2ivEXT); - flextglProgramUniform2uiEXT = reinterpret_cast(glProgramUniform2uiEXT); - flextglProgramUniform2uivEXT = reinterpret_cast(glProgramUniform2uivEXT); flextglProgramUniform3fEXT = reinterpret_cast(glProgramUniform3fEXT); flextglProgramUniform3fvEXT = reinterpret_cast(glProgramUniform3fvEXT); flextglProgramUniform3iEXT = reinterpret_cast(glProgramUniform3iEXT); flextglProgramUniform3ivEXT = reinterpret_cast(glProgramUniform3ivEXT); - flextglProgramUniform3uiEXT = reinterpret_cast(glProgramUniform3uiEXT); - flextglProgramUniform3uivEXT = reinterpret_cast(glProgramUniform3uivEXT); flextglProgramUniform4fEXT = reinterpret_cast(glProgramUniform4fEXT); flextglProgramUniform4fvEXT = reinterpret_cast(glProgramUniform4fvEXT); flextglProgramUniform4iEXT = reinterpret_cast(glProgramUniform4iEXT); flextglProgramUniform4ivEXT = reinterpret_cast(glProgramUniform4ivEXT); - flextglProgramUniform4uiEXT = reinterpret_cast(glProgramUniform4uiEXT); - flextglProgramUniform4uivEXT = reinterpret_cast(glProgramUniform4uivEXT); flextglProgramUniformMatrix2fvEXT = reinterpret_cast(glProgramUniformMatrix2fvEXT); - flextglProgramUniformMatrix2x3fvEXT = reinterpret_cast(glProgramUniformMatrix2x3fvEXT); - flextglProgramUniformMatrix2x4fvEXT = reinterpret_cast(glProgramUniformMatrix2x4fvEXT); flextglProgramUniformMatrix3fvEXT = reinterpret_cast(glProgramUniformMatrix3fvEXT); - flextglProgramUniformMatrix3x2fvEXT = reinterpret_cast(glProgramUniformMatrix3x2fvEXT); - flextglProgramUniformMatrix3x4fvEXT = reinterpret_cast(glProgramUniformMatrix3x4fvEXT); flextglProgramUniformMatrix4fvEXT = reinterpret_cast(glProgramUniformMatrix4fvEXT); - flextglProgramUniformMatrix4x2fvEXT = reinterpret_cast(glProgramUniformMatrix4x2fvEXT); - flextglProgramUniformMatrix4x3fvEXT = reinterpret_cast(glProgramUniformMatrix4x3fvEXT); flextglUseProgramStagesEXT = reinterpret_cast(glUseProgramStagesEXT); flextglValidateProgramPipelineEXT = reinterpret_cast(glValidateProgramPipelineEXT); #endif @@ -319,12 +290,8 @@ void flextGLInit() { /* GL_EXT_texture_storage */ #if GL_EXT_texture_storage - flextglTexStorage1DEXT = reinterpret_cast(glTexStorage1DEXT); flextglTexStorage2DEXT = reinterpret_cast(glTexStorage2DEXT); flextglTexStorage3DEXT = reinterpret_cast(glTexStorage3DEXT); - flextglTextureStorage1DEXT = reinterpret_cast(glTextureStorage1DEXT); - flextglTextureStorage2DEXT = reinterpret_cast(glTextureStorage2DEXT); - flextglTextureStorage3DEXT = reinterpret_cast(glTextureStorage3DEXT); #endif /* GL_KHR_blend_equation_advanced */ diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformIOS.cpp.template b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformIOS.cpp.template index 2d5982016..a038a4f0a 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformIOS.cpp.template +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformIOS.cpp.template @@ -12,6 +12,9 @@ #include void flextGLInit() { + /* Work around missing glTexStorage3D (can't be used anyway because GLES2 + on iOS doesn't support OES_texture_3D) */ + constexpr void(*glTexStorage3DEXT)() = nullptr; @for category,funcs in functions: @if funcs and category not in ['ES_VERSION_2_0']: From 16092109e22f673ff194816fdfec9057952e3fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 4 Jun 2016 18:06:56 +0200 Subject: [PATCH 020/290] package/ci: um... --- package/ci/travis-desktop.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/ci/travis-desktop.sh b/package/ci/travis-desktop.sh index a20664a6c..b308763d2 100755 --- a/package/ci/travis-desktop.sh +++ b/package/ci/travis-desktop.sh @@ -9,7 +9,7 @@ cmake .. \ -DCMAKE_INSTALL_PREFIX=$HOME/deps \ -DCMAKE_INSTALL_RPATH=$HOME/deps/lib \ -DCMAKE_BUILD_TYPE=Release \ - -DWITH_INTERCONNECT=OFF \ + -DWITH_INTERCONNECT=OFF make -j install cd ../.. From 1411e2e85bb8879a5f50d2e43bd7f8173be57667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 4 Jun 2016 20:39:37 +0200 Subject: [PATCH 021/290] Math: work around GCC 4.9 crash in Android NDK. Seems to be only in case of this particular function in the test and nowehere else. Won't bother investigating further. --- src/Magnum/Math/Test/QuaternionTest.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Magnum/Math/Test/QuaternionTest.cpp b/src/Magnum/Math/Test/QuaternionTest.cpp index 4addf3c40..9aee96466 100644 --- a/src/Magnum/Math/Test/QuaternionTest.cpp +++ b/src/Magnum/Math/Test/QuaternionTest.cpp @@ -399,6 +399,13 @@ void QuaternionTest::matrix() { CORRADE_COMPARE(Quaternion::fromMatrix(m4), q4); } +/* The crappy 4.9 20140827 (prerelease) in Android NDK segfaults when + optimizing the following function. Dialing down the optimization helps. No + problem when calling Math::lerp() anywhere else, so I won't dig further. + Fuck this. */ +#if defined(CORRADE_TARGET_ANDROID) && __GNUC__*100 + __GNUC_MINOR__*10 + __GNUC_PATCHLEVEL__ == 490 +#pragma GCC push_options +#pragma GCC optimize("O0") void QuaternionTest::lerp() { Quaternion a = Quaternion::rotation(Deg(15.0f), Vector3(1.0f/Constants::sqrt3())); Quaternion b = Quaternion::rotation(Deg(23.0f), Vector3::xAxis()); @@ -416,6 +423,8 @@ void QuaternionTest::lerp() { Quaternion lerp = Math::lerp(a, b, 0.35f); CORRADE_COMPARE(lerp, Quaternion({0.119127f, 0.049134f, 0.049134f}, 0.990445f)); } +#pragma GCC pop_options +#endif void QuaternionTest::slerp() { Quaternion a = Quaternion::rotation(Deg(15.0f), Vector3(1.0f/Constants::sqrt3())); From 60b6889ca634e583182e4881386c08761a2e4ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 4 Jun 2016 21:45:57 +0200 Subject: [PATCH 022/290] Platform: disable hidden visibility for Android Native App Glue. Otherwise the ANativeActivity_onCreate() won't get exported and the app will fail to start. Of course they just don't care and produce crappy code that apparently nobody uses in production environment. --- src/Magnum/Platform/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Magnum/Platform/CMakeLists.txt b/src/Magnum/Platform/CMakeLists.txt index 2eec28899..a28050001 100644 --- a/src/Magnum/Platform/CMakeLists.txt +++ b/src/Magnum/Platform/CMakeLists.txt @@ -75,6 +75,10 @@ if(WITH_ANDROIDAPPLICATION) ${MagnumAndroidApplication_HEADERS} ${MagnumAndroidApplication_PRIVATE_HEADERS} ${ANDROID_NATIVE_APP_GLUE_SRC}) + # They just don't care, so of course the ANativeActivity_onCreate() + # function is not exported and thus the app startup fails if I don't + # disable hidden visibility for the file. + set_source_files_properties(${ANDROID_NATIVE_APP_GLUE_SRC} PROPERTIES COMPILE_FLAGS "-fvisibility=default") target_include_directories(MagnumAndroidApplication PUBLIC ${ANDROID_NATIVE_APP_GLUE_INCLUDE_DIR}) set_target_properties(MagnumAndroidApplication PROPERTIES DEBUG_POSTFIX "-d") # Assuming that PIC is not needed because the Application lib is always From a4993319554858da48dc65041ce485cbdaea28bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 4 Jun 2016 22:00:44 +0200 Subject: [PATCH 023/290] Math: um... --- src/Magnum/Math/Test/QuaternionTest.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Magnum/Math/Test/QuaternionTest.cpp b/src/Magnum/Math/Test/QuaternionTest.cpp index 9aee96466..106c3a366 100644 --- a/src/Magnum/Math/Test/QuaternionTest.cpp +++ b/src/Magnum/Math/Test/QuaternionTest.cpp @@ -406,6 +406,7 @@ void QuaternionTest::matrix() { #if defined(CORRADE_TARGET_ANDROID) && __GNUC__*100 + __GNUC_MINOR__*10 + __GNUC_PATCHLEVEL__ == 490 #pragma GCC push_options #pragma GCC optimize("O0") +#endif void QuaternionTest::lerp() { Quaternion a = Quaternion::rotation(Deg(15.0f), Vector3(1.0f/Constants::sqrt3())); Quaternion b = Quaternion::rotation(Deg(23.0f), Vector3::xAxis()); @@ -423,6 +424,7 @@ void QuaternionTest::lerp() { Quaternion lerp = Math::lerp(a, b, 0.35f); CORRADE_COMPARE(lerp, Quaternion({0.119127f, 0.049134f, 0.049134f}, 0.990445f)); } +#if defined(CORRADE_TARGET_ANDROID) && __GNUC__*100 + __GNUC_MINOR__*10 + __GNUC_PATCHLEVEL__ == 490 #pragma GCC pop_options #endif From 28d7400a8241cbe0ce20a0f6c71fd4d8d3282671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 6 Jun 2016 21:16:14 +0200 Subject: [PATCH 024/290] Math: doc++ --- src/Magnum/Math/Vector.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Math/Vector.h b/src/Magnum/Math/Vector.h index 8d8fc5bcf..0da186eb4 100644 --- a/src/Magnum/Math/Vector.h +++ b/src/Magnum/Math/Vector.h @@ -1356,7 +1356,7 @@ template inline T Vector::max() const { namespace Corrade { namespace Utility { -/** @configurationvalue{Magnum::Math::RectangularMatrix} */ +/** @configurationvalue{Magnum::Math::Vector} */ template struct ConfigurationValue> { ConfigurationValue() = delete; From 9508d94aae499358e333b6ba6c006ddef81ab95d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 6 Jun 2016 21:16:43 +0200 Subject: [PATCH 025/290] Math: ability to save and restore Deg and Rad from configuration. --- src/Magnum/Math/Angle.h | 34 ++++++++++++++++++++++++++++++ src/Magnum/Math/Test/AngleTest.cpp | 29 ++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Math/Angle.h b/src/Magnum/Math/Angle.h index c5d40cdf4..e84335d23 100644 --- a/src/Magnum/Math/Angle.h +++ b/src/Magnum/Math/Angle.h @@ -268,4 +268,38 @@ extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utili }} +namespace Corrade { namespace Utility { + +/** @configurationvalue{Magnum::Math::Deg} */ +template struct ConfigurationValue> { + ConfigurationValue() = delete; + + /** @brief Writes degrees as a number */ + static std::string toString(const Magnum::Math::Deg& value, ConfigurationValueFlags flags) { + return ConfigurationValue::toString(T(value), flags); + } + + /** @brief Reads degrees as a number */ + static Magnum::Math::Deg fromString(const std::string& stringValue, ConfigurationValueFlags flags) { + return Magnum::Math::Deg(ConfigurationValue::fromString(stringValue, flags)); + } +}; + +/** @configurationvalue{Magnum::Math::Rad} */ +template struct ConfigurationValue> { + ConfigurationValue() = delete; + + /** @brief Writes degrees as a number */ + static std::string toString(const Magnum::Math::Rad& value, ConfigurationValueFlags flags) { + return ConfigurationValue::toString(T(value), flags); + } + + /** @brief Reads degrees as a number */ + static Magnum::Math::Rad fromString(const std::string& stringValue, ConfigurationValueFlags flags) { + return Magnum::Math::Rad(ConfigurationValue::fromString(stringValue, flags)); + } +}; + +}} + #endif diff --git a/src/Magnum/Math/Test/AngleTest.cpp b/src/Magnum/Math/Test/AngleTest.cpp index 43843e70a..aaef1c5cf 100644 --- a/src/Magnum/Math/Test/AngleTest.cpp +++ b/src/Magnum/Math/Test/AngleTest.cpp @@ -25,6 +25,7 @@ #include #include +#include #include "Magnum/Math/Angle.h" @@ -40,6 +41,8 @@ struct AngleTest: Corrade::TestSuite::Tester { void debugDeg(); void debugRad(); + void configurationDeg(); + void configurationRad(); }; typedef Math::Deg Deg; @@ -56,7 +59,9 @@ AngleTest::AngleTest() { &AngleTest::conversion, &AngleTest::debugDeg, - &AngleTest::debugRad}); + &AngleTest::debugRad, + &AngleTest::configurationDeg, + &AngleTest::configurationRad}); } void AngleTest::construct() { @@ -175,6 +180,28 @@ void AngleTest::debugRad() { CORRADE_COMPARE(o.str(), "Rad(-1.5708)\n"); } +void AngleTest::configurationDeg() { + Corrade::Utility::Configuration c; + + Deg angle{25.3f}; + std::string value("25.3"); + + c.setValue("angle", angle); + CORRADE_COMPARE(c.value("angle"), value); + CORRADE_COMPARE(c.value("angle"), angle); +} + +void AngleTest::configurationRad() { + Corrade::Utility::Configuration c; + + Rad angle{3.14159f}; + std::string value("3.14159"); + + c.setValue("angle", angle); + CORRADE_COMPARE(c.value("angle"), value); + CORRADE_COMPARE(c.value("angle"), angle); +} + }}} CORRADE_TEST_MAIN(Magnum::Math::Test::AngleTest) From 02c1c8cfd4468282c0457b5512d6686357467c28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 7 Jun 2016 21:33:59 +0200 Subject: [PATCH 026/290] Platform: don't copy windowless app docs from windowed apps. The docs weren't correct in 90% cases -- mainly in case of createContext() function, docs of which were extended to clearly specify what's done inside. --- src/Magnum/Platform/Sdl2Application.h | 3 +- .../Platform/WindowlessCglApplication.h | 40 +++++++++++++++-- .../Platform/WindowlessEglApplication.h | 35 +++++++++++++-- .../Platform/WindowlessGlxApplication.h | 44 +++++++++++++++++-- .../Platform/WindowlessIosApplication.h | 35 +++++++++++++-- .../Platform/WindowlessNaClApplication.h | 35 +++++++++++++-- .../Platform/WindowlessWglApplication.h | 44 +++++++++++++++++-- .../WindowlessWindowsEglApplication.h | 35 +++++++++++++-- 8 files changed, 242 insertions(+), 29 deletions(-) diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index 110a62436..b18bf7c4c 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -342,7 +342,8 @@ class Sdl2Application { * * Creates application with default or user-specified configuration. * See @ref Configuration for more information. The program exits if - * the context cannot be created, see below for an alternative. + * the context cannot be created, see @ref tryCreateContext() for an + * alternative. */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit Sdl2Application(const Arguments& arguments, const Configuration& configuration = Configuration()); diff --git a/src/Magnum/Platform/WindowlessCglApplication.h b/src/Magnum/Platform/WindowlessCglApplication.h index 374fa864c..693fe8ee8 100644 --- a/src/Magnum/Platform/WindowlessCglApplication.h +++ b/src/Magnum/Platform/WindowlessCglApplication.h @@ -106,7 +106,16 @@ class WindowlessCglApplication { class Configuration; - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, const Configuration&) */ + /** + * @brief Default constructor + * @param arguments Application arguments + * @param configuration Configuration + * + * Creates application with default or user-specified configuration. + * See @ref Configuration for more information. The program exits if + * the context cannot be created, see @ref tryCreateContext() for an + * alternative. + */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessCglApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); #else @@ -115,7 +124,13 @@ class WindowlessCglApplication { explicit WindowlessCglApplication(const Arguments& arguments); #endif - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, std::nullptr_t) */ + /** + * @brief Constructor + * @param arguments Application arguments + * + * Unlike above, the context is not created and must be created later + * with @ref createContext() or @ref tryCreateContext(). + */ explicit WindowlessCglApplication(const Arguments& arguments, std::nullptr_t); /** @brief Copying is not allowed */ @@ -144,7 +159,19 @@ class WindowlessCglApplication { thus this is faster than public pure virtual destructor */ ~WindowlessCglApplication(); - /** @copydoc Sdl2Application::createContext() */ + /** + * @brief Create context with given configuration + * + * Must be called if and only if the context wasn't created by the + * constructor itself. Error message is printed and the program exits + * if the context cannot be created, see @ref tryCreateContext() for an + * alternative. + * + * On desktop GL, if version is not specified in @p configuration, the + * application first tries to create core context (OpenGL 3.2+), if + * that fails, tries OpenGL 3.0+ and as a last attempt falls back to + * compatibility OpenGL 2.1 context. + */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); #else @@ -153,7 +180,12 @@ class WindowlessCglApplication { void createContext(); #endif - /** @copydoc Sdl2Application::tryCreateContext() */ + /** + * @brief Try to create context with given configuration + * + * Unlike @ref createContext() returns `false` if the context cannot be + * created, `true` otherwise. + */ bool tryCreateContext(const Configuration& configuration); private: diff --git a/src/Magnum/Platform/WindowlessEglApplication.h b/src/Magnum/Platform/WindowlessEglApplication.h index 034e66b0d..b262ef3f7 100644 --- a/src/Magnum/Platform/WindowlessEglApplication.h +++ b/src/Magnum/Platform/WindowlessEglApplication.h @@ -106,7 +106,16 @@ class WindowlessEglApplication { class Configuration; - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, const Configuration&) */ + /** + * @brief Default constructor + * @param arguments Application arguments + * @param configuration Configuration + * + * Creates application with default or user-specified configuration. + * See @ref Configuration for more information. The program exits if + * the context cannot be created, see @ref tryCreateContext() for an + * alternative. + */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessEglApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); #else @@ -115,7 +124,13 @@ class WindowlessEglApplication { explicit WindowlessEglApplication(const Arguments& arguments); #endif - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, std::nullptr_t) */ + /** + * @brief Constructor + * @param arguments Application arguments + * + * Unlike above, the context is not created and must be created later + * with @ref createContext() or @ref tryCreateContext(). + */ explicit WindowlessEglApplication(const Arguments& arguments, std::nullptr_t); /** @brief Copying is not allowed */ @@ -144,7 +159,14 @@ class WindowlessEglApplication { thus this is faster than public pure virtual destructor */ ~WindowlessEglApplication(); - /** @copydoc Sdl2Application::createContext() */ + /** + * @brief Create context with given configuration + * + * Must be called if and only if the context wasn't created by the + * constructor itself. Error message is printed and the program exits + * if the context cannot be created, see @ref tryCreateContext() for an + * alternative. + */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); #else @@ -153,7 +175,12 @@ class WindowlessEglApplication { void createContext(); #endif - /** @copydoc Sdl2Application::tryCreateContext() */ + /** + * @brief Try to create context with given configuration + * + * Unlike @ref createContext() returns `false` if the context cannot be + * created, `true` otherwise. + */ bool tryCreateContext(const Configuration& configuration); private: diff --git a/src/Magnum/Platform/WindowlessGlxApplication.h b/src/Magnum/Platform/WindowlessGlxApplication.h index bdc2d9ee2..0e7325957 100644 --- a/src/Magnum/Platform/WindowlessGlxApplication.h +++ b/src/Magnum/Platform/WindowlessGlxApplication.h @@ -109,7 +109,16 @@ class WindowlessGlxApplication { class Configuration; - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, const Configuration&) */ + /** + * @brief Default constructor + * @param arguments Application arguments + * @param configuration Configuration + * + * Creates application with default or user-specified configuration. + * See @ref Configuration for more information. The program exits if + * the context cannot be created, see @ref tryCreateContext() for an + * alternative. + */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessGlxApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); #else @@ -118,7 +127,13 @@ class WindowlessGlxApplication { explicit WindowlessGlxApplication(const Arguments& arguments); #endif - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, std::nullptr_t) */ + /** + * @brief Constructor + * @param arguments Application arguments + * + * Unlike above, the context is not created and must be created later + * with @ref createContext() or @ref tryCreateContext(). + */ explicit WindowlessGlxApplication(const Arguments& arguments, std::nullptr_t); /** @brief Copying is not allowed */ @@ -147,7 +162,23 @@ class WindowlessGlxApplication { thus this is faster than public pure virtual destructor */ ~WindowlessGlxApplication(); - /** @copydoc Sdl2Application::createContext() */ + /** + * @brief Create context with given configuration + * + * Must be called if and only if the context wasn't created by the + * constructor itself. Error message is printed and the program exits + * if the context cannot be created, see @ref tryCreateContext() for an + * alternative. + * + * On desktop GL, if version is not specified in @p configuration, the + * application first tries to create core context (OpenGL 3.1+) and if + * that fails, falls back to compatibility OpenGL 2.1 context. However, + * on binary AMD and NVidia drivers, creating core context does not use + * the largest available version. If the application detects such case, + * the core context is destroyed and compatibility OpenGL 2.1 context + * is created instead to make the driver use the latest available + * version. + */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); #else @@ -156,7 +187,12 @@ class WindowlessGlxApplication { void createContext(); #endif - /** @copydoc Sdl2Application::tryCreateContext() */ + /** + * @brief Try to create context with given configuration + * + * Unlike @ref createContext() returns `false` if the context cannot be + * created, `true` otherwise. + */ bool tryCreateContext(const Configuration& configuration); private: diff --git a/src/Magnum/Platform/WindowlessIosApplication.h b/src/Magnum/Platform/WindowlessIosApplication.h index aa08accdb..459afc39a 100644 --- a/src/Magnum/Platform/WindowlessIosApplication.h +++ b/src/Magnum/Platform/WindowlessIosApplication.h @@ -102,7 +102,16 @@ class WindowlessIosApplication { class Configuration; - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, const Configuration&) */ + /** + * @brief Default constructor + * @param arguments Application arguments + * @param configuration Configuration + * + * Creates application with default or user-specified configuration. + * See @ref Configuration for more information. The program exits if + * the context cannot be created, see @ref tryCreateContext() for an + * alternative. + */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessIosApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); #else @@ -111,7 +120,13 @@ class WindowlessIosApplication { explicit WindowlessIosApplication(const Arguments& arguments); #endif - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, std::nullptr_t) */ + /** + * @brief Constructor + * @param arguments Application arguments + * + * Unlike above, the context is not created and must be created later + * with @ref createContext() or @ref tryCreateContext(). + */ explicit WindowlessIosApplication(const Arguments& arguments, std::nullptr_t); /** @brief Copying is not allowed */ @@ -140,7 +155,14 @@ class WindowlessIosApplication { thus this is faster than public pure virtual destructor */ ~WindowlessIosApplication(); - /** @copydoc Sdl2Application::createContext() */ + /** + * @brief Create context with given configuration + * + * Must be called if and only if the context wasn't created by the + * constructor itself. Error message is printed and the program exits + * if the context cannot be created, see @ref tryCreateContext() for an + * alternative. + */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); #else @@ -149,7 +171,12 @@ class WindowlessIosApplication { void createContext(); #endif - /** @copydoc Sdl2Application::tryCreateContext() */ + /** + * @brief Try to create context with given configuration + * + * Unlike @ref createContext() returns `false` if the context cannot be + * created, `true` otherwise. + */ bool tryCreateContext(const Configuration& configuration); private: diff --git a/src/Magnum/Platform/WindowlessNaClApplication.h b/src/Magnum/Platform/WindowlessNaClApplication.h index 1156a16dd..b130f475a 100644 --- a/src/Magnum/Platform/WindowlessNaClApplication.h +++ b/src/Magnum/Platform/WindowlessNaClApplication.h @@ -113,7 +113,16 @@ class WindowlessNaClApplication: public pp::Instance, public pp::Graphics3DClien class Configuration; - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, const Configuration&) */ + /** + * @brief Default constructor + * @param arguments Application arguments + * @param configuration Configuration + * + * Creates application with default or user-specified configuration. + * See @ref Configuration for more information. The program exits if + * the context cannot be created, see @ref tryCreateContext() for an + * alternative. + */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessNaClApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); #else @@ -122,7 +131,13 @@ class WindowlessNaClApplication: public pp::Instance, public pp::Graphics3DClien explicit WindowlessNaClApplication(const Arguments& arguments); #endif - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, std::nullptr_t) */ + /** + * @brief Constructor + * @param arguments Application arguments + * + * Unlike above, the context is not created and must be created later + * with @ref createContext() or @ref tryCreateContext(). + */ explicit WindowlessNaClApplication(const Arguments& arguments, std::nullptr_t); /** @brief Copying is not allowed */ @@ -156,7 +171,14 @@ class WindowlessNaClApplication: public pp::Instance, public pp::Graphics3DClien thus this is faster than public pure virtual destructor */ ~WindowlessNaClApplication(); - /** @copydoc Sdl2Application::createContext() */ + /** + * @brief Create context with given configuration + * + * Must be called if and only if the context wasn't created by the + * constructor itself. Error message is printed and the program exits + * if the context cannot be created, see @ref tryCreateContext() for an + * alternative. + */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); #else @@ -165,7 +187,12 @@ class WindowlessNaClApplication: public pp::Instance, public pp::Graphics3DClien void createContext(); #endif - /** @copydoc Sdl2Application::tryCreateContext() */ + /** + * @brief Try to create context with given configuration + * + * Unlike @ref createContext() returns `false` if the context cannot be + * created, `true` otherwise. + */ bool tryCreateContext(const Configuration& configuration); private: diff --git a/src/Magnum/Platform/WindowlessWglApplication.h b/src/Magnum/Platform/WindowlessWglApplication.h index d5cfd2545..0b5b4f6d4 100644 --- a/src/Magnum/Platform/WindowlessWglApplication.h +++ b/src/Magnum/Platform/WindowlessWglApplication.h @@ -117,7 +117,16 @@ class WindowlessWglApplication { static int create(LRESULT(CALLBACK windowProcedure)(HWND, UINT, WPARAM, LPARAM)); #endif - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, const Configuration&) */ + /** + * @brief Default constructor + * @param arguments Application arguments + * @param configuration Configuration + * + * Creates application with default or user-specified configuration. + * See @ref Configuration for more information. The program exits if + * the context cannot be created, see @ref tryCreateContext() for an + * alternative. + */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessWglApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); #else @@ -126,7 +135,13 @@ class WindowlessWglApplication { explicit WindowlessWglApplication(const Arguments& arguments); #endif - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, std::nullptr_t) */ + /** + * @brief Constructor + * @param arguments Application arguments + * + * Unlike above, the context is not created and must be created later + * with @ref createContext() or @ref tryCreateContext(). + */ explicit WindowlessWglApplication(const Arguments& arguments, std::nullptr_t); /** @brief Copying is not allowed */ @@ -155,7 +170,23 @@ class WindowlessWglApplication { thus this is faster than public pure virtual destructor */ ~WindowlessWglApplication(); - /** @copydoc Sdl2Application::createContext() */ + /** + * @brief Create context with given configuration + * + * Must be called if and only if the context wasn't created by the + * constructor itself. Error message is printed and the program exits + * if the context cannot be created, see @ref tryCreateContext() for an + * alternative. + * + * On desktop GL, if version is not specified in @p configuration, the + * application first tries to create core context (OpenGL 3.1+) and if + * that fails, falls back to compatibility OpenGL 2.1 context. However, + * on binary AMD and NVidia drivers, creating core context does not use + * the largest available version. If the application detects such case, + * the core context is destroyed and compatibility OpenGL 2.1 context + * is created instead to make the driver use the latest available + * version. + */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); #else @@ -164,7 +195,12 @@ class WindowlessWglApplication { void createContext(); #endif - /** @copydoc Sdl2Application::tryCreateContext() */ + /** + * @brief Try to create context with given configuration + * + * Unlike @ref createContext() returns `false` if the context cannot be + * created, `true` otherwise. + */ bool tryCreateContext(const Configuration& configuration); private: diff --git a/src/Magnum/Platform/WindowlessWindowsEglApplication.h b/src/Magnum/Platform/WindowlessWindowsEglApplication.h index 3910d8be1..87c6e663f 100644 --- a/src/Magnum/Platform/WindowlessWindowsEglApplication.h +++ b/src/Magnum/Platform/WindowlessWindowsEglApplication.h @@ -112,7 +112,16 @@ class WindowlessWindowsEglApplication { static int create(LRESULT(CALLBACK windowProcedure)(HWND, UINT, WPARAM, LPARAM)); #endif - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, const Configuration&) */ + /** + * @brief Default constructor + * @param arguments Application arguments + * @param configuration Configuration + * + * Creates application with default or user-specified configuration. + * See @ref Configuration for more information. The program exits if + * the context cannot be created, see @ref tryCreateContext() for an + * alternative. + */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessWindowsEglApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); #else @@ -121,7 +130,13 @@ class WindowlessWindowsEglApplication { explicit WindowlessWindowsEglApplication(const Arguments& arguments); #endif - /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, std::nullptr_t) */ + /** + * @brief Constructor + * @param arguments Application arguments + * + * Unlike above, the context is not created and must be created later + * with @ref createContext() or @ref tryCreateContext(). + */ explicit WindowlessWindowsEglApplication(const Arguments& arguments, std::nullptr_t); /** @brief Copying is not allowed */ @@ -150,7 +165,14 @@ class WindowlessWindowsEglApplication { thus this is faster than public pure virtual destructor */ ~WindowlessWindowsEglApplication(); - /** @copydoc Sdl2Application::createContext() */ + /** + * @brief Create context with given configuration + * + * Must be called if and only if the context wasn't created by the + * constructor itself. Error message is printed and the program exits + * if the context cannot be created, see @ref tryCreateContext() for an + * alternative. + */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); #else @@ -159,7 +181,12 @@ class WindowlessWindowsEglApplication { void createContext(); #endif - /** @copydoc Sdl2Application::tryCreateContext() */ + /** + * @brief Try to create context with given configuration + * + * Unlike @ref createContext() returns `false` if the context cannot be + * created, `true` otherwise. + */ bool tryCreateContext(const Configuration& configuration); private: From 942ce73f834329423967f723a4ff2782af1a069b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 8 Jun 2016 00:15:25 +0200 Subject: [PATCH 027/290] doc: don't use deprecated functionality. --- doc/getting-started.dox | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/getting-started.dox b/doc/getting-started.dox index 57e6c2634..6e38841c9 100644 --- a/doc/getting-started.dox +++ b/doc/getting-started.dox @@ -211,10 +211,12 @@ First include the needed headers: And in the constructor (which is currently empty) change the clear color and print something to debug output: @code +using namespace Magnum::Math::Literals; + Renderer::setClearColor(Color3::fromHSV(216.0_degf, 0.85f, 1.0f)); -Debug() << "Hello! This application is running on" << Context::current()->version() - << "using" << Context::current()->rendererString(); +Debug() << "Hello! This application is running on" << Context::current().version() + << "using" << Context::current().rendererString(); @endcode After rebuilding and starting the application, the clear color changes to From dd0563300176f0faa50c0766cb97d5e376dbd802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 8 Jun 2016 13:26:07 +0200 Subject: [PATCH 028/290] doc: clarify how to specify path to SDL2 in Getting Started Guide. --- doc/getting-started.dox | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/getting-started.dox b/doc/getting-started.dox index 6e38841c9..1f2bc1b42 100644 --- a/doc/getting-started.dox +++ b/doc/getting-started.dox @@ -188,6 +188,13 @@ where to create build directory, allows you to specify initial CMake parameters (e.g. the `-DWITH_SDL2APPLICATION=ON` parameter) and then you can just press *Configure* and everything is ready to be built. +If you have SDL2 in a non-standard location and CMake can't find it, you need +to specify where SDL `include/` and `lib/` directories are through +`CMAKE_PREFIX_PATH`. So, for example, on Windows, the full CMake invocation +might look like this: + + cmake .. -DCMAKE_PREFIX_PATH="C:/Users/you/Downloads/SDL2-2.0.4" -DWITH_SDL2APPLICATION=ON + On Windows you may get errors about missing DLLs when running the application. The solution is either compiling everything as static (enable `BUILD_STATIC` CMake option) or installing the dependencies somewhere. To install them, change From 563888e02ef82f752e1e906d8191ed49e7080eff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 8 Jun 2016 13:28:13 +0200 Subject: [PATCH 029/290] Platform: fix copypaste error in GLFW application. --- src/Magnum/Platform/GlfwApplication.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Platform/GlfwApplication.cpp b/src/Magnum/Platform/GlfwApplication.cpp index ff2ffddc7..7753bb9f1 100644 --- a/src/Magnum/Platform/GlfwApplication.cpp +++ b/src/Magnum/Platform/GlfwApplication.cpp @@ -89,7 +89,7 @@ bool GlfwApplication::tryCreateContext(const Configuration& configuration) { glfwWindowHint(GLFW_ICONIFIED, flags >= Configuration::WindowFlag::Minimized); glfwWindowHint(GLFW_FLOATING, flags >= Configuration::WindowFlag::Floating); } - glfwWindowHint(GLFW_FLOATING, configuration.windowFlags() >= Configuration::WindowFlag::Focused); + glfwWindowHint(GLFW_FOCUSED, configuration.windowFlags() >= Configuration::WindowFlag::Focused); /* Context window hints */ glfwWindowHint(GLFW_SAMPLES, configuration.sampleCount()); From 04983da23a503d68bddcc0ab416c81bf22a9f910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 10 Jun 2016 16:57:34 +0200 Subject: [PATCH 030/290] Don't use EXT_DSA function in ARB_DSA path. Good news: this should fix the Object Picking example on Mesa, finally. --- src/Magnum/AbstractFramebuffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/AbstractFramebuffer.cpp b/src/Magnum/AbstractFramebuffer.cpp index d5ced3a92..03a9cc61d 100644 --- a/src/Magnum/AbstractFramebuffer.cpp +++ b/src/Magnum/AbstractFramebuffer.cpp @@ -467,7 +467,7 @@ void AbstractFramebuffer::readBufferImplementationDefault(GLenum buffer) { #ifndef MAGNUM_TARGET_GLES void AbstractFramebuffer::readBufferImplementationDSA(const GLenum buffer) { - glFramebufferReadBufferEXT(_id, buffer); + glNamedFramebufferReadBuffer(_id, buffer); } void AbstractFramebuffer::readBufferImplementationDSAEXT(GLenum buffer) { From b5816196c019775bf57838a2d989cce846b77505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 13 Jun 2016 07:57:53 +0200 Subject: [PATCH 031/290] Explicitly use Magnum::Math::Literals namespace. --- doc/generated/hello.cpp | 1 + doc/generated/shaders.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/doc/generated/hello.cpp b/doc/generated/hello.cpp index 807f3c280..2af5e7207 100644 --- a/doc/generated/hello.cpp +++ b/doc/generated/hello.cpp @@ -31,6 +31,7 @@ #include using namespace Magnum; +using namespace Magnum::Math::Literals; class Hello: public Platform::Application { public: diff --git a/doc/generated/shaders.cpp b/doc/generated/shaders.cpp index edf4cc11f..4b2f83f11 100644 --- a/doc/generated/shaders.cpp +++ b/doc/generated/shaders.cpp @@ -67,6 +67,7 @@ #include "configure.h" using namespace Magnum; +using namespace Magnum::Math::Literals; struct ShaderVisualizer: Platform::WindowlessApplication { using Platform::WindowlessApplication::WindowlessApplication; From 9613e0b2b259ee5963332275c84d4a7fdff4696b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 14 Jun 2016 08:28:32 +0200 Subject: [PATCH 032/290] modules: properly handle platforms with empty CMAKE_FIND_LIBRARY_PREFIXES. For example Windows with MSVC. The variable is set to empty list, which we need to preserve when setting it back. Otherwise CMake complains loudly. --- modules/FindMagnum.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/FindMagnum.cmake b/modules/FindMagnum.cmake index 5c88350fe..ef0058348 100644 --- a/modules/FindMagnum.cmake +++ b/modules/FindMagnum.cmake @@ -422,7 +422,7 @@ foreach(_component ${Magnum_FIND_COMPONENTS}) MAGNUM_${_COMPONENT}_LIBRARY_RELEASE) # Reset back - set(CMAKE_FIND_LIBRARY_PREFIXES ${_tmp_prefixes}) + set(CMAKE_FIND_LIBRARY_PREFIXES "${_tmp_prefixes}") endif() # Library location for libraries/plugins From 62c5479732f5c9614dac215d639b4b633bd9669c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 15 Jun 2016 08:51:59 +0200 Subject: [PATCH 033/290] doc: improve crosscompiling variables documentation. --- doc/building.dox | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/building.dox b/doc/building.dox index 30cf47620..06d589a87 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -378,8 +378,9 @@ contents in `toolchains/` subdirectory. git submodule update Note that CMake for some reason treats `CMAKE_PREFIX_PATH` and -`CMAKE_INSTALL_PREFIX` differently while crosscompiling and you may need to set -also `CMAKE_FIND_ROOT_PATH` to make it able to find the dependencies. +`CMAKE_INSTALL_PREFIX` differently while crosscompiling and you may need to add +dependency paths to both `CMAKE_PREFIX_PATH` and `CMAKE_FIND_ROOT_PATH` to make +it able to find the dependencies. @subsection building-cross-winrt Crosscompiling for Windows RT From c817f8412e590b1f499261b2c7c37a5434ce0f07 Mon Sep 17 00:00:00 2001 From: Elliot Saba Date: Mon, 13 Jun 2016 15:04:49 -0700 Subject: [PATCH 034/290] Allow horizontal-only scrolling --- src/Magnum/Platform/Sdl2Application.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index 3de708987..6e6ff6235 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -378,12 +378,11 @@ void Sdl2Application::mainLoop() { event.type == SDL_MOUSEBUTTONDOWN ? mousePressEvent(e) : mouseReleaseEvent(e); } break; - case SDL_MOUSEWHEEL: - if(event.wheel.y != 0) { - MouseEvent e(event.wheel.y > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {event.wheel.x, event.wheel.y}, 0); - mousePressEvent(e); - } break; - + case SDL_MOUSEWHEEL: { + MouseEvent e(event.wheel.y > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {event.wheel.x, event.wheel.y}, 0); + mousePressEvent(e); + break; + } case SDL_MOUSEMOTION: { MouseMoveEvent e({event.motion.x, event.motion.y}, {event.motion.xrel, event.motion.yrel}, static_cast(event.motion.state)); mouseMoveEvent(e); From 5ae55c15c7489586de239d7b5163f1113f9a1601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 15 Jun 2016 09:47:20 +0200 Subject: [PATCH 035/290] Platform: doc++ --- src/Magnum/Platform/GlfwApplication.h | 4 ++-- src/Magnum/Platform/Sdl2Application.h | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index 77e82bf72..f61565f4b 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -250,8 +250,8 @@ class GlfwApplication { /** * @brief Mouse scroll event * - * Called when a scrolling device is used (mouse wheel or scrolling area - * on touchpad). Default implementation does nothing. + * Called when a scrolling device is used (mouse wheel or scrolling + * area on touchpad). Default implementation does nothing. */ virtual void mouseScrollEvent(MouseScrollEvent& event); diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index b18bf7c4c..304a3bfce 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -1140,7 +1140,12 @@ class Sdl2Application::MouseEvent: public Sdl2Application::InputEvent { /** @brief Button */ constexpr Button button() const { return _button; } - /** @brief Position */ + /** + * @brief Position + * + * For whell events this contains the horizontal and vertical scroll + * amount. + */ constexpr Vector2i position() const { return _position; } /** From b069484a52b0b27a1f384e10ad2c736d3e03ef6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 4 Jun 2016 18:23:39 +0200 Subject: [PATCH 036/290] Updated toolchains submodule. --- toolchains | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolchains b/toolchains index db1c8163e..587043dda 160000 --- a/toolchains +++ b/toolchains @@ -1 +1 @@ -Subproject commit db1c8163e6a43bd8a77029b7080d3a802870b57d +Subproject commit 587043dda17485cdea2c133359c53125af3bbac6 From d8fb555a6a219d33ff6949b05798930a4f55e14b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 4 Jun 2016 23:03:23 +0200 Subject: [PATCH 037/290] package/ci: consistent build directory naming. --- package/ci/travis-ios-simulator.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package/ci/travis-ios-simulator.sh b/package/ci/travis-ios-simulator.sh index 2ca875087..0f70a8623 100755 --- a/package/ci/travis-ios-simulator.sh +++ b/package/ci/travis-ios-simulator.sh @@ -10,8 +10,8 @@ cd corrade # Build native corrade-rc mkdir build && cd build cmake .. \ - -DCMAKE_INSTALL_PREFIX=$HOME/deps \ - -DCMAKE_INSTALL_RPATH=$HOME/deps/lib \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps-native \ + -DCMAKE_INSTALL_RPATH=$HOME/deps-native/lib \ -DWITH_INTERCONNECT=OFF \ -DWITH_PLUGINMANAGER=OFF \ -DWITH_TESTSUITE=OFF \ @@ -25,8 +25,8 @@ cmake .. \ -DCMAKE_TOOLCHAIN_FILE=../../toolchains/generic/iOS.cmake \ -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk \ -DCMAKE_OSX_ARCHITECTURES="x86_64" \ - -DCORRADE_RC_EXECUTABLE=$HOME/deps/bin/corrade-rc \ - -DCMAKE_INSTALL_PREFIX=$HOME/deps-ios \ + -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_STATIC=ON \ -DTESTSUITE_TARGET_XCTEST=ON \ @@ -43,8 +43,8 @@ cmake .. \ -DCMAKE_TOOLCHAIN_FILE=../toolchains/generic/iOS.cmake \ -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk \ -DCMAKE_OSX_ARCHITECTURES="x86_64" \ - -DCORRADE_RC_EXECUTABLE=$HOME/deps/bin/corrade-rc \ - -DCMAKE_PREFIX_PATH="$HOME/deps-ios;$TRAVIS_BUILD_DIR/sdl2" \ + -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ + -DCMAKE_PREFIX_PATH="$HOME/deps;$TRAVIS_BUILD_DIR/sdl2" \ -DCMAKE_BUILD_TYPE=Release \ -DTARGET_GLES2=$TARGET_GLES2 \ -DWITH_AUDIO=ON \ From c13fbae1b8d7f99390f7920cf65f1e0c39919d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 4 Jun 2016 23:04:42 +0200 Subject: [PATCH 038/290] package/ci: don't do what's not needed on iOS Simulator. --- package/ci/travis-ios-simulator.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/package/ci/travis-ios-simulator.sh b/package/ci/travis-ios-simulator.sh index 0f70a8623..82efd42b4 100755 --- a/package/ci/travis-ios-simulator.sh +++ b/package/ci/travis-ios-simulator.sh @@ -57,16 +57,12 @@ cmake .. \ -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ - -DWITH_DISTANCEFIELDCONVERTER=ON \ - -DWITH_FONTCONVERTER=ON \ - -DWITH_MAGNUMINFO=ON \ -DBUILD_STATIC=ON \ -DBUILD_PLUGINS_STATIC=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -G Xcode cmake --build . --config Release | xcpretty -cmake --build . --config Release --target install | xcpretty # TODO: find a better way to avoid # Library not loaded: /System/Library/Frameworks/OpenGLES.framework/OpenGLES # error From e873af7777afa999ccd1ce5301658c2c027295b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 16 Jun 2016 22:11:21 +0200 Subject: [PATCH 039/290] Platform: make text input actually working on Emscripten. The event handlers were still disabled and SDL_IsTexInputActive() needs to be emulated. --- src/Magnum/Platform/Sdl2Application.cpp | 26 +++++++++++++++++++++---- src/Magnum/Platform/Sdl2Application.h | 10 +++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index 6e6ff6235..5dbbe15f5 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -395,7 +395,6 @@ void Sdl2Application::mainLoop() { break; } - #ifndef CORRADE_TARGET_EMSCRIPTEN case SDL_TEXTINPUT: { TextInputEvent e{{event.text.text, std::strlen(event.text.text)}}; textInputEvent(e); @@ -405,7 +404,6 @@ void Sdl2Application::mainLoop() { TextEditingEvent e{{event.edit.text, std::strlen(event.text.text)}, event.edit.start, event.edit.length}; textEditingEvent(e); } break; - #endif case SDL_QUIT: #ifndef CORRADE_TARGET_EMSCRIPTEN @@ -462,12 +460,32 @@ void Sdl2Application::setMouseLocked(bool enabled) { #endif } -#ifndef CORRADE_TARGET_EMSCRIPTEN +bool Sdl2Application::isTextInputActive() { + #ifndef CORRADE_TARGET_EMSCRIPTEN + return SDL_IsTextInputActive(); + #else + return _isTextInputActive; + #endif +} + +void Sdl2Application::startTextInput() { + SDL_StartTextInput(); + #ifdef CORRADE_TARGET_EMSCRIPTEN + _isTextInputActive = true; + #endif +} + +void Sdl2Application::stopTextInput() { + SDL_StopTextInput(); + #ifdef CORRADE_TARGET_EMSCRIPTEN + _isTextInputActive = false; + #endif +} + void Sdl2Application::setTextInputRect(const Range2Di& rect) { SDL_Rect r{rect.min().x(), rect.min().y(), rect.sizeX(), rect.sizeY()}; SDL_SetTextInputRect(&r); } -#endif void Sdl2Application::tickEvent() { /* If this got called, the tick event is not implemented by user and thus diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index 304a3bfce..e9be9a1d5 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -605,9 +605,12 @@ class Sdl2Application { * * If text input is active, text input events go to @ref textInputEvent() * and @ref textEditingEvent(). + * @note Note that in @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten" the + * value is emulated and might not reflect external events like + * closing on-screen keyboard. * @see @ref startTextInput(), @ref stopTextInput() */ - bool isTextInputActive() { return SDL_IsTextInputActive(); } + bool isTextInputActive(); /** * @brief Start text input @@ -617,7 +620,7 @@ class Sdl2Application { * @see @ref stopTextInput(), @ref isTextInputActive(), * @ref setTextInputRect() */ - void startTextInput() { SDL_StartTextInput(); } + void startTextInput(); /** * @brief Stop text input @@ -625,7 +628,7 @@ class Sdl2Application { * @see @ref startTextInput(), @ref isTextInputActive(), @ref textInputEvent() * @ref textEditingEvent() */ - void stopTextInput() { SDL_StopTextInput(); } + void stopTextInput(); /** * @brief Set text input rectangle @@ -683,6 +686,7 @@ class Sdl2Application { UnsignedInt _minimalLoopPeriod; #else SDL_Surface* _glContext; + bool _isTextInputActive = false; #endif std::unique_ptr _context; From 93cf86a076287384e12a048a0b2ca6e23765e156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 8 Jun 2016 19:04:05 +0200 Subject: [PATCH 040/290] Platform: mouse click count is not available in Emscripten. --- src/Magnum/Platform/Sdl2Application.cpp | 13 +++++++++++-- src/Magnum/Platform/Sdl2Application.h | 15 ++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index 5dbbe15f5..37db8dbe4 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -374,15 +374,24 @@ void Sdl2Application::mainLoop() { case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { - MouseEvent e(static_cast(event.button.button), {event.button.x, event.button.y}, event.button.clicks); + MouseEvent e(static_cast(event.button.button), {event.button.x, event.button.y} + #ifndef CORRADE_TARGET_EMSCRIPTEN + , event.button.clicks + #endif + ); event.type == SDL_MOUSEBUTTONDOWN ? mousePressEvent(e) : mouseReleaseEvent(e); } break; case SDL_MOUSEWHEEL: { - MouseEvent e(event.wheel.y > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {event.wheel.x, event.wheel.y}, 0); + MouseEvent e(event.wheel.y > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {event.wheel.x, event.wheel.y} + #ifndef CORRADE_TARGET_EMSCRIPTEN + , 0 + #endif + ); mousePressEvent(e); break; } + case SDL_MOUSEMOTION: { MouseMoveEvent e({event.motion.x, event.motion.y}, {event.motion.xrel, event.motion.yrel}, static_cast(event.motion.state)); mouseMoveEvent(e); diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index e9be9a1d5..5303d24ce 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -1152,12 +1152,15 @@ class Sdl2Application::MouseEvent: public Sdl2Application::InputEvent { */ constexpr Vector2i position() const { return _position; } + #ifndef CORRADE_TARGET_EMSCRIPTEN /** * @brief Click count * * Ignored for wheel events. + * @note Not available in @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten". */ constexpr Int clickCount() const { return _clickCount; } + #endif /** * @brief Modifiers @@ -1167,11 +1170,21 @@ class Sdl2Application::MouseEvent: public Sdl2Application::InputEvent { Modifiers modifiers(); private: - constexpr MouseEvent(Button button, const Vector2i& position, Int clickCount): _button{button}, _position{position}, _clickCount{clickCount}, _modifiersLoaded{false} {} + constexpr MouseEvent(Button button, const Vector2i& position + #ifndef CORRADE_TARGET_EMSCRIPTEN + , Int clickCount + #endif + ): _button{button}, _position{position}, + #ifndef CORRADE_TARGET_EMSCRIPTEN + _clickCount{clickCount}, + #endif + _modifiersLoaded{false} {} const Button _button; const Vector2i _position; + #ifndef CORRADE_TARGET_EMSCRIPTEN const Int _clickCount; + #endif bool _modifiersLoaded; Modifiers _modifiers; }; From c1e45f5e1468e1cc77b357f357fe6c2ba8a34435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 16 Jun 2016 22:52:59 +0200 Subject: [PATCH 041/290] Platform: Sdl2Application::windowSize() is not available in Emscripten. --- src/Magnum/Platform/Sdl2Application.cpp | 2 ++ src/Magnum/Platform/Sdl2Application.h | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index 37db8dbe4..aaa3dfd9e 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -273,11 +273,13 @@ bool Sdl2Application::tryCreateContext(const Configuration& configuration) { return true; } +#ifndef CORRADE_TARGET_EMSCRIPTEN Vector2i Sdl2Application::windowSize() { Vector2i size; SDL_GetWindowSize(_window, &size.x(), &size.y()); return size; } +#endif void Sdl2Application::swapBuffers() { #ifndef CORRADE_TARGET_EMSCRIPTEN diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index 5303d24ce..47f9d1f48 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -421,14 +421,17 @@ class Sdl2Application { /** @{ @name Screen handling */ + #ifndef CORRADE_TARGET_EMSCRIPTEN /** * @brief Window size * * Window size to which all input event coordinates can be related. * Note that especially on HiDPI systems the reported window size might * not be the same as framebuffer size. + * @note Not available in @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten". */ Vector2i windowSize(); + #endif /** * @brief Swap buffers From bc468b60e57c68c531914fae0fe0c01dfd7c3f1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 15 Jun 2016 09:41:02 +0200 Subject: [PATCH 042/290] package/archlinux: build and run Emscripten tests. --- package/archlinux/PKGBUILD-emscripten | 10 ++++++++-- package/archlinux/PKGBUILD-emscripten-webgl2 | 9 +++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/package/archlinux/PKGBUILD-emscripten b/package/archlinux/PKGBUILD-emscripten index 12445e06c..592d7b05a 100644 --- a/package/archlinux/PKGBUILD-emscripten +++ b/package/archlinux/PKGBUILD-emscripten @@ -31,8 +31,14 @@ build() { -DWITH_MAGNUMFONT=ON \ -DWITH_OBJIMPORTER=ON \ -DWITH_TGAIMAGECONVERTER=ON \ - -DWITH_TGAIMPORTER=ON - make + -DWITH_TGAIMPORTER=ON \ + -DBUILD_TESTS=ON + make -j4 +} + +check() { + cd "$_rootdir/build-emscripten" + CORRADE_TEST_COLOR=ON ctest --output-on-failure } package() { diff --git a/package/archlinux/PKGBUILD-emscripten-webgl2 b/package/archlinux/PKGBUILD-emscripten-webgl2 index 5025f842d..9e57decd4 100644 --- a/package/archlinux/PKGBUILD-emscripten-webgl2 +++ b/package/archlinux/PKGBUILD-emscripten-webgl2 @@ -33,8 +33,13 @@ build() { -DWITH_OBJIMPORTER=ON \ -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ - -DWITH_WAVAUDIOIMPORTER=ON - make + -DBUILD_TESTS=ON + make -j4 +} + +check() { + cd "$_rootdir/build-emscripten" + CORRADE_TEST_COLOR=ON ctest --output-on-failure } package() { From 5f36f41817e6ed16b3c6c8a4d1293cf874deb2f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 8 Jun 2016 17:46:58 +0200 Subject: [PATCH 043/290] Make all non-GL tests building and passing on WebGL/Emscripten. Yay! --- CMakeLists.txt | 4 +++ src/Magnum/Math/Test/TypeTraitsTest.cpp | 2 ++ src/Magnum/Test/CMakeLists.txt | 4 ++- src/Magnum/Test/ContextTest.cpp | 4 +++ src/Magnum/Test/DefaultFramebufferTest.cpp | 4 +-- src/Magnum/Test/ImageTest.cpp | 26 +++++++++---------- src/Magnum/Test/ImageViewTest.cpp | 14 +++++----- src/Magnum/Test/PixelStorageTest.cpp | 23 +++++++++++++--- src/Magnum/Test/RendererTest.cpp | 11 +++++++- src/Magnum/Test/SamplerTest.cpp | 6 +++++ src/Magnum/Test/VersionTest.cpp | 8 +++--- .../Text/Test/AbstractFontConverterTest.cpp | 3 +++ src/Magnum/Text/Test/CMakeLists.txt | 13 ++++++++++ src/Magnum/Text/Test/configure.h.cmake | 4 +-- .../Trade/Test/AbstractImageConverterTest.cpp | 3 +++ src/Magnum/Trade/Test/CMakeLists.txt | 12 +++++++++ src/Magnum/Trade/Test/ImageDataTest.cpp | 26 ++++++++++--------- src/Magnum/Trade/Test/configure.h.cmake | 4 +-- .../ObjImporter/Test/CMakeLists.txt | 10 +++++++ .../ObjImporter/Test/configure.h.cmake | 2 +- .../Test/TgaImageConverterTest.cpp | 20 ++++++++++++-- .../TgaImporter/Test/CMakeLists.txt | 10 +++++++ .../TgaImporter/Test/configure.h.cmake | 2 +- 23 files changed, 165 insertions(+), 50 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cd179519..172bf1f48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -207,6 +207,10 @@ if(TARGET_HEADLESS) set(MAGNUM_TARGET_HEADLESS 1) endif() +if(CORRADE_TARGET_EMSCRIPTEN) + include(UseEmscripten) +endif() + if(BUILD_GL_TESTS) if(MAGNUM_TARGET_HEADLESS) set(WITH_WINDOWLESSEGLAPPLICATION ON) diff --git a/src/Magnum/Math/Test/TypeTraitsTest.cpp b/src/Magnum/Math/Test/TypeTraitsTest.cpp index 7f733e6ed..21b8fa33d 100644 --- a/src/Magnum/Math/Test/TypeTraitsTest.cpp +++ b/src/Magnum/Math/Test/TypeTraitsTest.cpp @@ -48,8 +48,10 @@ TypeTraitsTest::TypeTraitsTest() { &TypeTraitsTest::equalsIntegral, &TypeTraitsTest::equalsIntegral, &TypeTraitsTest::equalsIntegral, + #ifndef CORRADE_TARGET_EMSCRIPTEN &TypeTraitsTest::equalsIntegral, &TypeTraitsTest::equalsIntegral, + #endif &TypeTraitsTest::equalsFloatingPoint0, #ifndef MAGNUM_TARGET_GLES &TypeTraitsTest::equalsFloatingPoint0, diff --git a/src/Magnum/Test/CMakeLists.txt b/src/Magnum/Test/CMakeLists.txt index a2bca782f..8675864a1 100644 --- a/src/Magnum/Test/CMakeLists.txt +++ b/src/Magnum/Test/CMakeLists.txt @@ -27,7 +27,9 @@ corrade_add_test(AbstractShaderProgramTest AbstractShaderProgramTest.cpp LIBRARI corrade_add_test(ArrayTest ArrayTest.cpp LIBRARIES Magnum) corrade_add_test(FormatTest FormatTest.cpp LIBRARIES Magnum) corrade_add_test(ContextTest ContextTest.cpp LIBRARIES Magnum) -corrade_add_test(DebugOutputTest DebugOutputTest.cpp LIBRARIES Magnum) +if(NOT MAGNUM_TARGET_WEBGL) + corrade_add_test(DebugOutputTest DebugOutputTest.cpp LIBRARIES Magnum) +endif() corrade_add_test(DefaultFramebufferTest DefaultFramebufferTest.cpp LIBRARIES Magnum) corrade_add_test(FramebufferTest FramebufferTest.cpp LIBRARIES Magnum) corrade_add_test(ImageTest ImageTest.cpp LIBRARIES Magnum) diff --git a/src/Magnum/Test/ContextTest.cpp b/src/Magnum/Test/ContextTest.cpp index 67d9346bf..2a0927ca7 100644 --- a/src/Magnum/Test/ContextTest.cpp +++ b/src/Magnum/Test/ContextTest.cpp @@ -41,9 +41,13 @@ ContextTest::ContextTest() { } void ContextTest::debugFlag() { + #ifdef MAGNUM_TARGET_WEBGL + CORRADE_SKIP("No context flags on Emscripten yet."); + #else std::ostringstream out; Debug(&out) << Context::Flag::Debug; CORRADE_COMPARE(out.str(), "Context::Flag::Debug\n"); + #endif } }} diff --git a/src/Magnum/Test/DefaultFramebufferTest.cpp b/src/Magnum/Test/DefaultFramebufferTest.cpp index 254d5b14c..98f64189a 100644 --- a/src/Magnum/Test/DefaultFramebufferTest.cpp +++ b/src/Magnum/Test/DefaultFramebufferTest.cpp @@ -43,8 +43,8 @@ DefaultFramebufferTest::DefaultFramebufferTest() { void DefaultFramebufferTest::debugStatus() { std::ostringstream out; - Debug(&out) << DefaultFramebuffer::Status::Undefined; - CORRADE_COMPARE(out.str(), "DefaultFramebuffer::Status::Undefined\n"); + Debug(&out) << DefaultFramebuffer::Status::Complete; + CORRADE_COMPARE(out.str(), "DefaultFramebuffer::Status::Complete\n"); } }} diff --git a/src/Magnum/Test/ImageTest.cpp b/src/Magnum/Test/ImageTest.cpp index 224855a2f..5f6e9347c 100644 --- a/src/Magnum/Test/ImageTest.cpp +++ b/src/Magnum/Test/ImageTest.cpp @@ -65,12 +65,12 @@ ImageTest::ImageTest() { } void ImageTest::construct() { - auto data = new char[3]; + auto data = new char[3*4]; Image2D a{PixelStorage{}.setAlignment(1), - PixelFormat::Red, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3}}; + PixelFormat::RGBA, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3*4}}; CORRADE_COMPARE(a.storage().alignment(), 1); - CORRADE_COMPARE(a.format(), PixelFormat::Red); + CORRADE_COMPARE(a.format(), PixelFormat::RGBA); CORRADE_COMPARE(a.type(), PixelType::UnsignedByte); CORRADE_COMPARE(a.size(), Vector2i(1, 3)); CORRADE_COMPARE(a.data(), data); @@ -104,16 +104,16 @@ void ImageTest::constructCopyCompressed() { } void ImageTest::constructMove() { - auto data = new char[3]; + auto data = new char[3*3]; Image2D a{PixelStorage{}.setAlignment(1), - PixelFormat::Red, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3}}; + PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3*3}}; Image2D b(std::move(a)); CORRADE_COMPARE(a.data(), nullptr); CORRADE_COMPARE(a.size(), Vector2i()); CORRADE_COMPARE(b.storage().alignment(), 1); - CORRADE_COMPARE(b.format(), PixelFormat::Red); + CORRADE_COMPARE(b.format(), PixelFormat::RGB); CORRADE_COMPARE(b.type(), PixelType::UnsignedByte); CORRADE_COMPARE(b.size(), Vector2i(1, 3)); CORRADE_COMPARE(b.data(), data); @@ -126,7 +126,7 @@ void ImageTest::constructMove() { CORRADE_COMPARE(b.size(), Vector2i(2, 6)); CORRADE_COMPARE(c.storage().alignment(), 1); - CORRADE_COMPARE(c.format(), PixelFormat::Red); + CORRADE_COMPARE(c.format(), PixelFormat::RGB); CORRADE_COMPARE(c.type(), PixelType::UnsignedByte); CORRADE_COMPARE(c.size(), Vector2i(1, 3)); CORRADE_COMPARE(c.data(), data); @@ -170,9 +170,9 @@ void ImageTest::constructMoveCompressed() { } void ImageTest::setData() { - auto data = new char[3]; + auto data = new char[3*3]; Image2D a{PixelStorage{}.setAlignment(1), - PixelFormat::Red, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3}}; + PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3*3}}; auto data2 = new char[2*2*4]; a.setData(PixelFormat::RGBA, PixelType::UnsignedShort, {2, 1}, Containers::Array{data2, 2*2*4}); @@ -203,13 +203,13 @@ void ImageTest::setDataCompressed() { } void ImageTest::toView() { - auto data = new char[3]; + auto data = new char[3*3]; const Image2D a{PixelStorage{}.setAlignment(1), - PixelFormat::Red, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3}}; + PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3*3}}; ImageView2D b = a; CORRADE_COMPARE(b.storage().alignment(), 1); - CORRADE_COMPARE(b.format(), PixelFormat::Red); + CORRADE_COMPARE(b.format(), PixelFormat::RGB); CORRADE_COMPARE(b.type(), PixelType::UnsignedByte); CORRADE_COMPARE(b.size(), Vector2i(1, 3)); CORRADE_COMPARE(b.data(), data); @@ -235,7 +235,7 @@ void ImageTest::toViewCompressed() { void ImageTest::release() { char data[] = {'c', 'a', 'f', 'e'}; - Image2D a(PixelFormat::Red, PixelType::UnsignedByte, {4, 1}, Containers::Array{data, 4}); + Image2D a(PixelFormat::RGBA, PixelType::UnsignedByte, {1, 1}, Containers::Array{data, 4}); const char* const pointer = a.release().release(); CORRADE_COMPARE(pointer, data); diff --git a/src/Magnum/Test/ImageViewTest.cpp b/src/Magnum/Test/ImageViewTest.cpp index 47074ae7f..45c8cf8df 100644 --- a/src/Magnum/Test/ImageViewTest.cpp +++ b/src/Magnum/Test/ImageViewTest.cpp @@ -51,12 +51,12 @@ ImageViewTest::ImageViewTest() { } void ImageViewTest::construct() { - const char data[3]{}; + const char data[3*3]{}; ImageView2D a{PixelStorage{}.setAlignment(1), - PixelFormat::Red, PixelType::UnsignedByte, {1, 3}, data}; + PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, data}; CORRADE_COMPARE(a.storage().alignment(), 1); - CORRADE_COMPARE(a.format(), PixelFormat::Red); + CORRADE_COMPARE(a.format(), PixelFormat::RGB); CORRADE_COMPARE(a.type(), PixelType::UnsignedByte); CORRADE_COMPARE(a.size(), Vector2i(1, 3)); CORRADE_COMPARE(a.data(), data); @@ -86,14 +86,14 @@ void ImageViewTest::constructCompressed() { } void ImageViewTest::setData() { - const char data[3]{}; + const char data[3*3]{}; ImageView2D a{PixelStorage{}.setAlignment(1), - PixelFormat::Red, PixelType::UnsignedByte, {1, 3}, data}; - const char data2[3]{}; + PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, data}; + const char data2[3*3]{}; a.setData(data2); CORRADE_COMPARE(a.storage().alignment(), 1); - CORRADE_COMPARE(a.format(), PixelFormat::Red); + CORRADE_COMPARE(a.format(), PixelFormat::RGB); CORRADE_COMPARE(a.type(), PixelType::UnsignedByte); CORRADE_COMPARE(a.size(), Vector2i(1, 3)); CORRADE_COMPARE(a.data(), data2); diff --git a/src/Magnum/Test/PixelStorageTest.cpp b/src/Magnum/Test/PixelStorageTest.cpp index 41f96a356..af298516e 100644 --- a/src/Magnum/Test/PixelStorageTest.cpp +++ b/src/Magnum/Test/PixelStorageTest.cpp @@ -38,7 +38,9 @@ struct PixelStorageTest: TestSuite::Tester { void dataProperties(); void dataPropertiesAlignment(); + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) void dataPropertiesRowLength(); + #endif #ifndef MAGNUM_TARGET_GLES2 void dataPropertiesImageHeight(); #endif @@ -61,7 +63,9 @@ PixelStorageTest::PixelStorageTest() { &PixelStorageTest::dataProperties, &PixelStorageTest::dataPropertiesAlignment, + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) &PixelStorageTest::dataPropertiesRowLength, + #endif #ifndef MAGNUM_TARGET_GLES2 &PixelStorageTest::dataPropertiesImageHeight, #endif @@ -81,7 +85,9 @@ PixelStorageTest::PixelStorageTest() { void PixelStorageTest::pixelSize() { CORRADE_COMPARE(PixelStorage::pixelSize(PixelFormat::RGBA, PixelType::UnsignedInt), 4*4); CORRADE_COMPARE(PixelStorage::pixelSize(PixelFormat::DepthComponent, PixelType::UnsignedShort), 2); + #ifndef MAGNUM_TARGET_WEBGL CORRADE_COMPARE(PixelStorage::pixelSize(PixelFormat::StencilIndex, PixelType::UnsignedByte), 1); + #endif CORRADE_COMPARE(PixelStorage::pixelSize(PixelFormat::DepthStencil, PixelType::UnsignedInt248), 4); } @@ -93,12 +99,14 @@ void PixelStorageTest::dataProperties() { (std::tuple{0, {0, 0, 0}, 4})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::RGBA, PixelType::UnsignedByte, Vector3i{1}), (std::tuple{0, {4, 1, 1}, 4})); + #if !defined(MAGNUM_TARGET_WEBGL) && !defined(MAGNUM_TARGET_GLES2) CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {8, 2, 1}), (std::tuple{0, {8, 2, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 1}), (std::tuple{0, {2, 4, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 6}), (std::tuple{0, {2, 4, 6}, 1})); + #endif } void PixelStorageTest::dataPropertiesAlignment() { @@ -110,14 +118,17 @@ void PixelStorageTest::dataPropertiesAlignment() { (std::tuple{3*4, {0, 0, 0}, 4})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::RGBA, PixelType::UnsignedByte, Vector3i{1}), (std::tuple{8 + 16 + 3*4, {8, 1, 1}, 4})); + #if !defined(MAGNUM_TARGET_WEBGL) && !defined(MAGNUM_TARGET_GLES2) CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {8, 2, 1}), (std::tuple{16 + 16 + 3, {8, 2, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 1}), (std::tuple{32 + 16 + 3, {8, 4, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 6}), (std::tuple{32 + 16 + 3, {8, 4, 6}, 1})); + #endif } +#if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) void PixelStorageTest::dataPropertiesRowLength() { PixelStorage storage; storage.setAlignment(4) @@ -135,6 +146,7 @@ void PixelStorageTest::dataPropertiesRowLength() { CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 6}), (std::tuple{3 + 7*16, {16, 4, 6}, 1})); } +#endif #ifndef MAGNUM_TARGET_GLES2 void PixelStorageTest::dataPropertiesImageHeight() { @@ -159,19 +171,24 @@ void PixelStorageTest::dataPropertiesImageHeight() { void PixelStorageTest::dataSize() { /* The same parameters as in PixelStorageGLTest 3D case */ const Image2D image{PixelStorage{}.setAlignment(2) + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) .setRowLength(3) + #endif #ifndef MAGNUM_TARGET_GLES2 .setImageHeight(5) #endif .setSkip({2, 3, 1}), PixelFormat::RGB, PixelType::UnsignedByte}; - #ifndef MAGNUM_TARGET_GLES2 + #if defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2) CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector2i{2, 3}), - 5*10 + 3*10 + 6 + 3*10); - #else + 3*6 + 3*6 + 6 + 3*6); + #elif defined(MAGNUM_TARGET_GLES2) CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector2i{2, 3}), 3*10 + 3*10 + 6 + 3*10); + #else + CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector2i{2, 3}), + 5*10 + 3*10 + 6 + 3*10); #endif } diff --git a/src/Magnum/Test/RendererTest.cpp b/src/Magnum/Test/RendererTest.cpp index 5aaa689c5..5564ccb3b 100644 --- a/src/Magnum/Test/RendererTest.cpp +++ b/src/Magnum/Test/RendererTest.cpp @@ -34,12 +34,19 @@ struct RendererTest: TestSuite::Tester { explicit RendererTest(); void debugError(); + #ifndef MAGNUM_TARGET_WEBGL void debugResetNotificationStrategy(); void debugGraphicsResetStatus(); + #endif }; RendererTest::RendererTest() { - addTests({&RendererTest::debugError}); + addTests({&RendererTest::debugError, + #ifndef MAGNUM_TARGET_WEBGL + &RendererTest::debugResetNotificationStrategy, + &RendererTest::debugGraphicsResetStatus + #endif + }); } void RendererTest::debugError() { @@ -49,6 +56,7 @@ void RendererTest::debugError() { CORRADE_COMPARE(out.str(), "Renderer::Error::InvalidOperation\n"); } +#ifndef MAGNUM_TARGET_WEBGL void RendererTest::debugResetNotificationStrategy() { std::ostringstream out; @@ -62,6 +70,7 @@ void RendererTest::debugGraphicsResetStatus() { Debug(&out) << Renderer::GraphicsResetStatus::GuiltyContextReset; CORRADE_COMPARE(out.str(), "Renderer::GraphicsResetStatus::GuiltyContextReset\n"); } +#endif }} diff --git a/src/Magnum/Test/SamplerTest.cpp b/src/Magnum/Test/SamplerTest.cpp index 621edffde..a7e1a87f6 100644 --- a/src/Magnum/Test/SamplerTest.cpp +++ b/src/Magnum/Test/SamplerTest.cpp @@ -36,8 +36,10 @@ struct SamplerTest: TestSuite::Tester { void debugFilter(); void debugMipmap(); void debugWrapping(); + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) void debugCompareMode(); void debugCompareFunction(); + #endif #ifndef MAGNUM_TARGET_GLES void debugDepthStencilMode(); #endif @@ -47,8 +49,10 @@ SamplerTest::SamplerTest() { addTests({&SamplerTest::debugFilter, &SamplerTest::debugMipmap, &SamplerTest::debugWrapping, + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) &SamplerTest::debugCompareMode, &SamplerTest::debugCompareFunction, + #endif #ifndef MAGNUM_TARGET_GLES &SamplerTest::debugDepthStencilMode #endif @@ -76,6 +80,7 @@ void SamplerTest::debugWrapping() { CORRADE_COMPARE(out.str(), "Sampler::Wrapping::ClampToEdge\n"); } +#if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) void SamplerTest::debugCompareMode() { std::ostringstream out; @@ -89,6 +94,7 @@ void SamplerTest::debugCompareFunction() { Debug(&out) << Sampler::CompareFunction::GreaterOrEqual; CORRADE_COMPARE(out.str(), "Sampler::CompareFunction::GreaterOrEqual\n"); } +#endif #ifndef MAGNUM_TARGET_GLES void SamplerTest::debugDepthStencilMode() { diff --git a/src/Magnum/Test/VersionTest.cpp b/src/Magnum/Test/VersionTest.cpp index d439b7b02..3ce871418 100644 --- a/src/Magnum/Test/VersionTest.cpp +++ b/src/Magnum/Test/VersionTest.cpp @@ -108,10 +108,12 @@ void VersionTest::debug() { Debug(&out) << Version::GLES200; #endif - #ifndef MAGNUM_TARGET_GLES - CORRADE_COMPARE(out.str(), "OpenGL 2.1\n"); - #else + #ifdef MAGNUM_TARGET_WEBGL + CORRADE_COMPARE(out.str(), "WebGL 1.0\n"); + #elif defined(MAGNUM_TARGET_GLES) CORRADE_COMPARE(out.str(), "OpenGL ES 2.0\n"); + #else + CORRADE_COMPARE(out.str(), "OpenGL 2.1\n"); #endif } diff --git a/src/Magnum/Text/Test/AbstractFontConverterTest.cpp b/src/Magnum/Text/Test/AbstractFontConverterTest.cpp index 3cca1727e..28773364c 100644 --- a/src/Magnum/Text/Test/AbstractFontConverterTest.cpp +++ b/src/Magnum/Text/Test/AbstractFontConverterTest.cpp @@ -62,6 +62,9 @@ AbstractFontConverterTest::AbstractFontConverterTest() { &AbstractFontConverterTest::importGlyphCacheFromSingleData, &AbstractFontConverterTest::importGlyphCacheFromFile}); + + /* Create testing dir */ + Utility::Directory::mkpath(TEXT_TEST_OUTPUT_DIR); } namespace { diff --git a/src/Magnum/Text/Test/CMakeLists.txt b/src/Magnum/Text/Test/CMakeLists.txt index 1fe654601..13552d5b9 100644 --- a/src/Magnum/Text/Test/CMakeLists.txt +++ b/src/Magnum/Text/Test/CMakeLists.txt @@ -23,6 +23,14 @@ # DEALINGS IN THE SOFTWARE. # +if(CORRADE_TARGET_EMSCRIPTEN) + set(TEXT_TEST_DIR "") + set(TEXT_TEST_OUTPUT_DIR "/write") +else() + set(TEXT_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + set(TEXT_TEST_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) +endif() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) @@ -32,6 +40,11 @@ corrade_add_test(TextAbstractFontConverterTest AbstractFontConverterTest.cpp LIB target_include_directories(TextAbstractFontConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) corrade_add_test(TextAbstractLayouterTest AbstractLayouterTest.cpp LIBRARIES Magnum MagnumText) +if(CORRADE_TARGET_EMSCRIPTEN) + emscripten_embed_file(TextAbstractFontTest data.bin "/data.bin") + emscripten_embed_file(TextAbstractFontConverterTest data.bin "/data.bin") +endif() + if(BUILD_GL_TESTS) corrade_add_test(TextGlyphCacheGLTest GlyphCacheGLTest.cpp LIBRARIES MagnumText ${GL_TEST_LIBRARIES}) corrade_add_test(TextRendererGLTest RendererGLTest.cpp LIBRARIES MagnumText ${GL_TEST_LIBRARIES}) diff --git a/src/Magnum/Text/Test/configure.h.cmake b/src/Magnum/Text/Test/configure.h.cmake index 96f3e6a59..e3f4cc05d 100644 --- a/src/Magnum/Text/Test/configure.h.cmake +++ b/src/Magnum/Text/Test/configure.h.cmake @@ -23,5 +23,5 @@ DEALINGS IN THE SOFTWARE. */ -#define TEXT_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}" -#define TEXT_TEST_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}" +#define TEXT_TEST_DIR "${TEXT_TEST_DIR}" +#define TEXT_TEST_OUTPUT_DIR "${TEXT_TEST_OUTPUT_DIR}" diff --git a/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp b/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp index fc2b86f2e..d70edd92c 100644 --- a/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp +++ b/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp @@ -45,6 +45,9 @@ class AbstractImageConverterTest: public TestSuite::Tester { AbstractImageConverterTest::AbstractImageConverterTest() { addTests({&AbstractImageConverterTest::exportToFile}); + + /* Create testing dir */ + Utility::Directory::mkpath(TRADE_TEST_OUTPUT_DIR); } void AbstractImageConverterTest::exportToFile() { diff --git a/src/Magnum/Trade/Test/CMakeLists.txt b/src/Magnum/Trade/Test/CMakeLists.txt index ffe52e9c9..6cbc59e29 100644 --- a/src/Magnum/Trade/Test/CMakeLists.txt +++ b/src/Magnum/Trade/Test/CMakeLists.txt @@ -23,6 +23,14 @@ # DEALINGS IN THE SOFTWARE. # +if(CORRADE_TARGET_EMSCRIPTEN) + set(TRADE_TEST_DIR "") + set(TRADE_TEST_OUTPUT_DIR "/write") +else() + set(TRADE_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + set(TRADE_TEST_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) +endif() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) @@ -35,3 +43,7 @@ corrade_add_test(TradeImageDataTest ImageDataTest.cpp LIBRARIES Magnum) corrade_add_test(TradeObjectData2DTest ObjectData2DTest.cpp LIBRARIES Magnum) corrade_add_test(TradeObjectData3DTest ObjectData3DTest.cpp LIBRARIES Magnum) corrade_add_test(TradeTextureDataTest TextureDataTest.cpp LIBRARIES Magnum) + +if(CORRADE_TARGET_EMSCRIPTEN) + emscripten_embed_file(TradeAbstractImporterTest file.bin "/file.bin") +endif() diff --git a/src/Magnum/Trade/Test/ImageDataTest.cpp b/src/Magnum/Trade/Test/ImageDataTest.cpp index f56132e60..ed8674b93 100644 --- a/src/Magnum/Trade/Test/ImageDataTest.cpp +++ b/src/Magnum/Trade/Test/ImageDataTest.cpp @@ -60,13 +60,13 @@ ImageDataTest::ImageDataTest() { } void ImageDataTest::construct() { - auto data = new char[3]; + auto data = new char[3*3]; Trade::ImageData2D a{PixelStorage{}.setAlignment(1), - PixelFormat::Red, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3}}; + PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3*3}}; CORRADE_VERIFY(!a.isCompressed()); CORRADE_COMPARE(a.storage().alignment(), 1); - CORRADE_COMPARE(a.format(), PixelFormat::Red); + CORRADE_COMPARE(a.format(), PixelFormat::RGB); CORRADE_COMPARE(a.type(), PixelType::UnsignedByte); CORRADE_COMPARE(a.size(), Vector2i(1, 3)); CORRADE_COMPARE(a.data(), data); @@ -96,9 +96,9 @@ void ImageDataTest::constructCopy() { } void ImageDataTest::constructMove() { - auto data = new char[3]; + auto data = new char[3*3]; Trade::ImageData2D a{PixelStorage{}.setAlignment(1), - PixelFormat::Red, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3}}; + PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3*3}}; Trade::ImageData2D b(std::move(a)); CORRADE_COMPARE(a.data(), nullptr); @@ -106,7 +106,7 @@ void ImageDataTest::constructMove() { CORRADE_VERIFY(!b.isCompressed()); CORRADE_COMPARE(b.storage().alignment(), 1); - CORRADE_COMPARE(b.format(), PixelFormat::Red); + CORRADE_COMPARE(b.format(), PixelFormat::RGB); CORRADE_COMPARE(b.type(), PixelType::UnsignedByte); CORRADE_COMPARE(b.size(), Vector2i(1, 3)); CORRADE_COMPARE(b.data(), data); @@ -120,7 +120,7 @@ void ImageDataTest::constructMove() { CORRADE_VERIFY(!c.isCompressed()); CORRADE_COMPARE(c.storage().alignment(), 1); - CORRADE_COMPARE(c.format(), PixelFormat::Red); + CORRADE_COMPARE(c.format(), PixelFormat::RGB); CORRADE_COMPARE(c.type(), PixelType::UnsignedByte); CORRADE_COMPARE(c.size(), Vector2i(1, 3)); CORRADE_COMPARE(c.data(), data); @@ -166,13 +166,15 @@ void ImageDataTest::constructMoveCompressed() { } void ImageDataTest::toView() { - auto data = new char[4]; - const Trade::ImageData2D a{PixelFormat::Red, PixelType::UnsignedByte, {4, 1}, Containers::Array{data, 4}}; + auto data = new char[3*3]; + const Trade::ImageData2D a{PixelStorage{}.setAlignment(1), + PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, Containers::Array{data, 3*3}}; ImageView2D b = a; - CORRADE_COMPARE(b.format(), PixelFormat::Red); + CORRADE_COMPARE(b.storage().alignment(), 1); + CORRADE_COMPARE(b.format(), PixelFormat::RGB); CORRADE_COMPARE(b.type(), PixelType::UnsignedByte); - CORRADE_COMPARE(b.size(), Vector2i(4, 1)); + CORRADE_COMPARE(b.size(), Vector2i(1, 3)); CORRADE_COMPARE(b.data(), data); } @@ -189,7 +191,7 @@ void ImageDataTest::toViewCompressed() { void ImageDataTest::release() { char data[] = {'b', 'e', 'e', 'r'}; - Trade::ImageData2D a{PixelFormat::Red, PixelType::UnsignedByte, {4, 1}, Containers::Array{data, 4}}; + Trade::ImageData2D a{PixelFormat::RGBA, PixelType::UnsignedByte, {1, 1}, Containers::Array{data, 4}}; const char* const pointer = a.release().release(); CORRADE_COMPARE(pointer, data); diff --git a/src/Magnum/Trade/Test/configure.h.cmake b/src/Magnum/Trade/Test/configure.h.cmake index d39dc3cdf..017811a26 100644 --- a/src/Magnum/Trade/Test/configure.h.cmake +++ b/src/Magnum/Trade/Test/configure.h.cmake @@ -23,5 +23,5 @@ DEALINGS IN THE SOFTWARE. */ -#define TRADE_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}" -#define TRADE_TEST_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}" +#define TRADE_TEST_DIR "${TRADE_TEST_DIR}" +#define TRADE_TEST_OUTPUT_DIR "${TRADE_TEST_OUTPUT_DIR}" diff --git a/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt b/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt index 134e83d4d..e51873f87 100644 --- a/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt @@ -23,8 +23,18 @@ # DEALINGS IN THE SOFTWARE. # +if(CORRADE_TARGET_EMSCRIPTEN) + set(OBJIMPORTER_TEST_DIR "") +else() + set(OBJIMPORTER_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +endif() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) corrade_add_test(ObjImporterTest Test.cpp LIBRARIES MagnumObjImporterTestLib) target_include_directories(ObjImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + +if(CORRADE_TARGET_EMSCRIPTEN) + emscripten_embed_file(ObjImporterTest "" "/") +endif() diff --git a/src/MagnumPlugins/ObjImporter/Test/configure.h.cmake b/src/MagnumPlugins/ObjImporter/Test/configure.h.cmake index 459564c9c..04d28dd95 100644 --- a/src/MagnumPlugins/ObjImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/ObjImporter/Test/configure.h.cmake @@ -23,4 +23,4 @@ DEALINGS IN THE SOFTWARE. */ -#define OBJIMPORTER_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}" +#define OBJIMPORTER_TEST_DIR "${OBJIMPORTER_TEST_DIR}" diff --git a/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp b/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp index 52b003d27..6b2628058 100644 --- a/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp +++ b/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp @@ -87,18 +87,34 @@ TgaImageConverterTest::TgaImageConverterTest() { } void TgaImageConverterTest::wrongFormat() { - ImageView2D image(PixelFormat::RG, PixelType::UnsignedByte, {}, nullptr); + ImageView2D image{ + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) + PixelFormat::RG, + #else + PixelFormat::LuminanceAlpha, + #endif + PixelType::UnsignedByte, {}, nullptr}; std::ostringstream out; Error redirectError{&out}; const auto data = TgaImageConverter().exportToData(image); CORRADE_VERIFY(!data); + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) CORRADE_COMPARE(out.str(), "Trade::TgaImageConverter::exportToData(): unsupported color format PixelFormat::RG\n"); + #else + CORRADE_COMPARE(out.str(), "Trade::TgaImageConverter::exportToData(): unsupported color format PixelFormat::LuminanceAlpha\n"); + #endif } void TgaImageConverterTest::wrongType() { - ImageView2D image(PixelFormat::Red, PixelType::Float, {}, nullptr); + ImageView2D image{ + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) + PixelFormat::Red, + #else + PixelFormat::Luminance, + #endif + PixelType::Float, {}, nullptr}; std::ostringstream out; Error redirectError{&out}; diff --git a/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt b/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt index e3499dd25..d74826eac 100644 --- a/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt @@ -23,6 +23,12 @@ # DEALINGS IN THE SOFTWARE. # +if(CORRADE_TARGET_EMSCRIPTEN) + set(TGAIMPORTER_TEST_DIR "") +else() + set(TGAIMPORTER_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +endif() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) @@ -35,3 +41,7 @@ target_include_directories(TgaImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) if(WIN32) target_compile_definitions(TgaImporterTest PRIVATE "MAGNUM_TGAIMPORTER_BUILD_STATIC") endif() + +if(CORRADE_TARGET_EMSCRIPTEN) + emscripten_embed_file(TgaImporterTest file.tga "/file.tga") +endif() diff --git a/src/MagnumPlugins/TgaImporter/Test/configure.h.cmake b/src/MagnumPlugins/TgaImporter/Test/configure.h.cmake index cb625138d..9b4aac529 100644 --- a/src/MagnumPlugins/TgaImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/TgaImporter/Test/configure.h.cmake @@ -23,4 +23,4 @@ DEALINGS IN THE SOFTWARE. */ -#define TGAIMPORTER_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}" +#define TGAIMPORTER_TEST_DIR "${TGAIMPORTER_TEST_DIR}" From e2cc33f9d3d401fe4b7c91bc848f64573a1e831c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 17 Jun 2016 18:18:30 +0200 Subject: [PATCH 044/290] Math: don't use std::fma() on Emscripten. With -O2 the test works, but with -O1 the compiler complains about missing instruction. I guess -O2 just optimizes it away in this particular case, so the safe option is to not use it at all. --- src/Magnum/Math/Functions.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Math/Functions.h b/src/Magnum/Math/Functions.h index 3c3ff7b57..333313892 100644 --- a/src/Magnum/Math/Functions.h +++ b/src/Magnum/Math/Functions.h @@ -498,7 +498,10 @@ template inline T fma(const T& a, const T& b, const T& c); #else template inline typename std::enable_if::value, T>::type fma(T a, T b, T c) { /** @todo Remove when newlib has this fixed */ - #if !defined(CORRADE_TARGET_NACL_NEWLIB) && !defined(CORRADE_TARGET_ANDROID) + /* On Emscripten it works with -O2 but not with -O1 (function not defined). + I guess that's only because -O2 optimizes it out, so disabling it there + also */ + #if !defined(CORRADE_TARGET_NACL_NEWLIB) && !defined(CORRADE_TARGET_ANDROID) && !defined(CORRADE_TARGET_EMSCRIPTEN) return std::fma(a, b, c); #else return a*b + c; From c9946bb06b7756bae1f2c821479a97be71b1cd6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 17 Jun 2016 18:19:43 +0200 Subject: [PATCH 045/290] DebugTools: reduce test precision for Emscripten. Again, works w/o problem with -O2, this is just in case of -O1. --- src/Magnum/DebugTools/Test/ForceRendererTest.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Magnum/DebugTools/Test/ForceRendererTest.cpp b/src/Magnum/DebugTools/Test/ForceRendererTest.cpp index 2d4a0c7a3..4f6693860 100644 --- a/src/Magnum/DebugTools/Test/ForceRendererTest.cpp +++ b/src/Magnum/DebugTools/Test/ForceRendererTest.cpp @@ -100,7 +100,12 @@ void ForceRendererTest::arbitrary3D() { /* All vectors are orthogonal */ CORRADE_COMPARE(Math::dot(m.right(), m.up()), 0.0f); + #ifndef CORRADE_TARGET_EMSCRIPTEN CORRADE_COMPARE(Math::dot(m.right(), m.backward()), 0.0f); + #else + /* Emscripten -O1 has slightly lower precision. -O2 works fine. */ + CORRADE_VERIFY(Math::abs(Math::dot(m.right(), m.backward())) < Math::TypeTraits::epsilon()); + #endif /** @todo This shouldn't be too different */ CORRADE_VERIFY(Math::abs(Math::dot(m.up(), m.backward())) < Math::TypeTraits::epsilon()); } From 0d284736e2e8ad3227a5e70c39aa72c2d02258e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 17 Jun 2016 18:20:20 +0200 Subject: [PATCH 046/290] Math: expect test failure with Emscripten and -O1. Works flawlessly with -O2. --- src/Magnum/Math/Test/VectorTest.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Math/Test/VectorTest.cpp b/src/Magnum/Math/Test/VectorTest.cpp index 64c6ec747..2c835d5f4 100644 --- a/src/Magnum/Math/Test/VectorTest.cpp +++ b/src/Magnum/Math/Test/VectorTest.cpp @@ -615,11 +615,23 @@ void VectorTest::subclass() { /* Integral multiplication/division */ CORRADE_COMPARE(Vec2i(2, 4)*1.5f, Vec2i(3, 6)); CORRADE_COMPARE(1.5f*Vec2i(2, 4), Vec2i(3, 6)); - CORRADE_COMPARE(Vec2i(2, 4)/(2.0f/3.0f), Vec2i(3, 6)); + { + #ifdef CORRADE_TARGET_EMSCRIPTEN + CORRADE_EXPECT_FAIL_IF(Vec2i(2, 4)/(2.0f/3.0f) == Vec2i(2, 5), + "Emscripten -O1 misoptimizes the following (-O2 works)."); + #endif + CORRADE_COMPARE(Vec2i(2, 4)/(2.0f/3.0f), Vec2i(3, 6)); + } CORRADE_COMPARE(Vec2i(2, 4)*Vec2(-1.5f, 0.5f), Vec2i(-3, 2)); CORRADE_COMPARE(Vec2(-1.5f, 0.5f)*Vec2i(2, 4), Vec2i(-3, 2)); - CORRADE_COMPARE(Vec2i(2, 4)/Vec2(-2.0f/3.0f, 2.0f), Vec2i(-3, 2)); + { + #ifdef CORRADE_TARGET_EMSCRIPTEN + CORRADE_EXPECT_FAIL_IF(Vec2i(2, 4)/Vec2(-2.0f/3.0f, 2.0f) == Vec2i(-2, 2), + "Emscripten -O1 misoptimizes the following (-O2 works)."); + #endif + CORRADE_COMPARE(Vec2i(2, 4)/Vec2(-2.0f/3.0f, 2.0f), Vec2i(-3, 2)); + } /* Functions */ CORRADE_COMPARE(Vec2(3.0f, 0.0f).normalized(), Vec2(1.0f, 0.0f)); From 4bd958ab8cff936eb6862ee8b8f82367a934a351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 17 Jun 2016 19:58:35 +0200 Subject: [PATCH 047/290] package/ci: build for Emscripten WebGL 1/2 on Travis. --- package/ci/travis-emscripten.sh | 61 +++++++++++++++++++++++++++++++++ package/ci/travis.yml | 10 ++++++ 2 files changed, 71 insertions(+) create mode 100755 package/ci/travis-emscripten.sh diff --git a/package/ci/travis-emscripten.sh b/package/ci/travis-emscripten.sh new file mode 100755 index 000000000..bb8d26002 --- /dev/null +++ b/package/ci/travis-emscripten.sh @@ -0,0 +1,61 @@ +#!/bin/bash +set -ev + +git submodule update --init + +git clone --depth 1 git://github.com/mosra/corrade.git +cd corrade + +# Build native corrade-rc +mkdir build && cd build || exit /b +cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps-native \ + -DCMAKE_INSTALL_RPATH=$HOME/deps-native/lib \ + -DWITH_INTERCONNECT=OFF \ + -DWITH_PLUGINMANAGER=OFF \ + -DWITH_TESTSUITE=OFF +make -j install +cd .. + +# Crosscompile Corrade +mkdir build-emscripten && cd build-emscripten +cmake .. \ + -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ + -DCMAKE_TOOLCHAIN_FILE="../../toolchains/generic/Emscripten.cmake" \ + -DEMSCRIPTEN_PREFIX=$(echo /usr/local/Cellar/emscripten/*/libexec) \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_FLAGS_RELEASE="-DNDEBUG -O1" \ + -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-O1" \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps \ + -DWITH_INTERCONNECT=OFF +make -j install +cd .. + +cd .. + +# Crosscompile +mkdir build-emscripten && cd build-emscripten +cmake .. \ + -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ + -DCMAKE_TOOLCHAIN_FILE="../toolchains/generic/Emscripten.cmake" \ + -DEMSCRIPTEN_PREFIX=$(echo /usr/local/Cellar/emscripten/*/libexec) \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_FLAGS_RELEASE="-DNDEBUG -O1" \ + -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-O1" \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps \ + -DCMAKE_FIND_ROOT_PATH=$HOME/deps \ + -DWITH_AUDIO=OFF \ + -DWITH_SDL2APPLICATION=ON \ + -DWITH_MAGNUMFONT=ON \ + -DWITH_MAGNUMFONTCONVERTER=ON \ + -DWITH_OBJIMPORTER=ON \ + -DWITH_TGAIMAGECONVERTER=ON \ + -DWITH_TGAIMPORTER=ON \ + -DWITH_WAVAUDIOIMPORTER=OFF \ + -DBUILD_TESTS=ON \ + -DTARGET_GLES2=$TARGET_GLES2 +make -j4 + +# Test +CORRADE_TEST_COLOR=ON ctest -V diff --git a/package/ci/travis.yml b/package/ci/travis.yml index be4179143..2aff509ea 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -21,6 +21,14 @@ matrix: env: - TARGET=ios-simulator - TARGET_GLES2=OFF + - os: osx + env: + - TARGET=emscripten + - TARGET_GLES2=ON + - os: osx + env: + - TARGET=emscripten + - TARGET_GLES2=OFF addons: apt: @@ -52,6 +60,7 @@ install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then export PLATFORM_GL_API=CGL; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then gem install xcpretty; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then brew upgrade cmake; fi +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then brew install emscripten && export LLVM=/usr/local/opt/emscripten/libexec/llvm/bin && emcc; fi - if [ "$TARGET" == "desktop" ]; then printf "[General]\ndrivers=null" > ~/.alsoftrc; fi # SDL (cached) @@ -67,5 +76,6 @@ script: - if [ "$TRAVIS_OS_NAME" == "linux" ]; then ./package/ci/travis-desktop.sh; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then ./package/ci/travis-desktop.sh; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then ./package/ci/travis-ios-simulator.sh; fi +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then ./package/ci/travis-emscripten.sh; fi # Travis somehow is not able to gather all output, try to force it using this - sync From 3f9de4e6a84702125e1c72709e5677b75f42f301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 18:22:11 +0200 Subject: [PATCH 048/290] Platform: revert "Allow horizontal-only scrolling" Will be replaced by proper scroll event. This reverts commit c817f8412e590b1f499261b2c7c37a5434ce0f07. --- src/Magnum/Platform/Sdl2Application.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index aaa3dfd9e..ffcefec35 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -384,15 +384,15 @@ void Sdl2Application::mainLoop() { event.type == SDL_MOUSEBUTTONDOWN ? mousePressEvent(e) : mouseReleaseEvent(e); } break; - case SDL_MOUSEWHEEL: { - MouseEvent e(event.wheel.y > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {event.wheel.x, event.wheel.y} - #ifndef CORRADE_TARGET_EMSCRIPTEN - , 0 - #endif - ); - mousePressEvent(e); - break; - } + case SDL_MOUSEWHEEL: + if(event.wheel.y != 0) { + MouseEvent e(event.wheel.y > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {event.wheel.x, event.wheel.y} + #ifndef CORRADE_TARGET_EMSCRIPTEN + , 0 + #endif + ); + mousePressEvent(e); + } break; case SDL_MOUSEMOTION: { MouseMoveEvent e({event.motion.x, event.motion.y}, {event.motion.xrel, event.motion.yrel}, static_cast(event.motion.state)); From 2a77856df2e7d55ec587306f6184072865ba20b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 20:30:23 +0200 Subject: [PATCH 049/290] Platform: first-class MouseScrollEvent for SDL2 and NaCl application. The original implementation tried to mimic the behavior of GLUT, which treats mouse wheel as a button. SDL2, GLFW and NaCl all treat scroll event separately, so it was quite nastily hacked in, with horizontal scrolling ignored and scrolling offset treated as cursor position. Moreover, wheel up/down buttons were confused with extra mouse buttons in SDL2. Now there is a dedicated MouseScrollEvent, which has just the offset and modifiers, no cursor position. The original way with WheelUp/WheelDown buttons in mouse press event is still preserved, though it is marked as deprecated and will be removed in future release. Sdl2Application had WheelUp/WheelDown buttons also for mouse move event, which was completely useless (try moving a mouse while the wheel is rotating, ha), so it's removed. Scroll event offset is now also consistently Vector2 across all toolkits -- it was integer in SDL2, float in NaCl and double in GLFW. The X1 and X2 buttons in Sdl2Application are not confused with wheel up/down anymore and are a new Mouse*Event::Button::X1 and Mouse*Event::Button::X2 enums -- on my mouse they are actually wheel left and wheel right (though wheel left and wheel right is not treated as horizontal scrolling, weird). --- src/Magnum/Platform/GlfwApplication.cpp | 11 +++- src/Magnum/Platform/GlfwApplication.h | 31 ++++++---- src/Magnum/Platform/NaClApplication.cpp | 14 ++++- src/Magnum/Platform/NaClApplication.h | 51 ++++++++++++++-- src/Magnum/Platform/Sdl2Application.cpp | 24 +++++++- src/Magnum/Platform/Sdl2Application.h | 79 +++++++++++++++++++++---- 6 files changed, 175 insertions(+), 35 deletions(-) diff --git a/src/Magnum/Platform/GlfwApplication.cpp b/src/Magnum/Platform/GlfwApplication.cpp index 7753bb9f1..bac69aa43 100644 --- a/src/Magnum/Platform/GlfwApplication.cpp +++ b/src/Magnum/Platform/GlfwApplication.cpp @@ -187,13 +187,22 @@ void GlfwApplication::staticMouseEvent(GLFWwindow*, int button, int action, int } void GlfwApplication::staticMouseScrollEvent(GLFWwindow* window, double xoffset, double yoffset) { - MouseScrollEvent e(Vector2d{xoffset, yoffset}, KeyEvent::getCurrentGlfwModifiers(window)); + MouseScrollEvent e(Vector2{Float(xoffset), Float(yoffset)}, KeyEvent::getCurrentGlfwModifiers(window)); _instance->mouseScrollEvent(e); + #ifdef MAGNUM_BUILD_DEPRECATED if(yoffset != 0.0) { + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif MouseEvent e1((yoffset > 0.0) ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, KeyEvent::getCurrentGlfwModifiers(window)); + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif _instance->mousePressEvent(e1); } + #endif } void GlfwApplication::staticErrorCallback(int, const char* description) { diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index f61565f4b..4ba7537d4 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -247,12 +247,7 @@ class GlfwApplication { */ virtual void mouseMoveEvent(MouseMoveEvent& event); - /** - * @brief Mouse scroll event - * - * Called when a scrolling device is used (mouse wheel or scrolling - * area on touchpad). Default implementation does nothing. - */ + /** @copydoc Sdl2Application::mouseScrollEvent() */ virtual void mouseScrollEvent(MouseScrollEvent& event); /*@}*/ @@ -706,7 +701,8 @@ class GlfwApplication::KeyEvent: public GlfwApplication::InputEvent { /** @brief Mouse event -@see @ref MouseMoveEvent, @ref MouseScrollEvent, @ref mousePressEvent(), @ref mouseReleaseEvent() +@see @ref MouseMoveEvent, @ref MouseScrollEvent, @ref mousePressEvent(), + @ref mouseReleaseEvent() */ class GlfwApplication::MouseEvent: public GlfwApplication::InputEvent { friend GlfwApplication; @@ -730,8 +726,19 @@ class GlfwApplication::MouseEvent: public GlfwApplication::InputEvent { Button7 = GLFW_MOUSE_BUTTON_7, /**< Mouse button 7 */ Button8 = GLFW_MOUSE_BUTTON_8, /**< Mouse button 8 */ - WheelUp = GLFW_MOUSE_BUTTON_LAST + 1, /**< Mouse wheel up */ - WheelDown = GLFW_MOUSE_BUTTON_LAST + 2 /**< Mouse wheel down */ + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * Wheel up + * @deprecated Use @ref MouseScrollEvent and @ref mouseScrollEvent() instead. + */ + WheelUp CORRADE_DEPRECATED_ENUM("use mouseScrollEvent() and MouseScrollEvent instead") = GLFW_MOUSE_BUTTON_LAST + 1, + + /** + * Wheel down + * @deprecated Use @ref MouseScrollEvent and @ref mouseScrollEvent() instead. + */ + WheelDown CORRADE_DEPRECATED_ENUM("use mouseScrollEvent() and MouseScrollEvent instead") = GLFW_MOUSE_BUTTON_LAST + 2 + #endif }; /** @brief Button */ @@ -779,15 +786,15 @@ class GlfwApplication::MouseScrollEvent: public GlfwApplication::InputEvent { public: /** @brief Scroll offset */ - constexpr Vector2d offset() const { return _offset; } + constexpr Vector2 offset() const { return _offset; } /** @brief Modifiers */ constexpr Modifiers modifiers() const { return _modifiers; } private: - constexpr MouseScrollEvent(const Vector2d& offset, Modifiers modifiers): _offset(offset), _modifiers(modifiers) {} + constexpr MouseScrollEvent(const Vector2& offset, Modifiers modifiers): _offset(offset), _modifiers(modifiers) {} - const Vector2d _offset; + const Vector2 _offset; const Modifiers _modifiers; }; diff --git a/src/Magnum/Platform/NaClApplication.cpp b/src/Magnum/Platform/NaClApplication.cpp index 9dafcd8c9..afe153845 100644 --- a/src/Magnum/Platform/NaClApplication.cpp +++ b/src/Magnum/Platform/NaClApplication.cpp @@ -192,10 +192,17 @@ bool NaClApplication::HandleInputEvent(const pp::InputEvent& event) { case PP_INPUTEVENT_TYPE_WHEEL: { pp::WheelInputEvent wheelEvent(event); - if(Math::TypeTraits::equals(wheelEvent.GetDelta().y(), 0.0f)) return false; - MouseEvent e(wheelEvent.GetDelta().y() > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {}, static_cast(wheelEvent.GetModifiers())); - mousePressEvent(e); + MouseScrollEvent e{{wheelEvent.GetDelta().x(), wheelEvent.GetDelta().y()}, static_cast(wheelEvent.GetModifiers())}; + mouseScrollEvent(e); + #ifdef MAGNUM_BUILD_DEPRECATED + if(!Math::TypeTraits::equals(wheelEvent.GetDelta().y(), 0.0f)) { + MouseEvent e2(wheelEvent.GetDelta().y() > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {}, static_cast(wheelEvent.GetModifiers())); + mousePressEvent(e2); + if(!e.isAccepted() && !e2.isAccepted()) return false; + } else if(!e.isAccepted()) return false; + #else if(!e.isAccepted()) return false; + #endif break; } @@ -261,6 +268,7 @@ void NaClApplication::keyReleaseEvent(KeyEvent&) {} void NaClApplication::mousePressEvent(MouseEvent&) {} void NaClApplication::mouseReleaseEvent(MouseEvent&) {} void NaClApplication::mouseMoveEvent(MouseMoveEvent&) {} +void NaClApplication::mouseScrollEvent(MouseScrollEvent&) {} template class BasicScreen; template class BasicScreenedApplication; diff --git a/src/Magnum/Platform/NaClApplication.h b/src/Magnum/Platform/NaClApplication.h index 488b4e742..29c22ef4b 100644 --- a/src/Magnum/Platform/NaClApplication.h +++ b/src/Magnum/Platform/NaClApplication.h @@ -204,6 +204,7 @@ class NaClApplication: public pp::Instance, public pp::Graphics3DClient, public class KeyEvent; class MouseEvent; class MouseMoveEvent; + class MouseScrollEvent; /** @copydoc Sdl2Application::Sdl2Application(const Arguments&, const Configuration&) */ #ifdef DOXYGEN_GENERATING_OUTPUT @@ -355,6 +356,16 @@ class NaClApplication: public pp::Instance, public pp::Graphics3DClient, public */ virtual void mouseMoveEvent(MouseMoveEvent& event); + /** + * @brief Mouse scroll event + * + * Called when a scrolling device is used (mouse wheel or scrolling + * area on a touchpad). Default implementation does nothing. If you + * accept the event, call @ref InputEvent::setAccepted() "setAccepted()" + * on it, otherwise the event will be propagated to the browser. + */ + virtual void mouseScrollEvent(MouseScrollEvent& event); + /*@}*/ private: @@ -650,7 +661,8 @@ class NaClApplication::KeyEvent: public NaClApplication::InputEvent { @brief Mouse event See also @ref InputEvent for more information. -@see @ref MouseMoveEvent, @ref mousePressEvent(), @ref mouseReleaseEvent() +@see @ref MouseMoveEvent, @ref MouseScrollEvent, @ref mousePressEvent(), + @ref mouseReleaseEvent() */ class NaClApplication::MouseEvent: public NaClApplication::InputEvent { friend NaClApplication; @@ -665,8 +677,20 @@ class NaClApplication::MouseEvent: public NaClApplication::InputEvent { Left = PP_INPUTEVENT_MOUSEBUTTON_LEFT, /**< Left button */ Middle = PP_INPUTEVENT_MOUSEBUTTON_MIDDLE, /**< Middle button */ Right = PP_INPUTEVENT_MOUSEBUTTON_RIGHT, /**< Right button */ - WheelUp = 0xFFFF01, /**< Wheel up */ - WheelDown = 0xFFFF02 /**< Wheel down */ + + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * Wheel up + * @deprecated Use @ref MouseScrollEvent and @ref mouseScrollEvent() instead. + */ + WheelUp CORRADE_DEPRECATED_ENUM("use mouseScrollEvent() and MouseScrollEvent instead") = 0xFFFF01, + + /** + * Wheel down + * @deprecated Use @ref MouseScrollEvent and @ref mouseScrollEvent() instead. + */ + WheelDown CORRADE_DEPRECATED_ENUM("use mouseScrollEvent() and MouseScrollEvent instead") = 0xFFFF02 + #endif }; /** @brief Button */ @@ -692,7 +716,7 @@ class NaClApplication::MouseEvent: public NaClApplication::InputEvent { @brief Mouse move event See also @ref InputEvent for more information. -@see @ref MouseEvent, @ref mouseMoveEvent() +@see @ref MouseEvent, @ref MouseScrollEvent, @ref mouseMoveEvent() */ class NaClApplication::MouseMoveEvent: public NaClApplication::InputEvent { friend NaClApplication; @@ -714,6 +738,25 @@ class NaClApplication::MouseMoveEvent: public NaClApplication::InputEvent { const Vector2i _position, _relativePosition; }; +/** +@brief Mouse scroll event + +See also @ref InputEvent for more information. +@see @ref MouseEvent, @ref MouseMoveEvent, @ref mouseScrollEvent() +*/ +class NaClApplication::MouseScrollEvent: public NaClApplication::InputEvent { + friend NaClApplication; + + public: + /** @brief Scroll offset */ + constexpr Vector2 offset() const { return _offset; } + + private: + constexpr MouseScrollEvent(const Vector2& offset, Modifiers modifiers): InputEvent{modifiers}, _offset{offset} {} + + const Vector2 _offset; +}; + CORRADE_ENUMSET_OPERATORS(NaClApplication::Flags) namespace Implementation { diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index ffcefec35..7578fdbdd 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -384,15 +384,28 @@ void Sdl2Application::mainLoop() { event.type == SDL_MOUSEBUTTONDOWN ? mousePressEvent(e) : mouseReleaseEvent(e); } break; - case SDL_MOUSEWHEEL: + case SDL_MOUSEWHEEL: { + MouseScrollEvent e{{Float(event.wheel.x), Float(event.wheel.y)}}; + mouseScrollEvent(e); + + #ifdef MAGNUM_BUILD_DEPRECATED if(event.wheel.y != 0) { + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif MouseEvent e(event.wheel.y > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {event.wheel.x, event.wheel.y} #ifndef CORRADE_TARGET_EMSCRIPTEN , 0 #endif ); + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif mousePressEvent(e); - } break; + } + #endif + } break; case SDL_MOUSEMOTION: { MouseMoveEvent e({event.motion.x, event.motion.y}, {event.motion.xrel, event.motion.yrel}, static_cast(event.motion.state)); @@ -510,6 +523,7 @@ void Sdl2Application::keyReleaseEvent(KeyEvent&) {} void Sdl2Application::mousePressEvent(MouseEvent&) {} void Sdl2Application::mouseReleaseEvent(MouseEvent&) {} void Sdl2Application::mouseMoveEvent(MouseMoveEvent&) {} +void Sdl2Application::mouseScrollEvent(MouseScrollEvent&) {} void Sdl2Application::multiGestureEvent(MultiGestureEvent&) {} void Sdl2Application::textInputEvent(TextInputEvent&) {} void Sdl2Application::textEditingEvent(TextEditingEvent&) {} @@ -543,6 +557,12 @@ Sdl2Application::InputEvent::Modifiers Sdl2Application::MouseMoveEvent::modifier return _modifiers = fixedModifiers(Uint16(SDL_GetModState())); } +Sdl2Application::InputEvent::Modifiers Sdl2Application::MouseScrollEvent::modifiers() { + if(_modifiersLoaded) return _modifiers; + _modifiersLoaded = true; + return _modifiers = fixedModifiers(Uint16(SDL_GetModState())); +} + template class BasicScreen; template class BasicScreenedApplication; diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index 47f9d1f48..a44feb9e7 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -331,6 +331,7 @@ class Sdl2Application { class KeyEvent; class MouseEvent; class MouseMoveEvent; + class MouseScrollEvent; class MultiGestureEvent; class TextInputEvent; class TextEditingEvent; @@ -586,6 +587,14 @@ class Sdl2Application { */ virtual void mouseMoveEvent(MouseMoveEvent& event); + /** + * @brief Mouse scroll event + * + * Called when a scrolling device is used (mouse wheel or scrolling + * area on a touchpad). Default implementation does nothing. + */ + virtual void mouseScrollEvent(MouseScrollEvent& event); + /*@}*/ /** @{ @name Touch gesture handling */ @@ -1125,7 +1134,8 @@ class Sdl2Application::KeyEvent: public Sdl2Application::InputEvent { /** @brief Mouse event -@see @ref MouseMoveEvent, @ref mousePressEvent(), @ref mouseReleaseEvent() +@see @ref MouseMoveEvent, @ref MouseScrollEvent, @ref mousePressEvent(), + @ref mouseReleaseEvent() */ class Sdl2Application::MouseEvent: public Sdl2Application::InputEvent { friend Sdl2Application; @@ -1140,26 +1150,38 @@ class Sdl2Application::MouseEvent: public Sdl2Application::InputEvent { Left = SDL_BUTTON_LEFT, /**< Left button */ Middle = SDL_BUTTON_MIDDLE, /**< Middle button */ Right = SDL_BUTTON_RIGHT, /**< Right button */ - WheelUp = SDL_BUTTON_X1, /**< Wheel up */ - WheelDown = SDL_BUTTON_X2 /**< Wheel down */ + + /** First extra button (e.g. wheel left) */ + X1 = SDL_BUTTON_X1, + + /** Second extra button (e.g. wheel right) */ + X2 = SDL_BUTTON_X2, + + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * Wheel up + * @deprecated Use @ref MouseScrollEvent and @ref mouseScrollEvent() instead. + */ + WheelUp CORRADE_DEPRECATED_ENUM("use mouseScrollEvent() and MouseScrollEvent instead") = SDL_BUTTON_X2 + 1, + + /** + * Wheel down + * @deprecated Use @ref MouseScrollEvent and @ref mouseScrollEvent() instead. + */ + WheelDown CORRADE_DEPRECATED_ENUM("use mouseScrollEvent() and MouseScrollEvent instead") = SDL_BUTTON_X2 + 2 + #endif }; /** @brief Button */ constexpr Button button() const { return _button; } - /** - * @brief Position - * - * For whell events this contains the horizontal and vertical scroll - * amount. - */ + /** @brief Position */ constexpr Vector2i position() const { return _position; } #ifndef CORRADE_TARGET_EMSCRIPTEN /** * @brief Click count * - * Ignored for wheel events. * @note Not available in @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten". */ constexpr Int clickCount() const { return _clickCount; } @@ -1195,7 +1217,7 @@ class Sdl2Application::MouseEvent: public Sdl2Application::InputEvent { /** @brief Mouse move event -@see @ref MouseEvent, @ref mouseMoveEvent() +@see @ref MouseEvent, @ref MouseScrollEvent, @ref mouseMoveEvent() */ class Sdl2Application::MouseMoveEvent: public Sdl2Application::InputEvent { friend Sdl2Application; @@ -1210,8 +1232,12 @@ class Sdl2Application::MouseMoveEvent: public Sdl2Application::InputEvent { Left = SDL_BUTTON_LMASK, /**< Left button */ Middle = SDL_BUTTON_MMASK, /**< Middle button */ Right = SDL_BUTTON_RMASK, /**< Right button */ - WheelUp = SDL_BUTTON_X1MASK, /**< Wheel up */ - WheelDown = SDL_BUTTON_X2MASK /**< Wheel down */ + + /** First extra button (e.g. wheel left) */ + X1 = SDL_BUTTON_X1MASK, + + /** Second extra button (e.g. wheel right) */ + X2 = SDL_BUTTON_X2MASK }; /** @@ -1250,6 +1276,33 @@ class Sdl2Application::MouseMoveEvent: public Sdl2Application::InputEvent { Modifiers _modifiers; }; +/** +@brief Mouse scroll event + +@see @ref MouseEvent, @ref MouseMoveEvent, @ref mouseScrollEvent() +*/ +class Sdl2Application::MouseScrollEvent: public Sdl2Application::InputEvent { + friend Sdl2Application; + + public: + /** @brief Scroll offset */ + constexpr Vector2 offset() const { return _offset; } + + /** + * @brief Modifiers + * + * Lazily populated on first request. + */ + Modifiers modifiers(); + + private: + constexpr MouseScrollEvent(const Vector2& offset): _offset{offset}, _modifiersLoaded{false} {} + + const Vector2 _offset; + bool _modifiersLoaded; + Modifiers _modifiers; +}; + /** @brief Multi gesture event From 88d732a2164ccd1a99bf148329da7538c6084ca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 16 Jun 2016 21:28:58 +0200 Subject: [PATCH 050/290] Platform: doc++ --- src/Magnum/Platform/Sdl2Application.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index a44feb9e7..2363d8dc8 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -893,7 +893,8 @@ class Sdl2Application::Configuration { * backwards-compatible with requested one. Default is * @ref Version::None, i.e. any provided version is used. * @note In @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten" this function - * does nothing (@ref Version::GLES200 is always used). + * does nothing (@ref Version::GLES200 or @ref Version::GLES300 is + * used implicitly based on the target). */ Configuration& setVersion(Version version) { #ifndef CORRADE_TARGET_EMSCRIPTEN From 6feda42f134a8e7aeb071ccaa44a1941967275da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 16 Jun 2016 19:52:15 +0200 Subject: [PATCH 051/290] Platform: reworked windowless apps to make threaded contexts possible. Each Windowless*Application has now a companion Windowless*Context that manages just the GL context creation and nothing else, with the ability to just create the context and not make it current, so it doesn't affect current thread state and can be moved to another thread and make current there. Other things that were done: * Using `NoCreateT` instead of `nullptr` for creating the application without creating GL context. * Properly handling failed creation of Magnum context instance -- if it errors out, also the GL context is destroyed to make it possible to create the context with a different configuration. * Reworked AMD and NVidia binary driver workaround, where core context created with specific version doesn't automatically choose the newest available (creating compatibility context on the other hand causes the version to get stuck on 2.1 on Mesa and OSX). * Added the above workaround also for WindowlessWglApplication to avoid driver issues in the future. * Reworked WindowlessWglApplication to not be so crazily entangled. It was a misunderstanding on my side about how WINAPI works. Much simpler now (and I hope still working :D). --- doc/platform.dox | 70 ++++- .../Platform/WindowlessCglApplication.cpp | 93 ++++--- .../Platform/WindowlessCglApplication.h | 142 ++++++++-- .../Platform/WindowlessEglApplication.cpp | 96 ++++--- .../Platform/WindowlessEglApplication.h | 205 ++++++++++---- .../Platform/WindowlessGlxApplication.cpp | 180 ++++++++----- .../Platform/WindowlessGlxApplication.h | 222 ++++++++++----- .../Platform/WindowlessIosApplication.h | 159 +++++++---- .../Platform/WindowlessIosApplication.mm | 71 +++-- .../Platform/WindowlessNaClApplication.cpp | 79 +++--- .../Platform/WindowlessNaClApplication.h | 131 +++++++-- .../Platform/WindowlessWglApplication.cpp | 218 ++++++++++----- .../Platform/WindowlessWglApplication.h | 254 +++++++++++------- .../WindowlessWindowsEglApplication.cpp | 121 +++++---- .../WindowlessWindowsEglApplication.h | 231 ++++++++++------ src/Magnum/Platform/magnum-info.cpp | 2 +- src/Magnum/Test/AbstractOpenGLTester.h | 28 +- src/Magnum/Text/fontconverter.cpp | 2 +- .../TextureTools/distancefieldconverter.cpp | 2 +- 19 files changed, 1546 insertions(+), 760 deletions(-) diff --git a/doc/platform.dox b/doc/platform.dox index bc58a29b4..fa02d29c0 100644 --- a/doc/platform.dox +++ b/doc/platform.dox @@ -284,8 +284,6 @@ int main(int argc, char** argv) { } // Delete OpenGL context ... - - return 0; } @endcode @@ -319,6 +317,74 @@ target_link_libraries(myapplication Magnum::Context) @endcode +@section platform-windowless-contexts Manually managing windowless contexts + +In case you need to manage windowless OpenGL contexts manually (for example +to use Magnum for data processing in a thread or when having more than one +OpenGL context), there is a possibility to directly use the context wrappers +from windowless applications. Each @ref WindowlessEglApplication "Windowless*Application" +is accompanied by a @ref WindowlessEglContext "Windowless*Context" class that +manages just GL context creation, making it current and destruction. Similarly +to using custom platform toolkits above, the workflow is to first create a GL +context instance, then making it current and finally instantiating the +@ref Platform::Context instance to initialize Magnum. + +Similarly as with the applications, to simplify the porting, the library +provides `Platform::WindowlessGLContext` typedef, but only if just one +windowless application header is included. + +@attention With this approach it is possible to switch between different GL + contexts, but make sure that Magnum is used only with its OpenGL context. + +@code +int main(int argc, char** argv) { + Platform::WindowlessGLContext glContext{{}}; + glContext.makeCurrent(); + Platform::Context context{argc, argv}; + + // Your GL code ... + + // Make another context current + eglMakeCurrent(); + + // Someone else's code ... + + // Make Magnum context current again + glContext.makeCurrent(); + + // Your GL code again ... + + // Magnum context gets destroyed + // Windowless GL context gets destroyed +} +@endcode + +The main purpose of windowless contexts is threaded OpenGL, used for example +for background data processing. The workflow is to create the windowless +context on the main thread, but make it current in the worker thread. This way +the main thread state isn't affected so it can have any other GL context +current (for example for the main application rendering). + +@note Context creation is not thread safe on all platforms, that's why it still + has to be done on the main thread. + +@code +int main() { + Platform::WindowlessGLContext glContext{{}}; + + std::thread worker{[&glContext]{ + glContext.makeCurrent(); + Platform::Context context{0, nullptr}; + + // Use Magnum here ... + }}; + + // Independent main application code here ... + + worker.join(); +} +@endcode + - Next page: @ref types */ } diff --git a/src/Magnum/Platform/WindowlessCglApplication.cpp b/src/Magnum/Platform/WindowlessCglApplication.cpp index 49140e99b..b43ae3455 100644 --- a/src/Magnum/Platform/WindowlessCglApplication.cpp +++ b/src/Magnum/Platform/WindowlessCglApplication.cpp @@ -35,25 +35,7 @@ namespace Magnum { namespace Platform { -#ifndef DOXYGEN_GENERATING_OUTPUT -WindowlessCglApplication::WindowlessCglApplication(const Arguments& arguments): WindowlessCglApplication{arguments, Configuration{}} {} -#endif - -WindowlessCglApplication::WindowlessCglApplication(const Arguments& arguments, const Configuration& configuration): WindowlessCglApplication{arguments, nullptr} { - createContext(configuration); -} - -WindowlessCglApplication::WindowlessCglApplication(const Arguments& arguments, std::nullptr_t): _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} - -void WindowlessCglApplication::createContext() { createContext({}); } - -void WindowlessCglApplication::createContext(const Configuration& configuration) { - if(!tryCreateContext(configuration)) std::exit(1); -} - -bool WindowlessCglApplication::tryCreateContext(const Configuration&) { - CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessCglApplication::tryCreateContext(): context already created", false); - +WindowlessCglContext::WindowlessCglContext(const Configuration&, Context*) { int formatCount; CGLPixelFormatAttribute attributes32[] = { kCGLPFAAccelerated, @@ -62,7 +44,7 @@ bool WindowlessCglApplication::tryCreateContext(const Configuration&) { CGLPixelFormatAttribute(0) }; if(CGLChoosePixelFormat(attributes32, &_pixelFormat, &formatCount) != kCGLNoError) { - Error() << "Platform::WindowlessCglApplication::tryCreateContext(): cannot choose pixel format for GL 3.2, falling back to 3.0"; + Warning() << "Platform::WindowlessCglContext: cannot choose pixel format for GL 3.2, falling back to 3.0"; CGLPixelFormatAttribute attributes30[] = { kCGLPFAAccelerated, @@ -71,7 +53,7 @@ bool WindowlessCglApplication::tryCreateContext(const Configuration&) { CGLPixelFormatAttribute(0) }; if(CGLChoosePixelFormat(attributes30, &_pixelFormat, &formatCount) != kCGLNoError) { - Error() << "Platform::WindowlessCglApplication::tryCreateContext(): cannot choose pixel format for GL 3.0, falling back to 2.1"; + Warning() << "Platform::WindowlessCglContext: cannot choose pixel format for GL 3.0, falling back to 2.1"; CGLPixelFormatAttribute attributes21[] = { kCGLPFAAccelerated, @@ -80,31 +62,68 @@ bool WindowlessCglApplication::tryCreateContext(const Configuration&) { CGLPixelFormatAttribute(0) }; if(CGLChoosePixelFormat(attributes21, &_pixelFormat, &formatCount) != kCGLNoError) { - Error() << "Platform::WindowlessCglApplication::tryCreateContext(): cannot choose pixel format"; - return false; + Error() << "Platform::WindowlessCglContext: cannot choose pixel format"; + return; } } } - if(CGLCreateContext(_pixelFormat, nullptr, &_glContext) != kCGLNoError) { - Error() << "Platform::WindowlessCglApplication::tryCreateContext(): cannot create context"; - return false; - } + if(CGLCreateContext(_pixelFormat, nullptr, &_context) != kCGLNoError) + Error() << "Platform::WindowlessCglContext: cannot create context"; +} - if(CGLSetCurrentContext(_glContext) != kCGLNoError) { - Error() << "Platform::WindowlessCglApplication::tryCreateContext(): cannot make context current"; - return false; - } +WindowlessCglContext::WindowlessCglContext(WindowlessCglContext&& other): _pixelFormat{other._pixelFormat}, _context{other._context} { + other._pixelFormat = {}; + other._context = {}; +} - /* Return true if the initialization succeeds */ - return _context->tryCreate(); +WindowlessCglContext::~WindowlessCglContext() { + if(_context) CGLDestroyContext(_context); + if(_pixelFormat) CGLDestroyPixelFormat(_pixelFormat); } -WindowlessCglApplication::~WindowlessCglApplication() { - _context.reset(); +WindowlessCglContext& WindowlessCglContext::operator=(WindowlessCglContext&& other) { + using std::swap; + swap(other._pixelFormat, _pixelFormat); + swap(other._context, _context); + return *this; +} + +bool WindowlessCglContext::makeCurrent() { + if(CGLSetCurrentContext(_context) == kCGLNoError) + return true; + + Error() << "Platform::WindowlessCglContext::makeCurrent(): cannot make context current"; + return false; +} + +#ifndef DOXYGEN_GENERATING_OUTPUT +WindowlessCglApplication::WindowlessCglApplication(const Arguments& arguments): WindowlessCglApplication{arguments, Configuration{}} {} +#endif + +WindowlessCglApplication::WindowlessCglApplication(const Arguments& arguments, const Configuration& configuration): WindowlessCglApplication{arguments, NoCreate} { + createContext(configuration); +} + +WindowlessCglApplication::WindowlessCglApplication(const Arguments& arguments, NoCreateT): _glContext{NoCreate}, _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} + +WindowlessCglApplication::~WindowlessCglApplication() = default; + +void WindowlessCglApplication::createContext() { createContext({}); } + +void WindowlessCglApplication::createContext(const Configuration& configuration) { + if(!tryCreateContext(configuration)) std::exit(1); +} + +bool WindowlessCglApplication::tryCreateContext(const Configuration& configuration) { + CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessCglApplication::tryCreateContext(): context already created", false); + + WindowlessCglContext glContext{configuration, _context.get()}; + if(!glContext.isCreated() || !glContext.makeCurrent() || !_context->tryCreate()) + return false; - CGLDestroyContext(_glContext); - CGLDestroyPixelFormat(_pixelFormat); + _glContext = std::move(glContext); + return true; } }} diff --git a/src/Magnum/Platform/WindowlessCglApplication.h b/src/Magnum/Platform/WindowlessCglApplication.h index 693fe8ee8..9acb76868 100644 --- a/src/Magnum/Platform/WindowlessCglApplication.h +++ b/src/Magnum/Platform/WindowlessCglApplication.h @@ -28,12 +28,13 @@ */ /** @file - * @brief Class @ref Magnum::Platform::WindowlessCglApplication, macro @ref MAGNUM_WINDOWLESSCGLAPPLICATION_MAIN() + * @brief Class @ref Magnum::Platform::WindowlessCglApplication, @ref Magnum::Platform::WindowlessCglContext, macro @ref MAGNUM_WINDOWLESSCGLAPPLICATION_MAIN() */ #include #include "Magnum/OpenGL.h" +#include "Magnum/Tags.h" #include #include #include @@ -44,13 +45,99 @@ namespace Magnum { namespace Platform { /** -@brief Windowless CGL application +@brief Windowless CGL context + +GL context used in @ref WindowlessCglApplication. Does not have any default +framebuffer. It is built if `WITH_WINDOWLESSCGLAPPLICATION` is enabled in +CMake. + +Meant to be used when there is a need to manage (multiple) GL contexts +manually. See @ref platform-windowless-contexts for more information. If no +other application header is included, this class is also aliased to +`Platform::WindowlessGLContext`. +*/ +class WindowlessCglContext { + public: + class Configuration; + + /** + * @brief Constructor + * @param configuration Context configuration + * @param context Optional Magnum context instance constructed + * using @ref NoCreate to manage driver workarounds + * + * If version is not specified in @p configuration, it first tries to + * create core context (OpenGL 3.2+), if that fails, tries OpenGL 3.0+ + * and as a last attempt falls back to compatibility OpenGL 2.1 + * context. + * + * Once the context is created, make it current using @ref makeCurrent() + * and create @ref Platform::Context instance to be able to use Magnum. + * @see @ref isCreated() + */ + explicit WindowlessCglContext(const Configuration& configuration, Context* context = nullptr); + + /** + * @brief Construct without creating the context + * + * Move a instance with created context over to make it usable. + */ + explicit WindowlessCglContext(NoCreateT) {} -Application for offscreen rendering using pure CGL. Does not have any default -framebuffer. + /** @brief Copying is not allowed */ + WindowlessCglContext(const WindowlessCglContext&) = delete; + + /** @brief Move constructor */ + WindowlessCglContext(WindowlessCglContext&& other); + + /** @brief Copying is not allowed */ + WindowlessCglContext& operator=(const WindowlessCglContext&) = delete; + + /** @brief Move assignment */ + WindowlessCglContext& operator=(WindowlessCglContext&& other); + + /** + * @brief Destructor + * + * Destroys the context, if any. + */ + ~WindowlessCglContext(); + + /** @brief Whether the context is created */ + bool isCreated() const { return _context; } + + /** + * @brief Make the context current + * + * Prints error message and returns `false` on failure, otherwise + * returns `true`. + */ + bool makeCurrent(); -This application library is available on desktop OpenGL on OS X. It -is built if `WITH_WINDOWLESSCGLAPPLICATION` is enabled in CMake. + private: + CGLPixelFormatObj _pixelFormat{}; + CGLContextObj _context{}; +}; + +/** +@brief Configuration + +@see @ref WindowlessCglContext(), + @ref WindowlessCglApplication::WindowlessCglApplication(), + @ref WindowlessCglApplication::createContext(), + @ref WindowlessCglApplication::tryCreateContext() +*/ +class WindowlessCglContext::Configuration { + public: + constexpr /*implicit*/ Configuration() {} +}; + +/** +@brief Windowless CGL application + +Application for offscreen rendering using @ref WindowlessCglContext. This +application library is available on desktop OpenGL on OS X. It is built if +`WITH_WINDOWLESSCGLAPPLICATION` is enabled in CMake. ## Bootstrap application @@ -104,7 +191,13 @@ class WindowlessCglApplication { char** argv; /**< @brief Argument values */ }; - class Configuration; + /** + * @brief Configuration + * + * @see @ref WindowlessCglApplication(), @ref createContext(), + * @ref tryCreateContext() + */ + typedef WindowlessCglContext::Configuration Configuration; /** * @brief Default constructor @@ -115,6 +208,7 @@ class WindowlessCglApplication { * See @ref Configuration for more information. The program exits if * the context cannot be created, see @ref tryCreateContext() for an * alternative. + * @see @ref WindowlessCglContext */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessCglApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); @@ -125,13 +219,21 @@ class WindowlessCglApplication { #endif /** - * @brief Constructor + * @brief Construct without creating the context * @param arguments Application arguments * * Unlike above, the context is not created and must be created later * with @ref createContext() or @ref tryCreateContext(). */ - explicit WindowlessCglApplication(const Arguments& arguments, std::nullptr_t); + explicit WindowlessCglApplication(const Arguments& arguments, NoCreateT); + + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * @copybrief WindowlessCglApplication(const Arguments&, NoCreateT) + * @deprecated Use @ref WindowlessCglApplication(const Arguments&, NoCreateT) instead. + */ + CORRADE_DEPRECATED("use WindowlessCglApplication(const Arguments&, NoCreateT) instead") explicit WindowlessCglApplication(const Arguments& arguments, std::nullptr_t): WindowlessCglApplication{arguments, NoCreate} {} + #endif /** @brief Copying is not allowed */ WindowlessCglApplication(const WindowlessCglApplication&) = delete; @@ -166,11 +268,7 @@ class WindowlessCglApplication { * constructor itself. Error message is printed and the program exits * if the context cannot be created, see @ref tryCreateContext() for an * alternative. - * - * On desktop GL, if version is not specified in @p configuration, the - * application first tries to create core context (OpenGL 3.2+), if - * that fails, tries OpenGL 3.0+ and as a last attempt falls back to - * compatibility OpenGL 2.1 context. + * @see @ref WindowlessCglContext */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); @@ -189,23 +287,10 @@ class WindowlessCglApplication { bool tryCreateContext(const Configuration& configuration); private: - CGLContextObj _glContext; - CGLPixelFormatObj _pixelFormat; - + WindowlessCglContext _glContext; std::unique_ptr _context; }; -/** -@brief Configuration - -@see @ref WindowlessCglApplication(), @ref createContext(), - @ref tryCreateContext() -*/ -class WindowlessCglApplication::Configuration { - public: - constexpr /*implicit*/ Configuration() {} -}; - /** @hideinitializer @brief Entry point for windowless CGL application @param className Class name @@ -232,6 +317,7 @@ aliased to `MAGNUM_WINDOWLESSAPPLICATION_MAIN()`. #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_WINDOWLESSAPPLICATION_MAIN typedef WindowlessCglApplication WindowlessApplication; +typedef WindowlessCglContext WindowlessGLContext; #define MAGNUM_WINDOWLESSAPPLICATION_MAIN(className) MAGNUM_WINDOWLESSCGLAPPLICATION_MAIN(className) #else #undef MAGNUM_WINDOWLESSAPPLICATION_MAIN diff --git a/src/Magnum/Platform/WindowlessEglApplication.cpp b/src/Magnum/Platform/WindowlessEglApplication.cpp index 61d61ce22..ca63f7a5e 100644 --- a/src/Magnum/Platform/WindowlessEglApplication.cpp +++ b/src/Magnum/Platform/WindowlessEglApplication.cpp @@ -35,30 +35,12 @@ namespace Magnum { namespace Platform { -#ifndef DOXYGEN_GENERATING_OUTPUT -WindowlessEglApplication::WindowlessEglApplication(const Arguments& arguments): WindowlessEglApplication{arguments, Configuration{}} {} -#endif - -WindowlessEglApplication::WindowlessEglApplication(const Arguments& arguments, const Configuration& configuration): WindowlessEglApplication{arguments, nullptr} { - createContext(configuration); -} - -WindowlessEglApplication::WindowlessEglApplication(const Arguments& arguments, std::nullptr_t): _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} - -void WindowlessEglApplication::createContext() { createContext({}); } - -void WindowlessEglApplication::createContext(const Configuration& configuration) { - if(!tryCreateContext(configuration)) std::exit(1); -} - -bool WindowlessEglApplication::tryCreateContext(const Configuration& configuration) { - CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessEglApplication::tryCreateContext(): context already created", false); - +WindowlessEglContext::WindowlessEglContext(const Configuration& configuration, Context*) { /* Initialize */ _display = eglGetDisplay(EGL_DEFAULT_DISPLAY); if(!eglInitialize(_display, nullptr, nullptr)) { Error() << "Platform::WindowlessEglApplication::tryCreateContext(): cannot initialize EGL:" << Implementation::eglErrorString(eglGetError()); - return false; + return; } const EGLenum api = @@ -70,7 +52,7 @@ bool WindowlessEglApplication::tryCreateContext(const Configuration& configurati ; if(!eglBindAPI(api)) { Error() << "Platform::WindowlessEglApplication::tryCreateContext(): cannot bind EGL API:" << Implementation::eglErrorString(eglGetError()); - return false; + return; } /* Choose EGL config */ @@ -87,15 +69,16 @@ bool WindowlessEglApplication::tryCreateContext(const Configuration& configurati #endif EGL_NONE }; + EGLConfig config; EGLint configCount; - if(!eglChooseConfig(_display, attribs, &_config, 1, &configCount)) { + if(!eglChooseConfig(_display, attribs, &config, 1, &configCount)) { Error() << "Platform::WindowlessEglApplication::tryCreateContext(): cannot get EGL visual config:" << Implementation::eglErrorString(eglGetError()); - return false; + return; } if(!configCount) { Error() << "Platform::WindowlessEglApplication::tryCreateContext(): no matching EGL visual config available"; - return false; + return; } const EGLint attributes[] = { @@ -113,25 +96,64 @@ bool WindowlessEglApplication::tryCreateContext(const Configuration& configurati EGL_NONE }; - if(!(_glContext = eglCreateContext(_display, _config, EGL_NO_CONTEXT, attributes))) { + if(!(_context = eglCreateContext(_display, config, EGL_NO_CONTEXT, attributes))) { Error() << "Platform::WindowlessEglApplication::tryCreateContext(): cannot create EGL context:" << Implementation::eglErrorString(eglGetError()); - return false; - } - if(!eglMakeCurrent(_display, EGL_NO_SURFACE, EGL_NO_SURFACE, _glContext)) { - Error() << "Platform::WindowlessEglApplication::tryCreateContext(): cannot make context current:" << Implementation::eglErrorString(eglGetError()); - return false; + return; } +} - /* Return true if the initialization succeeds */ - return _context->tryCreate(); +WindowlessEglContext::WindowlessEglContext(WindowlessEglContext&& other): _display{other._display}, _context{other._context} { + other._display = {}; + other._context = {}; } -WindowlessEglApplication::~WindowlessEglApplication() { - _context.reset(); +WindowlessEglContext::~WindowlessEglContext() { + if(_context) eglDestroyContext(_display, _context); + if(_display) eglTerminate(_display); +} - eglDestroyContext(_display, _glContext); - eglDestroySurface(_display, EGL_NO_SURFACE); - eglTerminate(_display); +WindowlessEglContext& WindowlessEglContext::operator=(WindowlessEglContext && other) { + using std::swap; + swap(other._display, _display); + swap(other._context, _context); + return *this; } +bool WindowlessEglContext::makeCurrent() { + if(eglMakeCurrent(_display, EGL_NO_SURFACE, EGL_NO_SURFACE, _context)) + return true; + + Error() << "Platform::WindowlessEglApplication::tryCreateContext(): cannot make context current:" << Implementation::eglErrorString(eglGetError()); + return false; +} + +#ifndef DOXYGEN_GENERATING_OUTPUT +WindowlessEglApplication::WindowlessEglApplication(const Arguments& arguments): WindowlessEglApplication{arguments, Configuration{}} {} +#endif + +WindowlessEglApplication::WindowlessEglApplication(const Arguments& arguments, const Configuration& configuration): WindowlessEglApplication{arguments, NoCreate} { + createContext(configuration); +} + +WindowlessEglApplication::WindowlessEglApplication(const Arguments& arguments, NoCreateT): _glContext{NoCreate}, _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} + +void WindowlessEglApplication::createContext() { createContext({}); } + +void WindowlessEglApplication::createContext(const Configuration& configuration) { + if(!tryCreateContext(configuration)) std::exit(1); +} + +bool WindowlessEglApplication::tryCreateContext(const Configuration& configuration) { + CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessEglApplication::tryCreateContext(): context already created", false); + + WindowlessEglContext glContext{configuration, _context.get()}; + if(!glContext.isCreated() || !glContext.makeCurrent() || !_context->tryCreate()) + return false; + + _glContext = std::move(glContext); + return true; +} + +WindowlessEglApplication::~WindowlessEglApplication() = default; + }} diff --git a/src/Magnum/Platform/WindowlessEglApplication.h b/src/Magnum/Platform/WindowlessEglApplication.h index b262ef3f7..c656154b0 100644 --- a/src/Magnum/Platform/WindowlessEglApplication.h +++ b/src/Magnum/Platform/WindowlessEglApplication.h @@ -26,7 +26,7 @@ */ /** @file - * @brief Class @ref Magnum::Platform::WindowlessEglApplication, macro @ref MAGNUM_WINDOWLESSEGLAPPLICATION_MAIN() + * @brief Class @ref Magnum::Platform::WindowlessEglApplication, @ref Magnum::Platform::WindowlessEglContext, macro @ref MAGNUM_WINDOWLESSEGLAPPLICATION_MAIN() */ #include @@ -41,17 +41,138 @@ #include "Magnum/Magnum.h" #include "Magnum/OpenGL.h" +#include "Magnum/Tags.h" #include "Magnum/Platform/Platform.h" namespace Magnum { namespace Platform { +/** +@brief Windowless EGL context + +GL context using EGL without any windowing system, used in +@ref WindowlessEglApplication. Does not have any default framebuffer. It is +built if `WITH_WINDOWLESSEGLAPPLICATION` is enabled in CMake. + +Meant to be used when there is a need to manage (multiple) GL contexts +manually. See @ref platform-windowless-contexts for more information. If no +other application header is included, this class is also aliased to +`Platform::WindowlessGLContext`. +*/ +class WindowlessEglContext { + public: + class Configuration; + + /** + * @brief Constructor + * @param configuration Context configuration + * @param context Optional Magnum context instance constructed + * using @ref NoCreate to manage driver workarounds + * + * Once the context is created, make it current using @ref makeCurrent() + * and create @ref Platform::Context instance to be able to use Magnum. + * @see @ref isCreated() + */ + explicit WindowlessEglContext(const Configuration& configuration, const Context* context = nullptr); + + /** + * @brief Construct without creating the context + * + * Move a instance with created context over to make it usable. + */ + explicit WindowlessEglContext(NoCreateT) {} + + /** @brief Copying is not allowed */ + WindowlessEglContext(const WindowlessEglContext&) = delete; + + /** @brief Move constructor */ + WindowlessEglContext(WindowlessEglContext&& other); + + /** @brief Copying is not allowed */ + WindowlessEglContext& operator=(const WindowlessEglContext&) = delete; + + /** @brief Move assignment */ + WindowlessEglContext& operator=(WindowlessEglContext&& other); + + /** + * @brief Destructor + * + * Destroys the context, if any. + */ + ~WindowlessEglContext(); + + /** @brief Whether the context is created */ + bool isCreated() const { return _context; } + + /** + * @brief Make the context current + * + * Prints error message and returns `false` on failure, otherwise + * returns `true`. + */ + bool makeCurrent(); + + private: + EGLDisplay _display{}; + EGLContext _context{}; +}; + +/** +@brief Configuration + +@see @ref WindowlessEglContext(), + @ref WindowlessEglApplication::WindowlessEglApplication(), + @ref WindowlessEglApplication::createContext(), + @ref WindowlessEglApplication::tryCreateContext() +*/ +class WindowlessEglContext::Configuration { + public: + /** + * @brief Context flag + * + * @see @ref Flags, @ref setFlags(), @ref Context::Flag + */ + enum class Flag: int { + Debug = EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR /**< Create debug context */ + }; + + /** + * @brief Context flags + * + * @see @ref setFlags(), @ref Context::Flags + */ + #ifndef DOXYGEN_GENERATING_OUTPUT + typedef Containers::EnumSet Flags; + #else + typedef Containers::EnumSet Flags; + #endif + + constexpr /*implicit*/ Configuration() {} + + /** @brief Context flags */ + Flags flags() const { return _flags; } + + /** + * @brief Set context flags + * @return Reference to self (for method chaining) + * + * Default is no flag. See also @ref Context::flags(). + */ + Configuration& setFlags(Flags flags) { + _flags = flags; + return *this; + } + + private: + Flags _flags; +}; + /** @brief Windowless EGL application -Application for offscreen rendering using EGL without any windowing system. -Does not have any default framebuffer. Supported mainly on OpenGL ES drivers, -for desktop OpenGL the only driver that supports this configuration is -NVidia >= 355. See other `Windowless*Application` classes for an alternative. +Application for offscreen rendering using @ref WindowlessEglContext. Supported +mainly on OpenGL ES drivers, for desktop OpenGL the only driver that supports +this configuration is NVidia >= 355. See other `Windowless*Application` classes +for an alternative. It is built if `WITH_WINDOWLESSEGLAPPLICATION` is enabled in CMake. @@ -104,7 +225,13 @@ class WindowlessEglApplication { char** argv; /**< @brief Argument values */ }; - class Configuration; + /** + * @brief Configuration + * + * @see @ref WindowlessEglApplication(), @ref createContext(), + * @ref tryCreateContext() + */ + typedef WindowlessEglContext::Configuration Configuration; /** * @brief Default constructor @@ -115,6 +242,7 @@ class WindowlessEglApplication { * See @ref Configuration for more information. The program exits if * the context cannot be created, see @ref tryCreateContext() for an * alternative. + * @see @ref WindowlessEglContext */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessEglApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); @@ -131,7 +259,15 @@ class WindowlessEglApplication { * Unlike above, the context is not created and must be created later * with @ref createContext() or @ref tryCreateContext(). */ - explicit WindowlessEglApplication(const Arguments& arguments, std::nullptr_t); + explicit WindowlessEglApplication(const Arguments& arguments, NoCreateT); + + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * @copybrief WindowlessEglApplication(const Arguments&, NoCreateT) + * @deprecated Use @ref WindowlessEglApplication(const Arguments&, NoCreateT) instead. + */ + CORRADE_DEPRECATED("use WindowlessEglApplication(const Arguments&, NoCreateT) instead") explicit WindowlessEglApplication(const Arguments& arguments, std::nullptr_t): WindowlessEglApplication{arguments, NoCreate} {} + #endif /** @brief Copying is not allowed */ WindowlessEglApplication(const WindowlessEglApplication&) = delete; @@ -166,6 +302,7 @@ class WindowlessEglApplication { * constructor itself. Error message is printed and the program exits * if the context cannot be created, see @ref tryCreateContext() for an * alternative. + * @see @ref WindowlessEglContext */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); @@ -184,61 +321,10 @@ class WindowlessEglApplication { bool tryCreateContext(const Configuration& configuration); private: - EGLDisplay _display; - EGLConfig _config; - EGLContext _glContext; - + WindowlessEglContext _glContext; std::unique_ptr _context; }; -/** -@brief Configuration - -@see @ref WindowlessEglApplication(), @ref createContext(), - @ref tryCreateContext() -*/ -class WindowlessEglApplication::Configuration { - public: - /** - * @brief Context flag - * - * @see @ref Flags, @ref setFlags(), @ref Context::Flag - */ - enum class Flag: int { - Debug = EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR /**< Create debug context */ - }; - - /** - * @brief Context flags - * - * @see @ref setFlags(), @ref Context::Flags - */ - #ifndef DOXYGEN_GENERATING_OUTPUT - typedef Containers::EnumSet Flags; - #else - typedef Containers::EnumSet Flags; - #endif - - constexpr /*implicit*/ Configuration() {} - - /** @brief Context flags */ - Flags flags() const { return _flags; } - - /** - * @brief Set context flags - * @return Reference to self (for method chaining) - * - * Default is no flag. See also @ref Context::flags(). - */ - Configuration& setFlags(Flags flags) { - _flags = flags; - return *this; - } - - private: - Flags _flags; -}; - /** @hideinitializer @brief Entry point for windowless EGL application @param className Class name @@ -258,6 +344,7 @@ windowless application header is included this macro is also aliased to #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_WINDOWLESSAPPLICATION_MAIN typedef WindowlessEglApplication WindowlessApplication; +typedef WindowlessEglContext WindowlessGLContext; #define MAGNUM_WINDOWLESSAPPLICATION_MAIN(className) MAGNUM_WINDOWLESSEGLAPPLICATION_MAIN(className) #else #undef MAGNUM_WINDOWLESSAPPLICATION_MAIN diff --git a/src/Magnum/Platform/WindowlessGlxApplication.cpp b/src/Magnum/Platform/WindowlessGlxApplication.cpp index 0e1379eee..fcb693f7e 100644 --- a/src/Magnum/Platform/WindowlessGlxApplication.cpp +++ b/src/Magnum/Platform/WindowlessGlxApplication.cpp @@ -37,32 +37,15 @@ namespace { enum { None = 0L }; } namespace Magnum { namespace Platform { -#ifndef DOXYGEN_GENERATING_OUTPUT -WindowlessGlxApplication::WindowlessGlxApplication(const Arguments& arguments): WindowlessGlxApplication{arguments, Configuration{}} {} -#endif - -WindowlessGlxApplication::WindowlessGlxApplication(const Arguments& arguments, const Configuration& configuration): WindowlessGlxApplication{arguments, nullptr} { - createContext(configuration); -} - -WindowlessGlxApplication::WindowlessGlxApplication(const Arguments& arguments, std::nullptr_t): _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} - -void WindowlessGlxApplication::createContext() { createContext({}); } - -void WindowlessGlxApplication::createContext(const Configuration& configuration) { - if(!tryCreateContext(configuration)) std::exit(1); -} - -bool WindowlessGlxApplication::tryCreateContext(const Configuration& configuration) { - CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessGlxApplication::tryCreateContext(): context already created", false); +WindowlessGlxContext::WindowlessGlxContext(const WindowlessGlxContext::Configuration& configuration, Context* const magnumContext) { _display = XOpenDisplay(nullptr); /* Check version */ int major, minor; glXQueryVersion(_display, &major, &minor); if(major == 1 && minor < 4) { - Error() << "Platform::WindowlessGlxApplication::tryCreateContext(): GLX version 1.4 or greater is required"; - return false; + Error() << "Platform::WindowlessGlxContext: GLX version 1.4 or greater is required"; + return; } /* Choose config */ @@ -70,8 +53,8 @@ bool WindowlessGlxApplication::tryCreateContext(const Configuration& configurati constexpr static const int fbAttributes[] = { None }; GLXFBConfig* configs = glXChooseFBConfig(_display, DefaultScreen(_display), fbAttributes, &configCount); if(!configCount) { - Error() << "Platform::WindowlessGlxApplication::tryCreateContext(): no supported framebuffer configuration found"; - return false; + Error() << "Platform::WindowlessGlxContext: no supported framebuffer configuration found"; + return; } /* Create pbuffer */ @@ -82,6 +65,10 @@ bool WindowlessGlxApplication::tryCreateContext(const Configuration& configurati }; _pbuffer = glXCreatePbuffer(_display, configs[0], pbufferAttributes); + /* Get pointer to proper context creation function */ + const PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = reinterpret_cast(glXGetProcAddress(reinterpret_cast("glXCreateContextAttribsARB"))); + + /* Optimistically choose core context first */ const GLint contextAttributes[] = { #ifdef MAGNUM_TARGET_GLES #ifdef MAGNUM_TARGET_GLES3 @@ -95,8 +82,6 @@ bool WindowlessGlxApplication::tryCreateContext(const Configuration& configurati GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EXT, GLX_CONTEXT_FLAGS_ARB, GLint(configuration.flags()), #else - /* Similarly to what's done in Sdl2Application, try to request core - context first */ GLX_CONTEXT_MAJOR_VERSION_ARB, 3, GLX_CONTEXT_MINOR_VERSION_ARB, 1, GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, @@ -104,73 +89,122 @@ bool WindowlessGlxApplication::tryCreateContext(const Configuration& configurati #endif 0 }; - - const PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = reinterpret_cast(glXGetProcAddress(reinterpret_cast("glXCreateContextAttribsARB"))); - _glContext = glXCreateContextAttribsARB(_display, configs[0], nullptr, True, contextAttributes); + _context = glXCreateContextAttribsARB(_display, configs[0], nullptr, True, contextAttributes); #ifndef MAGNUM_TARGET_GLES - /* Fall back to (forward compatible) GL 2.1, if version is not - user-specified and either core context creation fails or we are on - binary NVidia/AMD drivers on Linux/Windows. Instead of creating forward- - compatible context with highest available version, they force the - version to the one specified, which is completely useless behavior. */ - #ifndef CORRADE_TARGET_APPLE - constexpr static const char nvidiaVendorString[] = "NVIDIA Corporation"; - constexpr static const char amdVendorString[] = "ATI Technologies Inc."; - const char* vendorString; - #endif - if(!_glContext - #ifndef CORRADE_TARGET_APPLE - /* We need to make the context current first, sorry about the UGLY code - and HOPEFULLY THERE WON'T BE MORE WORKAROUNDS */ - || (glXMakeContextCurrent(_display, _pbuffer, _pbuffer, _glContext) && - (vendorString = reinterpret_cast(glGetString(GL_VENDOR)), - (std::strncmp(vendorString, nvidiaVendorString, sizeof(nvidiaVendorString)) == 0 || - std::strncmp(vendorString, amdVendorString, sizeof(amdVendorString)) == 0) && - !_context->isDriverWorkaroundDisabled("amd-nv-no-forward-compatible-core-context"))) - #endif - ) { - /* Don't print any warning when doing the NV workaround, because the - bug will be there probably forever */ - if(!_glContext) Warning() - << "Platform::WindowlessGlxApplication::tryCreateContext(): cannot create core context, falling back to compatibility context"; - else { - glXMakeCurrent(_display, None, nullptr); - glXDestroyContext(_display, _glContext); - } + /* Fall back to (forward compatible) GL 2.1 if core context creation fails */ + if(!_context) { + Warning() << "Platform::WindowlessGlxContext: cannot create core context, falling back to compatibility context"; const GLint fallbackContextAttributes[] = { GLX_CONTEXT_FLAGS_ARB, GLint(configuration.flags()), 0 }; + _context = glXCreateContextAttribsARB(_display, configs[0], nullptr, True, fallbackContextAttributes); + + /* Fall back to (forward compatible) GL 2.1 if we are on binary NVidia/AMD + drivers on Linux/Windows. Instead of creating forward-compatible context + with highest available version, they force the version to the one + specified, which is completely useless behavior. */ + } else { + /* We need to make the context current to read out vendor string, so + save the previous values so we can safely revert back without + messing up the state */ + GLXDrawable currentDrawable = glXGetCurrentDrawable(); + GLXDrawable currentReadDrawable = glXGetCurrentReadDrawable(); + GLXContext currentContext = glXGetCurrentContext(); + if(!glXMakeContextCurrent(_display, _pbuffer, _pbuffer, _context)) { + Error() << "Platform::WindowlessGlxContext: cannot make context current"; + return; + } - _glContext = glXCreateContextAttribsARB(_display, configs[0], nullptr, True, fallbackContextAttributes); + /* The workaround check is the last so it doesn't appear in workaround + list on unrelated drivers */ + constexpr static const char nvidiaVendorString[] = "NVIDIA Corporation"; + constexpr static const char amdVendorString[] = "ATI Technologies Inc."; + const char* const vendorString = reinterpret_cast(glGetString(GL_VENDOR)); + if((std::strncmp(vendorString, nvidiaVendorString, sizeof(nvidiaVendorString)) == 0 || + std::strncmp(vendorString, amdVendorString, sizeof(amdVendorString)) == 0) && + (!magnumContext || !magnumContext->isDriverWorkaroundDisabled("amd-nv-no-forward-compatible-core-context"))) + { + /* Destroy the core context and create a compatibility one */ + glXDestroyContext(_display, _context); + const GLint fallbackContextAttributes[] = { + GLX_CONTEXT_FLAGS_ARB, GLint(configuration.flags()), + 0 + }; + _context = glXCreateContextAttribsARB(_display, configs[0], nullptr, True, fallbackContextAttributes); + } + + /* Revert back the old context */ + if(!glXMakeContextCurrent(_display, currentDrawable, currentReadDrawable, currentContext)) { + Error() << "Platform::WindowlessGlxContext: cannot make the previous context current"; + return; + } } #endif XFree(configs); - if(!_glContext) { - Error() << "Platform::WindowlessGlxApplication::tryCreateContext(): cannot create context"; - return false; - } + if(!_context) + Error() << "Platform::WindowlessGlxContext: cannot create context"; +} - /* Set OpenGL context as current */ - if(!glXMakeContextCurrent(_display, _pbuffer, _pbuffer, _glContext)) { - Error() << "Platform::WindowlessGlxApplication::tryCreateContext(): cannot make context current"; - return false; - } +WindowlessGlxContext::WindowlessGlxContext(WindowlessGlxContext&& other): _display{other._display}, _pbuffer{other._pbuffer}, _context{other._context} { + other._display = {}; + other._context = {}; + other._pbuffer = {}; +} + +WindowlessGlxContext::~WindowlessGlxContext() { + if(_context) glXDestroyContext(_display, _context); + if(_pbuffer) glXDestroyPbuffer(_display, _pbuffer); + if(_display) XCloseDisplay(_display); +} - /* Return true if the initialization succeeds */ - return _context->tryCreate(); +WindowlessGlxContext& WindowlessGlxContext::operator=(WindowlessGlxContext&& other) { + using std::swap; + swap(other._display, _display); + swap(other._pbuffer, _pbuffer); + swap(other._context, _context); + return *this; } -WindowlessGlxApplication::~WindowlessGlxApplication() { - _context.reset(); +bool WindowlessGlxContext::makeCurrent() { + if(glXMakeContextCurrent(_display, _pbuffer, _pbuffer, _context)) + return true; - glXMakeCurrent(_display, None, nullptr); - glXDestroyPbuffer(_display, _pbuffer); - glXDestroyContext(_display, _glContext); + Error() << "Platform::WindowlessGlxContext::makeCurrent(): cannot make context current"; + return false; } +#ifndef DOXYGEN_GENERATING_OUTPUT +WindowlessGlxApplication::WindowlessGlxApplication(const Arguments& arguments): WindowlessGlxApplication{arguments, Configuration{}} {} +#endif + +WindowlessGlxApplication::WindowlessGlxApplication(const Arguments& arguments, const Configuration& configuration): WindowlessGlxApplication{arguments, NoCreate} { + createContext(configuration); +} + +WindowlessGlxApplication::WindowlessGlxApplication(const Arguments& arguments, NoCreateT): _glContext{NoCreate}, _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} + +void WindowlessGlxApplication::createContext() { createContext({}); } + +void WindowlessGlxApplication::createContext(const Configuration& configuration) { + if(!tryCreateContext(configuration)) std::exit(1); +} + +bool WindowlessGlxApplication::tryCreateContext(const Configuration& configuration) { + CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessGlxApplication::tryCreateContext(): context already created", false); + + WindowlessGlxContext glContext{configuration, _context.get()}; + if(!glContext.isCreated() || !glContext.makeCurrent() || !_context->tryCreate()) + return false; + + _glContext = std::move(glContext); + return true; +} + +WindowlessGlxApplication::~WindowlessGlxApplication() = default; + }} diff --git a/src/Magnum/Platform/WindowlessGlxApplication.h b/src/Magnum/Platform/WindowlessGlxApplication.h index 0e7325957..5821aae9d 100644 --- a/src/Magnum/Platform/WindowlessGlxApplication.h +++ b/src/Magnum/Platform/WindowlessGlxApplication.h @@ -26,7 +26,7 @@ */ /** @file - * @brief Class @ref Magnum::Platform::WindowlessGlxApplication, macro @ref MAGNUM_WINDOWLESSGLXAPPLICATION_MAIN() + * @brief Class @ref Magnum::Platform::WindowlessGlxApplication, @ref Magnum::Platform::WindowlessGlxContext, macro @ref MAGNUM_WINDOWLESSGLXAPPLICATION_MAIN() */ #include @@ -43,16 +43,147 @@ #undef Status #include "Magnum/Magnum.h" +#include "Magnum/Tags.h" #include "Magnum/Platform/Platform.h" namespace Magnum { namespace Platform { /** -@brief Windowless GLX application +@brief Windowless GLX context + +GL context using pure X11 and GLX, used in @ref WindowlessGlxApplication. Does +not have any default framebuffer. It is built if `WITH_WINDOWLESSGLXAPPLICATION` +is enabled in CMake. + +Meant to be used when there is a need to manage (multiple) GL contexts +manually. See @ref platform-windowless-contexts for more information. If no +other application header is included, this class is also aliased to +`Platform::WindowlessGLContext`. +*/ +class WindowlessGlxContext { + public: + class Configuration; + + /** + * @brief Constructor + * @param configuration Context configuration + * @param context Optional Magnum context instance constructed + * using @ref NoCreate to manage driver workarounds + * + * On desktop GL, if version is not specified in @p configuration, the + * application first tries to create core context (OpenGL 3.1+) and if + * that fails, falls back to compatibility OpenGL 2.1 context. However, + * on binary AMD and NVidia drivers, creating core context does not use + * the largest available version. If the application detects such case + * (and given workaround is not disabled in optionally passed + * @ref context instance), the core context is destroyed and + * compatibility OpenGL 2.1 context is created instead to make the + * driver use the latest available version. + * + * Once the context is created, make it current using @ref makeCurrent() + * and create @ref Platform::Context instance to be able to use Magnum. + * @see @ref isCreated() + */ + explicit WindowlessGlxContext(const Configuration& configuration, Context* context = nullptr); + + /** + * @brief Construct without creating the context + * + * Move a instance with created context over to make it usable. + */ + explicit WindowlessGlxContext(NoCreateT) {} + + /** @brief Copying is not allowed */ + WindowlessGlxContext(const WindowlessGlxContext&) = delete; + + /** @brief Move constructor */ + WindowlessGlxContext(WindowlessGlxContext&& other); + + /** @brief Copying is not allowed */ + WindowlessGlxContext& operator=(const WindowlessGlxContext&) = delete; + + /** @brief Move assignment */ + WindowlessGlxContext& operator=(WindowlessGlxContext&& other); + + /** + * @brief Destructor + * + * Destroys the context, if any. + */ + ~WindowlessGlxContext(); + + /** @brief Whether the context is created */ + bool isCreated() const { return _context; } + + /** + * @brief Make the context current + * + * Prints error message and returns `false` on failure, otherwise + * returns `true`. + */ + bool makeCurrent(); + + private: + Display* _display{}; + GLXPbuffer _pbuffer{}; + GLXContext _context{}; +}; + +/** +@brief Configuration + +@see @ref WindowlessGlxContext(), + @ref WindowlessGlxApplication::WindowlessGlxApplication(), + @ref WindowlessGlxApplication::createContext(), + @ref WindowlessGlxApplication::tryCreateContext() +*/ +class WindowlessGlxContext::Configuration { + public: + /** + * @brief Context flag + * + * @see @ref Flags, @ref setFlags(), @ref Context::Flag + */ + enum class Flag: int { + Debug = GLX_CONTEXT_DEBUG_BIT_ARB /**< Create debug context */ + }; + + /** + * @brief Context flags + * + * @see @ref setFlags(), @ref Context::Flags + */ + #ifndef DOXYGEN_GENERATING_OUTPUT + typedef Containers::EnumSet Flags; + #else + typedef Containers::EnumSet Flags; + #endif + + constexpr /*implicit*/ Configuration() {} + + /** @brief Context flags */ + Flags flags() const { return _flags; } + + /** + * @brief Set context flags + * @return Reference to self (for method chaining) + * + * Default is no flag. See also @ref Context::flags(). + */ + Configuration& setFlags(Flags flags) { + _flags = flags; + return *this; + } + + private: + Flags _flags; +}; -Application for offscreen rendering using pure X11 and GLX. +/** +@brief Windowless GLX application -This application library is available on desktop OpenGL and +Application for offscreen rendering using @ref WindowlessGlxContext. This +application library is available on desktop OpenGL and @ref MAGNUM_TARGET_DESKTOP_GLES "OpenGL ES emulation on desktop" on Linux. It depends on **X11** library and is built if `WITH_WINDOWLESSGLXAPPLICATION` is enabled in CMake. @@ -107,7 +238,13 @@ class WindowlessGlxApplication { char** argv; /**< @brief Argument values */ }; - class Configuration; + /** + * @brief Configuration + * + * @see @ref WindowlessGlxApplication(), @ref createContext(), + * @ref tryCreateContext() + */ + typedef WindowlessGlxContext::Configuration Configuration; /** * @brief Default constructor @@ -118,6 +255,7 @@ class WindowlessGlxApplication { * See @ref Configuration for more information. The program exits if * the context cannot be created, see @ref tryCreateContext() for an * alternative. + * @see @ref WindowlessGlxContext */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessGlxApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); @@ -134,7 +272,15 @@ class WindowlessGlxApplication { * Unlike above, the context is not created and must be created later * with @ref createContext() or @ref tryCreateContext(). */ - explicit WindowlessGlxApplication(const Arguments& arguments, std::nullptr_t); + explicit WindowlessGlxApplication(const Arguments& arguments, NoCreateT); + + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * @copybrief WindowlessGlxApplication(const Arguments&, NoCreateT) + * @deprecated Use @ref WindowlessGlxApplication(const Arguments&, NoCreateT) instead. + */ + CORRADE_DEPRECATED("use WindowlessGlxApplication(const Arguments&, NoCreateT) instead") explicit WindowlessGlxApplication(const Arguments& arguments, std::nullptr_t): WindowlessGlxApplication{arguments, NoCreate} {} + #endif /** @brief Copying is not allowed */ WindowlessGlxApplication(const WindowlessGlxApplication&) = delete; @@ -169,15 +315,7 @@ class WindowlessGlxApplication { * constructor itself. Error message is printed and the program exits * if the context cannot be created, see @ref tryCreateContext() for an * alternative. - * - * On desktop GL, if version is not specified in @p configuration, the - * application first tries to create core context (OpenGL 3.1+) and if - * that fails, falls back to compatibility OpenGL 2.1 context. However, - * on binary AMD and NVidia drivers, creating core context does not use - * the largest available version. If the application detects such case, - * the core context is destroyed and compatibility OpenGL 2.1 context - * is created instead to make the driver use the latest available - * version. + * @see @ref WindowlessGlxContext */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); @@ -196,61 +334,10 @@ class WindowlessGlxApplication { bool tryCreateContext(const Configuration& configuration); private: - Display* _display; - GLXContext _glContext; - GLXPbuffer _pbuffer; - + WindowlessGlxContext _glContext; std::unique_ptr _context; }; -/** -@brief Configuration - -@see @ref WindowlessGlxApplication(), @ref createContext(), - @ref tryCreateContext() -*/ -class WindowlessGlxApplication::Configuration { - public: - /** - * @brief Context flag - * - * @see @ref Flags, @ref setFlags(), @ref Context::Flag - */ - enum class Flag: int { - Debug = GLX_CONTEXT_DEBUG_BIT_ARB /**< Create debug context */ - }; - - /** - * @brief Context flags - * - * @see @ref setFlags(), @ref Context::Flags - */ - #ifndef DOXYGEN_GENERATING_OUTPUT - typedef Containers::EnumSet Flags; - #else - typedef Containers::EnumSet Flags; - #endif - - constexpr /*implicit*/ Configuration() {} - - /** @brief Context flags */ - Flags flags() const { return _flags; } - - /** - * @brief Set context flags - * @return Reference to self (for method chaining) - * - * Default is no flag. See also @ref Context::flags(). - */ - Configuration& setFlags(Flags flags) { - _flags = flags; - return *this; - } - - private: - Flags _flags; -}; - /** @hideinitializer @brief Entry point for windowless GLX application @param className Class name @@ -277,6 +364,7 @@ aliased to `MAGNUM_WINDOWLESSAPPLICATION_MAIN()`. #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_WINDOWLESSAPPLICATION_MAIN typedef WindowlessGlxApplication WindowlessApplication; +typedef WindowlessGlxContext WindowlessGLContext; #define MAGNUM_WINDOWLESSAPPLICATION_MAIN(className) MAGNUM_WINDOWLESSGLXAPPLICATION_MAIN(className) #else #undef MAGNUM_WINDOWLESSAPPLICATION_MAIN diff --git a/src/Magnum/Platform/WindowlessIosApplication.h b/src/Magnum/Platform/WindowlessIosApplication.h index 459afc39a..b870c5ab4 100644 --- a/src/Magnum/Platform/WindowlessIosApplication.h +++ b/src/Magnum/Platform/WindowlessIosApplication.h @@ -3,7 +3,7 @@ /* This file is part of Magnum. - Copyright © 2010, 2011, 2012, 2013, 2014, 2015 + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Vladimír Vondruš Permission is hereby granted, free of charge, to any person obtaining a @@ -26,7 +26,7 @@ */ /** @file - * @brief Class @ref Magnum::Platform::WindowlessIosApplication, macro @ref MAGNUM_WINDOWLESSIOSAPPLICATION_MAIN() + * @brief Class @ref Magnum::Platform::WindowlessIosApplication, @ref Magnum::Platform::WindowlessIosContext, macro @ref MAGNUM_WINDOWLESSIOSAPPLICATION_MAIN() */ #include @@ -34,6 +34,7 @@ #include "Magnum/Magnum.h" #include "Magnum/OpenGL.h" +#include "Magnum/Tags.h" #include "Magnum/Platform/Platform.h" #ifdef __OBJC__ @@ -44,12 +45,94 @@ struct EAGLContext; namespace Magnum { namespace Platform { +/** +@brief Windowless iOS context + +GL context using EAGL on iOS, used in @ref WindowlessIosApplication. Does not +have any default framebuffer. It is built if `WITH_WINDOWLESSIOSAPPLICATION` is +enabled in CMake. + +Meant to be used when there is a need to manage (multiple) GL contexts +manually. See @ref platform-windowless-contexts for more information. If no +other application header is included, this class is also aliased to +`Platform::WindowlessGLContext`. +*/ +class WindowlessIosContext { + public: + class Configuration; + + /** + * @brief Constructor + * @param configuration Context configuration + * @param context Optional Magnum context instance constructed + * using @ref NoCreate to manage driver workarounds + * + * Once the context is created, make it current using @ref makeCurrent() + * and create @ref Platform::Context instance to be able to use Magnum. + * @see @ref isCreated() + */ + explicit WindowlessIosContext(const Configuration& configuration, Context* context = nullptr); + + /** + * @brief Construct without creating the context + * + * Move a instance with created context over to make it usable. + */ + explicit WindowlessIosContext(NoCreateT) {} + + /** @brief Copying is not allowed */ + WindowlessIosContext(const WindowlessIosContext&) = delete; + + /** @brief Move constructor */ + WindowlessIosContext(WindowlessIosContext&& other); + + /** @brief Copying is not allowed */ + WindowlessIosContext& operator=(const WindowlessIosContext&) = delete; + + /** @brief Move assignment */ + WindowlessIosContext& operator=(WindowlessIosContext&& other); + + /** + * @brief Destructor + * + * Destroys the context, if any. + */ + ~WindowlessIosContext(); + + /** @brief Whether the context is created */ + bool isCreated() const { return _context; } + + /** + * @brief Make the context current + * + * Prints error message and returns `false` on failure, otherwise + * returns `true`. + */ + bool makeCurrent(); + + private: + EAGLContext* _context{}; +}; + +/** +@brief Configuration + +@see @ref WindowlessIosContext(), + @ref WindowlessIosApplication::WindowlessCglApplication(), + @ref WindowlessIosApplication::createContext(), + @ref WindowlessIosApplication::tryCreateContext() +*/ +class WindowlessIosContext::Configuration { + public: + constexpr /*implicit*/ Configuration() {} +}; + /** @brief Windowless iOS application -Application for offscreen rendering using EAGL on iOS. Does not have any -default framebuffer. It is built if `WITH_WINDOWLESSIOSAPPLICATION` is enabled -in CMake. +Application for offscreen rendering using @ref WindowlessIosContext. Does not +have any default framebuffer. It is built if `WITH_WINDOWLESSIOSAPPLICATION` is +enabled in CMake. ## Bootstrap application @@ -100,7 +183,13 @@ class WindowlessIosApplication { char** argv; /**< @brief Argument values */ }; - class Configuration; + /** + * @brief Configuration + * + * @see @ref WindowlessIosApplication(), @ref createContext(), + * @ref tryCreateContext() + */ + typedef WindowlessIosContext::Configuration Configuration; /** * @brief Default constructor @@ -111,6 +200,7 @@ class WindowlessIosApplication { * See @ref Configuration for more information. The program exits if * the context cannot be created, see @ref tryCreateContext() for an * alternative. + * @see @ref WindowlessIosContext */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessIosApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); @@ -127,7 +217,15 @@ class WindowlessIosApplication { * Unlike above, the context is not created and must be created later * with @ref createContext() or @ref tryCreateContext(). */ - explicit WindowlessIosApplication(const Arguments& arguments, std::nullptr_t); + explicit WindowlessIosApplication(const Arguments& arguments, NoCreateT); + + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * @copybrief WindowlessIosApplication(const Arguments&, NoCreateT) + * @deprecated Use @ref WindowlessIosApplication(const Arguments&, NoCreateT) instead. + */ + CORRADE_DEPRECATED("use WindowlessIosApplication(const Arguments&, NoCreateT) instead") explicit WindowlessIosApplication(const Arguments& arguments, std::nullptr_t): WindowlessIosApplication{arguments, NoCreate} {} + #endif /** @brief Copying is not allowed */ WindowlessIosApplication(const WindowlessIosApplication&) = delete; @@ -162,6 +260,7 @@ class WindowlessIosApplication { * constructor itself. Error message is printed and the program exits * if the context cannot be created, see @ref tryCreateContext() for an * alternative. + * @see @ref WindowlessIosContext */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); @@ -180,53 +279,10 @@ class WindowlessIosApplication { bool tryCreateContext(const Configuration& configuration); private: - EAGLContext* _glContext; - + WindowlessIosContext _glContext; std::unique_ptr _context; }; -/** -@brief Configuration - -@see @ref WindowlessIosApplication(), @ref createContext(), - @ref tryCreateContext() -*/ -class WindowlessIosApplication::Configuration { - public: - /** - * @brief Context flag - * - * @see @ref Flags, @ref setFlags(), @ref Context::Flag - */ - enum class Flag: int {}; - - /** - * @brief Context flags - * - * @see @ref setFlags(), @ref Context::Flags - */ - typedef Containers::EnumSet Flags; - - constexpr /*implicit*/ Configuration() {} - - /** @brief Context flags */ - Flags flags() const { return _flags; } - - /** - * @brief Set context flags - * @return Reference to self (for method chaining) - * - * Default is no flag. See also @ref Context::flags(). - */ - Configuration& setFlags(Flags flags) { - _flags = flags; - return *this; - } - - private: - Flags _flags; -}; - /** @hideinitializer @brief Entry point for windowless EGL application @param className Class name @@ -246,6 +302,7 @@ windowless application header is included this macro is also aliased to #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_WINDOWLESSAPPLICATION_MAIN typedef WindowlessIosApplication WindowlessApplication; +typedef WindowlessIosContext WindowlessGLContext; #define MAGNUM_WINDOWLESSAPPLICATION_MAIN(className) MAGNUM_WINDOWLESSIOSAPPLICATION_MAIN(className) #else #undef MAGNUM_WINDOWLESSAPPLICATION_MAIN diff --git a/src/Magnum/Platform/WindowlessIosApplication.mm b/src/Magnum/Platform/WindowlessIosApplication.mm index 921f5d261..172e9273d 100644 --- a/src/Magnum/Platform/WindowlessIosApplication.mm +++ b/src/Magnum/Platform/WindowlessIosApplication.mm @@ -1,7 +1,7 @@ /* This file is part of Magnum. - Copyright © 2010, 2011, 2012, 2013, 2014, 2015 + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Vladimír Vondruš Permission is hereby granted, free of charge, to any person obtaining a @@ -39,15 +39,50 @@ namespace Magnum { namespace Platform { +WindowlessIosContext::WindowlessIosContext(const Configuration&, Context*) { + if(!(_context = [[EAGLContext alloc] + #ifdef MAGNUM_TARGET_GLES2 + initWithAPI:kEAGLRenderingAPIOpenGLES2 + #else + initWithAPI:kEAGLRenderingAPIOpenGLES3 + #endif + ])) + { + Error() << "Platform::WindowlessIosContext(): cannot create EAGL context"; + } +} + +WindowlessIosContext::WindowlessIosContext(WindowlessIosContext&& other): _context{other._context} { + other._context = {}; +} + +WindowlessIosContext::~WindowlessIosContext() { + if(_context) [_context dealloc]; +} + +WindowlessIosContext& WindowlessIosContext::operator=(WindowlessIosContext&& other) { + using std::swap; + swap(other._context, _context); + return *this; +} + +bool WindowlessIosContext::makeCurrent() { + if([EAGLContext setCurrentContext:_context]) + return true; + + Error() << "Platform::WindowlessIosContext::makeCurrent(): cannot make context current"; + return false; +} + #ifndef DOXYGEN_GENERATING_OUTPUT WindowlessIosApplication::WindowlessIosApplication(const Arguments& arguments): WindowlessIosApplication{arguments, Configuration{}} {} #endif -WindowlessIosApplication::WindowlessIosApplication(const Arguments& arguments, const Configuration& configuration): WindowlessIosApplication{arguments, nullptr} { +WindowlessIosApplication::WindowlessIosApplication(const Arguments& arguments, const Configuration& configuration): WindowlessIosApplication{arguments, NoCreate} { createContext(configuration); } -WindowlessIosApplication::WindowlessIosApplication(const Arguments& arguments, std::nullptr_t): _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} +WindowlessIosApplication::WindowlessIosApplication(const Arguments& arguments, NoCreateT): _glContext{NoCreate}, _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} void WindowlessIosApplication::createContext() { createContext({}); } @@ -55,35 +90,17 @@ void WindowlessIosApplication::createContext(const Configuration& configuration) if(!tryCreateContext(configuration)) std::exit(1); } -bool WindowlessIosApplication::tryCreateContext(const Configuration&) { +bool WindowlessIosApplication::tryCreateContext(const Configuration& configuration) { CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessIosApplication::tryCreateContext(): context already created", false); - /* Initialize */ - if(!(_glContext = [[EAGLContext alloc] - #ifdef MAGNUM_TARGET_GLES2 - initWithAPI:kEAGLRenderingAPIOpenGLES2 - #else - initWithAPI:kEAGLRenderingAPIOpenGLES3 - #endif - ])) - { - Error() << "Platform::WindowlessIosApplication::tryCreateContext(): cannot create EAGL context"; - return false; - } - - if(![EAGLContext setCurrentContext:_glContext]) { - Error() << "Platform::WindowlessIosApplication::tryCreateContext(): cannot make context current"; + WindowlessIosContext glContext{configuration, _context.get()}; + if(!glContext.isCreated() || !glContext.makeCurrent() || !_context->tryCreate()) return false; - } - /* Return true if the initialization succeeds */ - return _context->tryCreate(); + _glContext = std::move(glContext); + return true; } -WindowlessIosApplication::~WindowlessIosApplication() { - _context.reset(); - - [_glContext dealloc]; -} +WindowlessIosApplication::~WindowlessIosApplication() = default; }} diff --git a/src/Magnum/Platform/WindowlessNaClApplication.cpp b/src/Magnum/Platform/WindowlessNaClApplication.cpp index fd4194d33..22f0cdbce 100644 --- a/src/Magnum/Platform/WindowlessNaClApplication.cpp +++ b/src/Magnum/Platform/WindowlessNaClApplication.cpp @@ -34,6 +34,40 @@ namespace Magnum { namespace Platform { +WindowlessNaClContext::WindowlessNaClContext(pp::Instance& instance, const Configuration&, Context*) { + const std::int32_t attributes[] = { + PP_GRAPHICS3DATTRIB_ALPHA_SIZE, 8, + PP_GRAPHICS3DATTRIB_DEPTH_SIZE, 24, + PP_GRAPHICS3DATTRIB_STENCIL_SIZE, 8, + PP_GRAPHICS3DATTRIB_WIDTH, 1, + PP_GRAPHICS3DATTRIB_HEIGHT, 1, + PP_GRAPHICS3DATTRIB_NONE + }; + + std::unique_ptr context{new pp::Graphics3D{*instance, attributes}}; + if(context->is_null()) + Error() << "Platform::WindowlessNaClContext: cannot create context"; + + if(!BindGraphics(*context)) + Error() << "Platform::WindowlessNaClContext: cannot bind graphics"; + + /* All went well, save the context */ + _context = std::move(context); +} + +WindowlessNaClContext::WindowlessNaClContext(WindowlessNaClContext&&) = default; + +WindowlessNaClContext::~WindowlessEglContext() = default; + +WindowlessNaClContext& WindowlessNaClContext::operator=(WindowlessNaClContext&&) = default; + +bool WindowlessNaClContext::makeCurrent() { + if(!_context) return false; + + glSetCurrentContextPPAPI(_context->pp_resource()); + return true; +} + struct WindowlessNaClApplication::ConsoleDebugOutput { explicit ConsoleDebugOutput(pp::Instance* instance); @@ -55,13 +89,11 @@ WindowlessNaClApplication::WindowlessNaClApplication(const Arguments& arguments) #endif WindowlessNaClApplication::WindowlessNaClApplication(const Arguments& arguments, const Configuration& configuration): -WindowlessNaClApplication{arguments, nullptr} { +WindowlessNaClApplication{arguments, NoCreate} { createContext(configuration); } -WindowlessNaClApplication::WindowlessNaClApplication(const Arguments& arguments, std::nullptr_t): Instance(arguments), Graphics3DClient(this), graphics(nullptr), c(nullptr) { - debugOutput = new ConsoleDebugOutput(this); -} +WindowlessNaClApplication::WindowlessNaClApplication(const Arguments& arguments, NoCreate): Instance(arguments), Graphics3DClient(this), _glContext{NoCreate}, _debugOutput{new ConsoleDebugOutput{this}} {} void WindowlessNaClApplication::createContext() { createContext({}); } @@ -69,43 +101,18 @@ void WindowlessNaClApplication::createContext(const Configuration& configuration if(!tryCreateContext(configuration)) std::exit(1); } -bool WindowlessNaClApplication::tryCreateContext(const Configuration&) { - CORRADE_ASSERT(!c, "Platform::WindowlessNaClApplication::tryCreateContext(): context already created", false); - - const std::int32_t attributes[] = { - PP_GRAPHICS3DATTRIB_ALPHA_SIZE, 8, - PP_GRAPHICS3DATTRIB_DEPTH_SIZE, 24, - PP_GRAPHICS3DATTRIB_STENCIL_SIZE, 8, - PP_GRAPHICS3DATTRIB_WIDTH, 1, - PP_GRAPHICS3DATTRIB_HEIGHT, 1, - PP_GRAPHICS3DATTRIB_NONE - }; +bool WindowlessNaClApplication::tryCreateContext(const Configuration& configuration) { + CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessNaClApplication::tryCreateContext(): context already created", false); - graphics = new pp::Graphics3D(this, attributes); - if(graphics->is_null()) { - Error() << "Platform::WindowlessNaClApplication::tryCreateContext(): cannot create context"; - delete graphics; - graphics = nullptr; - return false; - } - if(!BindGraphics(*graphics)) { - Error() << "Platform::WindowlessNaClApplication::tryCreateContext(): cannot bind graphics"; - delete graphics; - graphics = nullptr; + WindowlessNaClContext glContext{*this, configuration, _context.get()}; + if(!glContext.isCreated() || !glContext.makeCurrent() || !_context->tryCreate()) return false; - } - glSetCurrentContextPPAPI(graphics->pp_resource()); - - /* Return true if the initialization succeeds */ - return c = Platform::Context::tryCreate().release(); + _glContext = std::move(glContext); + return true; } -WindowlessNaClApplication::~WindowlessNaClApplication() { - delete c; - delete graphics; - delete debugOutput; -} +WindowlessNaClApplication::~WindowlessNaClApplication() = default; bool WindowlessNaClApplication::Init(uint32_t , const char* , const char*) { return exec() == 0; diff --git a/src/Magnum/Platform/WindowlessNaClApplication.h b/src/Magnum/Platform/WindowlessNaClApplication.h index b130f475a..fba8b8e62 100644 --- a/src/Magnum/Platform/WindowlessNaClApplication.h +++ b/src/Magnum/Platform/WindowlessNaClApplication.h @@ -26,9 +26,10 @@ */ /** @file - * @brief Class @ref Magnum::Platform::WindowlessNaClApplication, macro @ref MAGNUM_WINDOWLESSNACLAPPLICATION_MAIN() + * @brief Class @ref Magnum::Platform::WindowlessNaClApplication, @ref Magnum::Platform::WindowlessNaClContext, macro @ref MAGNUM_WINDOWLESSNACLAPPLICATION_MAIN() */ +#include #include #include @@ -41,6 +42,7 @@ #include #include "Magnum/Magnum.h" +#include "Magnum/Tags.h" #include "Magnum/Platform/Platform.h" namespace pp { @@ -50,13 +52,94 @@ namespace pp { namespace Magnum { namespace Platform { +/** +@brief Windowless NaCl context + +GL context running in [Google Chrome Native Client](https://developers.google.com/native-client/), +used in @ref WindowlessNaClApplication. Does not have any default framebuffer. +It is built if `WITH_WINDOWLESSNACLAPPLICATION` is enabled in CMake. + +Meant to be used when there is a need to manage (multiple) GL contexts +manually. See @ref platform-windowless-contexts for more information. If no +other application header is included, this class is also aliased to +`Platform::WindowlessGLContext`. +*/ +class WindowlessNaClContext { + public: + class Configuration; + + /** + * @brief Constructor + * @param instance Pepper instance handle + * @param configuration Context configuration + * @param context Optional Magnum context instance constructed + * using @ref NoCreate to manage driver workarounds + * + * Once the context is created, make it current using @ref makeCurrent() + * and create @ref Platform::Context instance to be able to use Magnum. + * @see @ref isCreated() + */ + explicit WindowlessNaClContext(pp::Instance& instance, const Configuration& configuration, const Context* context = nullptr); + + /** + * @brief Construct without creating the context + * + * Move a instance with created context over to make it usable. + */ + explicit WindowlessNaClContext(NoCreateT) {} + + /** @brief Copying is not allowed */ + WindowlessNaClContext(const WindowlessNaClContext&) = delete; + + /** @brief Move constructor */ + WindowlessNaClContext(WindowlessNaClContext&&); + + /** @brief Copying is not allowed */ + WindowlessNaClContext& operator=(const WindowlessNaClContext&) = delete; + + /** @brief Move assignment */ + WindowlessNaClContext& operator=(WindowlessNaClContext&&); + + /** + * @brief Destructor + * + * Destroys the context, if any. + */ + ~WindowlessNaClContext(); + + /** @brief Whether the context is created */ + bool isCreated() const { return _context; } + + /** + * @brief Make the context current + * + * Prints error message and returns `false` on failure, otherwise + * returns `true`. + */ + bool makeCurrent(); + + private: + std::unique_ptr _context; +}; + +/** +@brief Configuration + +@see @ref WindowlessNaClContext(), + @ref WindowlessNaClApplication::WindowlessCglApplication(), + @ref WindowlessNaClApplication::createContext(), + @ref WindowlessNaClApplication::tryCreateContext() +*/ +class WindowlessNaClContext::Configuration { + public: + constexpr /*implicit*/ Configuration() {} +}; + /** @nosubgrouping @brief Windowless NaCl application -Application for offscreen rendering running in -[Google Chrome Native Client](https://developers.google.com/native-client/). - -This application library is available only in @ref CORRADE_TARGET_NACL "Native Client", +Application for offscreen rendering using @ref WindowlessNaClContext. This +application library is available only in @ref CORRADE_TARGET_NACL "Native Client", see respective sections in @ref building-corrade-cross-nacl "Corrade's" and @ref building-cross-nacl "Magnum's" building documentation. It is built if `WITH_WINDOWLESSNACLAPPLICATION` is enabled in CMake. @@ -111,7 +194,13 @@ class WindowlessNaClApplication: public pp::Instance, public pp::Graphics3DClien /** @brief Application arguments */ typedef PP_Instance Arguments; - class Configuration; + /** + * @brief Configuration + * + * @see @ref WindowlessNaClApplication(), @ref createContext(), + * @ref tryCreateContext() + */ + typedef WindowlessNaClContext::Configuration Configuration; /** * @brief Default constructor @@ -122,6 +211,7 @@ class WindowlessNaClApplication: public pp::Instance, public pp::Graphics3DClien * See @ref Configuration for more information. The program exits if * the context cannot be created, see @ref tryCreateContext() for an * alternative. + * @see @ref WindowlessNaClContext */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessNaClApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); @@ -138,7 +228,15 @@ class WindowlessNaClApplication: public pp::Instance, public pp::Graphics3DClien * Unlike above, the context is not created and must be created later * with @ref createContext() or @ref tryCreateContext(). */ - explicit WindowlessNaClApplication(const Arguments& arguments, std::nullptr_t); + explicit WindowlessNaClApplication(const Arguments& arguments, NoCreateT); + + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * @copybrief WindowlessNaClApplication(const Arguments&, NoCreateT) + * @deprecated Use @ref WindowlessNaClApplication(const Arguments&, NoCreateT) instead. + */ + CORRADE_DEPRECATED("use WindowlessNaClApplication(const Arguments&, NoCreateT) instead") explicit WindowlessNaClApplication(const Arguments& arguments, std::nullptr_t): WindowlessNaClApplication{arguments, NoCreate} {} + #endif /** @brief Copying is not allowed */ WindowlessNaClApplication(const WindowlessNaClApplication&) = delete; @@ -178,6 +276,7 @@ class WindowlessNaClApplication: public pp::Instance, public pp::Graphics3DClien * constructor itself. Error message is printed and the program exits * if the context cannot be created, see @ref tryCreateContext() for an * alternative. + * @see @ref WindowlessNaClContext */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); @@ -202,20 +301,9 @@ class WindowlessNaClApplication: public pp::Instance, public pp::Graphics3DClien bool Init(std::uint32_t, const char*, const char*) override; - pp::Graphics3D* graphics; - Platform::Context* c; - ConsoleDebugOutput* debugOutput; -}; - -/** -@brief Configuration - -@see @ref WindowlessNaClApplication(), @ref createContext(), - @ref tryCreateContext() -*/ -class WindowlessNaClApplication::Configuration { - public: - constexpr /*implicit*/ Configuration() {} + WindowlessNaClContext _glContext; + std::unique_ptr _context; + std::unique_ptr _debugOutput; }; namespace Implementation { @@ -256,6 +344,7 @@ application header is included this macro is also aliased to #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_WINDOWLESSAPPLICATION_MAIN typedef WindowlessNaClApplication WindowlessApplication; +typedef WindowlessNaClContext WindowlessGLContext; #define MAGNUM_WINDOWLESSAPPLICATION_MAIN(className) MAGNUM_WINDOWLESSNACLAPPLICATION_MAIN(className) #else #undef MAGNUM_WINDOWLESSAPPLICATION_MAIN diff --git a/src/Magnum/Platform/WindowlessWglApplication.cpp b/src/Magnum/Platform/WindowlessWglApplication.cpp index 72597d12d..75845496e 100644 --- a/src/Magnum/Platform/WindowlessWglApplication.cpp +++ b/src/Magnum/Platform/WindowlessWglApplication.cpp @@ -25,19 +25,31 @@ #include "WindowlessWglApplication.h" +#include #include #include #include "Magnum/Version.h" #include "Magnum/Platform/Context.h" +#ifndef DOXYGEN_GENERATING_OUTPUT +/* Define stuff that we need because I can't be bothered with creating a new + header just for a few defines */ +#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define WGL_CONTEXT_FLAGS_ARB 0x2094 +#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 +#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 +#endif + namespace Magnum { namespace Platform { -#ifndef DOXYGEN_GENERATING_OUTPUT -int WindowlessWglApplication::create(LRESULT(CALLBACK windowProcedure)(HWND, UINT, WPARAM, LPARAM)) { +WindowlessWglContext::WindowlessWglContext(const Configuration& configuration, Context* const magnumContext) { + /* Create the window */ const WNDCLASS wc{ 0, - windowProcedure, + DefWindowProc, 0, 0, GetModuleHandle(nullptr), @@ -47,37 +59,10 @@ int WindowlessWglApplication::create(LRESULT(CALLBACK windowProcedure)(HWND, UIN nullptr, L"Magnum Windowless Application" }; - if(!RegisterClass(&wc)) return 1; - - CreateWindowW(wc.lpszClassName, L"Magnum Windowless Application", + if(!RegisterClass(&wc)) return; + _window = CreateWindowW(wc.lpszClassName, L"Magnum Windowless Application", WS_OVERLAPPEDWINDOW, 0, 0, 32, 32, 0, 0, wc.hInstance, 0); - /* Hammer the return code out of the messaging thingy */ - MSG msg; - do {} while(GetMessageW(&msg, nullptr, 0, 0) != 0); - return msg.wParam; -} -#endif - -#ifndef DOXYGEN_GENERATING_OUTPUT -WindowlessWglApplication::WindowlessWglApplication(const Arguments& arguments): WindowlessWglApplication{arguments, Configuration{}} {} -#endif - -WindowlessWglApplication::WindowlessWglApplication(const Arguments& arguments, const Configuration& configuration): WindowlessWglApplication{arguments, nullptr} { - createContext(configuration); -} - -WindowlessWglApplication::WindowlessWglApplication(const Arguments& arguments, std::nullptr_t): _window(arguments.window), _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} - -void WindowlessWglApplication::createContext() { createContext({}); } - -void WindowlessWglApplication::createContext(const Configuration& configuration) { - if(!tryCreateContext(configuration)) std::exit(1); -} - -bool WindowlessWglApplication::tryCreateContext(const Configuration& configuration) { - CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessWglApplication::tryCreateContext(): context already created", false); - /* Get device context */ _deviceContext = GetDC(_window); @@ -104,49 +89,160 @@ bool WindowlessWglApplication::tryCreateContext(const Configuration& configurati const int pixelFormat = ChoosePixelFormat(_deviceContext, &pfd); SetPixelFormat(_deviceContext, pixelFormat, &pfd); - const int attributes[] = { - WGL_CONTEXT_FLAGS_ARB, int(configuration.flags()), - 0 - }; - /* Create temporary context so we are able to get the pointer to - wglCreateContextAttribsARB() */ - HGLRC temporaryContext = wglCreateContext(_deviceContext); + wglCreateContextAttribsARB(). To avoid messing up the app state we need + to save the old active context and then restore it later. */ + const HGLRC currentContext = wglGetCurrentContext(); + const HGLRC temporaryContext = wglCreateContext(_deviceContext); if(!wglMakeCurrent(_deviceContext, temporaryContext)) { - Error() << "Platform::WindowlessWglApplication::tryCreateContext(): cannot make temporary context current:" << GetLastError(); - return false; + Error() << "Platform::WindowlessWglContext: cannot make temporary context current:" << GetLastError(); + wglDeleteContext(temporaryContext); + return; } - /* Get pointer to proper context creation function and create real context - with it */ + /* Get pointer to proper context creation function */ typedef HGLRC(WINAPI*PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC, HGLRC, const int*); const PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = reinterpret_cast( wglGetProcAddress(reinterpret_cast("wglCreateContextAttribsARB"))); - _renderingContext = wglCreateContextAttribsARB(_deviceContext, nullptr, attributes); - /* Delete the temporary context */ - wglMakeCurrent(_deviceContext, nullptr); - wglDeleteContext(temporaryContext); - - if(!_renderingContext) { - Error() << "Platform::WindowlessWglApplication::tryCreateContext(): cannot create context:" << GetLastError(); - return false; + /* Optimistically choose core context first */ + const GLint contextAttributes[] = { + #ifdef MAGNUM_TARGET_GLES + #ifdef MAGNUM_TARGET_GLES3 + WGL_CONTEXT_MAJOR_VERSION_ARB, 3, + #elif defined(MAGNUM_TARGET_GLES2) + WGL_CONTEXT_MAJOR_VERSION_ARB, 2, + #else + #error unsupported OpenGL ES version + #endif + WGL_CONTEXT_MINOR_VERSION_ARB, 0, + WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_ES2_PROFILE_BIT_EXT, + WGL_CONTEXT_FLAGS_ARB, GLint(configuration.flags()), + #else + WGL_CONTEXT_MAJOR_VERSION_ARB, 3, + WGL_CONTEXT_MINOR_VERSION_ARB, 1, + WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, + WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB|GLint(configuration.flags()), + #endif + 0 + }; + _context = wglCreateContextAttribsARB(_deviceContext, nullptr, contextAttributes); + + #ifndef MAGNUM_TARGET_GLES + /* Fall back to (forward compatible) GL 2.1 if core context creation fails */ + if(!_context) { + Warning() << "Platform::WindowlessWglContext: cannot create core context, falling back to compatibility context:" << GetLastError(); + + const int fallbackContextAttributes[] = { + WGL_CONTEXT_FLAGS_ARB, int(configuration.flags()), + 0 + }; + _context = wglCreateContextAttribsARB(_deviceContext, nullptr, fallbackContextAttributes); + + /* Fall back to (forward compatible) GL 2.1 if we are on binary NVidia/AMD + drivers on Linux/Windows. Instead of creating forward-compatible context + with highest available version, they force the version to the one + specified, which is completely useless behavior. */ + } else { + /* We need to make the context current to read out vendor string */ + if(!wglMakeCurrent(_deviceContext, _context)) { + Error() << "Platform::WindowlessWglContext: cannot make context current:" << GetLastError(); + + /* Everything failed, at least try to delete the dangling contexts + and revert to the previous context to regain some sanity */ + wglMakeCurrent(_deviceContext, currentContext); + wglDeleteContext(temporaryContext); + return; + } + + /* The workaround check is the last so it doesn't appear in workaround + list on unrelated drivers */ + constexpr static const char nvidiaVendorString[] = "NVIDIA Corporation"; + constexpr static const char amdVendorString[] = "ATI Technologies Inc."; + const char* const vendorString = reinterpret_cast(glGetString(GL_VENDOR)); + if((std::strncmp(vendorString, nvidiaVendorString, sizeof(nvidiaVendorString)) == 0 || + std::strncmp(vendorString, amdVendorString, sizeof(amdVendorString)) == 0) && + (!magnumContext || !magnumContext->isDriverWorkaroundDisabled("amd-nv-no-forward-compatible-core-context"))) + { + /* Destroy the core context and create a compatibility one */ + wglDeleteContext(_context); + const int fallbackContextAttributes[] = { + WGL_CONTEXT_FLAGS_ARB, int(configuration.flags()), + 0 + }; + _context = wglCreateContextAttribsARB(_deviceContext, nullptr, fallbackContextAttributes); + } } + #endif - /* Set OpenGL context as current */ - if(!wglMakeCurrent(_deviceContext, _renderingContext)) { - Error() << "Platform::WindowlessWglApplication::tryCreateContext(): cannot make context current:" << GetLastError(); - return false; + /* Make the previous context active and delete the temporary context */ + if(!wglMakeCurrent(_deviceContext, currentContext)) { + Error() << "Platform::WindowlessWglContext: cannot make the previous context current:" << GetLastError(); + + /* Everything is fucked up, but try to delete the temporary context + anyway */ + wglDeleteContext(temporaryContext); + return; } + wglDeleteContext(temporaryContext); + + if(!_context) + Error() << "Platform::WindowlessWglContext: cannot create context:" << GetLastError(); +} + +WindowlessWglContext::WindowlessWglContext(WindowlessWglContext&& other): _window{other._window}, _deviceContext{other._deviceContext}, _context{other._context} { + other._window = {}; + other._deviceContext = {}; + other._context = {}; +} + +WindowlessWglContext::~WindowlessWglContext() { + if(_context) wglDeleteContext(_context); + if(_window) DestroyWindow(_window); +} + +WindowlessWglContext& WindowlessWglContext::operator=(WindowlessWglContext&& other) { + using std::swap; + swap(other._window, _window); + swap(other._deviceContext, _deviceContext); + swap(other._context, _context); + return *this; +} + +bool WindowlessWglContext::makeCurrent() { + if(wglMakeCurrent(_deviceContext, _context)) + return true; + + Error() << "Platform::WindowlessWglContext::makeCurrent(): cannot make context current:" << GetLastError(); + return false; +} + +#ifndef DOXYGEN_GENERATING_OUTPUT +WindowlessWglApplication::WindowlessWglApplication(const Arguments& arguments): WindowlessWglApplication{arguments, Configuration{}} {} +#endif + +WindowlessWglApplication::WindowlessWglApplication(const Arguments& arguments, const Configuration& configuration): WindowlessWglApplication{arguments, NoCreate} { + createContext(configuration); +} + +WindowlessWglApplication::WindowlessWglApplication(const Arguments& arguments, NoCreateT): _glContext{NoCreate}, _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} + +void WindowlessWglApplication::createContext() { createContext({}); } - /* Return true if the initialization succeeds */ - return _context->tryCreate(); +void WindowlessWglApplication::createContext(const Configuration& configuration) { + if(!tryCreateContext(configuration)) std::exit(1); } -WindowlessWglApplication::~WindowlessWglApplication() { - _context.reset(); +bool WindowlessWglApplication::tryCreateContext(const Configuration& configuration) { + CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessWglApplication::tryCreateContext(): context already created", false); + + WindowlessWglContext glContext{configuration, _context.get()}; + if(!glContext.isCreated() || !glContext.makeCurrent() || !_context->tryCreate()) + return false; - wglMakeCurrent(_deviceContext, nullptr); - wglDeleteContext(_renderingContext); + _glContext = std::move(glContext); + return true; } +WindowlessWglApplication::~WindowlessWglApplication() = default; + }} diff --git a/src/Magnum/Platform/WindowlessWglApplication.h b/src/Magnum/Platform/WindowlessWglApplication.h index 0b5b4f6d4..2f91b2558 100644 --- a/src/Magnum/Platform/WindowlessWglApplication.h +++ b/src/Magnum/Platform/WindowlessWglApplication.h @@ -26,7 +26,7 @@ */ /** @file - * @brief Class @ref Magnum::Platform::WindowlessWglApplication, macro @ref MAGNUM_WINDOWLESSWGLAPPLICATION_MAIN() + * @brief Class @ref Magnum::Platform::WindowlessWglApplication, @ref Magnum::Platform::WindowlessWglContext, macro @ref MAGNUM_WINDOWLESSWGLAPPLICATION_MAIN() */ #include @@ -39,24 +39,153 @@ #include "Magnum/Magnum.h" #include "Magnum/OpenGL.h" +#include "Magnum/Tags.h" #include "Magnum/Platform/Platform.h" #ifndef DOXYGEN_GENERATING_OUTPUT /* Define stuff that we need because I can't be bothered with creating a new - header just for two defines */ -#define WGL_CONTEXT_FLAGS_ARB 0x2094 + header just for a few defines */ #define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 #endif namespace Magnum { namespace Platform { /** -@brief Windowless WGL application +@brief Windowless WGL context + +GL context using pure WINAPI, used in @ref WindowlessWglApplication. It is +built if `WITH_WINDOWLESSWGLAPPLICATION` is enabled in CMake. + +Meant to be used when there is a need to manage (multiple) GL contexts +manually. See @ref platform-windowless-contexts for more information. If no +other application header is included, this class is also aliased to +`Platform::WindowlessGLContext`. +*/ +class WindowlessWglContext { + public: + class Configuration; + + /** + * @brief Constructor + * @param configuration Context configuration + * @param context Optional Magnum context instance constructed + * using @ref NoCreate to manage driver workarounds + * + * On desktop GL, if version is not specified in @p configuration, the + * application first tries to create core context (OpenGL 3.1+) and if + * that fails, falls back to compatibility OpenGL 2.1 context. However, + * on binary AMD and NVidia drivers, creating core context does not use + * the largest available version. If the application detects such case + * (and given workaround is not disabled in optionally passed + * @ref context instance), the core context is destroyed and + * compatibility OpenGL 2.1 context is created instead to make the + * driver use the latest available version. + * + * Once the context is created, make it current using @ref makeCurrent() + * and create @ref Platform::Context instance to be able to use Magnum. + * @see @ref isCreated() + */ + explicit WindowlessWglContext(const Configuration& configuration, Context* context = nullptr); + + /** + * @brief Construct without creating the context + * + * Move a instance with created context over to make it usable. + */ + explicit WindowlessWglContext(NoCreateT) {} + + /** @brief Copying is not allowed */ + WindowlessWglContext(const WindowlessWglContext&) = delete; + + /** @brief Move constructor */ + WindowlessWglContext(WindowlessWglContext&& other); + + /** @brief Copying is not allowed */ + WindowlessWglContext& operator=(const WindowlessWglContext&) = delete; + + /** @brief Move assignment */ + WindowlessWglContext& operator=(WindowlessWglContext&& other); + + /** + * @brief Destructor + * + * Destroys the context, if any. + */ + ~WindowlessWglContext(); + + /** @brief Whether the context is created */ + bool isCreated() const { return _context; } + + /** + * @brief Make the context current + * + * Prints error message and returns `false` on failure, otherwise + * returns `true`. + */ + bool makeCurrent(); + + private: + HWND _window{}; + HDC _deviceContext{}; + HGLRC _context{}; +}; -Application for offscreen rendering using pure WINAPI. +/** +@brief Configuration -This application library is available on desktop OpenGL on Windows. It is built -if `WITH_WINDOWLESSWGLAPPLICATION` is enabled in CMake. +@see @ref WindowlessWglContext(), + @ref WindowlessWglApplication::WindowlessWglApplication(), + @ref WindowlessWglApplication::createContext(), + @ref WindowlessWglApplication::tryCreateContext() +*/ +class WindowlessWglContext::Configuration { + public: + /** + * @brief Context flag + * + * @see @ref Flags, @ref setFlags(), @ref Context::Flag + */ + enum class Flag: int { + Debug = WGL_CONTEXT_DEBUG_BIT_ARB /**< Create debug context */ + }; + + /** + * @brief Context flags + * + * @see @ref setFlags(), @ref Context::Flags + */ + #ifndef DOXYGEN_GENERATING_OUTPUT + typedef Containers::EnumSet Flags; + #else + typedef Containers::EnumSet Flags; + #endif + + constexpr /*implicit*/ Configuration() {} + + /** @brief Context flags */ + Flags flags() const { return _flags; } + + /** + * @brief Set context flags + * @return Reference to self (for method chaining) + * + * Default is no flag. See also @ref Context::flags(). + */ + Configuration& setFlags(Flags flags) { + _flags = flags; + return *this; + } + + private: + Flags _flags; +}; + +/** +@brief Windowless WGL application + +Application for offscreen rendering using @ref WindowlessWglContext. This +application library is available on desktop OpenGL on Windows. It is built if +`WITH_WINDOWLESSWGLAPPLICATION` is enabled in CMake. ## Bootstrap application @@ -102,20 +231,19 @@ class WindowlessWglApplication { /** @brief Application arguments */ struct Arguments { /** @brief Constructor */ - /*implicit*/ constexpr Arguments(int& argc, char** argv, HWND window) noexcept: argc{argc}, argv{argv}, window{window} {} + /*implicit*/ constexpr Arguments(int& argc, char** argv) noexcept: argc{argc}, argv{argv} {} int& argc; /**< @brief Argument count */ char** argv; /**< @brief Argument values */ - #ifndef DOXYGEN_GENERATING_OUTPUT - HWND window; - #endif }; - class Configuration; - - #ifndef DOXYGEN_GENERATING_OUTPUT - static int create(LRESULT(CALLBACK windowProcedure)(HWND, UINT, WPARAM, LPARAM)); - #endif + /** + * @brief Configuration + * + * @see @ref WindowlessWglApplication(), @ref createContext(), + * @ref tryCreateContext() + */ + typedef WindowlessWglContext::Configuration Configuration; /** * @brief Default constructor @@ -126,6 +254,7 @@ class WindowlessWglApplication { * See @ref Configuration for more information. The program exits if * the context cannot be created, see @ref tryCreateContext() for an * alternative. + * @see @ref WindowlessWglContext */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit WindowlessWglApplication(const Arguments& arguments, const Configuration& configuration = Configuration()); @@ -142,7 +271,15 @@ class WindowlessWglApplication { * Unlike above, the context is not created and must be created later * with @ref createContext() or @ref tryCreateContext(). */ - explicit WindowlessWglApplication(const Arguments& arguments, std::nullptr_t); + explicit WindowlessWglApplication(const Arguments& arguments, NoCreateT); + + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * @copybrief WindowlessWglApplication(const Arguments&, NoCreateT) + * @deprecated Use @ref WindowlessWglApplication(const Arguments&, NoCreateT) instead. + */ + CORRADE_DEPRECATED("use WindowlessWglApplication(const Arguments&, NoCreateT) instead") explicit WindowlessWglApplication(const Arguments& arguments, std::nullptr_t): WindowlessWglApplication{arguments, NoCreate} {} + #endif /** @brief Copying is not allowed */ WindowlessWglApplication(const WindowlessWglApplication&) = delete; @@ -177,15 +314,7 @@ class WindowlessWglApplication { * constructor itself. Error message is printed and the program exits * if the context cannot be created, see @ref tryCreateContext() for an * alternative. - * - * On desktop GL, if version is not specified in @p configuration, the - * application first tries to create core context (OpenGL 3.1+) and if - * that fails, falls back to compatibility OpenGL 2.1 context. However, - * on binary AMD and NVidia drivers, creating core context does not use - * the largest available version. If the application detects such case, - * the core context is destroyed and compatibility OpenGL 2.1 context - * is created instead to make the driver use the latest available - * version. + * @see @ref WindowlessWglContext */ #ifdef DOXYGEN_GENERATING_OUTPUT void createContext(const Configuration& configuration = Configuration()); @@ -204,61 +333,10 @@ class WindowlessWglApplication { bool tryCreateContext(const Configuration& configuration); private: - HWND _window; - HDC _deviceContext; - HGLRC _renderingContext; - + WindowlessWglContext _glContext; std::unique_ptr _context; }; -/** -@brief Configuration - -@see @ref WindowlessWglApplication(), @ref createContext(), - @ref tryCreateContext() -*/ -class WindowlessWglApplication::Configuration { - public: - /** - * @brief Context flag - * - * @see @ref Flags, @ref setFlags(), @ref Context::Flag - */ - enum class Flag: int { - Debug = WGL_CONTEXT_DEBUG_BIT_ARB /**< Create debug context */ - }; - - /** - * @brief Context flags - * - * @see @ref setFlags(), @ref Context::Flags - */ - #ifndef DOXYGEN_GENERATING_OUTPUT - typedef Containers::EnumSet Flags; - #else - typedef Containers::EnumSet Flags; - #endif - - constexpr /*implicit*/ Configuration() {} - - /** @brief Context flags */ - Flags flags() const { return _flags; } - - /** - * @brief Set context flags - * @return Reference to self (for method chaining) - * - * Default is no flag. See also @ref Context::flags(). - */ - Configuration& setFlags(Flags flags) { - _flags = flags; - return *this; - } - - private: - Flags _flags; -}; - /** @hideinitializer @brief Entry point for windowless WGL application @param className Class name @@ -270,29 +348,15 @@ windowless application header is included this macro is also aliased to `MAGNUM_WINDOWLESSAPPLICATION_MAIN()`. */ #define MAGNUM_WINDOWLESSWGLAPPLICATION_MAIN(className) \ - int globalArgc; char** globalArgv; \ - LRESULT CALLBACK windowProcedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); \ - LRESULT CALLBACK windowProcedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { \ - switch(message) { \ - case WM_CREATE: \ - { \ - className app({globalArgc, globalArgv, hWnd}); \ - PostQuitMessage(app.exec()); \ - } \ - break; \ - default: return DefWindowProc(hWnd, message, wParam, lParam); \ - } \ - return 0; \ - } \ int main(int argc, char** argv) { \ - globalArgc = argc; \ - globalArgv = argv; \ - return Magnum::Platform::WindowlessWglApplication::create(windowProcedure); \ + className app({argc, argv}); \ + return app.exec(); \ } #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_WINDOWLESSAPPLICATION_MAIN typedef WindowlessWglApplication WindowlessApplication; +typedef WindowlessWglContext WindowlessGLContext; #define MAGNUM_WINDOWLESSAPPLICATION_MAIN(className) MAGNUM_WINDOWLESSWGLAPPLICATION_MAIN(className) #else #undef MAGNUM_WINDOWLESSAPPLICATION_MAIN diff --git a/src/Magnum/Platform/WindowlessWindowsEglApplication.cpp b/src/Magnum/Platform/WindowlessWindowsEglApplication.cpp index 432274a8f..cf4c944e3 100644 --- a/src/Magnum/Platform/WindowlessWindowsEglApplication.cpp +++ b/src/Magnum/Platform/WindowlessWindowsEglApplication.cpp @@ -35,11 +35,11 @@ namespace Magnum { namespace Platform { -#ifndef DOXYGEN_GENERATING_OUTPUT -int WindowlessWindowsEglApplication::create(LRESULT(CALLBACK windowProcedure)(HWND, UINT, WPARAM, LPARAM)) { +WindowlessWindowsEglContext::WindowlessWindowsEglContext(const Configuration& configuration, Context*) { + /* Create the window */ const WNDCLASS wc{ 0, - windowProcedure, + DefWindowProc, 0, 0, GetModuleHandle(nullptr), @@ -49,39 +49,12 @@ int WindowlessWindowsEglApplication::create(LRESULT(CALLBACK windowProcedure)(HW nullptr, L"Magnum Windowless Application" }; - if(!RegisterClass(&wc)) return 1; - - CreateWindowW(wc.lpszClassName, L"Magnum Windowless Application", + if(!RegisterClass(&wc)) return; + const HWND window = CreateWindowW(wc.lpszClassName, L"Magnum Windowless Application", WS_OVERLAPPEDWINDOW, 0, 0, 32, 32, 0, 0, wc.hInstance, 0); - /* Hammer the return code out of the messaging thingy */ - MSG msg; - do {} while(GetMessageW(&msg, nullptr, 0, 0) != 0); - return msg.wParam; -} -#endif - -#ifndef DOXYGEN_GENERATING_OUTPUT -WindowlessWindowsEglApplication::WindowlessWindowsEglApplication(const Arguments& arguments): WindowlessWindowsEglApplication{arguments, Configuration{}} {} -#endif - -WindowlessWindowsEglApplication::WindowlessWindowsEglApplication(const Arguments& arguments, const Configuration& configuration): WindowlessWindowsEglApplication{arguments, nullptr} { - createContext(configuration); -} - -WindowlessWindowsEglApplication::WindowlessWindowsEglApplication(const Arguments& arguments, std::nullptr_t): _window(arguments.window), _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} - -void WindowlessWindowsEglApplication::createContext() { createContext({}); } - -void WindowlessWindowsEglApplication::createContext(const Configuration& configuration) { - if(!tryCreateContext(configuration)) std::exit(1); -} - -bool WindowlessWindowsEglApplication::tryCreateContext(const Configuration& configuration) { - CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessWindowsEglApplication::tryCreateContext(): context already created", false); - /* Initialize */ - _display = eglGetDisplay(GetDC(_window)); + _display = eglGetDisplay(GetDC(window)); if(!eglInitialize(_display, nullptr, nullptr)) { Error() << "Platform::WindowlessWindowsEglApplication::tryCreateContext(): cannot initialize EGL:" << Implementation::eglErrorString(eglGetError()); return false; @@ -117,7 +90,8 @@ bool WindowlessWindowsEglApplication::tryCreateContext(const Configuration& conf EGL_NONE }; EGLint configCount; - if(!eglChooseConfig(_display, attribs, &_config, 1, &configCount)) { + EGLConfig config; + if(!eglChooseConfig(_display, attribs, &config, 1, &configCount)) { Error() << "Platform::WindowlessWindowsEglApplication::tryCreateContext(): cannot get EGL visual config:" << Implementation::eglErrorString(eglGetError()); return false; } @@ -142,30 +116,73 @@ bool WindowlessWindowsEglApplication::tryCreateContext(const Configuration& conf EGL_NONE }; - if(!(_glContext = eglCreateContext(_display, _config, EGL_NO_CONTEXT, attributes))) { - Error() << "Platform::WindowlessWindowsEglApplication::tryCreateContext(): cannot create EGL context:" << Implementation::eglErrorString(eglGetError()); - return false; - } - if(!(_surface = eglCreateWindowSurface(_display, _config, _window, nullptr))) { - Error() << "Platform::WindowlessWindowsEglApplication::tryCreateContext(): cannot create window surface:" << Implementation::eglErrorString(eglGetError()); - return false; + if(!(_context = eglCreateContext(_display, config, EGL_NO_CONTEXT, attributes))) { + Error() << "Platform::WindowlessWindowsEglContext: cannot create EGL context:" << Implementation::eglErrorString(eglGetError()); + return; } - if(!eglMakeCurrent(_display, _surface, _surface, _glContext)) { - Error() << "Platform::WindowlessWindowsEglApplication::tryCreateContext(): cannot make context current:" << Implementation::eglErrorString(eglGetError()); - return false; - } + if(!(_surface = eglCreateWindowSurface(_display, config, _window, nullptr))) + Error() << "Platform::WindowlessWindowsEglContext: cannot create window surface:" << Implementation::eglErrorString(eglGetError()); +} + +WindowlessWindowsEglContext::WindowlessWindowsEglContext(WindowlessWindowsEglContext&& other): _window{other._window}, _display{other._display}, _surface{other._surface}, _context{other._context} { + other._window = {}; + other._display = {}; + other._surface = {}; + other._context = {}; +} + +WindowlessWindowsEglContext::~WindowlessWindowsEglContext() { + if(_context) eglDestroyContext(_display, _context); + if(_surface) eglDestroySurface(_display, _surface); + if(_display) eglTerminate(_display); + if(_window) DestroyWindow(_window); +} + +WindowlessWindowsEglContext& WindowlessWindowsEglContext::operator=(WindowlessWindowsEglContext&& other) { + using std::swap; + swap(other._window, _window); + swap(other._display, _display); + swap(other._surface, _surface); + swap(other._context, _context); + return *this; +} - /* Return true if the initialization succeeds */ - return _context->tryCreate(); +bool WindowlessWindowsEglContext::makeCurrent() { + if(eglMakeCurrent(_display, _surface, _surface, _context)) + return true; + + Error() << "Platform::WindowlessWindowsEglContext::makeCurrent(): cannot make context current:" << GetLastError(); + return false; } -WindowlessWindowsEglApplication::~WindowlessWindowsEglApplication() { - _context.reset(); +#ifndef DOXYGEN_GENERATING_OUTPUT +WindowlessWindowsEglApplication::WindowlessWindowsEglApplication(const Arguments& arguments): WindowlessWindowsEglApplication{arguments, Configuration{}} {} +#endif - eglDestroyContext(_display, _glContext); - eglDestroySurface(_display, _surface); - eglTerminate(_display); +WindowlessWindowsEglApplication::WindowlessWindowsEglApplication(const Arguments& arguments, const Configuration& configuration): WindowlessWindowsEglApplication{arguments, NoCreate} { + createContext(configuration); } +WindowlessWindowsEglApplication::WindowlessWindowsEglApplication(const Arguments& arguments, std::nullptr_t): _glContext{NoCreate}, _context{new Context{NoCreate, arguments.argc, arguments.argv}} {} + +void WindowlessWindowsEglApplication::createContext() { createContext({}); } + +void WindowlessWindowsEglApplication::createContext(const Configuration& configuration) { + if(!tryCreateContext(configuration)) std::exit(1); +} + +bool WindowlessWindowsEglApplication::tryCreateContext(const Configuration& configuration) { + CORRADE_ASSERT(_context->version() == Version::None, "Platform::WindowlessWindowsEglApplication::tryCreateContext(): context already created", false); + + WindowlessWindowsEglContext glContext{configuration, _context.get()}; + if(!glContext.isCreated() || !glContext.makeCurrent() || !_context->tryCreate()) + return false; + + _glContext = std::move(glContext); + return true; +} + +WindowlessWindowsEglApplication::~WindowlessWindowsEglApplication() = default; + }} diff --git a/src/Magnum/Platform/WindowlessWindowsEglApplication.h b/src/Magnum/Platform/WindowlessWindowsEglApplication.h index 87c6e663f..07a028458 100644 --- a/src/Magnum/Platform/WindowlessWindowsEglApplication.h +++ b/src/Magnum/Platform/WindowlessWindowsEglApplication.h @@ -26,7 +26,7 @@ */ /** @file - * @brief Class @ref Magnum::Platform::WindowlessWindowsEglApplication, macro @ref MAGNUM_WINDOWLESSWINDOWSEGLAPPLICATION_MAIN() + * @brief Class @ref Magnum::Platform::WindowlessWindowsEglApplication, @ref Magnum::Platform::WindowlessWindowsEglContext, macro @ref MAGNUM_WINDOWLESSWINDOWSEGLAPPLICATION_MAIN() */ #include @@ -41,15 +41,136 @@ #include "Magnum/Magnum.h" #include "Magnum/OpenGL.h" +#include "Magnum/Tags.h" #include "Magnum/Platform/Platform.h" namespace Magnum { namespace Platform { /** -@brief Windowless Windows/EGL application +@brief Windowless Windows/EGL context + +GL context using pure WINAPI and EGL, used in @ref WindowlessWindowsEglApplication. +It is built if `WITH_WINDOWLESSWINDOWSEGLAPPLICATION` is enabled in CMake. + +Meant to be used when there is a need to manage (multiple) GL contexts +manually. See @ref platform-windowless-contexts for more information. If no +other application header is included, this class is also aliased to +`Platform::WindowlessGLContext`. +*/ +class WindowlessWindowsEglContext { + public: + class Configuration; + + /** + * @brief Constructor + * @param configuration Context configuration + * @param context Optional Magnum context instance constructed + * using @ref NoCreate to manage driver workarounds + * + * Once the context is created, make it current using @ref makeCurrent() + * and create @ref Platform::Context instance to be able to use Magnum. + * @see @ref isCreated() + */ + explicit WindowlessWindowsEglContext(const Configuration& configuration, Context* context = nullptr); + + /** + * @brief Construct without creating the context + * + * Move a instance with created context over to make it usable. + */ + explicit WindowlessWindowsEglContext(NoCreateT) {} + + /** @brief Copying is not allowed */ + WindowlessWindowsEglContext(const WindowlessWindowsEglContext&) = delete; + + /** @brief Move constructor */ + WindowlessWindowsEglContext(WindowlessWindowsEglContext&& other); -Application for offscreen rendering using pure WINAPI and EGL. + /** @brief Copying is not allowed */ + WindowlessWindowsEglContext& operator=(const WindowlessWindowsEglContext&) = delete; + + /** @brief Move assignment */ + WindowlessWindowsEglContext& operator=(WindowlessWindowsEglContext&& other); + + /** + * @brief Destructor + * + * Destroys the context, if any. + */ + ~WindowlessWindowsEglContext(); + + /** @brief Whether the context is created */ + bool isCreated() const { return _context; } + + /** + * @brief Make the context current + * + * Prints error message and returns `false` on failure, otherwise + * returns `true`. + */ + bool makeCurrent(); + + private: + HWND _window{}; + EGLDisplay _display{}; + EGLSurface _surface{}; + EGLContext _context{}; +}; + +/** +@brief Configuration +@see @ref WindowlessWindowsEglContext(), + @ref WindowlessWindowsEglApplication::WindowlessWindowsEglApplication(), + @ref WindowlessWindowsEglApplication::createContext(), + @ref WindowlessWindowsEglApplication::tryCreateContext() +*/ +class WindowlessWindowsEglContext::Configuration { + public: + /** + * @brief Context flag + * + * @see @ref Flags, @ref setFlags(), @ref Context::Flag + */ + enum class Flag: int { + Debug = EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR /**< Create debug context */ + }; + + /** + * @brief Context flags + * + * @see @ref setFlags(), @ref Context::Flags + */ + #ifndef DOXYGEN_GENERATING_OUTPUT + typedef Containers::EnumSet Flags; + #else + typedef Containers::EnumSet Flags; + #endif + + constexpr /*implicit*/ Configuration() {} + + /** @brief Context flags */ + Flags flags() const { return _flags; } + + /** + * @brief Set context flags + * @return Reference to self (for method chaining) + * + * Default is no flag. See also @ref Context::flags(). + */ + Configuration& setFlags(Flags flags) { + _flags = flags; + return *this; + } + + private: + Flags _flags; +}; + +/** +@brief Windowless Windows/EGL application + +Application for offscreen rendering using @ref WindowlessWindowsEglContext. This application library is available on OpenGL ES (also ANGLE) on Windows. It is built if `WITH_WINDOWLESSWINDOWSEGLAPPLICATION` is enabled in CMake. @@ -97,20 +218,19 @@ class WindowlessWindowsEglApplication { /** @brief Application arguments */ struct Arguments { /** @brief Constructor */ - /*implicit*/ constexpr Arguments(int& argc, char** argv, HWND window) noexcept: argc{argc}, argv{argv}, window{window} {} + /*implicit*/ constexpr Arguments(int& argc, char** argv) noexcept: argc{argc}, argv{argv} {} int& argc; /**< @brief Argument count */ char** argv; /**< @brief Argument values */ - #ifndef DOXYGEN_GENERATING_OUTPUT - HWND window; - #endif }; - class Configuration; - - #ifndef DOXYGEN_GENERATING_OUTPUT - static int create(LRESULT(CALLBACK windowProcedure)(HWND, UINT, WPARAM, LPARAM)); - #endif + /** + * @brief Configuration + * + * @see @ref WindowlessWindowsEglApplication(), @ref createContext(), + * @ref tryCreateContext() + */ + typedef WindowlessWindowsEglContext::Configuration Configuration; /** * @brief Default constructor @@ -137,7 +257,15 @@ class WindowlessWindowsEglApplication { * Unlike above, the context is not created and must be created later * with @ref createContext() or @ref tryCreateContext(). */ - explicit WindowlessWindowsEglApplication(const Arguments& arguments, std::nullptr_t); + explicit WindowlessWindowsEglApplication(const Arguments& arguments, NoCreateT); + + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * @copybrief WindowlessWindowsEglApplication(const Arguments&, NoCreateT) + * @deprecated Use @ref WindowlessWindowsEglApplication(const Arguments&, NoCreateT) instead. + */ + CORRADE_DEPRECATED("use WindowlessWindowsEglApplication(const Arguments&, NoCreateT) instead") explicit WindowlessWindowsEglApplication(const Arguments& arguments, std::nullptr_t): WindowlessWindowsEglApplication{arguments, NoCreate} {} + #endif /** @brief Copying is not allowed */ WindowlessWindowsEglApplication(const WindowlessWindowsEglApplication&) = delete; @@ -190,63 +318,10 @@ class WindowlessWindowsEglApplication { bool tryCreateContext(const Configuration& configuration); private: - HWND _window; - EGLDisplay _display; - EGLConfig _config; - EGLSurface _surface; - EGLContext _glContext; - + WindowlessWindowsEglContext _glContext; std::unique_ptr _context; }; -/** -@brief Configuration - -@see @ref WindowlessWindowsEglApplication(), @ref createContext(), - @ref tryCreateContext() -*/ -class WindowlessWindowsEglApplication::Configuration { - public: - /** - * @brief Context flag - * - * @see @ref Flags, @ref setFlags(), @ref Context::Flag - */ - enum class Flag: int { - Debug = EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR /**< Create debug context */ - }; - - /** - * @brief Context flags - * - * @see @ref setFlags(), @ref Context::Flags - */ - #ifndef DOXYGEN_GENERATING_OUTPUT - typedef Containers::EnumSet Flags; - #else - typedef Containers::EnumSet Flags; - #endif - - constexpr /*implicit*/ Configuration() {} - - /** @brief Context flags */ - Flags flags() const { return _flags; } - - /** - * @brief Set context flags - * @return Reference to self (for method chaining) - * - * Default is no flag. See also @ref Context::flags(). - */ - Configuration& setFlags(Flags flags) { - _flags = flags; - return *this; - } - - private: - Flags _flags; -}; - /** @hideinitializer @brief Entry point for windowless Windows/EGL application @param className Class name @@ -257,30 +332,16 @@ code, see @ref portability-applications for more information. When no other windowless application header is included this macro is also aliased to `MAGNUM_WINDOWLESSAPPLICATION_MAIN()`. */ -#define MAGNUM_WINDOWLESSWINDOWSEGLAPPLICATION_MAIN(className) \ - int globalArgc; char** globalArgv; \ - LRESULT CALLBACK windowProcedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); \ - LRESULT CALLBACK windowProcedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { \ - switch(message) { \ - case WM_CREATE: \ - { \ - className app({globalArgc, globalArgv, hWnd}); \ - PostQuitMessage(app.exec()); \ - } \ - break; \ - default: return DefWindowProc(hWnd, message, wParam, lParam); \ - } \ - return 0; \ - } \ +#define MAGNUM_WINDOWLESSWINDOWSEGLAPPLICATION_MAIN(className) \ int main(int argc, char** argv) { \ - globalArgc = argc; \ - globalArgv = argv; \ - return Magnum::Platform::WindowlessWindowsEglApplication::create(windowProcedure); \ + className app({argc, argv}); \ + return app.exec(); \ } #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_WINDOWLESSAPPLICATION_MAIN typedef WindowlessWindowsEglApplication WindowlessApplication; +typedef WindowlessWindowsEglContext WindowlessGLContext; #define MAGNUM_WINDOWLESSAPPLICATION_MAIN(className) MAGNUM_WINDOWLESSWINDOWSEGLAPPLICATION_MAIN(className) #else #undef MAGNUM_WINDOWLESSAPPLICATION_MAIN diff --git a/src/Magnum/Platform/magnum-info.cpp b/src/Magnum/Platform/magnum-info.cpp index 68cf49f56..0c38fa460 100644 --- a/src/Magnum/Platform/magnum-info.cpp +++ b/src/Magnum/Platform/magnum-info.cpp @@ -141,7 +141,7 @@ class MagnumInfo: public Platform::WindowlessApplication { int exec() override { return 0; } }; -MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplication(arguments, nullptr) { +MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplication{arguments, NoCreate} { Utility::Arguments args; args.addBooleanOption('s', "short").setHelp("short", "display just essential info and exit") .addBooleanOption("extension-strings").setHelp("extension-strings", "list all extension strings provided by the driver (implies --short)") diff --git a/src/Magnum/Test/AbstractOpenGLTester.h b/src/Magnum/Test/AbstractOpenGLTester.h index 9e2450d57..e159cd1ae 100644 --- a/src/Magnum/Test/AbstractOpenGLTester.h +++ b/src/Magnum/Test/AbstractOpenGLTester.h @@ -61,7 +61,7 @@ class AbstractOpenGLTester: public TestSuite::Tester { private: struct WindowlessApplication: Platform::WindowlessApplication { - explicit WindowlessApplication(const Arguments& arguments): Platform::WindowlessApplication{arguments, nullptr} {} + explicit WindowlessApplication(const Arguments& arguments): Platform::WindowlessApplication{arguments, NoCreate} {} int exec() override final { return 0; } using Platform::WindowlessApplication::tryCreateContext; @@ -94,31 +94,7 @@ std::optional AbstractOpenGLTester:: #define MAGNUM_VERIFY_NO_ERROR() CORRADE_COMPARE(Magnum::Renderer::error(), Magnum::Renderer::Error::NoError) -#ifdef CORRADE_TARGET_WINDOWS -#define MAGNUM_GL_TEST_MAIN(Class) \ - LRESULT CALLBACK windowProcedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); \ - LRESULT CALLBACK windowProcedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { \ - int ret = 0; \ - switch(message) { \ - case WM_CREATE: \ - { \ - Magnum::Test::AbstractOpenGLTester::_windowlessApplicationArguments->window = hWnd; \ - Class t; \ - t.registerTest(__FILE__, #Class); \ - PostQuitMessage(ret = t.exec( \ - Magnum::Test::AbstractOpenGLTester::_windowlessApplicationArguments->argc, \ - Magnum::Test::AbstractOpenGLTester::_windowlessApplicationArguments->argv)); \ - } \ - break; \ - default: return DefWindowProc(hWnd, message, wParam, lParam); \ - } \ - return ret; \ - } \ - int main(int argc, char** argv) { \ - Magnum::Test::AbstractOpenGLTester::_windowlessApplicationArguments.emplace(argc, argv, nullptr); \ - return Magnum::Platform::WindowlessApplication::create(windowProcedure); \ - } -#elif defined(CORRADE_TESTSUITE_TARGET_XCTEST) +#ifdef CORRADE_TESTSUITE_TARGET_XCTEST #define MAGNUM_GL_TEST_MAIN(Class) \ int CORRADE_VISIBILITY_EXPORT corradeTestMain(int argc, char** argv) { \ Magnum::Test::AbstractOpenGLTester::_windowlessApplicationArguments.emplace(argc, argv); \ diff --git a/src/Magnum/Text/fontconverter.cpp b/src/Magnum/Text/fontconverter.cpp index 78a90dbf4..29f8bbc50 100644 --- a/src/Magnum/Text/fontconverter.cpp +++ b/src/Magnum/Text/fontconverter.cpp @@ -101,7 +101,7 @@ class FontConverter: public Platform::WindowlessApplication { Utility::Arguments args; }; -FontConverter::FontConverter(const Arguments& arguments): Platform::WindowlessApplication(arguments, nullptr) { +FontConverter::FontConverter(const Arguments& arguments): Platform::WindowlessApplication{arguments, NoCreate} { args.addArgument("input").setHelp("input", "input font") .addArgument("output").setHelp("output", "output filename prefix") .addNamedArgument("font").setHelp("font", "font plugin") diff --git a/src/Magnum/TextureTools/distancefieldconverter.cpp b/src/Magnum/TextureTools/distancefieldconverter.cpp index bded817b8..c06831f36 100644 --- a/src/Magnum/TextureTools/distancefieldconverter.cpp +++ b/src/Magnum/TextureTools/distancefieldconverter.cpp @@ -102,7 +102,7 @@ class DistanceFieldConverter: public Platform::WindowlessApplication { Utility::Arguments args; }; -DistanceFieldConverter::DistanceFieldConverter(const Arguments& arguments): Platform::WindowlessApplication(arguments, nullptr) { +DistanceFieldConverter::DistanceFieldConverter(const Arguments& arguments): Platform::WindowlessApplication{arguments, NoCreate} { args.addArgument("input").setHelp("input", "input image") .addArgument("output").setHelp("output", "output image") .addOption("importer", "AnyImageImporter").setHelp("importer", "image importer plugin") From 51cf1d612010bce83108792aeaba521168183bcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 17 Jun 2016 15:21:13 +0200 Subject: [PATCH 052/290] Introduce BUILD_MULTITHREADED CMake option. Enabled by default, makes the current Magnum context a thread-local variable instead of a global one, so it's possible to have multiple thread-local contexts. Might have some performance implications, that's why it's possible to disable it (but enabled by default is the safer option). GCC 4.7 and Apple platforms don't support thread_local, but __thread does the job too (though on iOS not until Xcode 7.3). Also had to move it to file-local because MSVC doesn't like having thread local variables as part of DLL interface. (And there is *of course* no way to disable exporting one particular member. F' that.) --- CMakeLists.txt | 5 +++++ doc/building.dox | 9 +++++++++ doc/cmake.dox | 2 ++ modules/FindMagnum.cmake | 3 +++ package/ci/travis.yml | 7 +++++-- src/Magnum/Context.cpp | 25 +++++++++++++++++-------- src/Magnum/Context.h | 8 +++++--- src/Magnum/Magnum.h | 10 ++++++++++ src/Magnum/Platform/magnum-info.cpp | 3 +++ src/Magnum/configure.h.cmake | 1 + 10 files changed, 60 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 172bf1f48..c508d6493 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -138,6 +138,11 @@ if(BUILD_DEPRECATED) set(MAGNUM_BUILD_DEPRECATED 1) endif() +option(BUILD_MULTITHREADED "Build in a way that makes it possible to use multiple thread-local Magnum contexts" ON) +if(BUILD_MULTITHREADED) + set(MAGNUM_BUILD_MULTITHREADED 1) +endif() + option(BUILD_STATIC "Build static libraries (default are shared)" OFF) option(BUILD_STATIC_PIC "Build static libraries and plugins with position-independent code" ON) option(BUILD_PLUGINS_STATIC "Build static plugins (default are dynamic)" OFF) diff --git a/doc/building.dox b/doc/building.dox index 06d589a87..c95322d85 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -173,6 +173,11 @@ available for desktop OpenGL only, see @ref requires-gl. Supported mainly on OpenGL ES drivers, for desktop OpenGL the only driver that supports this configuration is NVidia >= 355. +By default the engine is built in a way that allows having multiple +thread-local Magnum contents. This might cause some performance penalties -- if +you are sure that you will never need such feature, you can disable it via the +`BUILD_MULTITHREADED` option. + The features used can be conveniently detected in depending projects both in CMake and C++ sources, see @ref cmake and @ref Magnum/Magnum.h for more information. See also @ref corrade-cmake and @ref Corrade/Corrade.h for @@ -542,6 +547,10 @@ static libraries. You might also have problems using dynamic plugins, enable `BUILD_PLUGINS_STATIC` to build also plugins as static. OpenGL ES 2.0 is enabled by default, switch to 3.0 by disabling `TARGET_GLES2`. +Please note that `BUILD_MULTITHREADED` is supported only since Xcode 7.3 and +doesn't work on `i386` iOS Simulator, you need to disable it in order to build +for older platforms. + mkdir build-ios && cd build-ios cmake .. \ -DCMAKE_TOOLCHAIN_FILE=../toolchains/generic/iOS.cmake \ diff --git a/doc/cmake.dox b/doc/cmake.dox index 972858b2c..6cfca2b53 100644 --- a/doc/cmake.dox +++ b/doc/cmake.dox @@ -180,6 +180,8 @@ are also available as preprocessor variables if including included - `MAGNUM_BUILD_STATIC` -- Defined if compiled as static libraries. Default are shared libraries. +- `MAGNUM_BUILD_MULTITHREADED` -- Defined if compiled in a way that allows + having multiple thread-local Magnum contexts. The default. - `MAGNUM_TARGET_GLES` -- Defined if compiled for OpenGL ES - `MAGNUM_TARGET_GLES2` -- Defined if compiled for OpenGL ES 2.0 - `MAGNUM_TARGET_GLES3` -- Defined if compiled for OpenGL ES 3.0 diff --git a/modules/FindMagnum.cmake b/modules/FindMagnum.cmake index ef0058348..949d54a28 100644 --- a/modules/FindMagnum.cmake +++ b/modules/FindMagnum.cmake @@ -105,6 +105,8 @@ # MAGNUM_BUILD_DEPRECATED - Defined if compiled with deprecated APIs # included # MAGNUM_BUILD_STATIC - Defined if compiled as static libraries +# MAGNUM_BUILD_MULTITHREADED - Defined if compiled in a way that allows +# having multiple thread-local Magnum contexts # MAGNUM_TARGET_GLES - Defined if compiled for OpenGL ES # MAGNUM_TARGET_GLES2 - Defined if compiled for OpenGL ES 2.0 # MAGNUM_TARGET_GLES3 - Defined if compiled for OpenGL ES 3.0 @@ -206,6 +208,7 @@ file(READ ${_MAGNUM_CONFIGURE_FILE} _magnumConfigure) set(_magnumFlags BUILD_DEPRECATED BUILD_STATIC + BUILD_MULTITHREADED TARGET_GLES TARGET_GLES2 TARGET_GLES3 diff --git a/package/ci/travis.yml b/package/ci/travis.yml index 2aff509ea..b5792db8e 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -14,10 +14,12 @@ matrix: compiler: clang env: TARGET=desktop - os: osx + osx_image: xcode7.3 env: - TARGET=ios-simulator - TARGET_GLES2=ON - os: osx + osx_image: xcode7.3 env: - TARGET=ios-simulator - TARGET_GLES2=OFF @@ -59,13 +61,14 @@ install: - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export PLATFORM_GL_API=GLX; fi - if [ "$TRAVIS_OS_NAME" == "osx" ]; then export PLATFORM_GL_API=CGL; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then gem install xcpretty; fi -- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then brew upgrade cmake; fi +# Xcode 7.2 image doesn't have cmake installed using Homebrew, so we can't use `upgrade` +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then brew install cmake; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then brew install emscripten && export LLVM=/usr/local/opt/emscripten/libexec/llvm/bin && emcc; fi - if [ "$TARGET" == "desktop" ]; then printf "[General]\ndrivers=null" > ~/.alsoftrc; fi # SDL (cached) - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then brew install sdl2; fi -- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then curl -O https://www.libsdl.org/release/SDL2-2.0.4.tar.gz && tar -xzvf SDL2-2.0.4.tar.gz && cd SDL2-2.0.4/Xcode-iOS/SDL && xcodebuild -sdk iphonesimulator8.1 | xcpretty && mkdir -p ../../../sdl2/lib && cp build/Release-iphonesimulator/libSDL2.a ../../../sdl2/lib && mkdir -p ../../../sdl2/include/SDL2 && cp -R ../../include/* ../../../sdl2/include/SDL2 && cd ../../..; fi +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then curl -O https://www.libsdl.org/release/SDL2-2.0.4.tar.gz && tar -xzvf SDL2-2.0.4.tar.gz && cd SDL2-2.0.4/Xcode-iOS/SDL && xcodebuild -sdk iphonesimulator9.3 | xcpretty && mkdir -p ../../../sdl2/lib && cp build/Release-iphonesimulator/libSDL2.a ../../../sdl2/lib && mkdir -p ../../../sdl2/include/SDL2 && cp -R ../../include/* ../../../sdl2/include/SDL2 && cd ../../..; fi - if [ "$TRAVIS_OS_NAME" == "linux" ] && [ ! -e "$HOME/sdl2/include" ]; then curl -O http://www.libsdl.org/release/SDL2-2.0.4.tar.gz && tar -xzvf SDL2-2.0.4.tar.gz && cd SDL2-2.0.4 && mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/sdl2 -DCMAKE_BUILD_TYPE=Release && cmake --build . --target install && cd ../..; fi # GLFW (cached) diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index b922a3991..37c2dcaa8 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -409,13 +409,22 @@ const std::vector& Extension::extensions(Version version) { CORRADE_ASSERT_UNREACHABLE(); } -Context* Context::_current = nullptr; +namespace { + #ifdef MAGNUM_BUILD_MULTITHREADED + #if !defined(CORRADE_GCC47_COMPATIBILITY) && !defined(CORRADE_TARGET_APPLE) + thread_local + #else + __thread + #endif + #endif + Context* currentContext = nullptr; +} -bool Context::hasCurrent() { return _current; } +bool Context::hasCurrent() { return currentContext; } Context& Context::current() { - CORRADE_ASSERT(_current, "Context::current(): no current context", *_current); - return *_current; + CORRADE_ASSERT(currentContext, "Context::current(): no current context", *currentContext); + return *currentContext; } Context::Context(NoCreateT, Int argc, char** argv, void functionLoader()): _functionLoader{functionLoader}, _version{Version::None} { @@ -448,13 +457,13 @@ Context::Context(Context&& other): _version{std::move(other._version)}, _detectedDrivers{std::move(other._detectedDrivers)} { other._state = nullptr; - if(_current == &other) _current = this; + if(currentContext == &other) currentContext = this; } Context::~Context() { delete _state; - if(_current == this) _current = nullptr; + if(currentContext == this) currentContext = nullptr; } void Context::create() { @@ -640,8 +649,8 @@ bool Context::tryCreate() { setupDriverWorkarounds(); /* Set this context as current */ - CORRADE_ASSERT(!_current, "Context: Another context currently active", false); - _current = this; + CORRADE_ASSERT(!currentContext, "Context: Another context currently active", false); + currentContext = this; /* Print some info and initialize state tracker (which also prints some more info) */ diff --git a/src/Magnum/Context.h b/src/Magnum/Context.h index 8ce3b2521..5fe83d2be 100644 --- a/src/Magnum/Context.h +++ b/src/Magnum/Context.h @@ -244,6 +244,8 @@ class MAGNUM_EXPORT Context { /** * @brief Whether there is any current context * + * If Magnum is built with @ref MAGNUM_BUILD_MULTITHREADED, current + * context is thread-local instead of global (the default). * @see @ref current() */ static bool hasCurrent(); @@ -251,7 +253,9 @@ class MAGNUM_EXPORT Context { /** * @brief Current context * - * Expect that there is current context. + * Expect that there is current context. If Magnum is built with + * @ref MAGNUM_BUILD_MULTITHREADED, current context is thread-local + * instead of global (the default). * @see @ref hasCurrent() */ static Context& current(); @@ -501,8 +505,6 @@ class MAGNUM_EXPORT Context { Implementation::State& state() { return *_state; } private: - MAGNUM_LOCAL static Context* _current; - explicit Context(NoCreateT, Int argc, char** argv, void functionLoader()); bool tryCreate(); diff --git a/src/Magnum/Magnum.h b/src/Magnum/Magnum.h index a55936625..832ecf98e 100644 --- a/src/Magnum/Magnum.h +++ b/src/Magnum/Magnum.h @@ -91,6 +91,16 @@ Defined if built as static libraries. Default are shared libraries. #define MAGNUM_BUILD_STATIC #undef MAGNUM_BUILD_STATIC +/** +@brief Multi-threaded build + +Defined if the library is built in a way that allows multiple thread-local +Magnum contexts. Enabled by default. +@see @ref building, @ref cmake, @ref Context::current() +*/ +#define MAGNUM_BUILD_MULTITHREADED +#undef MAGNUM_BUILD_MULTITHREADED + /** @brief OpenGL ES target diff --git a/src/Magnum/Platform/magnum-info.cpp b/src/Magnum/Platform/magnum-info.cpp index 0c38fa460..a7bc1a027 100644 --- a/src/Magnum/Platform/magnum-info.cpp +++ b/src/Magnum/Platform/magnum-info.cpp @@ -246,6 +246,9 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat #ifdef MAGNUM_BUILD_STATIC Debug() << " MAGNUM_BUILD_STATIC"; #endif + #ifdef MAGNUM_BUILD_MULTITHREADED + Debug() << " MAGNUM_BUILD_MULTITHREADED"; + #endif #ifdef MAGNUM_TARGET_GLES Debug() << " MAGNUM_TARGET_GLES"; #endif diff --git a/src/Magnum/configure.h.cmake b/src/Magnum/configure.h.cmake index 54abfa21d..0026bbee1 100644 --- a/src/Magnum/configure.h.cmake +++ b/src/Magnum/configure.h.cmake @@ -25,6 +25,7 @@ #cmakedefine MAGNUM_BUILD_DEPRECATED #cmakedefine MAGNUM_BUILD_STATIC +#cmakedefine MAGNUM_BUILD_MULTITHREADED #cmakedefine MAGNUM_TARGET_GLES #cmakedefine MAGNUM_TARGET_GLES2 #cmakedefine MAGNUM_TARGET_GLES3 From f96b22e117695b3c5b6ef353eebec730ab92f9cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 20:44:42 +0200 Subject: [PATCH 053/290] Platform: no-forward-compatible-core-context also on Intel/Windows. Detected in WindowlessWglApplication, added it to both Sdl2Application and WindowlessWglApplication. Renamed the workaround to reflect that it is for all three major vendors. --- src/Magnum/Implementation/driverSpecific.cpp | 9 ++++++--- src/Magnum/Platform/Sdl2Application.cpp | 8 +++++++- src/Magnum/Platform/WindowlessGlxApplication.cpp | 8 ++++---- src/Magnum/Platform/WindowlessWglApplication.cpp | 12 +++++++----- src/Magnum/Platform/magnum-info.cpp | 2 +- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/Magnum/Implementation/driverSpecific.cpp b/src/Magnum/Implementation/driverSpecific.cpp index e6840aeda..b405dc12d 100644 --- a/src/Magnum/Implementation/driverSpecific.cpp +++ b/src/Magnum/Implementation/driverSpecific.cpp @@ -35,10 +35,13 @@ namespace Magnum { namespace { std::vector KnownWorkarounds{ #ifndef MAGNUM_TARGET_GLES + #ifndef CORRADE_TARGET_APPLE /* Creating core context with specific version on AMD and NV - proprietary drivers causes the context to be forced to given - version instead of selecting latest available version */ - "amd-nv-no-forward-compatible-core-context", + proprietary drivers on Linux/Windows and Intel drivers on Windows + causes the context to be forced to given version instead of + selecting latest available version */ + "no-forward-compatible-core-context", + #endif #ifdef CORRADE_TARGET_WINDOWS /* On Windows Intel drivers ARB_shading_language_420pack is exposed in diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index 7578fdbdd..ce86b4909 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -186,6 +186,9 @@ bool Sdl2Application::tryCreateContext(const Configuration& configuration) { version to the one specified, which is completely useless behavior. */ #ifndef CORRADE_TARGET_APPLE constexpr static const char nvidiaVendorString[] = "NVIDIA Corporation"; + #ifdef CORRADE_TARGET_WINDOWS + constexpr static const char intelVendorString[] = "Intel"; + #endif constexpr static const char amdVendorString[] = "ATI Technologies Inc."; const char* vendorString; #endif @@ -194,8 +197,11 @@ bool Sdl2Application::tryCreateContext(const Configuration& configuration) { /* Sorry about the UGLY code, HOPEFULLY THERE WON'T BE MORE WORKAROUNDS */ || (vendorString = reinterpret_cast(glGetString(GL_VENDOR)), (std::strncmp(vendorString, nvidiaVendorString, sizeof(nvidiaVendorString)) == 0 || + #ifdef CORRADE_TARGET_WINDOWS + std::strncmp(vendorString, intelVendorString, sizeof(intelVendorString)) == 0 || + #endif std::strncmp(vendorString, amdVendorString, sizeof(amdVendorString)) == 0) - && !_context->isDriverWorkaroundDisabled("amd-nv-no-forward-compatible-core-context")) + && !_context->isDriverWorkaroundDisabled("no-forward-compatible-core-context")) #endif )) { /* Don't print any warning when doing the NV workaround, because the diff --git a/src/Magnum/Platform/WindowlessGlxApplication.cpp b/src/Magnum/Platform/WindowlessGlxApplication.cpp index fcb693f7e..b9f014a0b 100644 --- a/src/Magnum/Platform/WindowlessGlxApplication.cpp +++ b/src/Magnum/Platform/WindowlessGlxApplication.cpp @@ -103,9 +103,9 @@ WindowlessGlxContext::WindowlessGlxContext(const WindowlessGlxContext::Configura _context = glXCreateContextAttribsARB(_display, configs[0], nullptr, True, fallbackContextAttributes); /* Fall back to (forward compatible) GL 2.1 if we are on binary NVidia/AMD - drivers on Linux/Windows. Instead of creating forward-compatible context - with highest available version, they force the version to the one - specified, which is completely useless behavior. */ + drivers on Linux. Instead of creating forward-compatible context with + highest available version, they force the version to the one specified, + which is completely useless behavior. */ } else { /* We need to make the context current to read out vendor string, so save the previous values so we can safely revert back without @@ -125,7 +125,7 @@ WindowlessGlxContext::WindowlessGlxContext(const WindowlessGlxContext::Configura const char* const vendorString = reinterpret_cast(glGetString(GL_VENDOR)); if((std::strncmp(vendorString, nvidiaVendorString, sizeof(nvidiaVendorString)) == 0 || std::strncmp(vendorString, amdVendorString, sizeof(amdVendorString)) == 0) && - (!magnumContext || !magnumContext->isDriverWorkaroundDisabled("amd-nv-no-forward-compatible-core-context"))) + (!magnumContext || !magnumContext->isDriverWorkaroundDisabled("no-forward-compatible-core-context"))) { /* Destroy the core context and create a compatibility one */ glXDestroyContext(_display, _context); diff --git a/src/Magnum/Platform/WindowlessWglApplication.cpp b/src/Magnum/Platform/WindowlessWglApplication.cpp index 75845496e..8e4be0878 100644 --- a/src/Magnum/Platform/WindowlessWglApplication.cpp +++ b/src/Magnum/Platform/WindowlessWglApplication.cpp @@ -138,10 +138,10 @@ WindowlessWglContext::WindowlessWglContext(const Configuration& configuration, C }; _context = wglCreateContextAttribsARB(_deviceContext, nullptr, fallbackContextAttributes); - /* Fall back to (forward compatible) GL 2.1 if we are on binary NVidia/AMD - drivers on Linux/Windows. Instead of creating forward-compatible context - with highest available version, they force the version to the one - specified, which is completely useless behavior. */ + /* Fall back to (forward compatible) GL 2.1 if we are on binary + NVidia/AMD/Intel drivers on Windows. Instead of creating forward-compatible + context with highest available version, they force the version to the + one specified, which is completely useless behavior. */ } else { /* We need to make the context current to read out vendor string */ if(!wglMakeCurrent(_deviceContext, _context)) { @@ -157,11 +157,13 @@ WindowlessWglContext::WindowlessWglContext(const Configuration& configuration, C /* The workaround check is the last so it doesn't appear in workaround list on unrelated drivers */ constexpr static const char nvidiaVendorString[] = "NVIDIA Corporation"; + constexpr static const char intelVendorString[] = "Intel"; constexpr static const char amdVendorString[] = "ATI Technologies Inc."; const char* const vendorString = reinterpret_cast(glGetString(GL_VENDOR)); if((std::strncmp(vendorString, nvidiaVendorString, sizeof(nvidiaVendorString)) == 0 || + std::strncmp(vendorString, intelVendorString, sizeof(intelVendorString)) == 0 || std::strncmp(vendorString, amdVendorString, sizeof(amdVendorString)) == 0) && - (!magnumContext || !magnumContext->isDriverWorkaroundDisabled("amd-nv-no-forward-compatible-core-context"))) + (!magnumContext || !magnumContext->isDriverWorkaroundDisabled("no-forward-compatible-core-context"))) { /* Destroy the core context and create a compatibility one */ wglDeleteContext(_context); diff --git a/src/Magnum/Platform/magnum-info.cpp b/src/Magnum/Platform/magnum-info.cpp index a7bc1a027..c6efab471 100644 --- a/src/Magnum/Platform/magnum-info.cpp +++ b/src/Magnum/Platform/magnum-info.cpp @@ -115,7 +115,7 @@ Using optional features: GL_ARB_invalidate_subdata ... Using driver workarounds: - amd-nv-no-forward-compatible-core-context + no-forward-compatible-core-context no-layout-qualifiers-on-old-glsl Context flags: Supported GLSL versions: From 58718e24e2756e791b8ff93d83d90e9b0919ab7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 20:50:40 +0200 Subject: [PATCH 054/290] doc: mention MAGNUM_BUILD_MULTITHREADED in Platform docs. --- doc/platform.dox | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/platform.dox b/doc/platform.dox index fa02d29c0..c85ec242e 100644 --- a/doc/platform.dox +++ b/doc/platform.dox @@ -363,7 +363,8 @@ The main purpose of windowless contexts is threaded OpenGL, used for example for background data processing. The workflow is to create the windowless context on the main thread, but make it current in the worker thread. This way the main thread state isn't affected so it can have any other GL context -current (for example for the main application rendering). +current (for example for the main application rendering). See also +@ref MAGNUM_BUILD_MULTITHREADED. @note Context creation is not thread safe on all platforms, that's why it still has to be done on the main thread. From bd1736a6cc2630af546893aa83385258cb0b39b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 17 Jun 2016 23:39:02 +0200 Subject: [PATCH 055/290] doc: improve Windows RT building docs. --- doc/building.dox | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/doc/building.dox b/doc/building.dox index c95322d85..e5cac6fbe 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -396,15 +396,23 @@ installation path for WinRT dependencies is in `C:/Sys-winrt`. You need at least Windows 8.1, Visual Studio 2013 and Windows 8.1 Store/Phone SDK installed. Windows RT applications support OpenGL only through ANGLE, which is currently limited to OpenGL ES. Download and build ANGLE @ref building-windows-angle "according to instructions above", -but use project files from the `winrt/` directory instead. Upcoming version -2.0.4 of SDL has support for WinRT applications, download the source from -https://www.libsdl.org/hg.php and use project files from the `VisualC-WinRT` -directory. Because WinRT applications run in a sandbox, it's recommended to -build the library as static so you don't have to bundle all the DLLs. Example: +but use project files from the `winrt/` directory instead. Version 2.0.4 of SDL +has support for WinRT applications, download the source from +https://www.libsdl.org/download-2.0.php and use project files from the +`VisualC-WinRT` directory. Because WinRT applications run in a sandbox, it's +recommended to build the library as static so you don't have to bundle all the +DLLs. Example: mkdir build-winrt cd build-winrt - cmake -DCORRADE_RC_EXECUTABLE="C:/Sys/bin/corrade-rc.exe" -DCMAKE_INSTALL_PREFIX="C:/Sys-winrt" -DBUILD_STATIC=ON -DWITH_SDL2APPLICATION=ON -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=8.1 -G "Visual Studio 14 2015" .. + cmake .. ^ + -DCMAKE_SYSTEM_NAME=WindowsStore ^ + -DCMAKE_SYSTEM_VERSION=10 ^ + -DCORRADE_RC_EXECUTABLE="C:/Sys/bin/corrade-rc.exe" ^ + -DCMAKE_INSTALL_PREFIX="C:/Sys-winrt" ^ + -DBUILD_STATIC=ON ^ + -DWITH_SDL2APPLICATION=ON ^ + -G "Visual Studio 14 2015" .. cmake --build . Change `WindowsStore` to `WindowsPhone` if you want to build for Windows Phone From f6cf1ba4c9d36019f5fd3f6691370d6cb0f7ffd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 20:52:38 +0200 Subject: [PATCH 056/290] package/ci: build for MinGW and Windows RT GLES2/GLES3 on AppVeyor. --- package/ci/appveyor-desktop-mingw.bat | 44 ++++++++++++++++ package/ci/appveyor-desktop.bat | 43 +++++++++++++++ package/ci/appveyor-rt.bat | 76 +++++++++++++++++++++++++++ package/ci/appveyor.yml | 74 ++++++++++---------------- 4 files changed, 190 insertions(+), 47 deletions(-) create mode 100644 package/ci/appveyor-desktop-mingw.bat create mode 100644 package/ci/appveyor-desktop.bat create mode 100644 package/ci/appveyor-rt.bat diff --git a/package/ci/appveyor-desktop-mingw.bat b/package/ci/appveyor-desktop-mingw.bat new file mode 100644 index 000000000..e97ffe66a --- /dev/null +++ b/package/ci/appveyor-desktop-mingw.bat @@ -0,0 +1,44 @@ +rem Workaround for CMake not wanting sh.exe on PATH for MinGW. AARGH. +set PATH=%PATH:C:\Program Files\Git\usr\bin;=% +set PATH=C:\tools\mingw64\bin;%APPVEYOR_BUILD_FOLDER%/openal/bin/Win64;%APPVEYOR_BUILD_FOLDER%\deps\bin;%PATH% + +rem Build Corrade. Could not get Ninja to work, meh. +git clone --depth 1 git://github.com/mosra/corrade.git || exit /b +cd corrade || exit /b +mkdir build && cd build || exit /b +cmake .. ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ + -DWITH_INTERCONNECT=OFF ^ + -G "MinGW Makefiles" || exit /b +cmake --build . -- -j || exit /b +cmake --build . --target install -- -j || exit /b +cd .. && cd .. + +rem Build +mkdir build && cd build || exit /b +cmake .. ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ + -DCMAKE_PREFIX_PATH="%APPVEYOR_BUILD_FOLDER%/SDL;%APPVEYOR_BUILD_FOLDER%/openal" ^ + -DWITH_AUDIO=ON ^ + -DWITH_SDL2APPLICATION=ON ^ + -DWITH_WINDOWLESSWGLAPPLICATION=ON ^ + -DWITH_WGLCONTEXT=ON ^ + -DWITH_MAGNUMFONT=ON ^ + -DWITH_MAGNUMFONTCONVERTER=ON ^ + -DWITH_OBJIMPORTER=ON ^ + -DWITH_TGAIMAGECONVERTER=ON ^ + -DWITH_TGAIMPORTER=ON ^ + -DWITH_WAVAUDIOIMPORTER=ON ^ + -DWITH_DISTANCEFIELDCONVERTER=ON ^ + -DWITH_FONTCONVERTER=ON ^ + -DWITH_MAGNUMINFO=ON ^ + -DBUILD_TESTS=ON ^ + -DBUILD_GL_TESTS=ON ^ + -G "MinGW Makefiles" || exit /b +cmake --build . || exit /b +cmake --build . --target install || exit /b + +rem Test +ctest -V -E GLTest || exit /b diff --git a/package/ci/appveyor-desktop.bat b/package/ci/appveyor-desktop.bat new file mode 100644 index 000000000..427cf6647 --- /dev/null +++ b/package/ci/appveyor-desktop.bat @@ -0,0 +1,43 @@ +call "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/vcvarsall.bat" || exit /b +set PATH=%APPVEYOR_BUILD_FOLDER%/openal/bin/Win32;%APPVEYOR_BUILD_FOLDER%\deps\bin;%PATH% + +rem Build Corrade +git clone --depth 1 git://github.com/mosra/corrade.git || exit /b +cd corrade || exit /b +mkdir build && cd build || exit /b +cmake .. ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ + -DWITH_INTERCONNECT=OFF ^ + -G Ninja || exit /b +cmake --build . || exit /b +cmake --build . --target install || exit /b +cd .. && cd .. + +rem Build +mkdir build && cd build || exit /b +cmake .. ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ + -DCMAKE_PREFIX_PATH="%APPVEYOR_BUILD_FOLDER%/SDL;%APPVEYOR_BUILD_FOLDER%/openal" ^ + -DWITH_AUDIO=ON ^ + -DWITH_SDL2APPLICATION=ON ^ + -DWITH_WINDOWLESSWGLAPPLICATION=ON ^ + -DWITH_WGLCONTEXT=ON ^ + -DWITH_MAGNUMFONT=ON ^ + -DWITH_MAGNUMFONTCONVERTER=ON ^ + -DWITH_OBJIMPORTER=ON ^ + -DWITH_TGAIMAGECONVERTER=ON ^ + -DWITH_TGAIMPORTER=ON ^ + -DWITH_WAVAUDIOIMPORTER=ON ^ + -DWITH_DISTANCEFIELDCONVERTER=ON ^ + -DWITH_FONTCONVERTER=ON ^ + -DWITH_MAGNUMINFO=ON ^ + -DBUILD_TESTS=ON ^ + -DBUILD_GL_TESTS=ON ^ + -G Ninja || exit /b +cmake --build . || exit /b +cmake --build . --target install || exit /b + +rem Test +ctest -V -E GLTest || exit /b diff --git a/package/ci/appveyor-rt.bat b/package/ci/appveyor-rt.bat new file mode 100644 index 000000000..d1c33ad71 --- /dev/null +++ b/package/ci/appveyor-rt.bat @@ -0,0 +1,76 @@ +call "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/vcvarsall.bat" || exit /b +set PATH=%APPVEYOR_BUILD_FOLDER%\deps-native\bin;%PATH% + +rem Build ANGLE +git clone --depth 1 git://github.com/MSOpenTech/angle.git || exit /b +cd angle\winrt\10\src || exit /b +msbuild angle.sln /p:Configuration=Release || exit /b +cd ..\..\..\.. || exit /b + +rem Build SDL +appveyor DownloadFile https://www.libsdl.org/release/SDL2-2.0.4.zip || exit /b +7z x SDL2-2.0.4.zip || exit /b +ren SDL2-2.0.4 SDL || exit /b +cd SDL/VisualC-WinRT/UWP_VS2015 || exit/b +msbuild /p:Configuration=Release || exit /b +cd ..\..\.. + +git clone --depth 1 git://github.com/mosra/corrade.git || exit /b +cd corrade || exit /b + +rem Build native corrade-rc +mkdir build && cd build || exit /b +cmake .. ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps-native ^ + -DWITH_INTERCONNECT=OFF ^ + -DWITH_PLUGINMANAGER=OFF ^ + -DWITH_TESTSUITE=OFF ^ + -G Ninja || exit /b +cmake --build . --target install || exit /b +cd .. || exit /b + +rem Crosscompile Corrade +mkdir build-rt && cd build-rt || exit /b +cmake .. ^ + -DCMAKE_SYSTEM_NAME=WindowsStore ^ + -DCMAKE_SYSTEM_VERSION=10.0 ^ + -DCORRADE_RC_EXECUTABLE=%APPVEYOR_BUILD_FOLDER%/deps-native/bin/corrade-rc.exe ^ + -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ + -DWITH_INTERCONNECT=OFF ^ + -DBUILD_STATIC=ON ^ + -G "Visual Studio 14 2015" || exit /b +cmake --build . --config Release --target install -- /m /v:m || exit /b +cd .. || exit /b + +cd .. || exit /b + +rem Crosscompile +mkdir build-rt && cd build-rt || exit /b +cmake .. ^ + -DCMAKE_SYSTEM_NAME=WindowsStore ^ + -DCMAKE_SYSTEM_VERSION=10.0 ^ + -DCORRADE_RC_EXECUTABLE=%APPVEYOR_BUILD_FOLDER%/deps-native/bin/corrade-rc.exe ^ + -DCMAKE_PREFIX_PATH=%APPVEYOR_BUILD_FOLDER%/deps ^ + -DEGL_LIBRARY=%APPVEYOR_BUILD_FOLDER%/angle/winrt/10/src/Release_Win32/lib/libEGL.lib ^ + -DEGL_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%/angle/include ^ + -DOPENGLES2_LIBRARY=%APPVEYOR_BUILD_FOLDER%/angle/winrt/10/src/Release_Win32/lib/libGLESv2.lib ^ + -DOPENGLES2_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%/angle/include ^ + -DOPENGLES3_LIBRARY=%APPVEYOR_BUILD_FOLDER%/angle/winrt/10/src/Release_Win32/lib/libGLESv2.lib ^ + -DOPENGLES3_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%/angle/include ^ + -DSDL2_LIBRARY=%APPVEYOR_BUILD_FOLDER%/SDL/VisualC-WinRT/UWP_VS2015/Release/SDL-UWP/SDL2.lib ^ + -DSDL2_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%/SDL/include ^ + -DWITH_AUDIO=OFF ^ + -DWITH_SDL2APPLICATION=ON ^ + -DWITH_MAGNUMFONT=ON ^ + -DWITH_MAGNUMFONTCONVERTER=ON ^ + -DWITH_OBJIMPORTER=ON ^ + -DWITH_TGAIMAGECONVERTER=ON ^ + -DWITH_TGAIMPORTER=ON ^ + -DWITH_WAVAUDIOIMPORTER=OFF ^ + -DTARGET_GLES2=%TARGET_GLES2% ^ + -DBUILD_TESTS=ON ^ + -DBUILD_STATIC=ON ^ + -DBUILD_PLUGINS_STATIC=ON ^ + -G "Visual Studio 14 2015" || exit /b +cmake --build . --config Release -- /m /v:m || exit /b diff --git a/package/ci/appveyor.yml b/package/ci/appveyor.yml index 02fa8c73b..9f2bb1f23 100644 --- a/package/ci/appveyor.yml +++ b/package/ci/appveyor.yml @@ -1,13 +1,20 @@ # kate: indent-width 2; -version: '{branch}-{build}' - -skip_tags: true -shallow_clone: true clone_depth: 1 os: Visual Studio 2015 +environment: + matrix: + - TARGET: desktop + COMPILER: msvc + - TARGET: desktop + COMPILER: mingw + - TARGET: rt + TARGET_GLES2: ON + - TARGET: rt + TARGET_GLES2: OFF + notifications: - provider: Webhook url: https://webhooks.gitter.im/e/415ae90928ba0dbd3df4 @@ -16,55 +23,28 @@ notifications: on_build_status_changed: true install: -- call "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/vcvarsall.bat" -- set PATH=C:/Sys/bin;C:/tools/ninja;%APPVEYOR_BUILD_FOLDER%/openal/bin/Win32;%PATH% - -# Ninja - cinst ninja +- set PATH=C:/tools/ninja;%PATH% +- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "mingw" cinst mingw /f >nul # OpenAL -- IF NOT EXIST %APPVEYOR_BUILD_FOLDER%\openal-soft-1.17.2-bin.zip appveyor DownloadFile http://kcat.strangesoft.net/openal-binaries/openal-soft-1.17.2-bin.zip -- 7z x openal-soft-1.17.2-bin.zip -- ren openal-soft-1.17.2-bin openal -- ren openal\bin\Win32\soft_oal.dll OpenAL32.dll -- echo [General] > %APPDATA%/alsoft.ini -- echo drivers=null >> %APPDATA%/alsoft.ini +- IF NOT "%TARGET%" == "rt" IF NOT EXIST %APPVEYOR_BUILD_FOLDER%\openal-soft-1.17.2-bin.zip appveyor DownloadFile http://kcat.strangesoft.net/openal-binaries/openal-soft-1.17.2-bin.zip +- IF NOT "%TARGET%" == "rt" 7z x openal-soft-1.17.2-bin.zip && ren openal-soft-1.17.2-bin openal && echo [General] > %APPDATA%/alsoft.ini & echo drivers=null >> %APPDATA%/alsoft.ini +- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "msvc" ren openal\bin\Win32\soft_oal.dll OpenAL32.dll +- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "mingw" ren openal\bin\Win64\soft_oal.dll OpenAL32.dll # SDL2 -- IF NOT EXIST %APPVEYOR_BUILD_FOLDER%\SDL2-devel-2.0.3-VC.zip appveyor DownloadFile http://www.libsdl.org/release/SDL2-devel-2.0.3-VC.zip -- 7z x SDL2-devel-2.0.3-VC.zip -- ren SDL2-2.0.3 SDL +- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "msvc" IF NOT EXIST %APPVEYOR_BUILD_FOLDER%\SDL2-devel-2.0.4-VC.zip appveyor DownloadFile http://www.libsdl.org/release/SDL2-devel-2.0.4-VC.zip +- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "msvc" 7z x SDL2-devel-2.0.4-VC.zip && ren SDL2-2.0.4 SDL +- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "mingw" IF NOT EXIST %APPVEYOR_BUILD_FOLDER%\SDL2-devel-2.0.4-mingw.tar.gz appveyor DownloadFile http://libsdl.org/release/SDL2-devel-2.0.4-mingw.tar.gz +- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "mingw" 7z x SDL2-devel-2.0.4-mingw.tar.gz & 7z x SDL2-devel-2.0.4-mingw.tar & ren SDL2-2.0.4 SDL -# Corrade -- git clone --depth 1 git://github.com/mosra/corrade.git -- cd corrade -- mkdir build -- cd build -- cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=C:/Sys -G Ninja -- cmake --build . -- cmake --build . --target install -- cd .. -- cd .. +build_script: +- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "msvc" call package\ci\appveyor-desktop.bat +- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "mingw" call package\ci\appveyor-desktop-mingw.bat +- IF "%TARGET%" == "rt" call package\ci\appveyor-rt.bat cache: -- SDL2-devel-2.0.3-VC.zip +- SDL2-devel-2.0.4-VC.zip +- SDL2-devel-2.0.4-mingw.zip - openal-soft-1.17.2-bin.zip - -build_script: -- mkdir build -- cd build -- cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=C:/Sys -DCMAKE_PREFIX_PATH="%APPVEYOR_BUILD_FOLDER%/SDL;%APPVEYOR_BUILD_FOLDER%/openal" -DWITH_AUDIO=ON -DWITH_SDL2APPLICATION=ON -DWITH_WINDOWLESSWGLAPPLICATION=ON -DWITH_WGLCONTEXT=ON -DWITH_MAGNUMFONT=ON -DWITH_MAGNUMFONTCONVERTER=ON -DWITH_OBJIMPORTER=ON -DWITH_TGAIMAGECONVERTER=ON -DWITH_TGAIMPORTER=ON -DWITH_WAVAUDIOIMPORTER=ON -DWITH_DISTANCEFIELDCONVERTER=ON -DWITH_FONTCONVERTER=ON -DWITH_MAGNUMINFO=ON -DBUILD_TESTS=ON -DBUILD_GL_TESTS=ON -G Ninja -- cmake --build . -- cmake --build . --target install -- cmake . -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/Deploy -DBUILD_TESTS=OFF -- cmake --build . --target install -- cd ../Deploy -- 7z a ../magnum.zip * - -test_script: -- cd %APPVEYOR_BUILD_FOLDER%/build -- SET fail=0 -- ctest --output-on-failure -E GLTest || SET fail=1 & ver > nul -- cd %APPVEYOR_BUILD_FOLDER% -- appveyor PushArtifact magnum.zip -- exit %fail% From ebdf234772cc89bd866d8da8a0131ea24f05d3cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 21:09:05 +0200 Subject: [PATCH 057/290] Platform: removed refs to unimplemented features from GlfwApplication. --- src/Magnum/Platform/GlfwApplication.h | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index 4ba7537d4..056c3f355 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -211,17 +211,6 @@ class GlfwApplication { /** @{ @name Mouse handling */ public: - /** - * @brief Mouse cursor - * - * @see @ref setMouseCursor() - */ - enum class MouseCursor: int { - Default = GLFW_CURSOR_NORMAL, /**< Default cursor provided by parent window */ - Hidden = GLFW_CURSOR_HIDDEN, /**< Hidden cursor */ - None = GLFW_CURSOR_DISABLED /**< No cursor */ - }; - /** @brief Warp mouse cursor to given coordinates */ void warpCursor(const Vector2i& position) { glfwSetCursorPos(_window, Double(position.x()), Double(position.y())); @@ -243,7 +232,6 @@ class GlfwApplication { * * Called when any mouse button is pressed and mouse is moved. Default * implementation does nothing. - * @see @ref setMouseTracking() */ virtual void mouseMoveEvent(MouseMoveEvent& event); From 387ab1b08d1bfc8efe48b7b0aabb244b4070f210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 21:09:43 +0200 Subject: [PATCH 058/290] Platform: compilation fixes for WindowlessNaClApplication. Still can't test it, but at least fixing what Doxygen found. --- src/Magnum/Platform/WindowlessNaClApplication.cpp | 4 ++-- src/Magnum/Platform/WindowlessNaClApplication.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Magnum/Platform/WindowlessNaClApplication.cpp b/src/Magnum/Platform/WindowlessNaClApplication.cpp index 22f0cdbce..440bdd12c 100644 --- a/src/Magnum/Platform/WindowlessNaClApplication.cpp +++ b/src/Magnum/Platform/WindowlessNaClApplication.cpp @@ -57,7 +57,7 @@ WindowlessNaClContext::WindowlessNaClContext(pp::Instance& instance, const Confi WindowlessNaClContext::WindowlessNaClContext(WindowlessNaClContext&&) = default; -WindowlessNaClContext::~WindowlessEglContext() = default; +WindowlessNaClContext::~WindowlessNaClContext() = default; WindowlessNaClContext& WindowlessNaClContext::operator=(WindowlessNaClContext&&) = default; @@ -93,7 +93,7 @@ WindowlessNaClApplication{arguments, NoCreate} { createContext(configuration); } -WindowlessNaClApplication::WindowlessNaClApplication(const Arguments& arguments, NoCreate): Instance(arguments), Graphics3DClient(this), _glContext{NoCreate}, _debugOutput{new ConsoleDebugOutput{this}} {} +WindowlessNaClApplication::WindowlessNaClApplication(const Arguments& arguments, NoCreateT): Instance(arguments), Graphics3DClient(this), _glContext{NoCreate}, _debugOutput{new ConsoleDebugOutput{this}} {} void WindowlessNaClApplication::createContext() { createContext({}); } diff --git a/src/Magnum/Platform/WindowlessNaClApplication.h b/src/Magnum/Platform/WindowlessNaClApplication.h index fba8b8e62..3bee062c8 100644 --- a/src/Magnum/Platform/WindowlessNaClApplication.h +++ b/src/Magnum/Platform/WindowlessNaClApplication.h @@ -79,7 +79,7 @@ class WindowlessNaClContext { * and create @ref Platform::Context instance to be able to use Magnum. * @see @ref isCreated() */ - explicit WindowlessNaClContext(pp::Instance& instance, const Configuration& configuration, const Context* context = nullptr); + explicit WindowlessNaClContext(pp::Instance& instance, const Configuration& configuration, Context* context = nullptr); /** * @brief Construct without creating the context @@ -126,7 +126,7 @@ class WindowlessNaClContext { @brief Configuration @see @ref WindowlessNaClContext(), - @ref WindowlessNaClApplication::WindowlessCglApplication(), + @ref WindowlessNaClApplication::WindowlessNaClApplication(), @ref WindowlessNaClApplication::createContext(), @ref WindowlessNaClApplication::tryCreateContext() */ From 6e666ebdc73a185479648c04b68553bcdae1e133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 21:10:44 +0200 Subject: [PATCH 059/290] Doxygen warning fixes. --- doc/platform.dox | 12 ++++++------ src/Magnum/Magnum.h | 2 +- src/Magnum/Platform/WindowlessGlxApplication.h | 2 +- src/Magnum/Platform/WindowlessIosApplication.h | 2 +- src/Magnum/Platform/WindowlessWglApplication.h | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/platform.dox b/doc/platform.dox index c85ec242e..f009e4f63 100644 --- a/doc/platform.dox +++ b/doc/platform.dox @@ -322,12 +322,12 @@ target_link_libraries(myapplication In case you need to manage windowless OpenGL contexts manually (for example to use Magnum for data processing in a thread or when having more than one OpenGL context), there is a possibility to directly use the context wrappers -from windowless applications. Each @ref WindowlessEglApplication "Windowless*Application" -is accompanied by a @ref WindowlessEglContext "Windowless*Context" class that -manages just GL context creation, making it current and destruction. Similarly -to using custom platform toolkits above, the workflow is to first create a GL -context instance, then making it current and finally instantiating the -@ref Platform::Context instance to initialize Magnum. +from windowless applications. Each @ref Platform::WindowlessEglApplication "Platform::Windowless*Application" +is accompanied by a @ref Platform::WindowlessEglContext "Platform::Windowless*Context" +class that manages just GL context creation, making it current and destruction. +Similarly to using custom platform toolkits above, the workflow is to first +create a GL context instance, then making it current and finally instantiating +the @ref Platform::Context instance to initialize Magnum. Similarly as with the applications, to simplify the porting, the library provides `Platform::WindowlessGLContext` typedef, but only if just one diff --git a/src/Magnum/Magnum.h b/src/Magnum/Magnum.h index 832ecf98e..51933ecae 100644 --- a/src/Magnum/Magnum.h +++ b/src/Magnum/Magnum.h @@ -96,7 +96,7 @@ Defined if built as static libraries. Default are shared libraries. Defined if the library is built in a way that allows multiple thread-local Magnum contexts. Enabled by default. -@see @ref building, @ref cmake, @ref Context::current() +@see @ref building, @ref cmake, @ref Magnum::Context::current() "Context::current()" */ #define MAGNUM_BUILD_MULTITHREADED #undef MAGNUM_BUILD_MULTITHREADED diff --git a/src/Magnum/Platform/WindowlessGlxApplication.h b/src/Magnum/Platform/WindowlessGlxApplication.h index 5821aae9d..164204901 100644 --- a/src/Magnum/Platform/WindowlessGlxApplication.h +++ b/src/Magnum/Platform/WindowlessGlxApplication.h @@ -76,7 +76,7 @@ class WindowlessGlxContext { * on binary AMD and NVidia drivers, creating core context does not use * the largest available version. If the application detects such case * (and given workaround is not disabled in optionally passed - * @ref context instance), the core context is destroyed and + * @p context instance), the core context is destroyed and * compatibility OpenGL 2.1 context is created instead to make the * driver use the latest available version. * diff --git a/src/Magnum/Platform/WindowlessIosApplication.h b/src/Magnum/Platform/WindowlessIosApplication.h index b870c5ab4..292d06c77 100644 --- a/src/Magnum/Platform/WindowlessIosApplication.h +++ b/src/Magnum/Platform/WindowlessIosApplication.h @@ -118,7 +118,7 @@ class WindowlessIosContext { @brief Configuration @see @ref WindowlessIosContext(), - @ref WindowlessIosApplication::WindowlessCglApplication(), + @ref WindowlessIosApplication::WindowlessIosApplication(), @ref WindowlessIosApplication::createContext(), @ref WindowlessIosApplication::tryCreateContext() */ diff --git a/src/Magnum/Platform/WindowlessWglApplication.h b/src/Magnum/Platform/WindowlessWglApplication.h index 2f91b2558..e8170ab9d 100644 --- a/src/Magnum/Platform/WindowlessWglApplication.h +++ b/src/Magnum/Platform/WindowlessWglApplication.h @@ -77,7 +77,7 @@ class WindowlessWglContext { * on binary AMD and NVidia drivers, creating core context does not use * the largest available version. If the application detects such case * (and given workaround is not disabled in optionally passed - * @ref context instance), the core context is destroyed and + * @p context instance), the core context is destroyed and * compatibility OpenGL 2.1 context is created instead to make the * driver use the latest available version. * From cac93ec3a5f8f8cc007fa028762d19eeff75ade2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 21:21:01 +0200 Subject: [PATCH 060/290] Platform: make WindowlessEglApplication compile. --- src/Magnum/Platform/WindowlessEglApplication.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Platform/WindowlessEglApplication.h b/src/Magnum/Platform/WindowlessEglApplication.h index c656154b0..1eeb03f25 100644 --- a/src/Magnum/Platform/WindowlessEglApplication.h +++ b/src/Magnum/Platform/WindowlessEglApplication.h @@ -72,7 +72,7 @@ class WindowlessEglContext { * and create @ref Platform::Context instance to be able to use Magnum. * @see @ref isCreated() */ - explicit WindowlessEglContext(const Configuration& configuration, const Context* context = nullptr); + explicit WindowlessEglContext(const Configuration& configuration, Context* context = nullptr); /** * @brief Construct without creating the context From 05684c552fa45a81030d3aa755374e135f05b4f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 21:24:43 +0200 Subject: [PATCH 061/290] Platform: fix warning in desktop GLES build. --- src/Magnum/Platform/WindowlessGlxApplication.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Magnum/Platform/WindowlessGlxApplication.cpp b/src/Magnum/Platform/WindowlessGlxApplication.cpp index b9f014a0b..9e9a0dc76 100644 --- a/src/Magnum/Platform/WindowlessGlxApplication.cpp +++ b/src/Magnum/Platform/WindowlessGlxApplication.cpp @@ -142,6 +142,8 @@ WindowlessGlxContext::WindowlessGlxContext(const WindowlessGlxContext::Configura return; } } + #else + static_cast(magnumContext); #endif XFree(configs); From 8b044064b9cc1198e4c0d450d7f9db0a1d8ac7d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 21:25:34 +0200 Subject: [PATCH 062/290] Use WindowlessEglApplication for windowless apps on non-desktop GLES. It "just works", yay! --- CMakeLists.txt | 11 ++++++++--- src/Magnum/Platform/magnum-info.cpp | 4 ++++ src/Magnum/Test/AbstractOpenGLTester.h | 6 +++++- src/Magnum/Text/fontconverter.cpp | 4 ++++ src/Magnum/TextureTools/distancefieldconverter.cpp | 4 ++++ 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c508d6493..f6433a857 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -226,9 +226,14 @@ if(BUILD_GL_TESTS) elseif(CORRADE_TARGET_APPLE) set(WITH_WINDOWLESSCGLAPPLICATION ON) set(GL_TEST_LIBRARIES Magnum MagnumWindowlessCglApplication) - elseif(CORRADE_TARGET_UNIX AND (NOT MAGNUM_TARGET_GLES OR MAGNUM_TARGET_DESKTOP_GLES)) - set(WITH_WINDOWLESSGLXAPPLICATION ON) - set(GL_TEST_LIBRARIES Magnum MagnumWindowlessGlxApplication) + elseif(CORRADE_TARGET_UNIX) + if(MAGNUM_TARGET_GLES AND NOT MAGNUM_TARGET_DESKTOP_GLES) + set(WITH_WINDOWLESSEGLAPPLICATION ON) + set(GL_TEST_LIBRARIES Magnum MagnumWindowlessEglApplication) + else() + set(WITH_WINDOWLESSGLXAPPLICATION ON) + set(GL_TEST_LIBRARIES Magnum MagnumWindowlessGlxApplication) + endif() elseif(CORRADE_TARGET_WINDOWS) if(NOT MAGNUM_TARGET_GLES OR MAGNUM_TARGET_DESKTOP_GLES) set(WITH_WINDOWLESSWGLAPPLICATION ON) diff --git a/src/Magnum/Platform/magnum-info.cpp b/src/Magnum/Platform/magnum-info.cpp index c6efab471..17bcc8cf9 100644 --- a/src/Magnum/Platform/magnum-info.cpp +++ b/src/Magnum/Platform/magnum-info.cpp @@ -66,7 +66,11 @@ #elif defined(CORRADE_TARGET_APPLE) #include "Magnum/Platform/WindowlessCglApplication.h" #elif defined(CORRADE_TARGET_UNIX) +#if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_DESKTOP_GLES) +#include "Magnum/Platform/WindowlessEglApplication.h" +#else #include "Magnum/Platform/WindowlessGlxApplication.h" +#endif #elif defined(CORRADE_TARGET_WINDOWS) #if !defined(MAGNUM_TARGET_GLES) || defined(MAGNUM_TARGET_DESKTOP_GLES) #include "Magnum/Platform/WindowlessWglApplication.h" diff --git a/src/Magnum/Test/AbstractOpenGLTester.h b/src/Magnum/Test/AbstractOpenGLTester.h index e159cd1ae..ef84d20bd 100644 --- a/src/Magnum/Test/AbstractOpenGLTester.h +++ b/src/Magnum/Test/AbstractOpenGLTester.h @@ -38,8 +38,12 @@ #include "Magnum/Platform/WindowlessIosApplication.h" #elif defined(CORRADE_TARGET_APPLE) #include "Magnum/Platform/WindowlessCglApplication.h" -#elif defined(CORRADE_TARGET_UNIX) && (!defined(MAGNUM_TARGET_GLES) || defined(MAGNUM_TARGET_DESKTOP_GLES)) +#elif defined(CORRADE_TARGET_UNIX) +#if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_DESKTOP_GLES) +#include "Magnum/Platform/WindowlessEglApplication.h" +#else #include "Magnum/Platform/WindowlessGlxApplication.h" +#endif #elif defined(CORRADE_TARGET_WINDOWS) #if !defined(MAGNUM_TARGET_GLES) || defined(MAGNUM_TARGET_DESKTOP_GLES) #include "Magnum/Platform/WindowlessWglApplication.h" diff --git a/src/Magnum/Text/fontconverter.cpp b/src/Magnum/Text/fontconverter.cpp index 29f8bbc50..cfb866eec 100644 --- a/src/Magnum/Text/fontconverter.cpp +++ b/src/Magnum/Text/fontconverter.cpp @@ -37,7 +37,11 @@ #elif defined(CORRADE_TARGET_APPLE) #include "Magnum/Platform/WindowlessCglApplication.h" #elif defined(CORRADE_TARGET_UNIX) +#if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_DESKTOP_GLES) +#include "Magnum/Platform/WindowlessEglApplication.h" +#else #include "Magnum/Platform/WindowlessGlxApplication.h" +#endif #elif defined(CORRADE_TARGET_WINDOWS) #include "Magnum/Platform/WindowlessWglApplication.h" #else diff --git a/src/Magnum/TextureTools/distancefieldconverter.cpp b/src/Magnum/TextureTools/distancefieldconverter.cpp index c06831f36..e64d0b52d 100644 --- a/src/Magnum/TextureTools/distancefieldconverter.cpp +++ b/src/Magnum/TextureTools/distancefieldconverter.cpp @@ -43,7 +43,11 @@ #elif defined(CORRADE_TARGET_APPLE) #include "Magnum/Platform/WindowlessCglApplication.h" #elif defined(CORRADE_TARGET_UNIX) +#if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_DESKTOP_GLES) +#include "Magnum/Platform/WindowlessEglApplication.h" +#else #include "Magnum/Platform/WindowlessGlxApplication.h" +#endif #elif defined(CORRADE_TARGET_WINDOWS) #include "Magnum/Platform/WindowlessWglApplication.h" #else From 5d3c0f4c6a4665bef63d0a5b938f7e001d45527d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 21:27:02 +0200 Subject: [PATCH 063/290] package: build GL tests also on non-desktop ES builds. --- package/archlinux/PKGBUILD-es2 | 3 +++ package/archlinux/PKGBUILD-es3 | 3 +++ package/ci/jenkins.xml | 9 ++------- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package/archlinux/PKGBUILD-es2 b/package/archlinux/PKGBUILD-es2 index 572e3e47f..3f06adf86 100644 --- a/package/archlinux/PKGBUILD-es2 +++ b/package/archlinux/PKGBUILD-es2 @@ -24,13 +24,16 @@ build() { -DTARGET_GLES2=ON \ -DWITH_AUDIO=ON \ -DWITH_XEGLAPPLICATION=ON \ + -DWITH_WINDOWLESSEGLAPPLICATION=ON \ -DWITH_EGLCONTEXT=ON \ -DWITH_MAGNUMFONT=ON \ -DWITH_OBJIMPORTER=ON \ -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ + -DWITH_MAGNUMINFO=ON \ -DBUILD_TESTS=ON \ + -DBUILD_GL_TESTS=ON \ -G Ninja ninja } diff --git a/package/archlinux/PKGBUILD-es3 b/package/archlinux/PKGBUILD-es3 index 132ffaa72..eaefcb0aa 100644 --- a/package/archlinux/PKGBUILD-es3 +++ b/package/archlinux/PKGBUILD-es3 @@ -24,13 +24,16 @@ build() { -DTARGET_GLES2=OFF \ -DWITH_AUDIO=ON \ -DWITH_XEGLAPPLICATION=ON \ + -DWITH_WINDOWLESSEGLAPPLICATION=ON \ -DWITH_EGLCONTEXT=ON \ -DWITH_MAGNUMFONT=ON \ -DWITH_OBJIMPORTER=ON \ -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ + -DWITH_MAGNUMINFO=ON \ -DBUILD_TESTS=ON \ + -DBUILD_GL_TESTS=ON \ -G Ninja ninja } diff --git a/package/ci/jenkins.xml b/package/ci/jenkins.xml index 4f76bf63e..835565b94 100644 --- a/package/ci/jenkins.xml +++ b/package/ci/jenkins.xml @@ -102,27 +102,22 @@ fi if [ ${gl} = "desktop" ] ; then desktop_flag=ON es_flag=OFF - windowless_flag=ON elif [ ${gl} = "es2" ] ; then gl_flags="-DTARGET_GLES=ON -DTARGET_GLES2=ON" desktop_flag=OFF es_flag=ON - windowless_flag=OFF elif [ ${gl} = "es2desktop" ] ; then gl_flags="-DTARGET_GLES=ON -DTARGET_GLES2=ON -DTARGET_DESKTOP_GLES=ON" desktop_flag=OFF es_flag=OFF - windowless_flag=ON elif [ ${gl} = "es3" ] ; then gl_flags="-DTARGET_GLES=ON -DTARGET_GLES2=OFF" desktop_flag=OFF es_flag=ON - windowless_flag=OFF elif [ ${gl} = "es3desktop" ] ; then gl_flags="-DTARGET_GLES=ON -DTARGET_GLES2=OFF -DTARGET_DESKTOP_GLES=ON" desktop_flag=OFF es_flag=OFF - windowless_flag=ON fi mkdir -p build-${compiler}-${libraries}-${compatibility}-${gl} @@ -136,7 +131,7 @@ cmake .. \ -DCMAKE_CXX_COMPILER=${compiler_binary} \ "${compiler_flags[@]}" \ -DBUILD_TESTS=ON \ - -DBUILD_GL_TESTS=${windowless_flag} \ + -DBUILD_GL_TESTS=ON \ -DBUILD_DEPRECATED=${deprecated_build_flag} \ ${static_build_flag} \ ${gl_flags} \ @@ -156,7 +151,7 @@ cmake .. \ -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=${desktop_flag} \ -DWITH_FONTCONVERTER=${desktop_flag} \ - -DWITH_MAGNUMINFO=${windowless_flag} \ + -DWITH_MAGNUMINFO=ON \ -G Ninja ninja From 0b3e9cddbce0c736992ef4eb9cd6a10f591dc688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jun 2016 21:45:11 +0200 Subject: [PATCH 064/290] SceneGraph: ignore deprecated warnings in deprecated functions on GCC. Gaah, why GCC can't ignore that by itself -- nobody cares if a deprecated API uses another deprecated API. Clang does that right. --- src/Magnum/SceneGraph/AbstractTranslation.h | 7 +++ .../AbstractTranslationRotation2D.h | 14 +++++ .../AbstractTranslationRotation3D.h | 35 ++++++++++++ .../AbstractTranslationRotationScaling2D.h | 21 +++++++ .../AbstractTranslationRotationScaling3D.h | 42 ++++++++++++++ .../SceneGraph/DualComplexTransformation.h | 21 +++++++ .../SceneGraph/DualQuaternionTransformation.h | 42 ++++++++++++++ .../SceneGraph/MatrixTransformation2D.h | 35 ++++++++++++ .../SceneGraph/MatrixTransformation3D.h | 56 +++++++++++++++++++ .../SceneGraph/RigidMatrixTransformation2D.h | 28 ++++++++++ .../SceneGraph/RigidMatrixTransformation3D.h | 49 ++++++++++++++++ .../SceneGraph/TranslationTransformation.h | 14 +++++ 12 files changed, 364 insertions(+) diff --git a/src/Magnum/SceneGraph/AbstractTranslation.h b/src/Magnum/SceneGraph/AbstractTranslation.h index 834a3dfb4..bacbadf3e 100644 --- a/src/Magnum/SceneGraph/AbstractTranslation.h +++ b/src/Magnum/SceneGraph/AbstractTranslation.h @@ -82,6 +82,10 @@ class AbstractTranslation: public AbstractTransformation { } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief translate() * @deprecated Use @ref translate() or @ref translateLocal() instead. @@ -89,6 +93,9 @@ class AbstractTranslation: public AbstractTransformation { CORRADE_DEPRECATED("use translate() or translateLocal() instead") AbstractTranslation& translate(const VectorTypeFor& vector, TransformationType type) { return type == TransformationType::Global ? translate(vector) : translateLocal(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /* Overloads to remove WTF-factor from method chaining order */ diff --git a/src/Magnum/SceneGraph/AbstractTranslationRotation2D.h b/src/Magnum/SceneGraph/AbstractTranslationRotation2D.h index f5a7bf747..266af3911 100644 --- a/src/Magnum/SceneGraph/AbstractTranslationRotation2D.h +++ b/src/Magnum/SceneGraph/AbstractTranslationRotation2D.h @@ -70,6 +70,10 @@ template class AbstractBasicTranslationRotation2D: public AbstractBasic } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotate() * @deprecated Use @ref rotate() or @ref rotateLocal() instead. @@ -77,6 +81,9 @@ template class AbstractBasicTranslationRotation2D: public AbstractBasic CORRADE_DEPRECATED("use rotate() or rotateLocal() instead") AbstractBasicTranslationRotation2D& rotate(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotate(angle) : rotateLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /* Overloads to remove WTF-factor from method chaining order */ @@ -94,6 +101,10 @@ template class AbstractBasicTranslationRotation2D: public AbstractBasic return *this; } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use translate() or translateLocal() instead") AbstractBasicTranslationRotation2D& translate(const Math::Vector2& vector, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) @@ -101,6 +112,9 @@ template class AbstractBasicTranslationRotation2D: public AbstractBasic AbstractBasicTranslation2D::translate(vector, type); return *this; } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif #endif diff --git a/src/Magnum/SceneGraph/AbstractTranslationRotation3D.h b/src/Magnum/SceneGraph/AbstractTranslationRotation3D.h index 72a3bdef3..be8624a94 100644 --- a/src/Magnum/SceneGraph/AbstractTranslationRotation3D.h +++ b/src/Magnum/SceneGraph/AbstractTranslationRotation3D.h @@ -74,6 +74,10 @@ template class AbstractBasicTranslationRotation3D: public AbstractBasic } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotate() * @deprecated Use @ref rotate() or @ref rotateLocal() instead. @@ -81,6 +85,9 @@ template class AbstractBasicTranslationRotation3D: public AbstractBasic CORRADE_DEPRECATED("use rotate() or rotateLocal() instead") AbstractBasicTranslationRotation3D& rotate(Math::Rad angle, const Math::Vector3& normalizedAxis, TransformationType type) { return type == TransformationType::Global ? rotate(angle, normalizedAxis) : rotateLocal(angle, normalizedAxis); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -112,6 +119,10 @@ template class AbstractBasicTranslationRotation3D: public AbstractBasic } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotateX() * @deprecated Use @ref rotateX() or @ref rotateXLocal() instead. @@ -119,6 +130,9 @@ template class AbstractBasicTranslationRotation3D: public AbstractBasic CORRADE_DEPRECATED("use rotateX() or rotateXLocal() instead") AbstractBasicTranslationRotation3D& rotateX(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotateX(angle) : rotateXLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -150,6 +164,10 @@ template class AbstractBasicTranslationRotation3D: public AbstractBasic } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotateY() * @deprecated Use @ref rotateY() or @ref rotateYLocal() instead. @@ -157,6 +175,9 @@ template class AbstractBasicTranslationRotation3D: public AbstractBasic CORRADE_DEPRECATED("use rotateY() or rotateYLocal() instead") AbstractBasicTranslationRotation3D& rotateY(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotateY(angle) : rotateYLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -188,6 +209,10 @@ template class AbstractBasicTranslationRotation3D: public AbstractBasic } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotateZ() * @deprecated Use @ref rotateZ() or @ref rotateZLocal() instead. @@ -195,6 +220,9 @@ template class AbstractBasicTranslationRotation3D: public AbstractBasic CORRADE_DEPRECATED("use rotateZ() or rotateZLocal() instead") AbstractBasicTranslationRotation3D& rotateZ(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotateZ(angle) : rotateZLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /* Overloads to remove WTF-factor from method chaining order */ @@ -212,6 +240,10 @@ template class AbstractBasicTranslationRotation3D: public AbstractBasic return *this; } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use translate() or translateLocal() instead") AbstractBasicTranslationRotation3D& translate(const Math::Vector3& vector, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) @@ -219,6 +251,9 @@ template class AbstractBasicTranslationRotation3D: public AbstractBasic AbstractBasicTranslation3D::translate(vector, type); return *this; } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif #endif diff --git a/src/Magnum/SceneGraph/AbstractTranslationRotationScaling2D.h b/src/Magnum/SceneGraph/AbstractTranslationRotationScaling2D.h index e7a04425e..e7f21034f 100644 --- a/src/Magnum/SceneGraph/AbstractTranslationRotationScaling2D.h +++ b/src/Magnum/SceneGraph/AbstractTranslationRotationScaling2D.h @@ -70,6 +70,10 @@ template class AbstractBasicTranslationRotationScaling2D: public Abstra } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief scale() * @deprecated Use @ref scale() or @ref scaleLocal() instead. @@ -77,6 +81,9 @@ template class AbstractBasicTranslationRotationScaling2D: public Abstra CORRADE_DEPRECATED("use scale() or scaleLocal() instead") AbstractBasicTranslationRotationScaling2D& scale(const Math::Vector2& vector, TransformationType type) { return type == TransformationType::Global ? scale(vector) : scaleLocal(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /* Overloads to remove WTF-factor from method chaining order */ @@ -94,6 +101,10 @@ template class AbstractBasicTranslationRotationScaling2D: public Abstra return *this; } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use translate() or translateLocal() instead") AbstractBasicTranslationRotationScaling2D& translate(const Math::Vector2& vector, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) @@ -101,6 +112,9 @@ template class AbstractBasicTranslationRotationScaling2D: public Abstra AbstractBasicTranslationRotation2D::translate(vector, type); return *this; } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif AbstractBasicTranslationRotationScaling2D& rotate(Math::Rad angle) { AbstractBasicTranslationRotation2D::rotate(angle); @@ -111,6 +125,10 @@ template class AbstractBasicTranslationRotationScaling2D: public Abstra return *this; } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use rotate() or rotateLocal() instead") AbstractBasicTranslationRotationScaling2D& rotate(Math::Rad angle, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) @@ -118,6 +136,9 @@ template class AbstractBasicTranslationRotationScaling2D: public Abstra AbstractBasicTranslationRotation2D::rotate(angle, type); return *this; } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif #endif diff --git a/src/Magnum/SceneGraph/AbstractTranslationRotationScaling3D.h b/src/Magnum/SceneGraph/AbstractTranslationRotationScaling3D.h index f8078b880..2361c8316 100644 --- a/src/Magnum/SceneGraph/AbstractTranslationRotationScaling3D.h +++ b/src/Magnum/SceneGraph/AbstractTranslationRotationScaling3D.h @@ -70,6 +70,10 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief scale() * @deprecated Use @ref scale() or @ref scaleLocal() instead. @@ -80,6 +84,9 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra #endif return type == TransformationType::Global ? scale(vector) : scaleLocal(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /* Overloads to remove WTF-factor from method chaining order */ @@ -97,6 +104,10 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra return *this; } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use translate() or translateLocal() instead") AbstractBasicTranslationRotationScaling3D& translate(const Math::Vector3& vector, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) @@ -104,6 +115,9 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra AbstractBasicTranslationRotation3D::translate(vector, type); return *this; } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif AbstractBasicTranslationRotationScaling3D& rotate(Math::Rad angle, const Math::Vector3& normalizedAxis) { AbstractBasicTranslationRotation3D::rotate(angle, normalizedAxis); @@ -114,6 +128,10 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra return *this; } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use rotate() or rotateLocal() instead") AbstractBasicTranslationRotationScaling3D& rotate(Math::Rad angle, const Math::Vector3& normalizedAxis, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) @@ -121,6 +139,9 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra AbstractBasicTranslationRotation3D::rotate(angle, normalizedAxis, type); return *this; } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif AbstractBasicTranslationRotationScaling3D& rotateX(Math::Rad angle) { AbstractBasicTranslationRotation3D::rotateX(angle); @@ -131,6 +152,10 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra return *this; } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use rotateX() or rotateXLocal() instead") AbstractBasicTranslationRotationScaling3D& rotateX(Math::Rad angle, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) @@ -138,6 +163,9 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra AbstractBasicTranslationRotation3D::rotateX(angle, type); return *this; } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif AbstractBasicTranslationRotationScaling3D& rotateY(Math::Rad angle) { AbstractBasicTranslationRotation3D::rotateY(angle); @@ -148,6 +176,10 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra return *this; } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use rotateY() or rotateYLocal() instead") AbstractBasicTranslationRotationScaling3D& rotateY(Math::Rad angle, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) @@ -155,6 +187,9 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra AbstractBasicTranslationRotation3D::rotateY(angle, type); return *this; } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif AbstractBasicTranslationRotationScaling3D& rotateZ(Math::Rad angle) { AbstractBasicTranslationRotation3D::rotateZ(angle); @@ -165,6 +200,10 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra return *this; } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use rotateZ() or rotateZLocal() instead") AbstractBasicTranslationRotationScaling3D& rotateZ(Math::Rad angle, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) @@ -172,6 +211,9 @@ template class AbstractBasicTranslationRotationScaling3D: public Abstra AbstractBasicTranslationRotation3D::rotateZ(angle, type); return *this; } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif #endif diff --git a/src/Magnum/SceneGraph/DualComplexTransformation.h b/src/Magnum/SceneGraph/DualComplexTransformation.h index 1df8a21d1..9c15382e1 100644 --- a/src/Magnum/SceneGraph/DualComplexTransformation.h +++ b/src/Magnum/SceneGraph/DualComplexTransformation.h @@ -110,6 +110,10 @@ template class BasicDualComplexTransformation: public AbstractBasicTran } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief transform() * @deprecated Use @ref transform() or @ref transformLocal() instead. @@ -117,6 +121,9 @@ template class BasicDualComplexTransformation: public AbstractBasicTran CORRADE_DEPRECATED("use transform() or transformLocal() instead") Object>& transform(const Math::DualComplex& transformation, TransformationType type) { return type == TransformationType::Global ? transform(transformation) : transformLocal(transformation); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -143,6 +150,10 @@ template class BasicDualComplexTransformation: public AbstractBasicTran } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief translate() * @deprecated Use @ref translate() or @ref translateLocal() instead. @@ -150,6 +161,9 @@ template class BasicDualComplexTransformation: public AbstractBasicTran CORRADE_DEPRECATED("use translate() or translateLocal() instead") Object>& translate(const Math::Vector2& vector, TransformationType type) { return type == TransformationType::Global ? translate(vector) : translateLocal(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -175,6 +189,10 @@ template class BasicDualComplexTransformation: public AbstractBasicTran } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotate() * @deprecated Use @ref rotate() or @ref rotateLocal() instead. @@ -182,6 +200,9 @@ template class BasicDualComplexTransformation: public AbstractBasicTran CORRADE_DEPRECATED("use rotate() or rotateLocal() instead") Object>& rotate(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotate(angle) : rotateLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif protected: diff --git a/src/Magnum/SceneGraph/DualQuaternionTransformation.h b/src/Magnum/SceneGraph/DualQuaternionTransformation.h index 364a87569..dc957df2c 100644 --- a/src/Magnum/SceneGraph/DualQuaternionTransformation.h +++ b/src/Magnum/SceneGraph/DualQuaternionTransformation.h @@ -110,6 +110,10 @@ template class BasicDualQuaternionTransformation: public AbstractBasicT } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief transform() * @deprecated Use @ref transform() or @ref transformLocal() instead. @@ -117,6 +121,9 @@ template class BasicDualQuaternionTransformation: public AbstractBasicT CORRADE_DEPRECATED("use transform() or transformLocal() instead") Object>& transform(const Math::DualQuaternion& transformation, TransformationType type) { return type == TransformationType::Global ? transform(transformation) : transformLocal(transformation); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -142,6 +149,10 @@ template class BasicDualQuaternionTransformation: public AbstractBasicT } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief translate() * @deprecated Use @ref translate() or @ref translateLocal() instead. @@ -149,6 +160,9 @@ template class BasicDualQuaternionTransformation: public AbstractBasicT CORRADE_DEPRECATED("use translate() or translateLocal() instead") Object>& translate(const Math::Vector3& vector, TransformationType type) { return type == TransformationType::Global ? translate(vector) : translateLocal(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -177,6 +191,10 @@ template class BasicDualQuaternionTransformation: public AbstractBasicT } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotate() * @deprecated Use @ref rotate() or @ref rotateLocal() instead. @@ -184,6 +202,9 @@ template class BasicDualQuaternionTransformation: public AbstractBasicT CORRADE_DEPRECATED("usr rotate() or rotateLocal() instead") Object>& rotate(Math::Rad angle, const Math::Vector3& normalizedAxis, TransformationType type) { return type == TransformationType::Global ? rotate(angle, normalizedAxis) : rotateLocal(angle, normalizedAxis); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /* Overloads to remove WTF-factor from method chaining order */ @@ -195,12 +216,19 @@ template class BasicDualQuaternionTransformation: public AbstractBasicT return rotateLocal(angle, Math::Vector3::xAxis()); } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use rotateX() or rotateXLocal() instead") Object>& rotateX(Math::Rad angle, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) #endif return rotate(angle, Math::Vector3::xAxis(), type); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif Object>& rotateY(Math::Rad angle) { return rotate(angle, Math::Vector3::yAxis()); @@ -209,12 +237,19 @@ template class BasicDualQuaternionTransformation: public AbstractBasicT return rotateLocal(angle, Math::Vector3::yAxis()); } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use rotateY() or rotateYLocal() instead") Object>& rotateY(Math::Rad angle, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) #endif return rotate(angle, Math::Vector3::yAxis(), type); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif Object>& rotateZ(Math::Rad angle) { return rotate(angle, Math::Vector3::zAxis()); @@ -223,12 +258,19 @@ template class BasicDualQuaternionTransformation: public AbstractBasicT return rotateLocal(angle, Math::Vector3::zAxis()); } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif CORRADE_DEPRECATED("use rotateZ() or rotateZLocal() instead") Object>& rotateZ(Math::Rad angle, TransformationType type) { #ifdef _MSC_VER #pragma warning(suppress: 4996) #endif return rotate(angle, Math::Vector3::zAxis(), type); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif #endif diff --git a/src/Magnum/SceneGraph/MatrixTransformation2D.h b/src/Magnum/SceneGraph/MatrixTransformation2D.h index 680c35f6a..840232f1b 100644 --- a/src/Magnum/SceneGraph/MatrixTransformation2D.h +++ b/src/Magnum/SceneGraph/MatrixTransformation2D.h @@ -87,6 +87,10 @@ template class BasicMatrixTransformation2D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief transform() * @deprecated Use @ref transform() or @ref transformLocal() instead. @@ -94,6 +98,9 @@ template class BasicMatrixTransformation2D: public AbstractBasicTransla CORRADE_DEPRECATED("use transform() or transformLocal() instead") Object>& transform(const Math::Matrix3& transformation, TransformationType type) { return type == TransformationType::Global ? transform(transformation) : transformLocal(transformation); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @copydoc AbstractTranslationRotationScaling2D::resetTransformation() */ @@ -125,6 +132,10 @@ template class BasicMatrixTransformation2D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief translate() * @deprecated Use @ref translate() or @ref translateLocal() instead. @@ -132,6 +143,9 @@ template class BasicMatrixTransformation2D: public AbstractBasicTransla CORRADE_DEPRECATED("use translate() or translateLocal() instead") Object>& translate(const Math::Vector2& vector, TransformationType type) { return type == TransformationType::Global ? translate(vector) : translateLocal(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -158,6 +172,10 @@ template class BasicMatrixTransformation2D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotate() * @deprecated Use @ref rotate() or @ref rotateLocal() instead. @@ -165,6 +183,9 @@ template class BasicMatrixTransformation2D: public AbstractBasicTransla CORRADE_DEPRECATED("use rotate() or rotateLocal() instead") Object>& rotate(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotate(angle) : rotateLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -191,6 +212,10 @@ template class BasicMatrixTransformation2D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief scale() * @deprecated Use @ref scale() or @ref scaleLocal() instead. @@ -198,6 +223,9 @@ template class BasicMatrixTransformation2D: public AbstractBasicTransla CORRADE_DEPRECATED("use scale() or scaleLocal() instead") Object>& scale(const Math::Vector2& vector, TransformationType type) { return type == TransformationType::Global ? scale(vector) : scaleLocal(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -226,6 +254,10 @@ template class BasicMatrixTransformation2D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief reflect() * @deprecated Use @ref reflect() or @ref reflectLocal() instead. @@ -233,6 +265,9 @@ template class BasicMatrixTransformation2D: public AbstractBasicTransla CORRADE_DEPRECATED("use reflect() or reflectLocal() instead") Object>& reflect(const Math::Vector2& normal, TransformationType type) { return type == TransformationType::Global ? reflect(normal) : reflectLocal(normal); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif protected: diff --git a/src/Magnum/SceneGraph/MatrixTransformation3D.h b/src/Magnum/SceneGraph/MatrixTransformation3D.h index 6dca54140..329214ce6 100644 --- a/src/Magnum/SceneGraph/MatrixTransformation3D.h +++ b/src/Magnum/SceneGraph/MatrixTransformation3D.h @@ -92,6 +92,10 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief transform() * @deprecated Use @ref transform() or @ref transformLocal() instead. @@ -99,6 +103,9 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla CORRADE_DEPRECATED("use transform() or transformLocal() instead") Object>& transform(const Math::Matrix4& transformation, TransformationType type) { return type == TransformationType::Global ? transform(transformation) : transformLocal(transformation); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -125,6 +132,10 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief translate() * @deprecated Use @ref translate() or @ref translateLocal() instead. @@ -132,6 +143,9 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla CORRADE_DEPRECATED("use translate() or translateLocal() instead") Object>& translate(const Math::Vector3& vector, TransformationType type) { return type == TransformationType::Global ? translate(vector) : translateLocal(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -161,6 +175,10 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotate() * @deprecated Use @ref rotate() or @ref rotateLocal() instead. @@ -168,6 +186,9 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla CORRADE_DEPRECATED("use rotate() or rotateLocal() instead") Object>& rotate(Math::Rad angle, const Math::Vector3& normalizedAxis, TransformationType type) { return type == TransformationType::Global ? rotate(angle, normalizedAxis) : rotateLocal(angle, normalizedAxis); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -194,6 +215,10 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotateX() * @deprecated Use @ref rotateX() or @ref rotateXLocal() instead. @@ -201,6 +226,9 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla CORRADE_DEPRECATED("use rotateX() or rotateXLocal() instead") Object>& rotateX(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotateX(angle) : rotateXLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -227,6 +255,10 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotateY() * @deprecated Use @ref rotateY() or @ref rotateYLocal() instead. @@ -234,6 +266,9 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla CORRADE_DEPRECATED("use rotateY() or rotateYLocal() instead") Object>& rotateY(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotateY(angle) : rotateYLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -260,6 +295,10 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotateZ() * @deprecated Use @ref rotateZ() or @ref rotateZLocal() instead. @@ -267,6 +306,9 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla CORRADE_DEPRECATED("use rotateZ() or rotateZLocal() instead") Object>& rotateZ(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotateZ(angle) : rotateZLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -293,6 +335,10 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief scale() * @deprecated Use @ref scale() or @ref scaleLocal() instead. @@ -300,6 +346,9 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla CORRADE_DEPRECATED("use scale() or scaleLocal() instead") Object>& scale(const Math::Vector3& vector, TransformationType type) { return type == TransformationType::Global ? scale(vector) : scaleLocal(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -327,6 +376,10 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief reflect() * @deprecated Use @ref reflect() or @ref reflectLocal() instead. @@ -334,6 +387,9 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla CORRADE_DEPRECATED("use reflect() or reflectLocal() instead") Object>& reflect(const Math::Vector3& normal, TransformationType type) { return type == TransformationType::Global ? reflect(normal) : reflectLocal(normal); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif protected: diff --git a/src/Magnum/SceneGraph/RigidMatrixTransformation2D.h b/src/Magnum/SceneGraph/RigidMatrixTransformation2D.h index 81a55b41a..e5f313432 100644 --- a/src/Magnum/SceneGraph/RigidMatrixTransformation2D.h +++ b/src/Magnum/SceneGraph/RigidMatrixTransformation2D.h @@ -115,6 +115,10 @@ template class BasicRigidMatrixTransformation2D: public AbstractBasicTr } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief transform() * @deprecated Use @ref transform() or @ref transformLocal() instead. @@ -122,6 +126,9 @@ template class BasicRigidMatrixTransformation2D: public AbstractBasicTr CORRADE_DEPRECATED("use transform() or transformLocal() instead") Object>& transform(const Math::Matrix3& transformation, TransformationType type) { return type == TransformationType::Global ? transform(transformation) : transformLocal(transformation); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -148,6 +155,10 @@ template class BasicRigidMatrixTransformation2D: public AbstractBasicTr } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief translate() * @deprecated Use @ref translate() or @ref translateLocal() instead. @@ -155,6 +166,9 @@ template class BasicRigidMatrixTransformation2D: public AbstractBasicTr CORRADE_DEPRECATED("use translate() or translateLocal() instead") Object>& translate(const Math::Vector2& vector, TransformationType type) { return type == TransformationType::Global ? translate(vector) : translateLocal(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -182,6 +196,10 @@ template class BasicRigidMatrixTransformation2D: public AbstractBasicTr } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotate() * @deprecated Use @ref rotate() or @ref rotateLocal() instead. @@ -189,6 +207,9 @@ template class BasicRigidMatrixTransformation2D: public AbstractBasicTr CORRADE_DEPRECATED("use rotate() or rotateLocal() instead") Object>& rotate(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotate(angle) : rotateLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -216,6 +237,10 @@ template class BasicRigidMatrixTransformation2D: public AbstractBasicTr } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief reflect() * @deprecated Use @ref reflect() or @ref reflectLocal() instead. @@ -223,6 +248,9 @@ template class BasicRigidMatrixTransformation2D: public AbstractBasicTr CORRADE_DEPRECATED("use reflect() or reflectInternal() instead") Object>& reflect(const Math::Vector2& normal, TransformationType type) { return type == TransformationType::Global ? reflect(normal) : reflectLocal(normal); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif protected: diff --git a/src/Magnum/SceneGraph/RigidMatrixTransformation3D.h b/src/Magnum/SceneGraph/RigidMatrixTransformation3D.h index 4d73c01e1..63c1713fe 100644 --- a/src/Magnum/SceneGraph/RigidMatrixTransformation3D.h +++ b/src/Magnum/SceneGraph/RigidMatrixTransformation3D.h @@ -114,6 +114,10 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief transform() * @deprecated Use @ref transform() or @ref transformLocal() instead. @@ -121,6 +125,9 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr CORRADE_DEPRECATED("use transform() or transformLocal() instead") Object>& transform(const Math::Matrix4& transformation, TransformationType type) { return type == TransformationType::Global ? transform(transformation) : transformLocal(transformation); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -147,6 +154,10 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief translate() * @deprecated Use @ref translate() or @ref translateLocal() instead. @@ -154,6 +165,9 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr CORRADE_DEPRECATED("use translate() or translateLocal() instead") Object>& translate(const Math::Vector3& vector, TransformationType type) { return type == TransformationType::Global ? translate(vector) : translateLocal(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -184,6 +198,10 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotate() * @deprecated Use @ref rotate() or @ref rotateLocal() instead. @@ -191,6 +209,9 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr CORRADE_DEPRECATED("use rotate() or rotateLocal() instead") Object>& rotate(Math::Rad angle, const Math::Vector3& normalizedAxis, TransformationType type) { return type == TransformationType::Global ? rotate(angle, normalizedAxis) : rotateLocal(angle, normalizedAxis); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -217,6 +238,10 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotateX() * @deprecated Use @ref rotateX() or @ref rotateXLocal() instead. @@ -224,6 +249,9 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr CORRADE_DEPRECATED("use rotateX() or rotateXLocal() instead") Object>& rotateX(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotateX(angle) : rotateXLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -250,6 +278,10 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotateY() * @deprecated Use @ref rotateY() or @ref rotateYLocal() instead. @@ -257,6 +289,9 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr CORRADE_DEPRECATED("use rotateY() or rotateYLocal() instead") Object>& rotateY(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotateY(angle) : rotateYLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -283,6 +318,10 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief rotateZ() * @deprecated Use @ref rotateZ() or @ref rotateZLocal() instead. @@ -290,6 +329,9 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr CORRADE_DEPRECATED("use rotateZ() or rotateZLocal() instead") Object>& rotateZ(Math::Rad angle, TransformationType type) { return type == TransformationType::Global ? rotateZ(angle) : rotateZLocal(angle); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -317,6 +359,10 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr } #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif /** * @copybrief reflect() * @deprecated Use @ref reflect() or @ref reflectLocal() instead. @@ -324,6 +370,9 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr CORRADE_DEPRECATED("use reflect() or reflectLocal() instead") Object>& reflect(const Math::Vector3& normal, TransformationType type) { return type == TransformationType::Global ? reflect(normal) : reflectLocal(normal); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif protected: diff --git a/src/Magnum/SceneGraph/TranslationTransformation.h b/src/Magnum/SceneGraph/TranslationTransformation.h index c0b140391..85412211e 100644 --- a/src/Magnum/SceneGraph/TranslationTransformation.h +++ b/src/Magnum/SceneGraph/TranslationTransformation.h @@ -95,6 +95,10 @@ class TranslationTransformation: public AbstractTranslation>& transform(const VectorTypeFor& transformation, TransformationType) { return transform(transformation); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /** @@ -119,6 +126,10 @@ class TranslationTransformation: public AbstractTranslation>& translate(const VectorTypeFor& vector, TransformationType) { return translate(vector); } + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif protected: From cc3e2df1e14035ec13bde10d075834e139d208a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 19 Jun 2016 17:10:34 +0200 Subject: [PATCH 065/290] Fix Attribute documentation to reflect actual enum values. --- src/Magnum/Attribute.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Magnum/Attribute.h b/src/Magnum/Attribute.h index 3645826e8..439e81383 100644 --- a/src/Magnum/Attribute.h +++ b/src/Magnum/Attribute.h @@ -171,7 +171,11 @@ template class Attribute { * @requires_webgl20 Half float vertex attributes are not available * in WebGL 1.0. */ + #ifndef MAGNUM_TARGET_GLES2 HalfFloat = GL_HALF_FLOAT, + #else + HalfFloat = GL_HALF_FLOAT_OES, + #endif #endif /** Float. Only for float attribute types. */ From 273189b435441828fb7d75e197d02acf70ffae80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 19 Jun 2016 20:33:20 +0200 Subject: [PATCH 066/290] Mention that glPixelStore() is used in *Framebuffer::read(). --- src/Magnum/AbstractFramebuffer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magnum/AbstractFramebuffer.h b/src/Magnum/AbstractFramebuffer.h index d8c9a61fc..f966dd0f8 100644 --- a/src/Magnum/AbstractFramebuffer.h +++ b/src/Magnum/AbstractFramebuffer.h @@ -319,8 +319,8 @@ class MAGNUM_EXPORT AbstractFramebuffer { * * If @extension{ARB,robustness} is available, the operation is * protected from buffer overflow. - * @see @fn_gl{BindFramebuffer}, @fn_gl{ReadPixels} or - * @fn_gl_extension{ReadnPixels,ARB,robustness} + * @see @fn_gl{BindFramebuffer}, then @fn_gl{PixelStore} and + * @fn_gl{ReadPixels} or @fn_gl_extension{ReadnPixels,ARB,robustness} */ void read(const Range2Di& rectangle, Image2D& image); From 1e6a88a9ddf2712097a814200b3bc40368ab4184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 19 Jun 2016 20:35:15 +0200 Subject: [PATCH 067/290] Properly check that EXT_texture_array is supported in the test. --- src/Magnum/Test/FramebufferGLTest.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Magnum/Test/FramebufferGLTest.cpp b/src/Magnum/Test/FramebufferGLTest.cpp index fbe32f287..c99f02b15 100644 --- a/src/Magnum/Test/FramebufferGLTest.cpp +++ b/src/Magnum/Test/FramebufferGLTest.cpp @@ -484,6 +484,8 @@ void FramebufferGLTest::attachTexture3D() { void FramebufferGLTest::attachTexture1DArray() { if(!Context::current().isExtensionSupported()) CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::EXT::texture_array::string() + std::string(" is not available.")); Texture1DArray color; color.setStorage(1, TextureFormat::RGBA8, {128, 8}); From f68b40c5d9dbc6e34dcc0aba4212cf76f4bc6b72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 19 Jun 2016 20:32:28 +0200 Subject: [PATCH 068/290] Implemented *Framebuffer::copyImage() and copySubImage(). Default, ARB_DSA and EXT_DSA paths. --- doc/opengl-mapping.dox | 4 +- doc/opengl-support.dox | 1 - src/Magnum/AbstractFramebuffer.cpp | 160 +++++ src/Magnum/AbstractFramebuffer.h | 322 ++++++++++ src/Magnum/AbstractTexture.h | 1 + .../Implementation/FramebufferState.cpp | 19 + src/Magnum/Implementation/FramebufferState.h | 10 + src/Magnum/Test/FramebufferGLTest.cpp | 556 +++++++++++++++++- src/Magnum/Texture.h | 9 +- 9 files changed, 1074 insertions(+), 8 deletions(-) diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index 37dd149b3..4fd9ab6f0 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -101,8 +101,8 @@ OpenGL function | Matching API @fn_gl{CompressedTexSubImage1D}, \n `glCompressedTextureSubImage1D()`, \n @fn_gl_extension{CompressedTextureSubImage1D,EXT,direct_state_access}, \n @fn_gl{CompressedTexSubImage2D}, \n `glCompressedTextureSubImage2D()`, \n @fn_gl_extension{CompressedTextureSubImage2D,EXT,direct_state_access}, \n @fn_gl{CompressedTexSubImage3D}, \n `glCompressedTextureSubImage3D()`, \n @fn_gl_extension{CompressedTextureSubImage3D,EXT,direct_state_access} | @ref Texture::setCompressedSubImage(), \n @ref TextureArray::setCompressedSubImage(), \n @ref CubeMapTexture::setCompressedSubImage(), \n @ref CubeMapTextureArray::setCompressedSubImage(), \n @ref RectangleTexture::setCompressedSubImage() @fn_gl{CopyBufferSubData}, \n `glCopyNamedBufferSubData()`, \n @fn_gl_extension{NamedCopyBufferSubData,EXT,direct_state_access} | @ref Buffer::copy() @fn_gl{CopyImageSubData} | | -@fn_gl{CopyTexImage1D}, \n @fn_gl_extension{CopyTextureImage1D,EXT,direct_state_access}, \n @fn_gl{CopyTexImage2D}, \n @fn_gl_extension{CopyTextureImage2D,EXT,direct_state_access} | | -@fn_gl{CopyTexSubImage1D}, \n `glCopyTextureSubImage1D()`, \n @fn_gl_extension{CopyTextureSubImage1D,EXT,direct_state_access}, \n @fn_gl{CopyTexSubImage2D}, \n `glCopyTextureSubImage2D()`, \n @fn_gl_extension{CopyTextureSubImage2D,EXT,direct_state_access}, \n @fn_gl{CopyTexSubImage3D}, \n `glCopyTextureSubImage3D()`, \n @fn_gl_extension{CopyTextureSubImage3D,EXT,direct_state_access} | | +@fn_gl{CopyTexImage1D}, \n @fn_gl{CopyTexImage2D} | @ref Framebuffer::copyImage() +@fn_gl{CopyTexSubImage1D}, \n `glCopyTextureSubImage1D()`, \n @fn_gl_extension{CopyTextureSubImage1D,EXT,direct_state_access}, \n @fn_gl{CopyTexSubImage2D}, \n `glCopyTextureSubImage2D()`, \n @fn_gl_extension{CopyTextureSubImage2D,EXT,direct_state_access}, \n @fn_gl{CopyTexSubImage3D}, \n `glCopyTextureSubImage3D()`, \n @fn_gl_extension{CopyTextureSubImage3D,EXT,direct_state_access} | @ref Framebuffer::copySubImage() @fn_gl{CreateProgram}, @fn_gl{DeleteProgram} | @ref AbstractShaderProgram constructor and destructor @fn_gl{CreateShader}, @fn_gl{DeleteShader} | @ref Shader constructor and destructor @fn_gl{CreateShaderProgram} | | diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index cf33b9bb1..a9bf219f6 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -40,7 +40,6 @@ The core subset of OpenGL 2.1 should be fully implemented, except for the following: - Proxy textures -- Copying framebuffer to texture (@fn_gl{CopyTexImage2D} etc.) - Some forgotten limit queries @subsection opengl-support-30 OpenGL 3.0 diff --git a/src/Magnum/AbstractFramebuffer.cpp b/src/Magnum/AbstractFramebuffer.cpp index 03a9cc61d..f3c73c4c9 100644 --- a/src/Magnum/AbstractFramebuffer.cpp +++ b/src/Magnum/AbstractFramebuffer.cpp @@ -29,8 +29,19 @@ #include "Magnum/BufferImage.h" #endif #include "Magnum/Context.h" +#include "Magnum/CubeMapTexture.h" +#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) +#include "Magnum/CubeMapTextureArray.h" +#endif #include "Magnum/Extensions.h" #include "Magnum/Image.h" +#ifndef MAGNUM_TARGET_GLES +#include "Magnum/RectangleTexture.h" +#endif +#include "Magnum/Texture.h" +#ifndef MAGNUM_TARGET_GLES2 +#include "Magnum/TextureArray.h" +#endif #include "Implementation/FramebufferState.h" #include "Implementation/State.h" @@ -331,6 +342,96 @@ BufferImage2D AbstractFramebuffer::read(const Range2Di& rectangle, BufferImage2D } #endif +#ifndef MAGNUM_TARGET_GLES +void AbstractFramebuffer::copyImage(const Range2Di& rectangle, Texture1D& texture, const Int level, const TextureFormat internalFormat) { + CORRADE_ASSERT(rectangle.sizeY() == 1, "AbstractFramebuffer::copyImage(): height must be 1 for 1D textures", ); + bindInternal(FramebufferTarget::Read); + texture.bindInternal(); + glCopyTexImage1D(GL_TEXTURE_1D, level, GLenum(internalFormat), rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), 0); +} +#endif + +void AbstractFramebuffer::copyImage(const Range2Di& rectangle, Texture2D& texture, const Int level, const TextureFormat internalFormat) { + bindInternal(FramebufferTarget::Read); + texture.bindInternal(); + glCopyTexImage2D(GL_TEXTURE_2D, level, GLenum(internalFormat), rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY(), 0); +} + +#ifndef MAGNUM_TARGET_GLES +void AbstractFramebuffer::copyImage(const Range2Di& rectangle, RectangleTexture& texture, const TextureFormat internalFormat) { + bindInternal(FramebufferTarget::Read); + texture.bindInternal(); + glCopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GLenum(internalFormat), rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY(), 0); +} +#endif + +void AbstractFramebuffer::copyImage(const Range2Di& rectangle, CubeMapTexture& texture, const CubeMapCoordinate coordinate, const Int level, const TextureFormat internalFormat) { + bindInternal(FramebufferTarget::Read); + texture.bindInternal(); + glCopyTexImage2D(GLenum(coordinate), level, GLenum(internalFormat), rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY(), 0); +} + +#ifndef MAGNUM_TARGET_GLES +void AbstractFramebuffer::copyImage(const Range2Di& rectangle, Texture1DArray& texture, const Int level, const TextureFormat internalFormat) { + bindInternal(FramebufferTarget::Read); + texture.bindInternal(); + glCopyTexImage2D(GL_TEXTURE_1D_ARRAY, level, GLenum(internalFormat), rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY(), 0); +} +#endif + +#ifndef MAGNUM_TARGET_GLES +void AbstractFramebuffer::copySubImage(const Range2Di& rectangle, Texture1D& texture, const Int level, const Int offset) { + CORRADE_ASSERT(rectangle.sizeY() == 1, "AbstractFramebuffer::copyImage(): height must be 1 for 1D textures", ); + bindInternal(FramebufferTarget::Read); + Context::current().state().framebuffer->copySub1DImplementation(rectangle, texture, level, offset); +} +#endif + +void AbstractFramebuffer::copySubImage(const Range2Di& rectangle, Texture2D& texture, const Int level, const Vector2i& offset) { + bindInternal(FramebufferTarget::Read); + Context::current().state().framebuffer->copySub2DImplementation(rectangle, texture, GL_TEXTURE_2D, level, offset); +} + +#ifndef MAGNUM_TARGET_GLES +void AbstractFramebuffer::copySubImage(const Range2Di& rectangle, RectangleTexture& texture, const Vector2i& offset) { + bindInternal(FramebufferTarget::Read); + Context::current().state().framebuffer->copySub2DImplementation(rectangle, texture, GL_TEXTURE_RECTANGLE, 0, offset); +} +#endif + +void AbstractFramebuffer::copySubImage(const Range2Di& rectangle, CubeMapTexture& texture, const Int level, const Vector3i& offset) { + bindInternal(FramebufferTarget::Read); + Context::current().state().framebuffer->copySubCubeMapImplementation(rectangle, texture, GL_TEXTURE_CUBE_MAP_POSITIVE_X + offset.z(), level, offset.xy()); +} + +#if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) +void AbstractFramebuffer::copySubImage(const Range2Di& rectangle, Texture3D& texture, const Int level, const Vector3i& offset) { + bindInternal(FramebufferTarget::Read); + Context::current().state().framebuffer->copySub3DImplementation(rectangle, texture, level, offset); +} +#endif + +#ifndef MAGNUM_TARGET_GLES +void AbstractFramebuffer::copySubImage(const Range2Di& rectangle, Texture1DArray& texture, const Int level, const Vector2i& offset) { + bindInternal(FramebufferTarget::Read); + Context::current().state().framebuffer->copySub2DImplementation(rectangle, texture, GL_TEXTURE_1D_ARRAY, level, offset); +} +#endif + +#ifndef MAGNUM_TARGET_GLES2 +void AbstractFramebuffer::copySubImage(const Range2Di& rectangle, Texture2DArray& texture, const Int level, const Vector3i& offset) { + bindInternal(FramebufferTarget::Read); + Context::current().state().framebuffer->copySub3DImplementation(rectangle, texture, level, offset); +} +#endif + +#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) +void AbstractFramebuffer::copySubImage(const Range2Di& rectangle, CubeMapTextureArray& texture, const Int level, const Vector3i& offset) { + bindInternal(FramebufferTarget::Read); + Context::current().state().framebuffer->copySub3DImplementation(rectangle, texture, level, offset); +} +#endif + void AbstractFramebuffer::invalidateImplementationNoOp(GLsizei, const GLenum* const) {} void AbstractFramebuffer::invalidateImplementationDefault(const GLsizei count, const GLenum* const attachments) { @@ -497,4 +598,63 @@ void AbstractFramebuffer::readImplementationRobustness(const Range2Di& rectangle } #endif +#ifndef MAGNUM_TARGET_GLES +void AbstractFramebuffer::copySub1DImplementationDefault(const Range2Di& rectangle, AbstractTexture& texture, const Int level, const Int offset) { + texture.bindInternal(); + glCopyTexSubImage1D(texture._target, level, offset, rectangle.min().x(), rectangle.min().y(), rectangle.sizeX()); +} + +void AbstractFramebuffer::copySub1DImplementationDSA(const Range2Di& rectangle, AbstractTexture& texture, const Int level, const Int offset) { + glCopyTextureSubImage1D(texture._id, level, offset, rectangle.min().x(), rectangle.min().y(), rectangle.sizeX()); +} + +void AbstractFramebuffer::copySub1DImplementationDSAEXT(const Range2Di& rectangle, AbstractTexture& texture, const Int level, const Int offset) { + texture._flags |= ObjectFlag::Created; + glCopyTextureSubImage1DEXT(texture._id, texture._target, level, offset, rectangle.min().x(), rectangle.min().y(), rectangle.sizeX()); +} +#endif + +void AbstractFramebuffer::copySub2DImplementationDefault(const Range2Di& rectangle, AbstractTexture& texture, const GLenum target, const Int level, const Vector2i& offset) { + texture.bindInternal(); + glCopyTexSubImage2D(target, level, offset.x(), offset.y(), rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY()); +} + +#ifndef MAGNUM_TARGET_GLES +void AbstractFramebuffer::copySub2DImplementationDSA(const Range2Di& rectangle, AbstractTexture& texture, const GLenum, const Int level, const Vector2i& offset) { + glCopyTextureSubImage2D(texture._id, level, offset.x(), offset.y(), rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY()); +} + +void AbstractFramebuffer::copySubCubeMapImplementationDSA(const Range2Di& rectangle, AbstractTexture& texture, const GLenum target, const Int level, const Vector2i& offset) { + glCopyTextureSubImage3D(texture._id, level, offset.x(), offset.y(), target - GL_TEXTURE_CUBE_MAP_POSITIVE_X, rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY()); +} + +void AbstractFramebuffer::copySub2DImplementationDSAEXT(const Range2Di& rectangle, AbstractTexture& texture, const GLenum target, const Int level, const Vector2i& offset) { + texture._flags |= ObjectFlag::Created; + glCopyTextureSubImage2DEXT(texture._id, target, level, offset.x(), offset.y(), rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY()); +} +#endif + +#if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)) +void AbstractFramebuffer::copySub3DImplementationDefault(const Range2Di& rectangle, AbstractTexture& texture, const Int level, const Vector3i& offset) { + texture.bindInternal(); + #ifndef MAGNUM_TARGET_GLES2 + glCopyTexSubImage3D + #else + glCopyTexSubImage3DOES + #endif + (texture._target, level, offset.x(), offset.y(), offset.z(), rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY()); +} +#endif + +#ifndef MAGNUM_TARGET_GLES +void AbstractFramebuffer::copySub3DImplementationDSA(const Range2Di& rectangle, AbstractTexture& texture, const Int level, const Vector3i& offset) { + glCopyTextureSubImage3D(texture._id, level, offset.x(), offset.y(), offset.z(), rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY()); +} + +void AbstractFramebuffer::copySub3DImplementationDSAEXT(const Range2Di& rectangle, AbstractTexture& texture, const Int level, const Vector3i& offset) { + texture._flags |= ObjectFlag::Created; + glCopyTextureSubImage3DEXT(texture._id, texture._target, level, offset.x(), offset.y(), offset.z(), rectangle.min().x(), rectangle.min().y(), rectangle.sizeX(), rectangle.sizeY()); +} +#endif + } diff --git a/src/Magnum/AbstractFramebuffer.h b/src/Magnum/AbstractFramebuffer.h index f966dd0f8..41d048eab 100644 --- a/src/Magnum/AbstractFramebuffer.h +++ b/src/Magnum/AbstractFramebuffer.h @@ -383,6 +383,307 @@ class MAGNUM_EXPORT AbstractFramebuffer { #endif #endif + #ifndef MAGNUM_TARGET_GLES + /** + * @brief Copy block of pixels from framebuffer to 1D texture image + * @param rectangle Framebuffer rectangle to copy. Height must + * be `1`. + * @param texture Texture where to put the data + * @param level Texture mip level + * @param internalFormat Texture internal format + * + * On platforms that support it prefer to use @ref Texture1D::setStorage() + * and @ref copySubImage() instead, as it avoids unnecessary + * reallocations and has better performance characteristics. This call + * also has no equivalent in @extension{ARB,direct_state_access}, thus + * the texture needs to be bound to some texture unit before the + * operation. + * @see @ref Texture1D::maxSize(), @fn_gl{BindFramebuffer}, then + * @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexImage1D} + * @requires_gl 1D textures are not available in OpenGL ES or WebGL. + * @deprecated_gl Prefer to use @ref Texture1D::setStorage() and + * @ref copySubImage() instead. + */ + void copyImage(const Range2Di& rectangle, Texture1D& texture, Int level, TextureFormat internalFormat); + #endif + + /** + * @brief Copy block of pixels from framebuffer to 2D texture image + * @param rectangle Framebuffer rectangle to copy + * @param texture Texture where to put the data + * @param level Texture mip level + * @param internalFormat Texture internal format + * + * On platforms that support it prefer to use @ref Texture2D::setStorage() + * and @ref copySubImage() instead, as it avoids unnecessary + * reallocations and has better performance characteristics. This call + * also has no equivalent in @extension{ARB,direct_state_access}, thus + * the texture needs to be bound to some texture unit before the + * operation. + * @see @ref Texture2D::maxSize(), @fn_gl{BindFramebuffer}, then + * @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexImage2D} + * @deprecated_gl Prefer to use @ref Texture2D::setStorage() and + * @ref copySubImage() instead. + */ + void copyImage(const Range2Di& rectangle, Texture2D& texture, Int level, TextureFormat internalFormat); + + #ifndef MAGNUM_TARGET_GLES + /** + * @brief Copy block of pixels from framebuffer to rectangle texture + * @param rectangle Framebuffer rectangle to copy + * @param texture Texture where to put the data + * @param internalFormat Texture internal format + * + * On platforms that support it prefer to use @ref RectangleTexture::setStorage() + * and @ref copySubImage() instead, as it avoids unnecessary + * reallocations and has better performance characteristics. This call + * also has no equivalent in @extension{ARB,direct_state_access}, thus + * the texture needs to be bound to some texture unit before the + * operation. + * @see @ref Texture2D::maxSize(), @fn_gl{BindFramebuffer}, then + * @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexImage2D} + * @requires_gl31 Extension @extension{ARB,texture_rectangle} + * @requires_gl Rectangle textures are not available in OpenGL ES and + * WebGL. + * @deprecated_gl Prefer to use @ref RectangleTexture::setStorage() and + * @ref copySubImage() instead. + */ + void copyImage(const Range2Di& rectangle, RectangleTexture& texture, TextureFormat internalFormat); + #endif + + /** + * @brief Copy block of pixels from framebuffer to cube map texture image + * @param rectangle Framebuffer rectangle to copy + * @param texture Texture where to put the data + * @param level Texture mip level + * @param coordinate Cube map coordinate + * @param internalFormat Texture internal format + * + * On platforms that support it prefer to use @ref CubeMapTexture::setStorage() + * and @ref copySubImage() instead, as it avoids unnecessary + * reallocations and has better performance characteristics. This call + * also has no equivalent in @extension{ARB,direct_state_access}, thus + * the texture needs to be bound to some texture unit before the + * operation. + * @see @ref Texture2D::maxSize(), @fn_gl{BindFramebuffer}, then + * @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexImage2D} + * @deprecated_gl Prefer to use @ref CubeMapTexture::setStorage() and + * @ref copySubImage() instead. + */ + void copyImage(const Range2Di& rectangle, CubeMapTexture& texture, CubeMapCoordinate coordinate, Int level, TextureFormat internalFormat); + + #ifndef MAGNUM_TARGET_GLES + /** + * @brief Copy block of pixels from framebuffer to 1D texture array image + * @param rectangle Framebuffer rectangle to copy + * @param texture Texture where to put the data + * @param level Texture mip level + * @param internalFormat Texture internal format + * + * On platforms that support it prefer to use @ref Texture2D::setStorage() + * and @ref copySubImage() instead, as it avoids unnecessary + * reallocations and has better performance characteristics. This call + * also has no equivalent in @extension{ARB,direct_state_access}, thus + * the texture needs to be bound to some texture unit before the + * operation. + * @see @ref Texture2D::maxSize(), @fn_gl{BindFramebuffer}, then + * @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexImage2D} + * @requires_gl 1D array textures are not available in OpenGL ES or + * WebGL, only 2D ones. + * @deprecated_gl Prefer to use @ref Texture1DArray::setStorage() and + * @ref copySubImage() instead. + */ + void copyImage(const Range2Di& rectangle, Texture1DArray& texture, Int level, TextureFormat internalFormat); + #endif + + #ifndef MAGNUM_TARGET_GLES + /** + * @brief Copy block of pixels from framebuffer to 1D texture subimage + * @param rectangle Framebuffer rectangle to copy. Height must + * be `1`. + * @param texture Texture where to put the data + * @param level Texture mip level + * @param offset Offset inside the texture + * + * If neither @extension{ARB,direct_state_access} (part of OpenGL 4.5) + * nor @extension{EXT,direct_state_access} desktop extension is + * available, the texture is bound before the operation (if not + * already). + * @see @ref Texture1D::setStorage(), @fn_gl{BindFramebuffer}, then + * @fn_gl2{CopyTextureSubImage1D,CopyTexSubImage1D}, + * @fn_gl_extension{CopyTextureSubImage1D,EXT,direct_state_access}, + * eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexSubImage1D} + * @requires_gl 1D textures are not available in OpenGL ES or WebGL. + */ + void copySubImage(const Range2Di& rectangle, Texture1D& texture, Int level, Int offset); + #endif + + /** + * @brief Copy block of pixels from framebuffer to 2D texture subimage + * @param rectangle Framebuffer rectangle to copy + * @param texture Texture where to put the data + * @param level Texture mip level + * @param offset Offset inside the texture + * + * If neither @extension{ARB,direct_state_access} (part of OpenGL 4.5) + * nor @extension{EXT,direct_state_access} desktop extension is + * available, the texture is bound before the operation (if not + * already). + * @see @ref Texture2D::setStorage(), @fn_gl{BindFramebuffer}, then + * @fn_gl2{CopyTextureSubImage2D,CopyTexSubImage2D}, + * @fn_gl_extension{CopyTextureSubImage2D,EXT,direct_state_access}, + * eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexSubImage2D} + */ + void copySubImage(const Range2Di& rectangle, Texture2D& texture, Int level, const Vector2i& offset); + + #ifndef MAGNUM_TARGET_GLES + /** + * @brief Copy block of pixels from framebuffer to rectangle texture subimage + * @param rectangle Framebuffer rectangle to copy + * @param texture Texture where to put the data + * @param offset Offset inside the texture + * + * If neither @extension{ARB,direct_state_access} (part of OpenGL 4.5) + * nor @extension{EXT,direct_state_access} desktop extension is + * available, the texture is bound before the operation (if not + * already). + * @see @ref RectangleTexture::setStorage(), @fn_gl{BindFramebuffer}, + * then @fn_gl2{CopyTextureSubImage2D,CopyTexSubImage2D}, + * @fn_gl_extension{CopyTextureSubImage2D,EXT,direct_state_access}, + * eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexSubImage2D} + * @requires_gl Rectangle textures are not available in OpenGL ES and + * WebGL. + */ + void copySubImage(const Range2Di& rectangle, RectangleTexture& texture, const Vector2i& offset); + #endif + + /** + * @brief Copy block of pixels from framebuffer to cube map texture subimage + * @param rectangle Framebuffer rectangle to copy + * @param texture Texture where to put the data + * @param level Texture mip level + * @param offset Offset inside the texture + * + * Z coordinate of the offset is equivalent to number of texture face, + * i.e. +X is `0` and so on, in order of (+X, -X, +Y, -Y, +Z, -Z). If + * neither @extension{ARB,direct_state_access} (part of OpenGL 4.5) nor + * @extension{EXT,direct_state_access} desktop extension is available, + * the texture is bound before the operation (if not already). + * @see @ref CubeMapTexture::setStorage(), @fn_gl{BindFramebuffer}, + * then @fn_gl2{CopyTextureSubImage3D,CopyTexSubImage3D}, + * @fn_gl_extension{CopyTextureSubImage2D,EXT,direct_state_access}, + * eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexSubImage2D} + */ + void copySubImage(const Range2Di& rectangle, CubeMapTexture& texture, Int level, const Vector3i& offset); + + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) + /** + * @brief Copy block of pixels from framebuffer to 3D texture subimage + * @param rectangle Framebuffer rectangle to copy + * @param texture Texture where to put the data + * @param level Texture mip level + * @param offset Offset inside the texture + * + * If neither @extension{ARB,direct_state_access} (part of OpenGL 4.5) + * nor @extension{EXT,direct_state_access} desktop extension is + * available, the texture is bound before the operation (if not + * already). + * @see @ref Texture3D::setStorage(), @fn_gl{BindFramebuffer}, then + * @fn_gl2{CopyTextureSubImage3D,CopyTexSubImage3D}, + * @fn_gl_extension{CopyTextureSubImage3D,EXT,direct_state_access}, + * eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexSubImage3D} + * @requires_gles30 Extension @es_extension{OES,texture_3D} in OpenGL + * ES 2.0. + * @requires_webgl20 Only 2D textures are available in WebGL 1.0. + */ + void copySubImage(const Range2Di& rectangle, Texture3D& texture, Int level, const Vector3i& offset); + #endif + + #ifndef MAGNUM_TARGET_GLES + /** + * @brief Copy block of pixels from framebuffer to 1D texture array subimage + * @param rectangle Framebuffer rectangle to copy + * @param texture Texture where to put the data + * @param level Texture mip level + * @param offset Offset inside the texture + * + * If neither @extension{ARB,direct_state_access} (part of OpenGL 4.5) + * nor @extension{EXT,direct_state_access} desktop extension is + * available, the texture is bound before the operation (if not + * already). + * @see @ref Texture1DArray::setStorage(), @fn_gl{BindFramebuffer}, + * then @fn_gl2{CopyTextureSubImage2D,CopyTexSubImage2D}, + * @fn_gl_extension{CopyTextureSubImage2D,EXT,direct_state_access}, + * eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexSubImage2D} + * @requires_gl 1D array textures are not available in OpenGL ES or + * WebGL, only 2D ones. + */ + void copySubImage(const Range2Di& rectangle, Texture1DArray& texture, Int level, const Vector2i& offset); + #endif + + #ifndef MAGNUM_TARGET_GLES2 + /** + * @brief Copy block of pixels from framebuffer to 2D texture array subimage + * @param rectangle Framebuffer rectangle to copy + * @param texture Texture where to put the data + * @param level Texture mip level + * @param offset Offset inside the texture + * + * If neither @extension{ARB,direct_state_access} (part of OpenGL 4.5) + * nor @extension{EXT,direct_state_access} desktop extension is + * available, the texture is bound before the operation (if not + * already). + * @see @ref Texture2DArray::setStorage(), @fn_gl{BindFramebuffer}, + * then @fn_gl2{CopyTextureSubImage3D,CopyTexSubImage3D}, + * @fn_gl_extension{CopyTextureSubImage3D,EXT,direct_state_access}, + * eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexSubImage3D} + * @requires_gl30 Extension @extension{EXT,texture_array} + * @requires_gles30 Array textures are not available in OpenGL ES 2.0. + * @requires_webgl20 Array textures are not available in WebGL 1.0. + */ + void copySubImage(const Range2Di& rectangle, Texture2DArray& texture, Int level, const Vector3i& offset); + #endif + + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + /** + * @brief Copy block of pixels from framebuffer to cube map texture array subimage + * @param rectangle Framebuffer rectangle to copy + * @param texture Texture where to put the data + * @param level Texture mip level + * @param offset Offset inside the texture + * + * Z coordinate of the offset is equivalent to layer * 6 + number of + * texture face, i.e. +X is `0` and so on, in order of (+X, -X, +Y, -Y, + * +Z, -Z). If neither @extension{ARB,direct_state_access} (part of + * OpenGL 4.5) nor @extension{EXT,direct_state_access} desktop + * available, the texture is bound before the operation (if not + * already). + * @see @ref CubeMapTextureArray::setStorage(), @fn_gl{BindFramebuffer}, + * then @fn_gl2{CopyTextureSubImage3D,CopyTexSubImage3D}, + * @fn_gl_extension{CopyTextureSubImage3D,EXT,direct_state_access}, + * eventually @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and + * @fn_gl{CopyTexSubImage3D} + * @requires_gl40 Extension @extension{ARB,texture_cube_map_array} + * @requires_gles30 Not defined in OpenGL ES 2.0. + * @requires_es_extension Extension @es_extension{ANDROID,extension_pack_es31a}/ + * @es_extension{EXT,texture_cube_map_array} + * @requires_gles Cube map texture arrays are not available in WebGL. + */ + void copySubImage(const Range2Di& rectangle, CubeMapTextureArray& texture, Int level, const Vector3i& offset); + #endif + #ifdef DOXYGEN_GENERATING_OUTPUT private: #else @@ -462,6 +763,27 @@ class MAGNUM_EXPORT AbstractFramebuffer { static void MAGNUM_LOCAL readImplementationRobustness(const Range2Di& rectangle, PixelFormat format, PixelType type, std::size_t dataSize, GLvoid* data); #endif + #ifndef MAGNUM_TARGET_GLES + static void MAGNUM_LOCAL copySub1DImplementationDefault(const Range2Di& rectangle, AbstractTexture& texture, Int level, Int offset); + static void MAGNUM_LOCAL copySub1DImplementationDSA(const Range2Di& rectangle, AbstractTexture& texture, Int level, Int offset); + static void MAGNUM_LOCAL copySub1DImplementationDSAEXT(const Range2Di& rectangle, AbstractTexture& texture, Int level, Int offset); + #endif + + static void MAGNUM_LOCAL copySub2DImplementationDefault(const Range2Di& rectangle, AbstractTexture& texture, GLenum textureTarget, Int level, const Vector2i& offset); + #ifndef MAGNUM_TARGET_GLES + static void MAGNUM_LOCAL copySub2DImplementationDSA(const Range2Di& rectangle, AbstractTexture& texture, GLenum textureTarget, Int level, const Vector2i& offset); + static void MAGNUM_LOCAL copySubCubeMapImplementationDSA(const Range2Di& rectangle, AbstractTexture& texture, GLenum textureTarget, Int level, const Vector2i& offset); + static void MAGNUM_LOCAL copySub2DImplementationDSAEXT(const Range2Di& rectangle, AbstractTexture& texture, GLenum textureTarget, Int level, const Vector2i& offset); + #endif + + #if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)) + static void MAGNUM_LOCAL copySub3DImplementationDefault(const Range2Di& rectangle, AbstractTexture& texture, Int level, const Vector3i& offset); + #endif + #ifndef MAGNUM_TARGET_GLES + static void MAGNUM_LOCAL copySub3DImplementationDSA(const Range2Di& rectangle, AbstractTexture& texture, Int level, const Vector3i& offset); + static void MAGNUM_LOCAL copySub3DImplementationDSAEXT(const Range2Di& rectangle, AbstractTexture& texture, Int level, const Vector3i& offset); + #endif + void MAGNUM_LOCAL invalidateImplementationNoOp(GLsizei, const GLenum*); void MAGNUM_LOCAL invalidateImplementationDefault(GLsizei count, const GLenum* attachments); #ifndef MAGNUM_TARGET_GLES diff --git a/src/Magnum/AbstractTexture.h b/src/Magnum/AbstractTexture.h index 77694e01f..4d49b9540 100644 --- a/src/Magnum/AbstractTexture.h +++ b/src/Magnum/AbstractTexture.h @@ -133,6 +133,7 @@ functions do nothing. */ class MAGNUM_EXPORT AbstractTexture: public AbstractObject { friend Implementation::TextureState; + friend AbstractFramebuffer; friend CubeMapTexture; public: diff --git a/src/Magnum/Implementation/FramebufferState.cpp b/src/Magnum/Implementation/FramebufferState.cpp index 9ba1004f5..d0ebb0a57 100644 --- a/src/Magnum/Implementation/FramebufferState.cpp +++ b/src/Magnum/Implementation/FramebufferState.cpp @@ -68,6 +68,11 @@ FramebufferState::FramebufferState(Context& context, std::vector& e drawBufferImplementation = &AbstractFramebuffer::drawBufferImplementationDSA; readBufferImplementation = &AbstractFramebuffer::readBufferImplementationDSA; + copySub1DImplementation = &AbstractFramebuffer::copySub1DImplementationDSA; + copySub2DImplementation = &AbstractFramebuffer::copySub2DImplementationDSA; + copySubCubeMapImplementation = &AbstractFramebuffer::copySubCubeMapImplementationDSA; + copySub3DImplementation = &AbstractFramebuffer::copySub3DImplementationDSA; + renderbufferImplementation = &Framebuffer::renderbufferImplementationDSA; /* The 1D implementation uses the same function as the layered attachment */ texture1DImplementation = &Framebuffer::textureImplementationDSA; @@ -88,6 +93,11 @@ FramebufferState::FramebufferState(Context& context, std::vector& e drawBufferImplementation = &AbstractFramebuffer::drawBufferImplementationDSAEXT; readBufferImplementation = &AbstractFramebuffer::readBufferImplementationDSAEXT; + copySub1DImplementation = &AbstractFramebuffer::copySub1DImplementationDSAEXT; + copySub2DImplementation = &AbstractFramebuffer::copySub2DImplementationDSAEXT; + copySubCubeMapImplementation = &AbstractFramebuffer::copySub2DImplementationDSAEXT; + copySub3DImplementation = &AbstractFramebuffer::copySub3DImplementationDSAEXT; + renderbufferImplementation = &Framebuffer::renderbufferImplementationDSAEXT; texture1DImplementation = &Framebuffer::texture1DImplementationDSAEXT; /* The EXT_DSA implementation is the same for both 2D and cube map textures */ @@ -111,6 +121,15 @@ FramebufferState::FramebufferState(Context& context, std::vector& e readBufferImplementation = &AbstractFramebuffer::readBufferImplementationDefault; #endif + #ifndef MAGNUM_TARGET_GLES + copySub1DImplementation = &AbstractFramebuffer::copySub1DImplementationDefault; + #endif + copySub2DImplementation = &AbstractFramebuffer::copySub2DImplementationDefault; + copySubCubeMapImplementation = &AbstractFramebuffer::copySub2DImplementationDefault; + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) + copySub3DImplementation = &AbstractFramebuffer::copySub3DImplementationDefault; + #endif + renderbufferImplementation = &Framebuffer::renderbufferImplementationDefault; #ifndef MAGNUM_TARGET_GLES texture1DImplementation = &Framebuffer::texture1DImplementationDefault; diff --git a/src/Magnum/Implementation/FramebufferState.h b/src/Magnum/Implementation/FramebufferState.h index 278f87d6b..57564b103 100644 --- a/src/Magnum/Implementation/FramebufferState.h +++ b/src/Magnum/Implementation/FramebufferState.h @@ -56,6 +56,16 @@ struct FramebufferState { #endif #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) void(AbstractFramebuffer::*readBufferImplementation)(GLenum); + #endif + #ifndef MAGNUM_TARGET_GLES + void(*copySub1DImplementation)(const Range2Di&, AbstractTexture&, Int, Int); + #endif + void(*copySub2DImplementation)(const Range2Di&, AbstractTexture&, GLenum, Int, const Vector2i&); + void(*copySubCubeMapImplementation)(const Range2Di&, AbstractTexture&, GLenum, Int, const Vector2i&); + #if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)) + void(*copySub3DImplementation)(const Range2Di&, AbstractTexture&, Int, const Vector3i&); + #endif + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) void(AbstractFramebuffer::*invalidateImplementation)(GLsizei, const GLenum*); #endif #ifndef MAGNUM_TARGET_GLES2 diff --git a/src/Magnum/Test/FramebufferGLTest.cpp b/src/Magnum/Test/FramebufferGLTest.cpp index c99f02b15..ccbf8be8a 100644 --- a/src/Magnum/Test/FramebufferGLTest.cpp +++ b/src/Magnum/Test/FramebufferGLTest.cpp @@ -23,7 +23,8 @@ DEALINGS IN THE SOFTWARE. */ -#include "Magnum/configure.h" +#include + #include "Magnum/Context.h" #include "Magnum/CubeMapTexture.h" #include "Magnum/Extensions.h" @@ -110,6 +111,35 @@ struct FramebufferGLTest: AbstractOpenGLTester { #ifndef MAGNUM_TARGET_GLES2 void readBuffer(); #endif + #ifndef MAGNUM_TARGET_GLES + void copyImageTexture1D(); + #endif + void copyImageTexture2D(); + #ifndef MAGNUM_TARGET_GLES + void copyImageTexture1DArray(); + #endif + #ifndef MAGNUM_TARGET_GLES + void copyImageRectangleTexture(); + #endif + void copyImageCubeMapTexture(); + #ifndef MAGNUM_TARGET_GLES + void copySubImageTexture1D(); + #endif + void copySubImageTexture2D(); + void copySubImageTexture3D(); + #ifndef MAGNUM_TARGET_GLES + void copySubImageTexture1DArray(); + #endif + #ifndef MAGNUM_TARGET_GLES2 + void copySubImageTexture2DArray(); + #endif + #ifndef MAGNUM_TARGET_GLES + void copySubImageRectangleTexture(); + #endif + void copySubImageCubeMapTexture(); + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + void copySubImageCubeMapTextureArray(); + #endif void blit(); #ifdef MAGNUM_TARGET_GLES2 @@ -175,6 +205,35 @@ FramebufferGLTest::FramebufferGLTest() { #ifndef MAGNUM_TARGET_GLES2 &FramebufferGLTest::readBuffer, #endif + #ifndef MAGNUM_TARGET_GLES + &FramebufferGLTest::copyImageTexture1D, + #endif + &FramebufferGLTest::copyImageTexture2D, + #ifndef MAGNUM_TARGET_GLES + &FramebufferGLTest::copyImageTexture1DArray, + #endif + #ifndef MAGNUM_TARGET_GLES + &FramebufferGLTest::copyImageRectangleTexture, + #endif + &FramebufferGLTest::copyImageCubeMapTexture, + #ifndef MAGNUM_TARGET_GLES + &FramebufferGLTest::copySubImageTexture1D, + #endif + &FramebufferGLTest::copySubImageTexture2D, + &FramebufferGLTest::copySubImageTexture3D, + #ifndef MAGNUM_TARGET_GLES + &FramebufferGLTest::copySubImageTexture1DArray, + #endif + #ifndef MAGNUM_TARGET_GLES2 + &FramebufferGLTest::copySubImageTexture2DArray, + #endif + #ifndef MAGNUM_TARGET_GLES + &FramebufferGLTest::copySubImageRectangleTexture, + #endif + &FramebufferGLTest::copySubImageCubeMapTexture, + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + &FramebufferGLTest::copySubImageCubeMapTextureArray, + #endif &FramebufferGLTest::blit}); #ifdef MAGNUM_TARGET_GLES2 @@ -1157,6 +1216,501 @@ void FramebufferGLTest::readBuffer() { } #endif +namespace { + constexpr char StorageData[]{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f + }; + + constexpr char ZeroStorage[4*4*4*6]{}; +} + +#ifndef MAGNUM_TARGET_GLES +void FramebufferGLTest::copyImageTexture1D() { + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + + Texture2D storage; + storage.setStorage(1, TextureFormat::RGBA8, Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + Texture1D texture; + fb.copyImage(Range2Di::fromSize(Vector2i{1}, {2, 1}), texture, 0, TextureFormat::RGBA8); + + MAGNUM_VERIFY_NO_ERROR(); + + CORRADE_COMPARE(texture.imageSize(0)[0], 2); + CORRADE_COMPARE_AS(texture.image(0, {PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from(0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b), + TestSuite::Compare::Container); +} +#endif + +void FramebufferGLTest::copyImageTexture2D() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + #endif + + Texture2D storage; + storage.setStorage(1, + #ifndef MAGNUM_TARGET_GLES2 + TextureFormat::RGBA8, + #else + rgbaFormatES2, + #endif + Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + Texture2D texture; + fb.copyImage(Range2Di::fromSize(Vector2i{1}, Vector2i{2}), texture, 0, + #ifndef MAGNUM_TARGET_GLES2 + TextureFormat::RGBA8 + #else + rgbaFormatES2 + #endif + ); + + MAGNUM_VERIFY_NO_ERROR(); + + #ifndef MAGNUM_TARGET_GLES + CORRADE_COMPARE(texture.imageSize(0), Vector2i{2}); + CORRADE_COMPARE_AS(texture.image(0, {PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from(0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b), + TestSuite::Compare::Container); + #endif +} + +#ifndef MAGNUM_TARGET_GLES +void FramebufferGLTest::copyImageTexture1DArray() { + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::EXT::texture_array::string() + std::string(" is not available.")); + + Texture2D storage; + storage.setStorage(1, TextureFormat::RGBA8, Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + Texture1DArray texture; + fb.copyImage(Range2Di::fromSize(Vector2i{1}, Vector2i{2}), texture, 0, TextureFormat::RGBA8); + + MAGNUM_VERIFY_NO_ERROR(); + + CORRADE_COMPARE(texture.imageSize(0), Vector2i{2}); + CORRADE_COMPARE_AS(texture.image(0, {PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from(0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b), + TestSuite::Compare::Container); +} + +void FramebufferGLTest::copyImageRectangleTexture() { + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::texture_rectangle::string() + std::string(" is not available.")); + + Texture2D storage; + storage.setStorage(1, TextureFormat::RGBA8, Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + RectangleTexture texture; + fb.copyImage(Range2Di::fromSize(Vector2i{1}, Vector2i{2}), texture, TextureFormat::RGBA8); + + MAGNUM_VERIFY_NO_ERROR(); + + CORRADE_COMPARE(texture.imageSize(), Vector2i{2}); + CORRADE_COMPARE_AS(texture.image({PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from(0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b), + TestSuite::Compare::Container); +} +#endif + +void FramebufferGLTest::copyImageCubeMapTexture() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + #endif + + Texture2D storage; + storage.setStorage(1, + #ifndef MAGNUM_TARGET_GLES2 + TextureFormat::RGBA8, + #else + rgbaFormatES2, + #endif + Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + CubeMapTexture texture; + fb.copyImage(Range2Di::fromSize(Vector2i{1}, Vector2i{2}), texture, CubeMapCoordinate::PositiveX, 0, + #ifndef MAGNUM_TARGET_GLES2 + TextureFormat::RGBA8 + #else + rgbaFormatES2 + #endif + ); + + MAGNUM_VERIFY_NO_ERROR(); + + #ifndef MAGNUM_TARGET_GLES + CORRADE_COMPARE(texture.imageSize(0), Vector2i{2}); + CORRADE_COMPARE_AS(texture.image(CubeMapCoordinate::PositiveX, 0, {PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from(0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b), + TestSuite::Compare::Container); + #endif +} + +#ifndef MAGNUM_TARGET_GLES +void FramebufferGLTest::copySubImageTexture1D() { + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + + Texture2D storage; + storage.setStorage(1, TextureFormat::RGBA8, Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + Texture1D texture; + texture.setStorage(1, TextureFormat::RGBA8, 4) + .setSubImage(0, {}, ImageView1D{PixelFormat::RGBA, PixelType::UnsignedByte, 4, ZeroStorage}); + fb.copySubImage(Range2Di::fromSize(Vector2i{1}, {2, 1}), texture, 0, 1); + + MAGNUM_VERIFY_NO_ERROR(); + + CORRADE_COMPARE_AS(texture.image(0, {PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from( + 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00), + TestSuite::Compare::Container); +} +#endif + +void FramebufferGLTest::copySubImageTexture2D() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + #endif + + Texture2D storage; + storage.setStorage(1, + #ifndef MAGNUM_TARGET_GLES2 + TextureFormat::RGBA8, + #else + rgbaFormatES2, + #endif + Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + Texture2D texture; + texture.setStorage(1, + #ifndef MAGNUM_TARGET_GLES2 + TextureFormat::RGBA8, + #else + rgbaFormatES2, + #endif + Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, ZeroStorage}); + fb.copySubImage(Range2Di::fromSize(Vector2i{1}, Vector2i{2}), texture, 0, Vector2i{1}); + + MAGNUM_VERIFY_NO_ERROR(); + + #ifndef MAGNUM_TARGET_GLES + CORRADE_COMPARE_AS(texture.image(0, {PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from( + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), + TestSuite::Compare::Container); + #endif +} + +#if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)) +void FramebufferGLTest::copySubImageTexture3D() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + #elif defined(MAGNUM_TARGET_GLES2) + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::OES::texture_3D::string() + std::string(" is not available.")); + #endif + + Texture2D storage; + storage.setStorage(1, + #ifndef MAGNUM_TARGET_GLES2 + TextureFormat::RGBA8, + #else + rgbaFormatES2, + #endif + Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + Texture3D texture; + texture.setStorage(1, + #ifndef MAGNUM_TARGET_GLES2 + TextureFormat::RGBA8, + #else + rgbaFormatES2, + #endif + {4, 4, 2}) + .setSubImage(0, {}, ImageView3D{PixelFormat::RGBA, PixelType::UnsignedByte, {4, 4, 2}, ZeroStorage}); + fb.copySubImage(Range2Di::fromSize(Vector2i{1}, Vector2i{2}), texture, 0, Vector3i{1}); + + MAGNUM_VERIFY_NO_ERROR(); + + #ifndef MAGNUM_TARGET_GLES + CORRADE_COMPARE_AS(texture.image(0, {PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from( + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), + TestSuite::Compare::Container); + #endif +} +#endif + +#ifndef MAGNUM_TARGET_GLES +void FramebufferGLTest::copySubImageTexture1DArray() { + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::EXT::texture_array::string() + std::string(" is not available.")); + + Texture2D storage; + storage.setStorage(1, TextureFormat::RGBA8, Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + Texture1DArray texture; + texture.setStorage(1, TextureFormat::RGBA8, Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, ZeroStorage}); + fb.copySubImage(Range2Di::fromSize(Vector2i{1}, Vector2i{2}), texture, 0, Vector2i{1}); + + MAGNUM_VERIFY_NO_ERROR(); + + CORRADE_COMPARE_AS(texture.image(0, {PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from( + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), + TestSuite::Compare::Container); +} +#endif + +#ifndef MAGNUM_TARGET_GLES2 +void FramebufferGLTest::copySubImageTexture2DArray() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::EXT::texture_array::string() + std::string(" is not available.")); + #endif + + Texture2D storage; + storage.setStorage(1, TextureFormat::RGBA8, Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + Texture2DArray texture; + texture.setStorage(1, TextureFormat::RGBA8, {4, 4, 2}) + .setSubImage(0, {}, ImageView3D{PixelFormat::RGBA, PixelType::UnsignedByte, {4, 4, 2}, ZeroStorage}); + fb.copySubImage(Range2Di::fromSize(Vector2i{1}, Vector2i{2}), texture, 0, Vector3i{1}); + + MAGNUM_VERIFY_NO_ERROR(); + + #ifndef MAGNUM_TARGET_GLES + CORRADE_COMPARE_AS(texture.image(0, {PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from( + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), + TestSuite::Compare::Container); + #endif +} +#endif + +#ifndef MAGNUM_TARGET_GLES +void FramebufferGLTest::copySubImageRectangleTexture() { + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::texture_rectangle::string() + std::string(" is not available.")); + + Texture2D storage; + storage.setStorage(1, TextureFormat::RGBA8, Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + RectangleTexture texture; + texture.setStorage(TextureFormat::RGBA8, Vector2i{4}) + .setSubImage({}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, ZeroStorage}); + fb.copySubImage(Range2Di::fromSize(Vector2i{1}, Vector2i{2}), texture, Vector2i{1}); + + MAGNUM_VERIFY_NO_ERROR(); + + CORRADE_COMPARE_AS(texture.image({PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from( + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), + TestSuite::Compare::Container); +} +#endif + +void FramebufferGLTest::copySubImageCubeMapTexture() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + #endif + + Texture2D storage; + storage.setStorage(1, + #ifndef MAGNUM_TARGET_GLES2 + TextureFormat::RGBA8, + #else + rgbaFormatES2, + #endif + Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + CubeMapTexture texture; + texture.setStorage(1, + #ifndef MAGNUM_TARGET_GLES2 + TextureFormat::RGBA8, + #else + rgbaFormatES2, + #endif + Vector2i{4}) + .setSubImage(CubeMapCoordinate::NegativeY, 0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, ZeroStorage}); + fb.copySubImage(Range2Di::fromSize(Vector2i{1}, Vector2i{2}), texture, 0, {1, 1, 3}); + + MAGNUM_VERIFY_NO_ERROR(); + + #ifndef MAGNUM_TARGET_GLES + CORRADE_COMPARE_AS(texture.image(CubeMapCoordinate::NegativeY, 0, {PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from( + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), + TestSuite::Compare::Container); + #endif +} + +#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) +void FramebufferGLTest::copySubImageCubeMapTextureArray() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::texture_cube_map_array::string() + std::string(" is not available.")); + #else + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::EXT::texture_cube_map_array::string() + std::string(" is not available.")); + #endif + + Texture2D storage; + storage.setStorage(1, TextureFormat::RGBA8, Vector2i{4}) + .setSubImage(0, {}, ImageView2D{PixelFormat::RGBA, PixelType::UnsignedByte, Vector2i{4}, StorageData}); + + Framebuffer fb{{{}, Vector2i{4}}}; + fb.attachTexture(Framebuffer::ColorAttachment{0}, storage, 0); + + CubeMapTextureArray texture; + texture.setStorage(1, TextureFormat::RGBA8, {4, 4, 6}) + .setSubImage(0, {}, ImageView3D{PixelFormat::RGBA, PixelType::UnsignedByte, {4, 4, 6}, ZeroStorage}); + fb.copySubImage(Range2Di::fromSize(Vector2i{1}, Vector2i{2}), texture, 0, {1, 1, 3}); + + MAGNUM_VERIFY_NO_ERROR(); + + #ifndef MAGNUM_TARGET_GLES + CORRADE_COMPARE_AS(texture.image(0, {PixelFormat::RGBA, PixelType::UnsignedByte}).release(), + Containers::Array::from( + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), + TestSuite::Compare::Container); + #endif +} +#endif + void FramebufferGLTest::blit() { #ifndef MAGNUM_TARGET_GLES if(!Context::current().isExtensionSupported()) diff --git a/src/Magnum/Texture.h b/src/Magnum/Texture.h index d33498c42..60fceade3 100644 --- a/src/Magnum/Texture.h +++ b/src/Magnum/Texture.h @@ -1014,9 +1014,9 @@ template class Texture: public AbstractTexture { * and has better performance characteristics. This call also has no * equivalent in @extension{ARB,direct_state_access}, thus the texture * needs to be bound to some texture unit before the operation. - * @see @ref maxSize(), @fn_gl{PixelStore}, then @fn_gl{ActiveTexture}, - * @fn_gl{BindTexture} and @fn_gl{TexImage1D} / @fn_gl{TexImage2D} - * / @fn_gl{TexImage3D} + * @see @ref maxSize(), @ref Framebuffer::copyImage(), @fn_gl{PixelStore}, + * then @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and @fn_gl{TexImage1D} + * / @fn_gl{TexImage2D} / @fn_gl{TexImage3D} * @deprecated_gl Prefer to use @ref setStorage() and @ref setSubImage() * instead. */ @@ -1115,7 +1115,8 @@ template class Texture: public AbstractTexture { * nor @extension{EXT,direct_state_access} desktop extension is * available, the texture is bound before the operation (if not * already). - * @see @ref setStorage(), @fn_gl{PixelStore}, @fn_gl2{TextureSubImage1D,TexSubImage1D} / + * @see @ref setStorage(), @ref Framebuffer::copySubImage(), + * @fn_gl{PixelStore}, @fn_gl2{TextureSubImage1D,TexSubImage1D} / * @fn_gl2{TextureSubImage2D,TexSubImage2D} / @fn_gl2{TextureSubImage3D,TexSubImage3D}, * @fn_gl_extension{TextureSubImage1D,EXT,direct_state_access} / * @fn_gl_extension{TextureSubImage2D,EXT,direct_state_access} / From 4759f419c1bfc7340ad5dfe069927d0320f65cc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 20 Jun 2016 08:56:59 +0200 Subject: [PATCH 069/290] Audio: cover also the official Windows SDK from Creative in the checks. --- src/Magnum/Audio/Audio.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Magnum/Audio/Audio.cpp b/src/Magnum/Audio/Audio.cpp index 4384c776f..7758c1a63 100644 --- a/src/Magnum/Audio/Audio.cpp +++ b/src/Magnum/Audio/Audio.cpp @@ -33,12 +33,9 @@ namespace Magnum { namespace Audio { /* Verify types */ static_assert(std::is_same::value, "ALubyte is not the same as UnsignedByte"); -/** @todo Why `ALbyte` is defined as `char` and not `signed char` on OSX? */ -#ifndef CORRADE_TARGET_APPLE -static_assert(std::is_same::value, "ALbyte is not the same as Byte"); -#else -static_assert(std::is_signed::value && sizeof(ALbyte) == 1, "ALbyte does not have the same characteristics as Byte"); -#endif +/* ALbyte is defined as `signed char` in OpenAL Soft and `char` in the official + SDK from Creative and on Apple. Both are okay. */ +static_assert(std::is_same::value || std::is_signed::value && sizeof(ALbyte) == 1, "ALbyte does not have the characteristics as Byte"); static_assert(std::is_same::value, "ALushort is not the same as UnsignedShort"); static_assert(std::is_same::value, "ALshort is not the same as Short"); static_assert(std::is_same::value, "ALuint is not the same as UnsignedInt"); From ca499e07c5e0d72015378612b2c7a6437d44afb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 21 Jun 2016 18:29:04 +0200 Subject: [PATCH 070/290] Audio: fix compiler warning. Eh, I'm not even able to do a single change without screwing up. --- src/Magnum/Audio/Audio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Audio/Audio.cpp b/src/Magnum/Audio/Audio.cpp index 7758c1a63..b0d928545 100644 --- a/src/Magnum/Audio/Audio.cpp +++ b/src/Magnum/Audio/Audio.cpp @@ -35,7 +35,7 @@ namespace Magnum { namespace Audio { static_assert(std::is_same::value, "ALubyte is not the same as UnsignedByte"); /* ALbyte is defined as `signed char` in OpenAL Soft and `char` in the official SDK from Creative and on Apple. Both are okay. */ -static_assert(std::is_same::value || std::is_signed::value && sizeof(ALbyte) == 1, "ALbyte does not have the characteristics as Byte"); +static_assert(std::is_same::value || (std::is_signed::value && sizeof(ALbyte) == 1), "ALbyte does not have the characteristics as Byte"); static_assert(std::is_same::value, "ALushort is not the same as UnsignedShort"); static_assert(std::is_same::value, "ALshort is not the same as Short"); static_assert(std::is_same::value, "ALuint is not the same as UnsignedInt"); From 798ec9af9b7c0752c54e1dc1ce87ee7c85742186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 21 Jun 2016 18:30:03 +0200 Subject: [PATCH 071/290] Platform: use BUILD_STATIC_PIC for windowless application libraries. Makes sense now that they provide WindowlessGLContext which can be used from shared libraries. --- src/Magnum/Platform/CMakeLists.txt | 35 ++++++++++++++++++------------ 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/Magnum/Platform/CMakeLists.txt b/src/Magnum/Platform/CMakeLists.txt index a28050001..6f03b14de 100644 --- a/src/Magnum/Platform/CMakeLists.txt +++ b/src/Magnum/Platform/CMakeLists.txt @@ -226,8 +226,9 @@ if(WITH_WINDOWLESSNACLAPPLICATION) ${MagnumWindowlessNaClApplication_SRCS} ${MagnumWindowlessNaClApplication_HEADERS}) set_target_properties(MagnumWindowlessNaClApplication PROPERTIES DEBUG_POSTFIX "-d") - # Assuming that PIC is not needed because the Application lib is always - # linked to the executable and not to any intermediate shared lib + if(BUILD_STATIC_PIC) + set_target_properties(MagnumWindowlessNaClApplication PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() target_link_libraries(MagnumWindowlessNaClApplication Magnum ppapi_cpp ppapi) install(FILES ${MagnumWindowlessNaClApplication_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Platform) @@ -347,9 +348,10 @@ if(WITH_WINDOWLESSEGLAPPLICATION) ${MagnumWindowlessEglApplication_HEADERS} ${MagnumWindowlessEglApplication_PRIVATE_HEADERS}) set_target_properties(MagnumWindowlessEglApplication PROPERTIES DEBUG_POSTFIX "-d") + if(BUILD_STATIC_PIC) + set_target_properties(MagnumWindowlessEglApplication PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() target_link_libraries(MagnumWindowlessEglApplication Magnum EGL::EGL) - # Assuming that PIC is not needed because the Application lib is always - # linked to the executable and not to any intermediate shared lib install(FILES ${MagnumWindowlessEglApplication_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Platform) install(TARGETS MagnumWindowlessEglApplication @@ -376,8 +378,9 @@ if(WITH_WINDOWLESSGLXAPPLICATION) # X11 macros are a mess, disable warnings for C-style casts set_target_properties(MagnumWindowlessGlxApplication PROPERTIES DEBUG_POSTFIX "-d") target_compile_options(MagnumWindowlessGlxApplication PRIVATE "-Wno-old-style-cast") - # Assuming that PIC is not needed because the Application lib is always - # linked to the executable and not to any intermediate shared lib + if(BUILD_STATIC_PIC) + set_target_properties(MagnumWindowlessGlxApplication PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() target_include_directories(MagnumWindowlessGlxApplication PUBLIC ${X11_INCLUDE_DIR}) target_link_libraries(MagnumWindowlessGlxApplication Magnum ${X11_LIBRARIES}) @@ -409,12 +412,13 @@ if(WITH_WINDOWLESSIOSAPPLICATION) ${MagnumWindowlessIosApplication_SRCS} ${MagnumWindowlessIosApplication_HEADERS}) set_target_properties(MagnumWindowlessIosApplication PROPERTIES DEBUG_POSTFIX "-d") + if(BUILD_STATIC_PIC) + set_target_properties(MagnumWindowlessIosApplication PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() target_link_libraries(MagnumWindowlessIosApplication Magnum EGL::EGL ${_MAGNUM_IOS_FOUNDATION_FRAMEWORK_LIBRARY}) - # Assuming that PIC is not needed because the Application lib is always - # linked to the executable and not to any intermediate shared lib install(FILES ${MagnumWindowlessIosApplication_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Platform) install(TARGETS MagnumWindowlessIosApplication @@ -440,8 +444,9 @@ if(WITH_WINDOWLESSWGLAPPLICATION) ${MagnumWindowlessWglApplication_HEADERS}) set_target_properties(MagnumWindowlessWglApplication PROPERTIES DEBUG_POSTFIX "-d") target_compile_definitions(MagnumWindowlessWglApplication PRIVATE "UNICODE") - # Assuming that PIC is not needed because the Application lib is always - # linked to the executable and not to any intermediate shared lib + if(BUILD_STATIC_PIC) + set_target_properties(MagnumWindowlessWglApplication PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() target_link_libraries(MagnumWindowlessWglApplication Magnum) install(FILES ${MagnumWindowlessWglApplication_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Platform) @@ -473,8 +478,9 @@ if(WITH_WINDOWLESSWINDOWSEGLAPPLICATION) ${MagnumWindowlessWindowsEglApplication_PRIVATE_HEADERS}) set_target_properties(MagnumWindowlessWindowsEglApplication PROPERTIES DEBUG_POSTFIX "-d") target_compile_definitions(MagnumWindowlessWindowsEglApplication PRIVATE "UNICODE") - # Assuming that PIC is not needed because the Application lib is always - # linked to the executable and not to any intermediate shared lib + if(BUILD_STATIC_PIC) + set_target_properties(MagnumWindowlessWindowsEglApplication PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() target_link_libraries(MagnumWindowlessWindowsEglApplication Magnum EGL::EGL) install(FILES ${MagnumWindowlessWindowsEglApplication_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Platform) @@ -500,8 +506,9 @@ if(WITH_WINDOWLESSCGLAPPLICATION) ${MagnumWindowlessCglApplication_SRCS} ${MagnumWindowlessCglApplication_HEADERS}) set_target_properties(MagnumWindowlessCglApplication PROPERTIES DEBUG_POSTFIX "-d") - # Assuming that PIC is not needed because the Application lib is always - # linked to the executable and not to any intermediate shared lib + if(BUILD_STATIC_PIC) + set_target_properties(MagnumWindowlessCglApplication PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() target_link_libraries(MagnumWindowlessCglApplication Magnum) install(FILES ${MagnumWindowlessCglApplication_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Platform) From 7fd78b28fb60c6f846946e8a53d3c9ab50552539 Mon Sep 17 00:00:00 2001 From: Elliot Saba Date: Sat, 25 Jun 2016 19:34:55 -0700 Subject: [PATCH 072/290] Change GLFW keymappings to use actual GLFW defines Note that the `Plus` and `Percent` keys are not available without using the SHIFT key on the typical US English keyboard layout, and as such do not have dedicated `#define`'s in `GLFW.h`. --- src/Magnum/Platform/GlfwApplication.h | 158 +++++++++++++------------- 1 file changed, 80 insertions(+), 78 deletions(-) diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index 056c3f355..c51410058 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -558,84 +558,86 @@ class GlfwApplication::KeyEvent: public GlfwApplication::InputEvent { * @see @ref key() */ enum class Key: Int { - Unknown = GLFW_KEY_UNKNOWN, /**< Unknown key */ - - Enter = GLFW_KEY_ENTER, /**< Enter */ - Esc = GLFW_KEY_ESCAPE, /**< Escape */ - - Up = GLFW_KEY_UP, /**< Up arrow */ - Down = GLFW_KEY_DOWN, /**< Down arrow */ - Left = GLFW_KEY_LEFT, /**< Left arrow */ - Right = GLFW_KEY_RIGHT, /**< Right arrow */ - Home = GLFW_KEY_HOME, /**< Home */ - End = GLFW_KEY_END, /**< End */ - PageUp = GLFW_KEY_PAGE_UP, /**< Page up */ - PageDown = GLFW_KEY_PAGE_DOWN, /**< Page down */ - Backspace = GLFW_KEY_BACKSPACE, /**< Backspace */ - Insert = GLFW_KEY_INSERT, /**< Insert */ - Delete = GLFW_KEY_DELETE, /**< Delete */ - - F1 = GLFW_KEY_F1, /**< F1 */ - F2 = GLFW_KEY_F2, /**< F2 */ - F3 = GLFW_KEY_F3, /**< F3 */ - F4 = GLFW_KEY_F4, /**< F4 */ - F5 = GLFW_KEY_F5, /**< F5 */ - F6 = GLFW_KEY_F6, /**< F6 */ - F7 = GLFW_KEY_F7, /**< F7 */ - F8 = GLFW_KEY_F8, /**< F8 */ - F9 = GLFW_KEY_F9, /**< F9 */ - F10 = GLFW_KEY_F10, /**< F10 */ - F11 = GLFW_KEY_F11, /**< F11 */ - F12 = GLFW_KEY_F12, /**< F12 */ - - Space = ' ', /**< Space */ - Tab = '\t', /**< Tab */ - Comma = ',', /**< Comma */ - Period = '.', /**< Period */ - Minus = '-', /**< Minus */ - Plus = '+', /**< Plus */ - Slash = '/', /**< Slash */ - Percent = '%', /**< Percent */ - Smicolon = ';', /**< Semicolon */ - Equal = '=', /**< Equal */ - - Zero = '0', /**< Zero */ - One = '1', /**< One */ - Two = '2', /**< Two */ - Three = '3', /**< Three */ - Four = '4', /**< Four */ - Five = '5', /**< Five */ - Six = '6', /**< Six */ - Seven = '7', /**< Seven */ - Eight = '8', /**< Eight */ - Nine = '9', /**< Nine */ - - A = 'a', /**< Letter A */ - B = 'b', /**< Letter B */ - C = 'c', /**< Letter C */ - D = 'd', /**< Letter D */ - E = 'e', /**< Letter E */ - F = 'f', /**< Letter F */ - G = 'g', /**< Letter G */ - H = 'h', /**< Letter H */ - I = 'i', /**< Letter I */ - J = 'j', /**< Letter J */ - K = 'k', /**< Letter K */ - L = 'l', /**< Letter L */ - M = 'm', /**< Letter M */ - N = 'n', /**< Letter N */ - O = 'o', /**< Letter O */ - P = 'p', /**< Letter P */ - Q = 'q', /**< Letter Q */ - R = 'r', /**< Letter R */ - S = 's', /**< Letter S */ - T = 't', /**< Letter T */ - U = 'u', /**< Letter U */ - V = 'v', /**< Letter V */ - W = 'w', /**< Letter W */ - X = 'x', /**< Letter X */ - Y = 'y', /**< Letter Y */ - Z = 'z', /**< Letter Z */ + Unknown = GLFW_KEY_UNKNOWN, /**< Unknown key */ + + Enter = GLFW_KEY_ENTER, /**< Enter */ + Esc = GLFW_KEY_ESCAPE, /**< Escape */ + + Up = GLFW_KEY_UP, /**< Up arrow */ + Down = GLFW_KEY_DOWN, /**< Down arrow */ + Left = GLFW_KEY_LEFT, /**< Left arrow */ + Right = GLFW_KEY_RIGHT, /**< Right arrow */ + Home = GLFW_KEY_HOME, /**< Home */ + End = GLFW_KEY_END, /**< End */ + PageUp = GLFW_KEY_PAGE_UP, /**< Page up */ + PageDown = GLFW_KEY_PAGE_DOWN, /**< Page down */ + Backspace = GLFW_KEY_BACKSPACE, /**< Backspace */ + Insert = GLFW_KEY_INSERT, /**< Insert */ + Delete = GLFW_KEY_DELETE, /**< Delete */ + + F1 = GLFW_KEY_F1, /**< F1 */ + F2 = GLFW_KEY_F2, /**< F2 */ + F3 = GLFW_KEY_F3, /**< F3 */ + F4 = GLFW_KEY_F4, /**< F4 */ + F5 = GLFW_KEY_F5, /**< F5 */ + F6 = GLFW_KEY_F6, /**< F6 */ + F7 = GLFW_KEY_F7, /**< F7 */ + F8 = GLFW_KEY_F8, /**< F8 */ + F9 = GLFW_KEY_F9, /**< F9 */ + F10 = GLFW_KEY_F10, /**< F10 */ + F11 = GLFW_KEY_F11, /**< F11 */ + F12 = GLFW_KEY_F12, /**< F12 */ + + Space = GLFW_KEY_SPACE, /**< Space */ + Tab = GLFW_KEY_TAB, /**< Tab */ + Comma = GLFW_KEY_COMMA, /**< Comma */ + Period = GLFW_KEY_PERIOD, /**< Period */ + Minus = GLFW_KEY_MINUS, /**< Minus */ + /* Note: This may only be represented as SHIFT + = */ + Plus = '+', /**< Plus */ + Slash = GLFW_KEY_SLASH, /**< Slash */ + /* Note: This may only be represented as SHIFT + 5 */ + Percent = '%', /**< Percent */ + Smicolon = GLFW_KEY_SEMICOLON, /**< Semicolon */ + Equal = GLFW_KEY_EQUAL, /**< Equal */ + + Zero = GLFW_KEY_0, /**< Zero */ + One = GLFW_KEY_1, /**< One */ + Two = GLFW_KEY_2, /**< Two */ + Three = GLFW_KEY_3, /**< Three */ + Four = GLFW_KEY_4, /**< Four */ + Five = GLFW_KEY_5, /**< Five */ + Six = GLFW_KEY_6, /**< Six */ + Seven = GLFW_KEY_7, /**< Seven */ + Eight = GLFW_KEY_8, /**< Eight */ + Nine = GLFW_KEY_9, /**< Nine */ + + A = GLFW_KEY_A, /**< Letter A */ + B = GLFW_KEY_B, /**< Letter B */ + C = GLFW_KEY_C, /**< Letter C */ + D = GLFW_KEY_D, /**< Letter D */ + E = GLFW_KEY_E, /**< Letter E */ + F = GLFW_KEY_F, /**< Letter F */ + G = GLFW_KEY_G, /**< Letter G */ + H = GLFW_KEY_H, /**< Letter H */ + I = GLFW_KEY_I, /**< Letter I */ + J = GLFW_KEY_J, /**< Letter J */ + K = GLFW_KEY_K, /**< Letter K */ + L = GLFW_KEY_L, /**< Letter L */ + M = GLFW_KEY_M, /**< Letter M */ + N = GLFW_KEY_N, /**< Letter N */ + O = GLFW_KEY_O, /**< Letter O */ + P = GLFW_KEY_P, /**< Letter P */ + Q = GLFW_KEY_Q, /**< Letter Q */ + R = GLFW_KEY_R, /**< Letter R */ + S = GLFW_KEY_S, /**< Letter S */ + T = GLFW_KEY_T, /**< Letter T */ + U = GLFW_KEY_U, /**< Letter U */ + V = GLFW_KEY_V, /**< Letter V */ + W = GLFW_KEY_W, /**< Letter W */ + X = GLFW_KEY_X, /**< Letter X */ + Y = GLFW_KEY_Y, /**< Letter Y */ + Z = GLFW_KEY_Z, /**< Letter Z */ /* Function keys */ CapsLock = GLFW_KEY_CAPS_LOCK, /**< Caps lock */ From 140f378739f9feeb946a8831c74278463820d519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 26 Jun 2016 11:58:20 +0200 Subject: [PATCH 073/290] Platform: rename GlfwApplication::InputEvent::Modifier::AltGr to Super. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's not AltGr, it's the Windows (or ⌘) key. --- src/Magnum/Platform/GlfwApplication.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index c51410058..543331151 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -503,7 +503,7 @@ class GlfwApplication::InputEvent { Shift = GLFW_MOD_SHIFT, /**< Shift */ Ctrl = GLFW_MOD_CONTROL, /**< Ctrl */ Alt = GLFW_MOD_ALT, /**< Alt */ - AltGr = GLFW_MOD_SUPER /**< AltGr */ + Super = GLFW_MOD_SUPER /**< Super key (Windows/⌘) */ }; /** From e40533b841727a3c9a85737e7a5848b3f9c3671e Mon Sep 17 00:00:00 2001 From: Elliot Saba Date: Sun, 26 Jun 2016 12:01:37 +0200 Subject: [PATCH 074/290] Platform: Add Sdl2Application::InputEvent::Modifier::Super. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Maps to the Windows/⌘ key. --- src/Magnum/Platform/Sdl2Application.cpp | 1 + src/Magnum/Platform/Sdl2Application.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index ce86b4909..b316c9cc4 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -52,6 +52,7 @@ Sdl2Application::InputEvent::Modifiers fixedModifiers(Uint16 mod) { if(modifiers & Sdl2Application::InputEvent::Modifier::Shift) modifiers |= Sdl2Application::InputEvent::Modifier::Shift; if(modifiers & Sdl2Application::InputEvent::Modifier::Ctrl) modifiers |= Sdl2Application::InputEvent::Modifier::Ctrl; if(modifiers & Sdl2Application::InputEvent::Modifier::Alt) modifiers |= Sdl2Application::InputEvent::Modifier::Alt; + if(modifiers & Sdl2Application::InputEvent::Modifier::Super) modifiers |= Sdl2Application::InputEvent::Modifier::Alt; return modifiers; } diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index 2363d8dc8..9d0f91401 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -974,6 +974,7 @@ class Sdl2Application::InputEvent { Shift = KMOD_SHIFT, /**< Shift */ Ctrl = KMOD_CTRL, /**< Ctrl */ Alt = KMOD_ALT, /**< Alt */ + Super = KMOD_GUI, /**< Super key (Windows/⌘) */ AltGr = KMOD_MODE, /**< AltGr */ CapsLock = KMOD_CAPS, /**< Caps lock */ From 0c52d79707b77dc13bb5b026833dc784ac50702f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 26 Jun 2016 13:17:17 +0200 Subject: [PATCH 075/290] Platform: oops. --- src/Magnum/Platform/GlfwApplication.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Platform/GlfwApplication.cpp b/src/Magnum/Platform/GlfwApplication.cpp index bac69aa43..6b40eda54 100644 --- a/src/Magnum/Platform/GlfwApplication.cpp +++ b/src/Magnum/Platform/GlfwApplication.cpp @@ -221,7 +221,7 @@ auto GlfwApplication::KeyEvent::getCurrentGlfwModifiers(GLFWwindow* window) -> M if(glfwGetKey(window, Int(Key::LeftCtrl)) || glfwGetKey(window, Int(Key::RightCtrl))) mods |= Modifier::Ctrl; if(glfwGetKey(window, Int(Key::RightSuper))) - mods |= Modifier::AltGr; + mods |= Modifier::Super; return mods; } From 35c3f7d05d57d7b0664796f743ac443bdaf47d62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 4 Jul 2016 09:13:04 +0200 Subject: [PATCH 076/290] Platform: link magnum-info to WindowlessEglApplication in EGL Linux builds. --- src/Magnum/Platform/CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Platform/CMakeLists.txt b/src/Magnum/Platform/CMakeLists.txt index 6f03b14de..142a2d4b7 100644 --- a/src/Magnum/Platform/CMakeLists.txt +++ b/src/Magnum/Platform/CMakeLists.txt @@ -744,7 +744,11 @@ if(WITH_MAGNUMINFO) elseif(CORRADE_TARGET_NACL) target_link_libraries(magnum-info MagnumWindowlessNaClApplication) elseif(CORRADE_TARGET_UNIX) - target_link_libraries(magnum-info MagnumWindowlessGlxApplication) + if(MAGNUM_TARGET_GLES AND NOT MAGNUM_TARGET_DESKTOP_GLES) + target_link_libraries(magnum-info MagnumWindowlessEglApplication) + else() + target_link_libraries(magnum-info MagnumWindowlessGlxApplication) + endif() elseif(CORRADE_TARGET_WINDOWS) if(NOT MAGNUM_TARGET_GLES OR MAGNUM_TARGET_DESKTOP_GLES) target_link_libraries(magnum-info MagnumWindowlessWglApplication) From 9b744250cfcd714dd23f8111d12e1a465c1c245c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 4 Jul 2016 09:13:56 +0200 Subject: [PATCH 077/290] Don't use deprecated Corrade functionality. --- src/Magnum/Platform/AbstractXApplication.cpp | 4 ++-- src/Magnum/Timeline.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Magnum/Platform/AbstractXApplication.cpp b/src/Magnum/Platform/AbstractXApplication.cpp index e360f8ef6..b91716622 100644 --- a/src/Magnum/Platform/AbstractXApplication.cpp +++ b/src/Magnum/Platform/AbstractXApplication.cpp @@ -25,7 +25,7 @@ #include "AbstractXApplication.h" -#include +#include #include "Magnum/Platform/Context.h" #include "Magnum/Version.h" @@ -162,7 +162,7 @@ int AbstractXApplication::exec() { if(_flags & Flag::Redraw) { _flags &= ~Flag::Redraw; drawEvent(); - } else Utility::sleep(5); + } else Utility::System::sleep(5); } return 0; diff --git a/src/Magnum/Timeline.cpp b/src/Magnum/Timeline.cpp index a05790bc5..b38574209 100644 --- a/src/Magnum/Timeline.cpp +++ b/src/Magnum/Timeline.cpp @@ -26,7 +26,7 @@ #include "Timeline.h" #include -#include +#include #include "Magnum/Magnum.h" @@ -57,7 +57,7 @@ void Timeline::nextFrame() { #ifdef MAGNUM_BUILD_DEPRECATED if(_previousFrameDuration < _minimalFrameTime) { - Utility::sleep(std::size_t(_minimalFrameTime*1000) - duration/1000); + Utility::System::sleep(std::size_t(_minimalFrameTime*1000) - duration/1000); now = high_resolution_clock::now(); _previousFrameDuration = duration_cast(now-_previousFrameTime).count()/1e6f; } From 41253de1d5b4483a6ea720bc7eb4b02fb33ca7f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 18 Jul 2016 23:20:10 +0200 Subject: [PATCH 078/290] Math: make Matrix4::transformPoint() work with projection matrices. Dividing by w instead of ignoring it. --- src/Magnum/Math/Matrix4.h | 5 +++-- src/Magnum/Math/Test/Matrix4Test.cpp | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Math/Matrix4.h b/src/Magnum/Math/Matrix4.h index 6e30f3156..65dc49a60 100644 --- a/src/Magnum/Math/Matrix4.h +++ b/src/Magnum/Math/Matrix4.h @@ -447,13 +447,14 @@ template class Matrix4: public Matrix4x4 { * * Unlike in @ref transformVector(), translation is also involved in * the transformation. @f[ - * \boldsymbol v' = \boldsymbol M \begin{pmatrix} v_x \\ v_y \\ v_z \\ 1 \end{pmatrix} + * \boldsymbol v' = v''_{xyz} / v''_w ~~~~~~~~~~ \boldsymbol v'' = \begin{pmatrix} v''_x \\ v''_y \\ v''_z \\ v''_w \end{pmatrix} = \boldsymbol M \begin{pmatrix} v_x \\ v_y \\ v_z \\ 1 \end{pmatrix} \\ * @f] * @see @ref DualQuaternion::transformPoint(), * @ref Matrix3::transformPoint() */ Vector3 transformPoint(const Vector3& vector) const { - return ((*this)*Vector4(vector, T(1))).xyz(); + const Vector4 transformed{(*this)*Vector4(vector, T(1))}; + return transformed.xyz()/transformed.w(); } MAGNUM_RECTANGULARMATRIX_SUBCLASS_IMPLEMENTATION(4, 4, Matrix4) diff --git a/src/Magnum/Math/Test/Matrix4Test.cpp b/src/Magnum/Math/Test/Matrix4Test.cpp index 3969e4817..3eac6154e 100644 --- a/src/Magnum/Math/Test/Matrix4Test.cpp +++ b/src/Magnum/Math/Test/Matrix4Test.cpp @@ -95,6 +95,7 @@ struct Matrix4Test: Corrade::TestSuite::Tester { void vectorParts(); void invertedRigid(); void transform(); + void transformProjection(); void debug(); void configuration(); @@ -143,6 +144,7 @@ Matrix4Test::Matrix4Test() { &Matrix4Test::vectorParts, &Matrix4Test::invertedRigid, &Matrix4Test::transform, + &Matrix4Test::transformProjection, &Matrix4Test::debug, &Matrix4Test::configuration}); @@ -546,6 +548,14 @@ void Matrix4Test::transform() { CORRADE_COMPARE(a.transformPoint(v), Vector3(3.0f, -4.0f, 9.0f)); } +void Matrix4Test::transformProjection() { + Matrix4 a = Matrix4::perspectiveProjection({2.0f, 2.0f}, 1.0f, 100.0f); + Vector3 v{0.0f, 0.0f, -100.0f}; + + CORRADE_COMPARE(a.transformVector(v), Vector3(0.0f, 0.0f, 0.0f)); + CORRADE_COMPARE(a.transformPoint(v), Vector3(0.0f, 0.0f, 1.0f)); +} + void Matrix4Test::lookAt() { Matrix4 a = Matrix4::lookAt({0.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, From c2d2737ca6c2d50737731ccf3331f1b9c42ee9cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 18 Jul 2016 23:36:24 +0200 Subject: [PATCH 079/290] Math: test and document Matrix4::*projection() harder. --- src/Magnum/Math/Matrix4.h | 8 ++++---- src/Magnum/Math/Test/Matrix4Test.cpp | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/Magnum/Math/Matrix4.h b/src/Magnum/Math/Matrix4.h index 65dc49a60..9f391399e 100644 --- a/src/Magnum/Math/Matrix4.h +++ b/src/Magnum/Math/Matrix4.h @@ -193,8 +193,8 @@ template class Matrix4: public Matrix4x4 { /** * @brief 3D orthographic projection matrix * @param size Size of the view - * @param near Near clipping plane - * @param far Far clipping plane + * @param near Distance to near clipping plane, positive is ahead + * @param far Distance to far clipping plane, positive is ahead * * @see @ref perspectiveProjection(), @ref Matrix3::projection() */ @@ -203,8 +203,8 @@ template class Matrix4: public Matrix4x4 { /** * @brief 3D perspective projection matrix * @param size Size of near clipping plane - * @param near Near clipping plane - * @param far Far clipping plane + * @param near Distance to near clipping plane, positive is ahead + * @param far Distance to far clipping plane, positive is ahead * * @see @ref orthographicProjection(), @ref Matrix3::projection() */ diff --git a/src/Magnum/Math/Test/Matrix4Test.cpp b/src/Magnum/Math/Test/Matrix4Test.cpp index 3eac6154e..9bc4b44a2 100644 --- a/src/Magnum/Math/Test/Matrix4Test.cpp +++ b/src/Magnum/Math/Test/Matrix4Test.cpp @@ -384,7 +384,12 @@ void Matrix4Test::orthographicProjection() { {0.0f, 0.5f, 0.0f, 0.0f}, {0.0f, 0.0f, -0.25f, 0.0f}, {0.0f, 0.0f, -1.25f, 1.0f}); - CORRADE_COMPARE(Matrix4::orthographicProjection({5.0f, 4.0f}, 1, 9), expected); + Matrix4 actual = Matrix4::orthographicProjection({5.0f, 4.0f}, 1.0f, 9.0f); + CORRADE_COMPARE(actual, expected); + + /* NDC is left-handed, so point on near plane should be -1, far +1 */ + CORRADE_COMPARE(actual.transformPoint({0.0f, 0.0f, -1.0f}), Vector3(0.0f, 0.0f, -1.0f)); + CORRADE_COMPARE(actual.transformPoint({0.0f, 0.0f, -9.0f}), Vector3(0.0f, 0.0f, +1.0f)); } void Matrix4Test::perspectiveProjection() { @@ -392,7 +397,12 @@ void Matrix4Test::perspectiveProjection() { {0.0f, 7.111111f, 0.0f, 0.0f}, {0.0f, 0.0f, -1.9411764f, -1.0f}, {0.0f, 0.0f, -94.1176452f, 0.0f}); - CORRADE_COMPARE(Matrix4::perspectiveProjection({16.0f, 9.0f}, 32.0f, 100), expected); + Matrix4 actual = Matrix4::perspectiveProjection({16.0f, 9.0f}, 32.0f, 100.0f); + CORRADE_COMPARE(actual, expected); + + /* NDC is left-handed, so point on near plane should be -1, far +1 */ + CORRADE_COMPARE(actual.transformPoint({0.0f, 0.0f, -32.0f}), Vector3(0.0f, 0.0f, -1.0f)); + CORRADE_COMPARE(actual.transformPoint({0.0f, 0.0f, -100.0f}), Vector3(0.0f, 0.0f, +1.0f)); } void Matrix4Test::perspectiveProjectionFov() { From 1e5e4843a98f0bf4b18d2980d8629b2e47338a96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 18 Jul 2016 23:50:54 +0200 Subject: [PATCH 080/290] Platform: expose also modifier keys in KeyEvent::Key enum. Was done for GLFW but not for SDL2. Also updated the docs to reflect the connection between them. --- src/Magnum/Platform/GlfwApplication.h | 95 +++++++++++++++++++++--- src/Magnum/Platform/Sdl2Application.h | 102 ++++++++++++++++++++++++-- 2 files changed, 180 insertions(+), 17 deletions(-) diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index 543331151..008281d24 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -500,10 +500,33 @@ class GlfwApplication::InputEvent { * @ref MouseEvent::modifiers() */ enum class Modifier: Int { - Shift = GLFW_MOD_SHIFT, /**< Shift */ - Ctrl = GLFW_MOD_CONTROL, /**< Ctrl */ - Alt = GLFW_MOD_ALT, /**< Alt */ - Super = GLFW_MOD_SUPER /**< Super key (Windows/⌘) */ + /** + * Shift + * + * @see @ref KeyEvent::Key::LeftShift, @ref KeyEvent::Key::RightShift + */ + Shift = GLFW_MOD_SHIFT, + + /** + * Ctrl + * + * @see @ref KeyEvent::Key::LeftCtrl, @ref KeyEvent::Key::RightCtrl + */ + Ctrl = GLFW_MOD_CONTROL, + + /** + * Alt + * + * @see @ref KeyEvent::Key::LeftAlt, @ref KeyEvent::Key::RightAlt + */ + Alt = GLFW_MOD_ALT, + + /** + * Super key (Windows/⌘) + * + * @see @ref KeyEvent::Key::LeftSuper, @ref KeyEvent::Key::RightSuper + */ + Super = GLFW_MOD_SUPER }; /** @@ -560,6 +583,62 @@ class GlfwApplication::KeyEvent: public GlfwApplication::InputEvent { enum class Key: Int { Unknown = GLFW_KEY_UNKNOWN, /**< Unknown key */ + /** + * Left Shift + * + * @see @ref InputEvent::Modifier::Shift + */ + LeftShift = GLFW_KEY_LEFT_SHIFT, + + /** + * Right Shift + * + * @see @ref InputEvent::Modifier::Shift + */ + RightShift = GLFW_KEY_RIGHT_SHIFT, + + /** + * Left Ctrl + * + * @see @ref InputEvent::Modifier::Ctrl + */ + LeftCtrl = GLFW_KEY_LEFT_CONTROL, + + /** + * Right Ctrl + * + * @see @ref InputEvent::Modifier::Ctrl + */ + RightCtrl = GLFW_KEY_RIGHT_CONTROL, + + /** + * Left Alt + * + * @see @ref InputEvent::Modifier::Alt + */ + LeftAlt = GLFW_KEY_LEFT_ALT, + + /** + * Right Alt + * + * @see @ref InputEvent::Modifier::Alt + */ + RightAlt = GLFW_KEY_RIGHT_ALT, + + /** + * Left Super key (Windows/⌘) + * + * @see @ref InputEvent::Modifier::Super + */ + LeftSuper = GLFW_KEY_LEFT_SUPER, + + /** + * Right Super key (Windows/⌘) + * + * @see @ref InputEvent::Modifier::Super + */ + RightSuper = GLFW_KEY_RIGHT_SUPER, + Enter = GLFW_KEY_ENTER, /**< Enter */ Esc = GLFW_KEY_ESCAPE, /**< Escape */ @@ -662,14 +741,6 @@ class GlfwApplication::KeyEvent: public GlfwApplication::InputEvent { NumAdd = GLFW_KEY_KP_ADD, /**< Numpad add */ NumEnter = GLFW_KEY_KP_ENTER, /**< Numpad enter */ NumEqual = GLFW_KEY_KP_EQUAL, /**< Numpad equal */ - LeftShift = GLFW_KEY_LEFT_SHIFT, /**< Left shift */ - LeftCtrl = GLFW_KEY_LEFT_CONTROL, /**< Left control */ - LeftAlt = GLFW_KEY_LEFT_ALT, /**< Left alt */ - LeftSuper = GLFW_KEY_LEFT_SUPER, /**< Left super */ - RightShift = GLFW_KEY_RIGHT_SHIFT, /**< Right shift */ - RightCtrl = GLFW_KEY_RIGHT_CONTROL, /**< Right control */ - RightAlt = GLFW_KEY_RIGHT_ALT, /**< Right alt */ - RightSuper = GLFW_KEY_RIGHT_SUPER, /**< Right super */ Menu = GLFW_KEY_MENU /**< Menu */ }; diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index 9d0f91401..24c1b1d24 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -971,11 +971,40 @@ class Sdl2Application::InputEvent { * @ref MouseEvent::modifiers(), @ref MouseMoveEvent::modifiers() */ enum class Modifier: Uint16 { - Shift = KMOD_SHIFT, /**< Shift */ - Ctrl = KMOD_CTRL, /**< Ctrl */ - Alt = KMOD_ALT, /**< Alt */ - Super = KMOD_GUI, /**< Super key (Windows/⌘) */ - AltGr = KMOD_MODE, /**< AltGr */ + /** + * Shift + * + * @see @ref KeyEvent::Key::LeftShift, @ref KeyEvent::Key::RightShift + */ + Shift = KMOD_SHIFT, + + /** + * Ctrl + * + * @see @ref KeyEvent::Key::LeftCtrl, @ref KeyEvent::Key::RightCtrl + */ + Ctrl = KMOD_CTRL, + + /** + * Alt + * + * @see @ref KeyEvent::Key::LeftAlt, @ref KeyEvent::Key::RightAlt + */ + Alt = KMOD_ALT, + + /** + * Super key (Windows/⌘) + * + * @see @ref KeyEvent::Key::LeftSuper, @ref KeyEvent::Key::RightSuper + */ + Super = KMOD_GUI, + + /** + * AltGr + * + * @see @ref KeyEvent::Key::AltGr + */ + AltGr = KMOD_MODE, CapsLock = KMOD_CAPS, /**< Caps lock */ NumLock = KMOD_NUM /**< Num lock */ @@ -1042,6 +1071,69 @@ class Sdl2Application::KeyEvent: public Sdl2Application::InputEvent { enum class Key: SDL_Keycode { Unknown = SDLK_UNKNOWN, /**< Unknown key */ + /** + * Left Shift + * + * @see @ref InputEvent::Modifier::Shift + */ + LeftShift = SDLK_LSHIFT, + + /** + * Right Shift + * + * @see @ref InputEvent::Modifier::Shift + */ + RightShift = SDLK_RSHIFT, + + /** + * Left Ctrl + * + * @see @ref InputEvent::Modifier::Ctrl + */ + LeftCtrl = SDLK_LCTRL, + + /** + * Right Ctrl + * + * @see @ref InputEvent::Modifier::Ctrl + */ + RightCtrl = SDLK_RCTRL, + + /** + * Left Alt + * + * @see @ref InputEvent::Modifier::Alt + */ + LeftAlt = SDLK_LALT, + + /** + * Right Alt + * + * @see @ref InputEvent::Modifier::Alt + */ + RightAlt = SDLK_RALT, + + /** + * Left Super key (Windows/⌘) + * + * @see @ref InputEvent::Modifier::Super + */ + LeftSuper = SDLK_LGUI, + + /** + * Right Super key (Windows/⌘) + * + * @see @ref InputEvent::Modifier::Super + */ + RightSuper = SDLK_RGUI, + + /** + * AltGr + * + * @see @ref InputEvent::Modifier::AltGr + */ + AltGr = SDLK_MODE, + Enter = SDLK_RETURN, /**< Enter */ Esc = SDLK_ESCAPE, /**< Escape */ From 288a1f265ca716135120695d4cda00237dc303b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 19 Jul 2016 18:09:56 +0200 Subject: [PATCH 081/290] Math: this shouldn't have been here. Fixes test failures on *all* platforms. Ha! --- src/Magnum/Math/Test/Matrix4Test.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Magnum/Math/Test/Matrix4Test.cpp b/src/Magnum/Math/Test/Matrix4Test.cpp index 9bc4b44a2..7d1bf5ae5 100644 --- a/src/Magnum/Math/Test/Matrix4Test.cpp +++ b/src/Magnum/Math/Test/Matrix4Test.cpp @@ -562,7 +562,6 @@ void Matrix4Test::transformProjection() { Matrix4 a = Matrix4::perspectiveProjection({2.0f, 2.0f}, 1.0f, 100.0f); Vector3 v{0.0f, 0.0f, -100.0f}; - CORRADE_COMPARE(a.transformVector(v), Vector3(0.0f, 0.0f, 0.0f)); CORRADE_COMPARE(a.transformPoint(v), Vector3(0.0f, 0.0f, 1.0f)); } From 4c4534135318f5c80f67571d5a484607fce15484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 22 Jul 2016 15:50:33 +0200 Subject: [PATCH 082/290] Test also using Framebuffer::DrawAttachment::None. --- src/Magnum/Test/FramebufferGLTest.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Test/FramebufferGLTest.cpp b/src/Magnum/Test/FramebufferGLTest.cpp index ccbf8be8a..9c9c8a655 100644 --- a/src/Magnum/Test/FramebufferGLTest.cpp +++ b/src/Magnum/Test/FramebufferGLTest.cpp @@ -949,7 +949,8 @@ void FramebufferGLTest::multipleColorOutputs() { .attachTexture(Framebuffer::ColorAttachment(1), color2, 0) .attachRenderbuffer(Framebuffer::BufferAttachment::Depth, depth) .mapForDraw({{0, Framebuffer::ColorAttachment(1)}, - {1, Framebuffer::ColorAttachment(0)}}); + {1, Framebuffer::ColorAttachment(0)}, + {2, Framebuffer::DrawAttachment::None}}); #ifdef MAGNUM_TARGET_GLES2 if(Context::current().isExtensionSupported()) From 24ad2fef279992ce0d47f40b31a111aee8d20e63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 22 Jul 2016 16:15:05 +0200 Subject: [PATCH 083/290] Properly export Framebuffer::DrawAttachment::None. Was causing linker failures on Windows. --- src/Magnum/Framebuffer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Framebuffer.h b/src/Magnum/Framebuffer.h index 7a0580c0b..d6fad0949 100644 --- a/src/Magnum/Framebuffer.h +++ b/src/Magnum/Framebuffer.h @@ -149,7 +149,7 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * @requires_webgl20 Extension @webgl_extension{WEBGL,draw_buffers} in * WebGL 1.0. */ - class DrawAttachment { + class MAGNUM_EXPORT DrawAttachment { public: /** @brief No attachment */ static const DrawAttachment None; From 7685cdf112708deea9a51876039853754443b177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 22 Jul 2016 19:27:14 +0200 Subject: [PATCH 084/290] Fix CMake configuration in case CMAKE_CXX_FLAGS is empty. Thanks @LB-- for pointing that out! --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4d22dc8f2..f4ece4669 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -32,7 +32,7 @@ endif() # On MSVC remove /W3, as we are replacing it with /W4 if(MSVC) - string(REPLACE "/W3" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) + string(REPLACE "/W3" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") endif() # Emscripten needs special flag to use WebGL 2 From 946aab3e87cfd1e7da280cef2de1fb961019f791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 26 Jul 2016 20:47:01 +0200 Subject: [PATCH 085/290] Platform: properly restore previous GL context in WindowlessWglApp. Now it is actually possible to create another context and not break the current GL state on Windows. --- src/Magnum/Platform/WindowlessWglApplication.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Platform/WindowlessWglApplication.cpp b/src/Magnum/Platform/WindowlessWglApplication.cpp index 8e4be0878..4a0da7fc6 100644 --- a/src/Magnum/Platform/WindowlessWglApplication.cpp +++ b/src/Magnum/Platform/WindowlessWglApplication.cpp @@ -64,6 +64,7 @@ WindowlessWglContext::WindowlessWglContext(const Configuration& configuration, C WS_OVERLAPPEDWINDOW, 0, 0, 32, 32, 0, 0, wc.hInstance, 0); /* Get device context */ + const HDC currentDeviceContext = wglGetCurrentDC(); _deviceContext = GetDC(_window); /* Use first provided pixel format */ @@ -177,7 +178,7 @@ WindowlessWglContext::WindowlessWglContext(const Configuration& configuration, C #endif /* Make the previous context active and delete the temporary context */ - if(!wglMakeCurrent(_deviceContext, currentContext)) { + if(!wglMakeCurrent(currentDeviceContext, currentContext)) { Error() << "Platform::WindowlessWglContext: cannot make the previous context current:" << GetLastError(); /* Everything is fucked up, but try to delete the temporary context From 64d94a12b2d457524d072036c797d171f88a888e Mon Sep 17 00:00:00 2001 From: Squareys Date: Thu, 28 Jul 2016 22:09:44 +0200 Subject: [PATCH 086/290] modules: Handle SDL2 library achitecture when building on windows. Signed-off-by: Squareys --- modules/FindSDL2.cmake | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/FindSDL2.cmake b/modules/FindSDL2.cmake index 20fc72037..2194d0750 100644 --- a/modules/FindSDL2.cmake +++ b/modules/FindSDL2.cmake @@ -43,14 +43,19 @@ if(CORRADE_TARGET_EMSCRIPTEN) set(_SDL2_PATH_SUFFIXES SDL) else() + # Precompiled libraries for Windows are in x86/x64 subdirectories + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_SDL_LIBRARY_PATH_SUFFIX lib/x64) + elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(_SDL_LIBRARY_PATH_SUFFIX lib/x86) + endif() + find_library(SDL2_LIBRARY # Compiling SDL2 from scratch on OSX creates dead libSDL2.so symlink # which CMake somehow prefers before the SDL2-2.0.dylib file. Making # the dylib first so it is preferred. NAMES SDL2-2.0 SDL2 - - # Precompiled libraries for Windows are in x86/x64 subdirectories - PATH_SUFFIXES lib/x86 lib/x64) + PATH_SUFFIXES ${_SDL_LIBRARY_PATH_SUFFIX}) set(SDL2_LIBRARY_NEEDED SDL2_LIBRARY) set(_SDL2_PATH_SUFFIXES SDL2) endif() From 286aaf2541f171bb7f90c80c38eec65b1d39b130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 29 Jul 2016 13:47:21 +0200 Subject: [PATCH 087/290] package/ci: this is not true anymore. --- package/ci/travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/package/ci/travis.yml b/package/ci/travis.yml index b5792db8e..21ffa0d94 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -61,8 +61,6 @@ install: - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export PLATFORM_GL_API=GLX; fi - if [ "$TRAVIS_OS_NAME" == "osx" ]; then export PLATFORM_GL_API=CGL; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then gem install xcpretty; fi -# Xcode 7.2 image doesn't have cmake installed using Homebrew, so we can't use `upgrade` -- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then brew install cmake; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then brew install emscripten && export LLVM=/usr/local/opt/emscripten/libexec/llvm/bin && emcc; fi - if [ "$TARGET" == "desktop" ]; then printf "[General]\ndrivers=null" > ~/.alsoftrc; fi From eaeda24399966e2efb93415cb555eedd11635842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 1 Aug 2016 22:30:10 +0200 Subject: [PATCH 088/290] Don't restrict Double usage on OpenGL ES. Restrict only what's not defined by GL on the ES flavor (double attributes and uniforms). I love the smell of burning code. --- src/Magnum/Audio/Audio.cpp | 2 -- src/Magnum/DimensionTraits.h | 4 --- src/Magnum/Magnum.h | 7 ----- src/Magnum/Math/Algorithms/Svd.h | 2 -- src/Magnum/Math/Algorithms/Test/SvdTest.cpp | 8 ------ src/Magnum/Math/Angle.h | 8 ------ src/Magnum/Math/Complex.h | 2 -- src/Magnum/Math/Constants.h | 6 ---- src/Magnum/Math/DualComplex.h | 2 -- src/Magnum/Math/DualQuaternion.h | 2 -- src/Magnum/Math/Quaternion.h | 2 -- src/Magnum/Math/Range.h | 2 -- src/Magnum/Math/RectangularMatrix.h | 8 ------ src/Magnum/Math/Test/AngleTest.cpp | 28 ------------------- src/Magnum/Math/Test/ConstantsTest.cpp | 4 --- src/Magnum/Math/Test/FunctionsTest.cpp | 10 +++---- src/Magnum/Math/Test/TypeTraitsTest.cpp | 13 +-------- src/Magnum/Math/TypeTraits.h | 10 ------- src/Magnum/Math/Vector.h | 4 --- src/Magnum/Math/instantiation.cpp | 31 --------------------- src/Magnum/Types.h | 2 -- 21 files changed, 6 insertions(+), 151 deletions(-) diff --git a/src/Magnum/Audio/Audio.cpp b/src/Magnum/Audio/Audio.cpp index b0d928545..c4c040c21 100644 --- a/src/Magnum/Audio/Audio.cpp +++ b/src/Magnum/Audio/Audio.cpp @@ -42,9 +42,7 @@ static_assert(std::is_same::value, "ALuint is not the same static_assert(std::is_same::value, "ALint is not the same as Int"); static_assert(std::is_same::value, "ALsizei is not the same as Int"); static_assert(std::is_same::value, "ALfloat is not the same as Float"); -#ifndef MAGNUM_TARGET_GLES static_assert(std::is_same::value, "ALdouble is not the same as Double"); -#endif /* Verify boolean values */ static_assert(AL_FALSE == false, "AL_FALSE is not the same as false"); diff --git a/src/Magnum/DimensionTraits.h b/src/Magnum/DimensionTraits.h index 7795fedd9..b0444c833 100644 --- a/src/Magnum/DimensionTraits.h +++ b/src/Magnum/DimensionTraits.h @@ -118,7 +118,6 @@ template<> struct DimensionTraits<2, Float> { typedef Math::Range2D RangeType; typedef Math::Matrix3 MatrixType; }; -#ifndef MAGNUM_TARGET_GLES template<> struct DimensionTraits<2, Double> { DimensionTraits() = delete; @@ -126,7 +125,6 @@ template<> struct DimensionTraits<2, Double> { typedef Math::Range2D RangeType; typedef Math::Matrix3 MatrixType; }; -#endif /* Three dimensions - integral */ template struct DimensionTraits<3, T> { @@ -144,7 +142,6 @@ template<> struct DimensionTraits<3, Float> { typedef Math::Range3D RangeType; typedef Math::Matrix4 MatrixType; }; -#ifndef MAGNUM_TARGET_GLES template<> struct DimensionTraits<3, Double> { DimensionTraits() = delete; @@ -153,7 +150,6 @@ template<> struct DimensionTraits<3, Double> { typedef Math::Matrix4 MatrixType; }; #endif -#endif } diff --git a/src/Magnum/Magnum.h b/src/Magnum/Magnum.h index 51933ecae..5de2ae8a1 100644 --- a/src/Magnum/Magnum.h +++ b/src/Magnum/Magnum.h @@ -50,10 +50,8 @@ namespace Math { #ifdef MAGNUM_BUILD_DEPRECATED namespace Literals { - #ifndef MAGNUM_TARGET_GLES constexpr Rad operator "" _rad(long double); constexpr Deg operator "" _deg(long double); - #endif constexpr Rad operator "" _radf(long double); constexpr Deg operator "" _degf(long double); } @@ -345,11 +343,9 @@ typedef Math::Range3D Range3Di; /*@}*/ -#ifndef MAGNUM_TARGET_GLES /** @{ @name Double-precision types See @ref types for more information. -@requires_gl Only single-precision types are available in OpenGL ES and WebGL. */ /** @brief Double (64bit) */ @@ -446,13 +442,10 @@ typedef Math::Range2D Range2Dd; typedef Math::Range3D Range3Dd; /*@}*/ -#endif #ifdef MAGNUM_BUILD_DEPRECATED -#ifndef MAGNUM_TARGET_GLES using Math::Literals::operator "" _deg; using Math::Literals::operator "" _rad; -#endif using Math::Literals::operator "" _degf; using Math::Literals::operator "" _radf; #endif diff --git a/src/Magnum/Math/Algorithms/Svd.h b/src/Magnum/Math/Algorithms/Svd.h index 514a4f274..65d35b9b5 100644 --- a/src/Magnum/Math/Algorithms/Svd.h +++ b/src/Magnum/Math/Algorithms/Svd.h @@ -51,9 +51,7 @@ template T pythagoras(T a, T b) { template constexpr T smallestDelta(); template<> constexpr Float smallestDelta() { return 1.0e-32f; } -#ifndef MAGNUM_TARGET_GLES template<> constexpr Double smallestDelta() { return 1.0e-64; } -#endif } diff --git a/src/Magnum/Math/Algorithms/Test/SvdTest.cpp b/src/Magnum/Math/Algorithms/Test/SvdTest.cpp index 1651166d9..b9ffeb8e5 100644 --- a/src/Magnum/Math/Algorithms/Test/SvdTest.cpp +++ b/src/Magnum/Math/Algorithms/Test/SvdTest.cpp @@ -36,13 +36,11 @@ struct SvdTest: Corrade::TestSuite::Tester { void testFloat(); }; -#ifndef MAGNUM_TARGET_GLES typedef RectangularMatrix<5, 8, Double> Matrix5x8d; typedef Matrix<8, Double> Matrix8d; typedef Matrix<5, Double> Matrix5d; typedef Vector<8, Double> Vector8d; typedef Vector<5, Double> Vector5d; -#endif typedef RectangularMatrix<5, 8, Float> Matrix5x8f; typedef Matrix<8, Float> Matrix8f; @@ -50,7 +48,6 @@ typedef Matrix<5, Float> Matrix5f; typedef Vector<8, Float> Vector8f; typedef Vector<5, Float> Vector5f; -#ifndef MAGNUM_TARGET_GLES constexpr static Matrix5x8d ad( Vector8d(22.0, 14.0, -1.0, -3.0, 9.0, 9.0, 2.0, 4.0), Vector8d(10.0, 7.0, 13.0, -2.0, 8.0, 1.0, -6.0, 5.0), @@ -59,7 +56,6 @@ constexpr static Matrix5x8d ad( Vector8d( 7.0, 8.0, 3.0, 4.0, 4.0, -1.0, 1.0, 2.0) ); static const Vector5d expectedd(std::sqrt(1248.0), 0.0, 20.0, std::sqrt(384.0), 0.0); -#endif constexpr static Matrix5x8f af( Vector8f(22.0f, 14.0f, -1.0f, -3.0f, 9.0f, 9.0f, 2.0f, 4.0f), @@ -76,7 +72,6 @@ SvdTest::SvdTest() { } void SvdTest::testDouble() { - #ifndef MAGNUM_TARGET_GLES Matrix5x8d u; Vector5d w; Matrix5d v; @@ -93,9 +88,6 @@ void SvdTest::testDouble() { /* Test W */ CORRADE_COMPARE(w, expectedd); - #else - CORRADE_SKIP("Double precision is not supported when targeting OpenGL ES."); - #endif } void SvdTest::testFloat() { diff --git a/src/Magnum/Math/Angle.h b/src/Magnum/Math/Angle.h index e84335d23..91ca09b73 100644 --- a/src/Magnum/Math/Angle.h +++ b/src/Magnum/Math/Angle.h @@ -155,7 +155,6 @@ template class Deg: public Unit { namespace Literals { -#ifndef MAGNUM_TARGET_GLES /** @relatesalso Magnum::Math::Deg @brief Double-precision degree value literal @@ -165,10 +164,8 @@ Double cosine = Math::cos(60.0_deg); // cosine = 0.5 Double cosine = Math::cos(1.047_rad); // cosine = 0.5 @endcode @see @link operator""_degf() @endlink, @link operator""_rad() @endlink -@requires_gl Only single-precision types are available in OpenGL ES and WebGL. */ constexpr Deg operator "" _deg(long double value) { return Deg(Double(value)); } -#endif /** @relatesalso Magnum::Math::Deg @brief Single-precision degree value literal @@ -222,16 +219,13 @@ template class Rad: public Unit { namespace Literals { -#ifndef MAGNUM_TARGET_GLES /** @relatesalso Magnum::Math::Rad @brief Double-precision radian value literal See @link operator""_deg() @endlink for more information. @see @link operator""_radf() @endlink -@requires_gl Only single-precision types are available in OpenGL ES and WebGL. */ constexpr Rad operator "" _rad(long double value) { return Rad(Double(value)); } -#endif /** @relatesalso Magnum::Math::Rad @brief Single-precision radian value literal @@ -260,11 +254,9 @@ template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug& d #ifndef DOXYGEN_GENERATING_OUTPUT extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Unit&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Unit&); -#ifndef MAGNUM_TARGET_GLES extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Unit&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Unit&); #endif -#endif }} diff --git a/src/Magnum/Math/Complex.h b/src/Magnum/Math/Complex.h index 9f2d0a614..880241970 100644 --- a/src/Magnum/Math/Complex.h +++ b/src/Magnum/Math/Complex.h @@ -490,10 +490,8 @@ template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug& d /* Explicit instantiation for commonly used types */ #ifndef DOXYGEN_GENERATING_OUTPUT extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Complex&); -#ifndef MAGNUM_TARGET_GLES extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Complex&); #endif -#endif }} diff --git a/src/Magnum/Math/Constants.h b/src/Magnum/Math/Constants.h index dedc89e3d..cfa2f999d 100644 --- a/src/Magnum/Math/Constants.h +++ b/src/Magnum/Math/Constants.h @@ -30,11 +30,7 @@ */ #include - -#include "Magnum/configure.h" -#ifndef MAGNUM_TARGET_GLES #include -#endif #include "Magnum/Types.h" @@ -83,7 +79,6 @@ template struct Constants { }; #ifndef DOXYGEN_GENERATING_OUTPUT -#ifndef MAGNUM_TARGET_GLES template<> struct Constants { Constants() = delete; @@ -97,7 +92,6 @@ template<> struct Constants { static constexpr Double nan() { return std::numeric_limits::quiet_NaN(); } static constexpr Double inf() { return std::numeric_limits::infinity(); } }; -#endif template<> struct Constants { Constants() = delete; diff --git a/src/Magnum/Math/DualComplex.h b/src/Magnum/Math/DualComplex.h index e3c445839..f32876935 100644 --- a/src/Magnum/Math/DualComplex.h +++ b/src/Magnum/Math/DualComplex.h @@ -367,10 +367,8 @@ template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug& d /* Explicit instantiation for commonly used types */ #ifndef DOXYGEN_GENERATING_OUTPUT extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const DualComplex&); -#ifndef MAGNUM_TARGET_GLES extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const DualComplex&); #endif -#endif }} diff --git a/src/Magnum/Math/DualQuaternion.h b/src/Magnum/Math/DualQuaternion.h index 4500613ab..361754515 100644 --- a/src/Magnum/Math/DualQuaternion.h +++ b/src/Magnum/Math/DualQuaternion.h @@ -448,10 +448,8 @@ template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug& d /* Explicit instantiation for commonly used types */ #ifndef DOXYGEN_GENERATING_OUTPUT extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const DualQuaternion&); -#ifndef MAGNUM_TARGET_GLES extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const DualQuaternion&); #endif -#endif }} diff --git a/src/Magnum/Math/Quaternion.h b/src/Magnum/Math/Quaternion.h index 470f72268..82db72876 100644 --- a/src/Magnum/Math/Quaternion.h +++ b/src/Magnum/Math/Quaternion.h @@ -554,10 +554,8 @@ template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug& d /* Explicit instantiation for commonly used types */ #ifndef DOXYGEN_GENERATING_OUTPUT extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Quaternion&); -#ifndef MAGNUM_TARGET_GLES extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Quaternion&); #endif -#endif namespace Implementation { diff --git a/src/Magnum/Math/Range.h b/src/Magnum/Math/Range.h index 4161668e9..78a8fb195 100644 --- a/src/Magnum/Math/Range.h +++ b/src/Magnum/Math/Range.h @@ -598,11 +598,9 @@ extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; -#ifndef MAGNUM_TARGET_GLES extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; #endif -#endif }} diff --git a/src/Magnum/Math/RectangularMatrix.h b/src/Magnum/Math/RectangularMatrix.h index 544f30cc3..64e1fdab1 100644 --- a/src/Magnum/Math/RectangularMatrix.h +++ b/src/Magnum/Math/RectangularMatrix.h @@ -524,11 +524,9 @@ template Corrade::Utility::Debug& o extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<2, 2, Float>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<3, 3, Float>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 4, Float>&); -#ifndef MAGNUM_TARGET_GLES extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<2, 2, Double>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<3, 3, Double>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 4, Double>&); -#endif /* Rectangular matrices */ extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<2, 3, Float>&); @@ -537,14 +535,12 @@ extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utili extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 2, Float>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<3, 4, Float>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 3, Float>&); -#ifndef MAGNUM_TARGET_GLES extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<2, 3, Double>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<3, 2, Double>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<2, 4, Double>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 2, Double>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<3, 4, Double>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 3, Double>&); -#endif #define MAGNUM_RECTANGULARMATRIX_SUBCLASS_IMPLEMENTATION(cols, rows, ...) \ static __VA_ARGS__& from(T* data) { \ @@ -718,11 +714,9 @@ template struct ConfigurationValue< extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; -#ifndef MAGNUM_TARGET_GLES extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; -#endif /* Rectangular matrices */ extern template struct MAGNUM_EXPORT ConfigurationValue>; @@ -731,7 +725,6 @@ extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; -#ifndef MAGNUM_TARGET_GLES extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; @@ -739,7 +732,6 @@ extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; #endif -#endif }} diff --git a/src/Magnum/Math/Test/AngleTest.cpp b/src/Magnum/Math/Test/AngleTest.cpp index aaef1c5cf..f430e9475 100644 --- a/src/Magnum/Math/Test/AngleTest.cpp +++ b/src/Magnum/Math/Test/AngleTest.cpp @@ -47,10 +47,8 @@ struct AngleTest: Corrade::TestSuite::Tester { typedef Math::Deg Deg; typedef Math::Rad Rad; -#ifndef MAGNUM_TARGET_GLES typedef Math::Deg Degd; typedef Math::Rad Radd; -#endif AngleTest::AngleTest() { addTests({&AngleTest::construct, @@ -70,50 +68,28 @@ void AngleTest::construct() { constexpr Deg m2{ZeroInit}; CORRADE_COMPARE(Float(m1), 0.0f); CORRADE_COMPARE(Float(m2), 0.0f); - #ifndef MAGNUM_TARGET_GLES constexpr Radd a1; constexpr Radd a2{ZeroInit}; CORRADE_COMPARE(Double(a1), 0.0); CORRADE_COMPARE(Double(a2), 0.0); - #else - constexpr Rad a1; - constexpr Rad a2{ZeroInit}; - CORRADE_COMPARE(Float(a1), 0.0f); - CORRADE_COMPARE(Float(a2), 0.0f); - #endif /* Value constructor */ constexpr Deg b(25.0); CORRADE_COMPARE(Float(b), 25.0f); - #ifndef MAGNUM_TARGET_GLES constexpr Radd n(3.14); CORRADE_COMPARE(Double(n), 3.14); - #else - constexpr Rad n(3.14); - CORRADE_COMPARE(Float(n), 3.14f); - #endif /* Copy constructor */ constexpr Deg c(b); CORRADE_COMPARE(c, b); - #ifndef MAGNUM_TARGET_GLES constexpr Radd o(n); CORRADE_COMPARE(o, n); - #else - constexpr Rad o(n); - CORRADE_COMPARE(o, n); - #endif /* Conversion operator */ constexpr Rad p(n); CORRADE_COMPARE(Float(p), 3.14f); - #ifndef MAGNUM_TARGET_GLES constexpr Degd d(b); CORRADE_COMPARE(Double(d), 25.0); - #else - constexpr Deg d(b); - CORRADE_COMPARE(Float(d), 25.0f); - #endif } void AngleTest::constructNoInit() { @@ -128,20 +104,16 @@ void AngleTest::constructNoInit() { void AngleTest::literals() { using namespace Literals; - #ifndef MAGNUM_TARGET_GLES constexpr auto a = 25.0_deg; CORRADE_VERIFY((std::is_same::value)); CORRADE_COMPARE(Double(a), 25.0); - #endif constexpr auto b = 25.0_degf; CORRADE_VERIFY((std::is_same::value)); CORRADE_COMPARE(Float(b), 25.0f); - #ifndef MAGNUM_TARGET_GLES constexpr auto m = 3.14_rad; CORRADE_VERIFY((std::is_same::value)); CORRADE_COMPARE(Double(m), 3.14); - #endif constexpr auto n = 3.14_radf; CORRADE_VERIFY((std::is_same::value)); CORRADE_COMPARE(Float(n), 3.14f); diff --git a/src/Magnum/Math/Test/ConstantsTest.cpp b/src/Magnum/Math/Test/ConstantsTest.cpp index 578efa578..9606298c5 100644 --- a/src/Magnum/Math/Test/ConstantsTest.cpp +++ b/src/Magnum/Math/Test/ConstantsTest.cpp @@ -49,16 +49,12 @@ ConstantsTest::ConstantsTest() { void ConstantsTest::constants() { _constants(); - #ifndef MAGNUM_TARGET_GLES _constants(); - #endif } void ConstantsTest::specials() { _specials(); - #ifndef MAGNUM_TARGET_GLES _specials(); - #endif } template void ConstantsTest::_constants() { diff --git a/src/Magnum/Math/Test/FunctionsTest.cpp b/src/Magnum/Math/Test/FunctionsTest.cpp index 836aa9703..12ed46427 100644 --- a/src/Magnum/Math/Test/FunctionsTest.cpp +++ b/src/Magnum/Math/Test/FunctionsTest.cpp @@ -277,10 +277,10 @@ void FunctionsTest::normalizeUnsigned() { CORRADE_COMPARE((Math::normalize(0)), 0.0f); CORRADE_COMPARE((Math::normalize(255)), 1.0f); - #ifndef MAGNUM_TARGET_GLES CORRADE_COMPARE((Math::normalize(0)), 0.0); CORRADE_COMPARE((Math::normalize(std::numeric_limits::max())), 1.0); + #ifndef MAGNUM_TARGET_WEBGL CORRADE_COMPARE((Math::normalize(0)), 0.0); CORRADE_COMPARE((Math::normalize(std::numeric_limits::max())), 1.0); #endif @@ -303,11 +303,11 @@ void FunctionsTest::normalizeSigned() { CORRADE_COMPARE((Math::normalize(0)), 0.0f); CORRADE_COMPARE((Math::normalize(std::numeric_limits::max())), 1.0f); - #ifndef MAGNUM_TARGET_GLES CORRADE_COMPARE((Math::normalize(std::numeric_limits::min())), -1.0); CORRADE_COMPARE((Math::normalize(0)), 0.0); CORRADE_COMPARE((Math::normalize(std::numeric_limits::max())), 1.0); + #ifndef MAGNUM_TARGET_WEBGL CORRADE_COMPARE((Math::normalize(std::numeric_limits::min())), -1.0); CORRADE_COMPARE((Math::normalize(0)), 0.0); CORRADE_COMPARE((Math::normalize(std::numeric_limits::max())), 1.0); @@ -326,10 +326,10 @@ void FunctionsTest::denormalizeUnsigned() { CORRADE_COMPARE(Math::denormalize(0.0f), 0); CORRADE_COMPARE(Math::denormalize(1.0f), std::numeric_limits::max()); - #ifndef MAGNUM_TARGET_GLES CORRADE_COMPARE(Math::denormalize(0.0), 0); CORRADE_COMPARE(Math::denormalize(1.0), std::numeric_limits::max()); + #ifndef MAGNUM_TARGET_WEBGL CORRADE_COMPARE(Math::denormalize(0.0l), 0); { #ifdef CORRADE_MSVC2015_COMPATIBILITY @@ -387,10 +387,10 @@ void FunctionsTest::renormalizeUnsinged() { CORRADE_COMPARE(Math::normalize(Math::denormalize(0.0f)), 0.0f); CORRADE_COMPARE(Math::normalize(Math::denormalize(1.0f)), 1.0f); - #ifndef MAGNUM_TARGET_GLES CORRADE_COMPARE(Math::normalize(Math::denormalize(0.0)), 0.0); CORRADE_COMPARE(Math::normalize(Math::denormalize(1.0)), 1.0); + #ifndef MAGNUM_TARGET_WEBGL CORRADE_COMPARE(Math::normalize(Math::denormalize(0.0l)), 0.0l); { #ifdef CORRADE_MSVC2015_COMPATIBILITY @@ -410,11 +410,11 @@ void FunctionsTest::renormalizeSinged() { CORRADE_COMPARE(Math::normalize(Math::denormalize(0.0f)), 0.0f); CORRADE_COMPARE(Math::normalize(Math::denormalize(1.0f)), 1.0f); - #ifndef MAGNUM_TARGET_GLES CORRADE_COMPARE(Math::normalize(Math::denormalize(-1.0)), -1.0); CORRADE_COMPARE(Math::normalize(Math::denormalize(0.0)), 0.0); CORRADE_COMPARE(Math::normalize(Math::denormalize(1.0)), 1.0); + #ifndef MAGNUM_TARGET_WEBGL CORRADE_COMPARE(Math::normalize(Math::denormalize(-1.0l)), -1.0l); CORRADE_COMPARE(Math::normalize(Math::denormalize(0.0l)), 0.0l); { diff --git a/src/Magnum/Math/Test/TypeTraitsTest.cpp b/src/Magnum/Math/Test/TypeTraitsTest.cpp index 21b8fa33d..82d22fcbd 100644 --- a/src/Magnum/Math/Test/TypeTraitsTest.cpp +++ b/src/Magnum/Math/Test/TypeTraitsTest.cpp @@ -53,26 +53,15 @@ TypeTraitsTest::TypeTraitsTest() { &TypeTraitsTest::equalsIntegral, #endif &TypeTraitsTest::equalsFloatingPoint0, - #ifndef MAGNUM_TARGET_GLES &TypeTraitsTest::equalsFloatingPoint0, - #endif &TypeTraitsTest::equalsFloatingPoint1, - #ifndef MAGNUM_TARGET_GLES &TypeTraitsTest::equalsFloatingPoint1, - #endif &TypeTraitsTest::equalsFloatingPointLarge, - #ifndef MAGNUM_TARGET_GLES &TypeTraitsTest::equalsFloatingPointLarge, - #endif &TypeTraitsTest::equalsFloatingPointInfinity, - #ifndef MAGNUM_TARGET_GLES &TypeTraitsTest::equalsFloatingPointInfinity, - #endif &TypeTraitsTest::equalsFloatingPointNaN, - #ifndef MAGNUM_TARGET_GLES - &TypeTraitsTest::equalsFloatingPointNaN - #endif - }); + &TypeTraitsTest::equalsFloatingPointNaN}); } template void TypeTraitsTest::equalsIntegral() { diff --git a/src/Magnum/Math/TypeTraits.h b/src/Magnum/Math/TypeTraits.h index 7a081dc94..b15869ea6 100644 --- a/src/Magnum/Math/TypeTraits.h +++ b/src/Magnum/Math/TypeTraits.h @@ -127,25 +127,17 @@ template<> struct TypeTraits: Implementation::TypeTraitsIntegral { typedef Float FloatingPointType; }; template<> struct TypeTraits: Implementation::TypeTraitsIntegral { - #ifndef MAGNUM_TARGET_GLES typedef Double FloatingPointType; - #endif }; template<> struct TypeTraits: Implementation::TypeTraitsIntegral { - #ifndef MAGNUM_TARGET_GLES typedef Double FloatingPointType; - #endif }; #ifndef MAGNUM_TARGET_WEBGL template<> struct TypeTraits: Implementation::TypeTraitsIntegral { - #ifndef MAGNUM_TARGET_GLES typedef long double FloatingPointType; - #endif }; template<> struct TypeTraits: Implementation::TypeTraitsIntegral { - #ifndef MAGNUM_TARGET_GLES typedef long double FloatingPointType; - #endif }; #endif @@ -183,13 +175,11 @@ template<> struct TypeTraits: Implementation::TypeTraitsFloatingPoint struct TypeTraits: Implementation::TypeTraitsFloatingPoint { typedef Double FloatingPointType; constexpr static Double epsilon() { return DOUBLE_EQUALITY_PRECISION; } }; -#endif template<> struct TypeTraits: Implementation::TypeTraitsFloatingPoint { typedef long double FloatingPointType; diff --git a/src/Magnum/Math/Vector.h b/src/Magnum/Math/Vector.h index 0da186eb4..c78619a1c 100644 --- a/src/Magnum/Math/Vector.h +++ b/src/Magnum/Math/Vector.h @@ -1085,12 +1085,10 @@ extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utili extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<2, UnsignedInt>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<3, UnsignedInt>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<4, UnsignedInt>&); -#ifndef MAGNUM_TARGET_GLES extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<2, Double>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<3, Double>&); extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<4, Double>&); #endif -#endif #ifndef DOXYGEN_GENERATING_OUTPUT #define MAGNUM_VECTOR_SUBCLASS_IMPLEMENTATION(size, Type) \ @@ -1404,12 +1402,10 @@ extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; -#ifndef MAGNUM_TARGET_GLES extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; extern template struct MAGNUM_EXPORT ConfigurationValue>; #endif -#endif }} diff --git a/src/Magnum/Math/instantiation.cpp b/src/Magnum/Math/instantiation.cpp index 005c0fe58..22a02e425 100644 --- a/src/Magnum/Math/instantiation.cpp +++ b/src/Magnum/Math/instantiation.cpp @@ -33,11 +33,9 @@ namespace Corrade { namespace Utility { template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; -#ifndef MAGNUM_TARGET_GLES template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; -#endif template struct ConfigurationValue>; template struct ConfigurationValue>; @@ -45,14 +43,12 @@ template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; -#ifndef MAGNUM_TARGET_GLES template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; -#endif template struct ConfigurationValue>; template struct ConfigurationValue>; @@ -63,21 +59,17 @@ template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; -#ifndef MAGNUM_TARGET_GLES template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; -#endif template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; -#ifndef MAGNUM_TARGET_GLES template struct ConfigurationValue>; template struct ConfigurationValue>; #endif -#endif }} @@ -85,24 +77,16 @@ namespace Magnum { namespace Math { #ifndef DOXYGEN_GENERATING_OUTPUT template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Complex&); -#ifndef MAGNUM_TARGET_GLES template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Complex&); -#endif template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const DualComplex&); -#ifndef MAGNUM_TARGET_GLES template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const DualComplex&); -#endif template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const DualQuaternion&); -#ifndef MAGNUM_TARGET_GLES template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const DualQuaternion&); -#endif template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Quaternion&); -#ifndef MAGNUM_TARGET_GLES template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Quaternion&); -#endif /* Check proper size of GL types */ static_assert(sizeof(Vector<2, Float>) == 8, "Improper size of 2-element Float vector"); @@ -114,20 +98,16 @@ static_assert(sizeof(Vector<4, Int>) == 16, "Improper size of 4-element Int vect static_assert(sizeof(Vector<2, UnsignedInt>) == 8, "Improper size of 2-element UnsignedInt vector"); static_assert(sizeof(Vector<3, UnsignedInt>) == 12, "Improper size of 3-element UnsignedInt vector"); static_assert(sizeof(Vector<4, UnsignedInt>) == 16, "Improper size of 4-element UnsignedInt vector"); -#ifndef MAGNUM_TARGET_GLES static_assert(sizeof(Vector<2, Double>) == 16, "Improper size of 2-element Double vector"); static_assert(sizeof(Vector<3, Double>) == 24, "Improper size of 3-element Double vector"); static_assert(sizeof(Vector<4, Double>) == 32, "Improper size of 4-element Double vector"); -#endif static_assert(sizeof(RectangularMatrix<2, 2, Float>) == 16, "Improper size of 2x2 Float matrix"); static_assert(sizeof(RectangularMatrix<3, 3, Float>) == 36, "Improper size of 3x3 Float matrix"); static_assert(sizeof(RectangularMatrix<4, 4, Float>) == 64, "Improper size of 4x4 Float matrix"); -#ifndef MAGNUM_TARGET_GLES static_assert(sizeof(RectangularMatrix<2, 2, Double>) == 32, "Improper size of 2x2 Double matrix"); static_assert(sizeof(RectangularMatrix<3, 3, Double>) == 72, "Improper size of 3x3 Double matrix"); static_assert(sizeof(RectangularMatrix<4, 4, Double>) == 128, "Improper size of 4x4 Double matrix"); -#endif static_assert(sizeof(RectangularMatrix<2, 3, Float>) == 24, "Improper size of 2x3 Float matrix"); static_assert(sizeof(RectangularMatrix<3, 2, Float>) == 24, "Improper size of 3x2 Float matrix"); @@ -135,23 +115,19 @@ static_assert(sizeof(RectangularMatrix<2, 4, Float>) == 32, "Improper size of 2x static_assert(sizeof(RectangularMatrix<4, 2, Float>) == 32, "Improper size of 4x2 Float matrix"); static_assert(sizeof(RectangularMatrix<3, 4, Float>) == 48, "Improper size of 3x4 Float matrix"); static_assert(sizeof(RectangularMatrix<4, 3, Float>) == 48, "Improper size of 4x3 Float matrix"); -#ifndef MAGNUM_TARGET_GLES static_assert(sizeof(RectangularMatrix<2, 3, Double>) == 48, "Improper size of 2x3 Double matrix"); static_assert(sizeof(RectangularMatrix<3, 2, Double>) == 48, "Improper size of 3x2 Double matrix"); static_assert(sizeof(RectangularMatrix<2, 4, Double>) == 64, "Improper size of 2x4 Double matrix"); static_assert(sizeof(RectangularMatrix<4, 2, Double>) == 64, "Improper size of 4x2 Double matrix"); static_assert(sizeof(RectangularMatrix<3, 4, Double>) == 96, "Improper size of 3x4 Double matrix"); static_assert(sizeof(RectangularMatrix<4, 3, Double>) == 96, "Improper size of 4x3 Double matrix"); -#endif template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<2, 2, Float>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<3, 3, Float>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 4, Float>&); -#ifndef MAGNUM_TARGET_GLES template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<2, 2, Double>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<3, 3, Double>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 4, Double>&); -#endif template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<2, 3, Float>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<3, 2, Float>&); @@ -159,21 +135,17 @@ template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Rec template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 2, Float>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<3, 4, Float>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 3, Float>&); -#ifndef MAGNUM_TARGET_GLES template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<2, 3, Double>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<3, 2, Double>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<2, 4, Double>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 2, Double>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<3, 4, Double>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const RectangularMatrix<4, 3, Double>&); -#endif template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Unit&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Unit&); -#ifndef MAGNUM_TARGET_GLES template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Unit&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Unit&); -#endif template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<2, Float>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<3, Float>&); @@ -184,12 +156,9 @@ template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vec template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<2, UnsignedInt>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<3, UnsignedInt>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<4, UnsignedInt>&); -#ifndef MAGNUM_TARGET_GLES template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<2, Double>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<3, Double>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<4, Double>&); #endif -#endif }} - diff --git a/src/Magnum/Types.h b/src/Magnum/Types.h index 0b73e006e..228137ccd 100644 --- a/src/Magnum/Types.h +++ b/src/Magnum/Types.h @@ -48,9 +48,7 @@ typedef std::int64_t Long; #endif typedef float Float; -#ifndef MAGNUM_TARGET_GLES typedef double Double; -#endif } From cb064f1fba8d7d578ffff7266578efadcc562733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 1 Aug 2016 22:55:14 +0200 Subject: [PATCH 089/290] package/ci: minor consistency updates. --- package/ci/travis-emscripten.sh | 3 ++- package/ci/travis-ios-simulator.sh | 4 ++-- package/ci/travis.yml | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package/ci/travis-emscripten.sh b/package/ci/travis-emscripten.sh index bb8d26002..399a03081 100755 --- a/package/ci/travis-emscripten.sh +++ b/package/ci/travis-emscripten.sh @@ -3,11 +3,12 @@ set -ev git submodule update --init +# Corrade git clone --depth 1 git://github.com/mosra/corrade.git cd corrade # Build native corrade-rc -mkdir build && cd build || exit /b +mkdir build && cd build cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$HOME/deps-native \ diff --git a/package/ci/travis-ios-simulator.sh b/package/ci/travis-ios-simulator.sh index 82efd42b4..fbecd9f01 100755 --- a/package/ci/travis-ios-simulator.sh +++ b/package/ci/travis-ios-simulator.sh @@ -10,12 +10,12 @@ cd corrade # Build native corrade-rc mkdir build && cd build cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$HOME/deps-native \ -DCMAKE_INSTALL_RPATH=$HOME/deps-native/lib \ -DWITH_INTERCONNECT=OFF \ -DWITH_PLUGINMANAGER=OFF \ - -DWITH_TESTSUITE=OFF \ - -DCMAKE_BUILD_TYPE=Release + -DWITH_TESTSUITE=OFF make -j install cd .. diff --git a/package/ci/travis.yml b/package/ci/travis.yml index 21ffa0d94..c4f9f1ef9 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -59,7 +59,7 @@ install: - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export CXX=g++-4.7; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export PLATFORM_GL_API=GLX; fi -- if [ "$TRAVIS_OS_NAME" == "osx" ]; then export PLATFORM_GL_API=CGL; fi +- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then export PLATFORM_GL_API=CGL; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then gem install xcpretty; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then brew install emscripten && export LLVM=/usr/local/opt/emscripten/libexec/llvm/bin && emcc; fi - if [ "$TARGET" == "desktop" ]; then printf "[General]\ndrivers=null" > ~/.alsoftrc; fi From edf77e60620d58d0a3d32a05b93ec80fdfb0a63d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 1 Aug 2016 23:32:20 +0200 Subject: [PATCH 090/290] package/ci: removed old debug output. --- package/ci/travis-ios-simulator.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/package/ci/travis-ios-simulator.sh b/package/ci/travis-ios-simulator.sh index fbecd9f01..8d66596f7 100755 --- a/package/ci/travis-ios-simulator.sh +++ b/package/ci/travis-ios-simulator.sh @@ -35,8 +35,6 @@ cmake .. \ cmake --build . --config Release --target install | xcpretty cd ../.. -ls -lR $TRAVIS_BUILD_DIR/sdl2 - # Crosscompile Magnum mkdir build-ios && cd build-ios cmake .. \ From 1cfd2dc7b5c361e10d36c4a5f6569646fc0e00b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 2 Aug 2016 20:57:01 +0200 Subject: [PATCH 091/290] Fix image data size computation with pixel storage skip applied. It now tries to find smallest line/rectangle/cube that covers the area. Previously it was a bit more in some cases. --- src/Magnum/BufferImage.h | 4 +- src/Magnum/Image.h | 4 +- src/Magnum/ImageView.h | 2 +- src/Magnum/PixelStorage.cpp | 10 +- src/Magnum/PixelStorage.h | 63 ++++++------ src/Magnum/Test/PixelStorageTest.cpp | 99 ++++++++++++------- src/Magnum/Trade/ImageData.cpp | 2 +- src/Magnum/Trade/ImageData.h | 2 +- .../TgaImageConverter/TgaImageConverter.cpp | 2 +- 9 files changed, 110 insertions(+), 78 deletions(-) diff --git a/src/Magnum/BufferImage.h b/src/Magnum/BufferImage.h index 7e351e6eb..8d63773be 100644 --- a/src/Magnum/BufferImage.h +++ b/src/Magnum/BufferImage.h @@ -145,7 +145,7 @@ template class BufferImage { * * See @ref PixelStorage::dataProperties() for more information. */ - std::tuple, std::size_t> dataProperties() const { + std::tuple, VectorTypeFor, std::size_t> dataProperties() const { return Implementation::imageDataProperties(*this); } @@ -333,7 +333,7 @@ template class CompressedBufferImage { * @requires_gl Compressed pixel storage is hardcoded in OpenGL ES and * WebGL. */ - std::tuple, std::size_t> dataProperties() const { + std::tuple, VectorTypeFor, std::size_t> dataProperties() const { return Implementation::compressedImageDataProperties(*this); } #endif diff --git a/src/Magnum/Image.h b/src/Magnum/Image.h index 50762aadf..c62379a44 100644 --- a/src/Magnum/Image.h +++ b/src/Magnum/Image.h @@ -135,7 +135,7 @@ template class Image { * * See @ref PixelStorage::dataProperties() for more information. */ - std::tuple, std::size_t> dataProperties() const { + std::tuple, VectorTypeFor, std::size_t> dataProperties() const { return Implementation::imageDataProperties(*this); } @@ -339,7 +339,7 @@ template class CompressedImage { * @requires_gl Compressed pixel storage is hardcoded in OpenGL ES and * WebGL. */ - std::tuple, std::size_t> dataProperties() const { + std::tuple, VectorTypeFor, std::size_t> dataProperties() const { return Implementation::compressedImageDataProperties(*this); } #endif diff --git a/src/Magnum/ImageView.h b/src/Magnum/ImageView.h index cdc5067f4..3775bbcee 100644 --- a/src/Magnum/ImageView.h +++ b/src/Magnum/ImageView.h @@ -134,7 +134,7 @@ template class ImageView { * * See @ref PixelStorage::dataProperties() for more information. */ - std::tuple, std::size_t> dataProperties() const { + std::tuple, VectorTypeFor, std::size_t> dataProperties() const { return Implementation::imageDataProperties(*this); } diff --git a/src/Magnum/PixelStorage.cpp b/src/Magnum/PixelStorage.cpp index 704875b9b..dd41e0752 100644 --- a/src/Magnum/PixelStorage.cpp +++ b/src/Magnum/PixelStorage.cpp @@ -156,7 +156,7 @@ std::size_t PixelStorage::pixelSize(PixelFormat format, PixelType type) { CORRADE_ASSERT_UNREACHABLE(); } -std::tuple, std::size_t> PixelStorage::dataProperties(const PixelFormat format, const PixelType type, const Vector3i& size) const { +std::tuple, Math::Vector3, std::size_t> PixelStorage::dataProperties(const PixelFormat format, const PixelType type, const Vector3i& size) const { const std::size_t pixelSize = PixelStorage::pixelSize(format, type); const Math::Vector3 dataSize{ std::size_t(((( @@ -170,13 +170,13 @@ std::tuple, std::size_t> PixelStorage::d std::size_t(size.y()), #endif std::size_t(size.z())}; - const std::size_t offset = (Math::Vector3{pixelSize, dataSize.x(), dataSize.xy().product()}*Math::Vector3{_skip}).sum(); - return std::make_tuple(offset, size.product() ? dataSize : Math::Vector3{}, pixelSize); + return std::make_tuple(Math::Vector3{pixelSize, dataSize.x(), dataSize.xy().product()}*Math::Vector3{_skip}, + size.product() ? dataSize : Math::Vector3{}, pixelSize); } #ifndef MAGNUM_TARGET_GLES -std::tuple, std::size_t> CompressedPixelStorage::dataProperties(const Vector3i& size) const { +std::tuple, Math::Vector3, std::size_t> CompressedPixelStorage::dataProperties(const Vector3i& size) const { CORRADE_ASSERT(_blockDataSize && _blockSize.product(), "CompressedPixelStorage::dataProperties(): expected non-zero storage parameters", {}); const Vector3i blockCount = (size + _blockSize - Vector3i{1})/_blockSize; @@ -186,7 +186,7 @@ std::tuple, std::size_t> CompressedPixel std::size_t(blockCount.z())}; const Vector3i skipBlockCount = (_skip + _blockSize - Vector3i{1})/_blockSize; - const std::size_t offset = (Math::Vector3{1, dataSize.x(), dataSize.xy().product()}*Math::Vector3{skipBlockCount}).sum()*_blockDataSize; + const Math::Vector3 offset = (Math::Vector3{1, dataSize.x(), dataSize.xy().product()}*Math::Vector3{skipBlockCount})*_blockDataSize; return std::make_tuple(offset, size.product() ? dataSize : Math::Vector3{}, _blockDataSize); } diff --git a/src/Magnum/PixelStorage.h b/src/Magnum/PixelStorage.h index bd8b0420c..d0283d7e2 100644 --- a/src/Magnum/PixelStorage.h +++ b/src/Magnum/PixelStorage.h @@ -203,14 +203,14 @@ class MAGNUM_EXPORT PixelStorage { /** * @brief Data properties for given parameters * - * Returns byte offset, (row length, row count, layer count) and pixel - * size for image of given @p size with current pixel storage - * parameters, @p format and @p type. The offset reflects the @ref skip() - * parameter. Adding byte offset and product of the vector gives - * minimal byte count to store given data. + * Returns byte offset in each direction, (row length, row count, layer + * count) and pixel size for image of given @p size with current pixel + * storage parameters, @p format and @p type. The offset reflects the + * @ref skip() parameter. Adding byte offset and product of the vector + * gives minimal byte count to store given data. * @see @ref pixelSize() */ - std::tuple, std::size_t> dataProperties(PixelFormat format, PixelType type, const Vector3i& size) const; + std::tuple, Math::Vector3, std::size_t> dataProperties(PixelFormat format, PixelType type, const Vector3i& size) const; #ifndef DOXYGEN_GENERATING_OUTPUT protected: @@ -306,15 +306,16 @@ class MAGNUM_EXPORT CompressedPixelStorage: public PixelStorage { /** * @brief Data properties for given parameters * - * Returns byte offset, count of blocks in each dimension and block - * data size for image of given @p size with current pixel storage - * parameters. Adding byte offset and product of the vector multiplied - * with block data size gives minimal byte count to store given data. + * Returns byte offset in each dimension, count of blocks in each + * dimension and block data size for image of given @p size with + * current pixel storage parameters. Adding byte offset and product of + * the vector multiplied with block data size gives minimal byte count + * to store given data. * * Expects @ref compressedBlockSize() and @ref compressedBlockDataSize() * to be non-zero. */ - std::tuple, std::size_t> dataProperties(const Vector3i& size) const; + std::tuple, Math::Vector3, std::size_t> dataProperties(const Vector3i& size) const; /* Overloads to remove WTF-factor from method chaining order */ #ifndef DOXYGEN_GENERATING_OUTPUT @@ -369,37 +370,38 @@ constexpr PixelStorage::PixelStorage() noexcept: namespace Implementation { /* Used in *Image::dataProperties() */ - template std::tuple, std::size_t> imageDataProperties(const T& image) { - std::size_t offset; - Math::Vector3 dataSize; + template std::tuple, Math::Vector, std::size_t> imageDataProperties(const T& image) { + Math::Vector3 offset, dataSize; std::size_t pixelSize; std::tie(offset, dataSize, pixelSize) = image.storage().dataProperties(image.format(), image.type(), Vector3i::pad(image.size(), 1)); - return std::make_tuple(offset, Math::Vector::pad(dataSize), pixelSize); + return std::make_tuple(Math::Vector::pad(offset), Math::Vector::pad(dataSize), pixelSize); } #ifndef MAGNUM_TARGET_GLES2 /* Used in Compressed*Image::dataProperties() */ - template std::tuple, std::size_t> compressedImageDataProperties(const T& image) { - std::size_t offset; - Math::Vector3 blockCount; + template std::tuple, Math::Vector, std::size_t> compressedImageDataProperties(const T& image) { + Math::Vector3 offset, blockCount; std::size_t blockSize; std::tie(offset, blockCount, blockSize) = image.storage().dataProperties(Vector3i::pad(image.size(), 1)); - return std::make_tuple(offset, Math::Vector::pad(blockCount), blockSize); + return std::make_tuple(Math::Vector::pad(offset), Math::Vector::pad(blockCount), blockSize); } #endif /* Used in image query functions */ template std::size_t imageDataSizeFor(const T& image, const Math::Vector& size) { - const auto paddedSize = Vector3i::pad(size, 1); - - std::size_t offset; - Math::Vector3 dataSize; + Math::Vector3 offset, dataSize; std::size_t pixelSize; - std::tie(offset, dataSize, pixelSize) = image.storage().dataProperties(image.format(), image.type(), paddedSize); - - /* I would subtract also (dataSize.x() - pixelSize*paddedSize.x()) but NVidia - then complains that the buffer is too small */ - return offset + dataSize.product() - (dataSize.y() - paddedSize.y())*dataSize.x(); + std::tie(offset, dataSize, pixelSize) = image.storage().dataProperties(image.format(), image.type(), Vector3i::pad(size, 1)); + + /* Smallest line/rectangle/cube that covers the area */ + std::size_t dataOffset = 0; + if(offset.z()) + dataOffset += offset.z(); + else if(offset.y()) + dataOffset += offset.y(); + else if(offset.x()) + dataOffset += offset.x(); + return dataOffset + dataSize.product(); } /* Used in data size assertions */ @@ -419,14 +421,13 @@ namespace Implementation { if(!image.storage().compressedBlockSize().product() || !image.storage().compressedBlockDataSize()) return {0, dataSize}; - std::size_t offset; - Math::Vector3 blockCount; + Math::Vector3 offset, blockCount; std::size_t blockDataSize; std::tie(offset, blockCount, blockDataSize) = image.storage().dataProperties(Vector3i::pad(size, 1)); const auto realBlockCount = Math::Vector3{(Vector3i::pad(size, 1) + image.storage().compressedBlockSize() - Vector3i{1})/image.storage().compressedBlockSize()}; - return {offset, (blockCount.product() - (blockCount.x() - realBlockCount.x()) - (blockCount.y() - realBlockCount.y())*blockCount.x())*blockDataSize}; + return {offset.sum(), (blockCount.product() - (blockCount.x() - realBlockCount.x()) - (blockCount.y() - realBlockCount.y())*blockCount.x())*blockDataSize}; } /* Used in image query functions */ diff --git a/src/Magnum/Test/PixelStorageTest.cpp b/src/Magnum/Test/PixelStorageTest.cpp index af298516e..ba6e1c006 100644 --- a/src/Magnum/Test/PixelStorageTest.cpp +++ b/src/Magnum/Test/PixelStorageTest.cpp @@ -45,7 +45,9 @@ struct PixelStorageTest: TestSuite::Tester { void dataPropertiesImageHeight(); #endif - void dataSize(); + void dataSize1D(); + void dataSize2D(); + void dataSize3D(); #ifndef MAGNUM_TARGET_GLES void dataPropertiesCompressed(); @@ -70,7 +72,9 @@ PixelStorageTest::PixelStorageTest() { &PixelStorageTest::dataPropertiesImageHeight, #endif - &PixelStorageTest::dataSize, + &PixelStorageTest::dataSize1D, + &PixelStorageTest::dataSize2D, + &PixelStorageTest::dataSize3D, #ifndef MAGNUM_TARGET_GLES &PixelStorageTest::dataPropertiesCompressed, @@ -96,16 +100,16 @@ void PixelStorageTest::dataProperties() { storage.setAlignment(1); CORRADE_COMPARE(storage.dataProperties(PixelFormat::RGBA, PixelType::UnsignedByte, Vector3i{0}), - (std::tuple{0, {0, 0, 0}, 4})); + (std::tuple{{}, {0, 0, 0}, 4})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::RGBA, PixelType::UnsignedByte, Vector3i{1}), - (std::tuple{0, {4, 1, 1}, 4})); + (std::tuple{{}, {4, 1, 1}, 4})); #if !defined(MAGNUM_TARGET_WEBGL) && !defined(MAGNUM_TARGET_GLES2) CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {8, 2, 1}), - (std::tuple{0, {8, 2, 1}, 1})); + (std::tuple{{}, {8, 2, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 1}), - (std::tuple{0, {2, 4, 1}, 1})); + (std::tuple{{}, {2, 4, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 6}), - (std::tuple{0, {2, 4, 6}, 1})); + (std::tuple{{}, {2, 4, 6}, 1})); #endif } @@ -115,16 +119,16 @@ void PixelStorageTest::dataPropertiesAlignment() { .setSkip({3, 2, 1}); CORRADE_COMPARE(storage.dataProperties(PixelFormat::RGBA, PixelType::UnsignedByte, Vector3i{0}), - (std::tuple{3*4, {0, 0, 0}, 4})); + (std::tuple{{3*4, 0, 0}, {0, 0, 0}, 4})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::RGBA, PixelType::UnsignedByte, Vector3i{1}), - (std::tuple{8 + 16 + 3*4, {8, 1, 1}, 4})); + (std::tuple{{12, 16, 8}, {8, 1, 1}, 4})); #if !defined(MAGNUM_TARGET_WEBGL) && !defined(MAGNUM_TARGET_GLES2) CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {8, 2, 1}), - (std::tuple{16 + 16 + 3, {8, 2, 1}, 1})); + (std::tuple{{3, 16, 16}, {8, 2, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 1}), - (std::tuple{32 + 16 + 3, {8, 4, 1}, 1})); + (std::tuple{{3, 16, 32}, {8, 4, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 6}), - (std::tuple{32 + 16 + 3, {8, 4, 6}, 1})); + (std::tuple{{3, 16, 32}, {8, 4, 6}, 1})); #endif } @@ -136,15 +140,15 @@ void PixelStorageTest::dataPropertiesRowLength() { .setSkip({3, 7, 0}); CORRADE_COMPARE(storage.dataProperties(PixelFormat::RGBA, PixelType::UnsignedByte, Vector3i{0}), - (std::tuple{3*4 + 7*15*4, {0, 0, 0}, 4})); + (std::tuple{{3*4, 7*15*4, 0}, {0, 0, 0}, 4})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::RGBA, PixelType::UnsignedByte, Vector3i{1}), - (std::tuple{3*4 + 7*15*4, {60, 1, 1}, 4})); + (std::tuple{{3*4, 7*15*4, 0}, {60, 1, 1}, 4})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {4, 2, 1}), - (std::tuple{3 + 7*16, {16, 2, 1}, 1})); + (std::tuple{{3, 7*16, 0}, {16, 2, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 1}), - (std::tuple{3 + 7*16, {16, 4, 1}, 1})); + (std::tuple{{3, 7*16, 0}, {16, 4, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 6}), - (std::tuple{3 + 7*16, {16, 4, 6}, 1})); + (std::tuple{{3, 7*16, 0}, {16, 4, 6}, 1})); } #endif @@ -156,39 +160,66 @@ void PixelStorageTest::dataPropertiesImageHeight() { .setSkip({3, 7, 2}); CORRADE_COMPARE(storage.dataProperties(PixelFormat::RGBA, PixelType::UnsignedByte, Vector3i{0}), - (std::tuple{3*4, {0, 0, 0}, 4})); + (std::tuple{{3*4, 0, 0}, {0, 0, 0}, 4})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::RGBA, PixelType::UnsignedByte, Vector3i{1}), - (std::tuple{3*4 + 7*1*4 + 2*128*1*4, {4, 128, 1}, 4})); + (std::tuple{{3*4, 7*1*4, 2*128*1*4}, {4, 128, 1}, 4})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {4, 2, 1}), - (std::tuple{3 + 7*1*4 + 2*128*4, {4, 128, 1}, 1})); + (std::tuple{{3, 7*1*4, 2*128*4}, {4, 128, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 1}), - (std::tuple{3 + 7*1*2 + 2*128*2, {2, 128, 1}, 1})); + (std::tuple{{3, 7*1*2, 2*128*2}, {2, 128, 1}, 1})); CORRADE_COMPARE(storage.dataProperties(PixelFormat::Red, PixelType::UnsignedByte, {2, 4, 6}), - (std::tuple{3 + 7*1*2 + 2*128*2, {2, 128, 6}, 1})); + (std::tuple{{3, 7*1*2, 2*128*2}, {2, 128, 6}, 1})); } #endif -void PixelStorageTest::dataSize() { +void PixelStorageTest::dataSize1D() { + const Image1D image{PixelStorage{}.setAlignment(2) + .setSkip({2, 0, 0}), + PixelFormat::RGB, PixelType::UnsignedByte}; + + CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Math::Vector<1, Int>{3}), + 16); +} + +void PixelStorageTest::dataSize2D() { /* The same parameters as in PixelStorageGLTest 3D case */ const Image2D image{PixelStorage{}.setAlignment(2) #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) - .setRowLength(3) + .setRowLength(7) + #endif + .setSkip({2, 3, 0}), + PixelFormat::RGB, PixelType::UnsignedByte}; + + #if defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2) + CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector2i{5, 9}), + (3 + 9)*15); + #else + CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector2i{5, 9}), + (3 + 9)*22); + #endif +} + +void PixelStorageTest::dataSize3D() { + /* The same parameters as in PixelStorageGLTest 3D case */ + const Image3D image{PixelStorage{}.setAlignment(2) + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) + .setRowLength(7) #endif #ifndef MAGNUM_TARGET_GLES2 - .setImageHeight(5) + .setImageHeight(10) #endif .setSkip({2, 3, 1}), PixelFormat::RGB, PixelType::UnsignedByte}; #if defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2) - CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector2i{2, 3}), - 3*6 + 3*6 + 6 + 3*6); + CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector3i{5, 9, 3}), + (1 + 3)*9*15); #elif defined(MAGNUM_TARGET_GLES2) - CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector2i{2, 3}), - 3*10 + 3*10 + 6 + 3*10); + CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector3i{5, 9, 3}), + (1 + 3)*9*22); #else - CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector2i{2, 3}), - 5*10 + 3*10 + 6 + 3*10); + CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector3i{5, 9, 3}), + (1 + 3)*10*22); #endif } @@ -199,7 +230,7 @@ void PixelStorageTest::dataPropertiesCompressed() { .setCompressedBlockDataSize(16); CORRADE_COMPARE(storage.dataProperties({2, 8, 11}), - (std::tuple{0, {1, 2, 3}, 16})); + (std::tuple{{}, {1, 2, 3}, 16})); } void PixelStorageTest::dataPropertiesCompressedRowLength() { @@ -210,7 +241,7 @@ void PixelStorageTest::dataPropertiesCompressedRowLength() { .setSkip({5, 8, 0}); CORRADE_COMPARE(storage.dataProperties({2, 8, 11}), - (std::tuple{(2 + 8)*9, {4, 2, 3}, 9})); + (std::tuple{{2*9, 8*9, 0}, {4, 2, 3}, 9})); } void PixelStorageTest::dataPropertiesCompressedImageHeight() { @@ -221,7 +252,7 @@ void PixelStorageTest::dataPropertiesCompressedImageHeight() { .setSkip({5, 8, 11}); CORRADE_COMPARE(storage.dataProperties({2, 8, 11}), - (std::tuple{(2 + 2 + 9)*16, {1, 3, 3}, 16})); + (std::tuple{{2*16, 2*16, 9*16}, {1, 3, 3}, 16})); } void PixelStorageTest::dataOffsetSizeCompressed() { diff --git a/src/Magnum/Trade/ImageData.cpp b/src/Magnum/Trade/ImageData.cpp index e4d1f3a87..587685009 100644 --- a/src/Magnum/Trade/ImageData.cpp +++ b/src/Magnum/Trade/ImageData.cpp @@ -63,7 +63,7 @@ template std::size_t ImageData::pixelSize() return PixelStorage::pixelSize(_format, _type); } -template std::tuple, std::size_t> ImageData::dataProperties() const { +template std::tuple, VectorTypeFor, std::size_t> ImageData::dataProperties() const { CORRADE_ASSERT(!_compressed, "Trade::ImageData::dataProperties(): the image is compressed", {}); return Implementation::imageDataProperties(*this); } diff --git a/src/Magnum/Trade/ImageData.h b/src/Magnum/Trade/ImageData.h index 2c6492aa0..28f53005c 100644 --- a/src/Magnum/Trade/ImageData.h +++ b/src/Magnum/Trade/ImageData.h @@ -210,7 +210,7 @@ template class ImageData { * @ref PixelStorage::dataProperties() for more information. * @see @ref isCompressed() */ - std::tuple, std::size_t> dataProperties() const; + std::tuple, VectorTypeFor, std::size_t> dataProperties() const; /* compressed data properties are not available because the importers are not setting any block size pixel storage properties to avoid diff --git a/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp b/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp index af9817c0f..6383105a4 100644 --- a/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp +++ b/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp @@ -98,7 +98,7 @@ Containers::Array TgaImageConverter::doExportToData(const ImageView2D& ima header->height = UnsignedShort(Utility::Endianness::littleEndian(image.size().y())); /* Image data pointer including skip */ - const char* imageData = image.data() + std::get<0>(image.dataProperties()); + const char* imageData = image.data() + std::get<0>(image.dataProperties()).sum(); /* Fill data or copy them row by row if we need to drop the padding */ const std::size_t rowSize = image.size().x()*pixelSize; From 78ddfad54330619585b6819ce548fd8124ebfde2 Mon Sep 17 00:00:00 2001 From: mdietsch Date: Wed, 3 Aug 2016 10:58:49 +0200 Subject: [PATCH 092/290] Platform: avoid registering WNDCLASS more than once. Fixes an issue when creating the context more than once in a single application. Also changed the API calls to be explicitly "W" and added proper error reporting to this part of code. --- .../Platform/WindowlessWglApplication.cpp | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/Magnum/Platform/WindowlessWglApplication.cpp b/src/Magnum/Platform/WindowlessWglApplication.cpp index 4a0da7fc6..6e07abfec 100644 --- a/src/Magnum/Platform/WindowlessWglApplication.cpp +++ b/src/Magnum/Platform/WindowlessWglApplication.cpp @@ -46,20 +46,29 @@ namespace Magnum { namespace Platform { WindowlessWglContext::WindowlessWglContext(const Configuration& configuration, Context* const magnumContext) { + /* Register the window class (if not yet done) */ + WNDCLASSW wc; + if(!GetClassInfoW(GetModuleHandleW(nullptr), L"Magnum Windowless Application", &wc)) { + wc = WNDCLASSW{ + 0, + DefWindowProcW, + 0, + 0, + GetModuleHandleW(nullptr), + nullptr, + nullptr, + HBRUSH(COLOR_BACKGROUND), + nullptr, + L"Magnum Windowless Application" + }; + + if(!RegisterClassW(&wc)) { + Error() << "Platform::WindowlessWglContext: cannot create window class:" << GetLastError(); + return; + } + } + /* Create the window */ - const WNDCLASS wc{ - 0, - DefWindowProc, - 0, - 0, - GetModuleHandle(nullptr), - nullptr, - nullptr, - HBRUSH(COLOR_BACKGROUND), - nullptr, - L"Magnum Windowless Application" - }; - if(!RegisterClass(&wc)) return; _window = CreateWindowW(wc.lpszClassName, L"Magnum Windowless Application", WS_OVERLAPPEDWINDOW, 0, 0, 32, 32, 0, 0, wc.hInstance, 0); From fbb363e9d0c839511611dbec5ebe7c59d555adc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 3 Aug 2016 11:00:04 +0200 Subject: [PATCH 093/290] Platform: work around horrible wglMakeCurrent() API design. It fails when a null HDC parameter is passed to it. WHAT THE HELL. --- src/Magnum/Platform/WindowlessWglApplication.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Platform/WindowlessWglApplication.cpp b/src/Magnum/Platform/WindowlessWglApplication.cpp index 6e07abfec..9f3ed7fde 100644 --- a/src/Magnum/Platform/WindowlessWglApplication.cpp +++ b/src/Magnum/Platform/WindowlessWglApplication.cpp @@ -72,9 +72,14 @@ WindowlessWglContext::WindowlessWglContext(const Configuration& configuration, C _window = CreateWindowW(wc.lpszClassName, L"Magnum Windowless Application", WS_OVERLAPPEDWINDOW, 0, 0, 32, 32, 0, 0, wc.hInstance, 0); - /* Get device context */ - const HDC currentDeviceContext = wglGetCurrentDC(); + /* Get device context from the newly created window and save the previous + one. In case the previous one is null, wglMakeCurrent(null, ...) would + fail and thus we need to pass at least something there. As a commenter + on https://github.com/glfw/glfw/issues/245#issuecomment-43475120 said: + the Windows API is horrible. HORRIBLE. */ + HDC currentDeviceContext = wglGetCurrentDC(); _deviceContext = GetDC(_window); + if(!currentDeviceContext) currentDeviceContext = _deviceContext; /* Use first provided pixel format */ constexpr static const PIXELFORMATDESCRIPTOR pfd = { From 176a72653e73da9d63c1cf0faaeae03cb58c9881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 3 Aug 2016 11:02:43 +0200 Subject: [PATCH 094/290] Platform: update WindowlessWindowsEglContext to match the WglContext. Applied 78ddfad54330619585b6819ce548fd8124ebfde2 on this class. Also fixed suspicious window creation -- the private member variable was never initialized. --- .../WindowlessWindowsEglApplication.cpp | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/Magnum/Platform/WindowlessWindowsEglApplication.cpp b/src/Magnum/Platform/WindowlessWindowsEglApplication.cpp index cf4c944e3..137959aa9 100644 --- a/src/Magnum/Platform/WindowlessWindowsEglApplication.cpp +++ b/src/Magnum/Platform/WindowlessWindowsEglApplication.cpp @@ -36,25 +36,34 @@ namespace Magnum { namespace Platform { WindowlessWindowsEglContext::WindowlessWindowsEglContext(const Configuration& configuration, Context*) { + /* Register the window class (if not yet done) */ + WNDCLASSW wc; + if(!GetClassInfoW(GetModuleHandleW(nullptr), L"Magnum Windowless Application", &wc)) { + wc = WNDCLASSW{ + 0, + DefWindowProcW, + 0, + 0, + GetModuleHandleW(nullptr), + nullptr, + nullptr, + HBRUSH(COLOR_BACKGROUND), + nullptr, + L"Magnum Windowless Application" + }; + + if(!RegisterClassW(&wc)) { + Error() << "Platform::WindowlessWglContext: cannot create window class:" << GetLastError(); + return; + } + } + /* Create the window */ - const WNDCLASS wc{ - 0, - DefWindowProc, - 0, - 0, - GetModuleHandle(nullptr), - nullptr, - nullptr, - HBRUSH(COLOR_BACKGROUND), - nullptr, - L"Magnum Windowless Application" - }; - if(!RegisterClass(&wc)) return; - const HWND window = CreateWindowW(wc.lpszClassName, L"Magnum Windowless Application", + _window = CreateWindowW(wc.lpszClassName, L"Magnum Windowless Application", WS_OVERLAPPEDWINDOW, 0, 0, 32, 32, 0, 0, wc.hInstance, 0); /* Initialize */ - _display = eglGetDisplay(GetDC(window)); + _display = eglGetDisplay(GetDC(_window)); if(!eglInitialize(_display, nullptr, nullptr)) { Error() << "Platform::WindowlessWindowsEglApplication::tryCreateContext(): cannot initialize EGL:" << Implementation::eglErrorString(eglGetError()); return false; From 00891e941dfde273b3b4d61060432a189efca2f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 3 Aug 2016 12:54:36 +0200 Subject: [PATCH 095/290] Ability to pass const char** arguments to Platform::Context. --- src/Magnum/Context.cpp | 2 +- src/Magnum/Context.h | 2 +- src/Magnum/Platform/Context.h | 22 +++++++++++++++++----- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index 37c2dcaa8..e3d592218 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -427,7 +427,7 @@ Context& Context::current() { return *currentContext; } -Context::Context(NoCreateT, Int argc, char** argv, void functionLoader()): _functionLoader{functionLoader}, _version{Version::None} { +Context::Context(NoCreateT, Int argc, const char** argv, void functionLoader()): _functionLoader{functionLoader}, _version{Version::None} { /* Parse arguments */ Utility::Arguments args{"magnum"}; args.addOption("disable-workarounds") diff --git a/src/Magnum/Context.h b/src/Magnum/Context.h index 5fe83d2be..e1cb51272 100644 --- a/src/Magnum/Context.h +++ b/src/Magnum/Context.h @@ -505,7 +505,7 @@ class MAGNUM_EXPORT Context { Implementation::State& state() { return *_state; } private: - explicit Context(NoCreateT, Int argc, char** argv, void functionLoader()); + explicit Context(NoCreateT, Int argc, const char** argv, void functionLoader()); bool tryCreate(); void create(); diff --git a/src/Magnum/Platform/Context.h b/src/Magnum/Platform/Context.h index 4bb498dcc..e9d207c43 100644 --- a/src/Magnum/Platform/Context.h +++ b/src/Magnum/Platform/Context.h @@ -54,13 +54,19 @@ class Context: public Magnum::Context { * @def_gl{CONTEXT_FLAGS}, @def_gl{NUM_EXTENSIONS}, * @fn_gl{GetString} with @def_gl{EXTENSIONS} */ - explicit Context(Int argc, char** argv): Context{NoCreate, argc, argv} { create(); } + explicit Context(Int argc, const char** argv): Context{NoCreate, argc, argv} { create(); } + + /** @overload */ + explicit Context(Int argc, char** argv): Context{argc, const_cast(argv)} {} + + /** @overload */ + explicit Context(Int argc, std::nullptr_t argv): Context{argc, static_cast(argv)} {} #ifdef MAGNUM_BUILD_DEPRECATED - /** @copybrief Context(Int, char**) - * @deprecated Use @ref Context(Int, char**) instead. + /** @copybrief Context(Int, const char**) + * @deprecated Use @ref Context(Int, const char**) instead. */ - CORRADE_DEPRECATED("use Context(Int, char**) instead") explicit Context(): Context(0, nullptr) {} + CORRADE_DEPRECATED("use Context(Int, const char**) instead") explicit Context(): Context(0, nullptr) {} #endif /** @@ -71,13 +77,19 @@ class Context: public Magnum::Context { * left in empty state. Use @ref create() or @ref tryCreate() to * complete the setup. */ - explicit Context(NoCreateT, Int argc, char** argv): + explicit Context(NoCreateT, Int argc, const char** argv): #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) Magnum::Context{NoCreate, argc, argv, flextGLInit} {} #else Magnum::Context{NoCreate, argc, argv, nullptr} {} #endif + /** @overload */ + explicit Context(NoCreateT, Int argc, char** argv): Context{NoCreate, argc, const_cast(argv)} {} + + /** @overload */ + explicit Context(NoCreateT, Int argc, std::nullptr_t argv): Context{NoCreate, argc, static_cast(argv)} {} + /** * @brief Complete the context setup and exit on failure * From 4988c1ccf71b46aaad4a87101c6a294dafea4ae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 3 Aug 2016 12:55:31 +0200 Subject: [PATCH 096/290] Ability to control the amount of console output in engine initialization. --- src/Magnum/Context.cpp | 23 ++++++++++++++++------- src/Magnum/Context.h | 1 + src/Magnum/Implementation/State.cpp | 6 +++--- src/Magnum/Implementation/State.h | 2 +- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index e3d592218..91ee025de 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -25,6 +25,7 @@ #include "Context.h" +#include /* for initialization log redirection */ #include #include #include @@ -433,10 +434,15 @@ Context::Context(NoCreateT, Int argc, const char** argv, void functionLoader()): args.addOption("disable-workarounds") .setHelp("disable-workarounds", "driver workarounds to disable\n (see src/Magnum/Implementation/driverSpecific.cpp for detailed info)", "LIST") .addOption("disable-extensions").setHelp("disable-extensions", "OpenGL extensions to disable", "LIST") + .addOption("log", "default").setHelp("log", "Console logging", "default|quiet") .setFromEnvironment("disable-workarounds") .setFromEnvironment("disable-extensions") + .setFromEnvironment("log") .parse(argc, argv); + /* Decide whether to display initialization log */ + _displayInitializationLog = !(args.value("log") == "quiet" || args.value("log") == "QUIET"); + /* Disable driver workarounds */ for(auto&& workaround: Utility::String::splitWithoutEmptyParts(args.value("disable-workarounds"))) disableDriverWorkaround(workaround); @@ -652,14 +658,17 @@ bool Context::tryCreate() { CORRADE_ASSERT(!currentContext, "Context: Another context currently active", false); currentContext = this; + /* Decide whether to print the initialization output or not */ + std::ostream* output = _displayInitializationLog ? &std::cout : nullptr; + /* Print some info and initialize state tracker (which also prints some more info) */ - Debug() << "Renderer:" << rendererString() << "by" << vendorString(); - Debug() << "OpenGL version:" << versionString(); + Debug{output} << "Renderer:" << rendererString() << "by" << vendorString(); + Debug{output} << "OpenGL version:" << versionString(); /* Disable extensions as requested by the user */ if(!_disabledExtensions.empty()) { - Debug() << "Disabling extensions:"; + Debug{output} << "Disabling extensions:"; /* Put remaining extensions into the hashmap for faster lookup */ std::unordered_map allExtensions{std::move(futureExtensions)}; @@ -675,17 +684,17 @@ bool Context::tryCreate() { if(found == allExtensions.end()) continue; _extensionRequiredVersion[found->second._index] = Version::None; - Debug() << " " << extension; + Debug{output} << " " << extension; } } - _state = new Implementation::State(*this); + _state = new Implementation::State{*this, output}; /* Print a list of used workarounds */ if(!_driverWorkarounds.empty()) { - Debug() << "Using driver workarounds:"; + Debug{output} << "Using driver workarounds:"; for(const auto& workaround: _driverWorkarounds) - if(!workaround.second) Debug() << " " << workaround.first; + if(!workaround.second) Debug{output} << " " << workaround.first; } /* Initialize functionality based on current OpenGL version and extensions */ diff --git a/src/Magnum/Context.h b/src/Magnum/Context.h index e1cb51272..cacc5e740 100644 --- a/src/Magnum/Context.h +++ b/src/Magnum/Context.h @@ -531,6 +531,7 @@ class MAGNUM_EXPORT Context { /* True means known and disabled, false means known */ std::vector> _driverWorkarounds; std::vector _disabledExtensions; + bool _displayInitializationLog; }; CORRADE_ENUMSET_OPERATORS(Context::DetectedDrivers) diff --git a/src/Magnum/Implementation/State.cpp b/src/Magnum/Implementation/State.cpp index 3b14cbd06..ba92bf7dc 100644 --- a/src/Magnum/Implementation/State.cpp +++ b/src/Magnum/Implementation/State.cpp @@ -49,7 +49,7 @@ namespace Magnum { namespace Implementation { -State::State(Context& context) { +State::State(Context& context, std::ostream* const out) { /* List of extensions used in current context. Guesstimate count to avoid unnecessary reallocations. */ std::vector extensions; @@ -80,8 +80,8 @@ State::State(Context& context) { std::sort(extensions.begin(), extensions.end()); extensions.erase(std::unique(extensions.begin(), extensions.end()), extensions.end()); - Debug() << "Using optional features:"; - for(const auto& ext: extensions) Debug() << " " << ext; + Debug{out} << "Using optional features:"; + for(const auto& ext: extensions) Debug{out} << " " << ext; } State::~State() = default; diff --git a/src/Magnum/Implementation/State.h b/src/Magnum/Implementation/State.h index 1975ba37c..4ff17793b 100644 --- a/src/Magnum/Implementation/State.h +++ b/src/Magnum/Implementation/State.h @@ -51,7 +51,7 @@ struct TransformFeedbackState; struct State { /* Initializes context-based functionality */ - explicit State(Context& context); + explicit State(Context& context, std::ostream* out); ~State(); From feecf4009bd6dab271b7cdd1735ce4854169578c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 3 Aug 2016 13:13:28 +0200 Subject: [PATCH 097/290] Fix build on ES2/WebGL 1. --- src/Magnum/PixelStorage.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/PixelStorage.h b/src/Magnum/PixelStorage.h index d0283d7e2..8ccf35c0f 100644 --- a/src/Magnum/PixelStorage.h +++ b/src/Magnum/PixelStorage.h @@ -448,7 +448,7 @@ namespace Implementation { #ifdef MAGNUM_TARGET_GLES2 template std::ptrdiff_t pixelStorageSkipOffsetFor(const T& image, const Math::Vector& size) { - return std::get<0>(image.storage().dataProperties(image.format(), image.type(), Vector3i::pad(size, 1))); + return std::get<0>(image.storage().dataProperties(image.format(), image.type(), Vector3i::pad(size, 1))).sum(); } template std::ptrdiff_t pixelStorageSkipOffset(const T& image) { return pixelStorageSkipOffsetFor(image, image.size()); From ce0941130c47a8384513b1b32d0ad99a8061e671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 3 Aug 2016 14:08:45 +0200 Subject: [PATCH 098/290] Fix wrongly calculated expected PixelStorage test values on WebGL 1. --- src/Magnum/Test/PixelStorageTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Test/PixelStorageTest.cpp b/src/Magnum/Test/PixelStorageTest.cpp index ba6e1c006..82cfc5b7b 100644 --- a/src/Magnum/Test/PixelStorageTest.cpp +++ b/src/Magnum/Test/PixelStorageTest.cpp @@ -192,7 +192,7 @@ void PixelStorageTest::dataSize2D() { #if defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2) CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector2i{5, 9}), - (3 + 9)*15); + (3 + 9)*16); #else CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector2i{5, 9}), (3 + 9)*22); @@ -213,7 +213,7 @@ void PixelStorageTest::dataSize3D() { #if defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2) CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector3i{5, 9, 3}), - (1 + 3)*9*15); + (1 + 3)*9*16); #elif defined(MAGNUM_TARGET_GLES2) CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector3i{5, 9, 3}), (1 + 3)*9*22); From c3e31b69ad809fa4679c14690d7c1d1a12a9bfac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 3 Aug 2016 14:09:46 +0200 Subject: [PATCH 099/290] SceneGraph: fix compilation of Camera class with double as T. Thanks to @ManuelK89 for the report. Actually I should add proper test cases for both float and double version, but I have other high-priority tasks ATM, so it has to wait until later. --- src/Magnum/SceneGraph/Camera.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magnum/SceneGraph/Camera.hpp b/src/Magnum/SceneGraph/Camera.hpp index a176ada83..5bb197d4c 100644 --- a/src/Magnum/SceneGraph/Camera.hpp +++ b/src/Magnum/SceneGraph/Camera.hpp @@ -49,8 +49,8 @@ template MatrixTypeFor aspectRat Clip on smaller side = scale smaller side up */ return MatrixTypeFor::scaling(Math::Vector::pad( (relativeAspectRatio.x() > relativeAspectRatio.y()) == (aspectRatioPolicy == AspectRatioPolicy::Extend) ? - Vector2(relativeAspectRatio.y()/relativeAspectRatio.x(), T(1)) : - Vector2(T(1), relativeAspectRatio.x()/relativeAspectRatio.y()), T(1))); + Math::Vector2(relativeAspectRatio.y()/relativeAspectRatio.x(), T(1)) : + Math::Vector2(T(1), relativeAspectRatio.x()/relativeAspectRatio.y()), T(1))); } } From fab154290c79061f14bb751545e2ad9a9d61e74f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 4 Aug 2016 11:58:06 +0200 Subject: [PATCH 100/290] Fix compilation on not-exactly-recent updates of MSVC 2015. --- src/Magnum/Context.cpp | 2 +- src/Magnum/Implementation/State.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index 91ee025de..ed1c6e892 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -694,7 +694,7 @@ bool Context::tryCreate() { if(!_driverWorkarounds.empty()) { Debug{output} << "Using driver workarounds:"; for(const auto& workaround: _driverWorkarounds) - if(!workaround.second) Debug{output} << " " << workaround.first; + if(!workaround.second) Debug(output) << " " << workaround.first; } /* Initialize functionality based on current OpenGL version and extensions */ diff --git a/src/Magnum/Implementation/State.cpp b/src/Magnum/Implementation/State.cpp index ba92bf7dc..aec634451 100644 --- a/src/Magnum/Implementation/State.cpp +++ b/src/Magnum/Implementation/State.cpp @@ -81,7 +81,7 @@ State::State(Context& context, std::ostream* const out) { extensions.erase(std::unique(extensions.begin(), extensions.end()), extensions.end()); Debug{out} << "Using optional features:"; - for(const auto& ext: extensions) Debug{out} << " " << ext; + for(const auto& ext: extensions) Debug(out) << " " << ext; } State::~State() = default; From ed0e4adeda39d033f065c3afeb845b1df7bed294 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 4 Aug 2016 21:37:43 +0200 Subject: [PATCH 101/290] Text: don't leak AbstractLayouter subclasses. They are passed in a std::unique_ptr and with the non-virtual destructor their destructors weren't called. Found by AddressSanitizer. --- src/Magnum/Text/AbstractFont.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Text/AbstractFont.h b/src/Magnum/Text/AbstractFont.h index 3af3f3ddc..c8a90eb5c 100644 --- a/src/Magnum/Text/AbstractFont.h +++ b/src/Magnum/Text/AbstractFont.h @@ -362,7 +362,7 @@ class MAGNUM_TEXT_EXPORT AbstractLayouter { /** @brief Moving is not allowed */ AbstractLayouter(AbstractLayouter&&) = delete; - ~AbstractLayouter(); + virtual ~AbstractLayouter(); /** @brief Copying is not allowed */ AbstractLayouter& operator=(const AbstractLayouter&) = delete; From ab6ffe68ee30b8fb24132ea0e5cc6646b0fb7f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 3 Aug 2016 21:49:57 +0200 Subject: [PATCH 102/290] Math: Added Algorithms::qr(). --- src/Magnum/Math/Algorithms/CMakeLists.txt | 1 + src/Magnum/Math/Algorithms/Qr.h | 59 ++++++++++++++++ .../Math/Algorithms/Test/CMakeLists.txt | 1 + src/Magnum/Math/Algorithms/Test/QrTest.cpp | 69 +++++++++++++++++++ 4 files changed, 130 insertions(+) create mode 100644 src/Magnum/Math/Algorithms/Qr.h create mode 100644 src/Magnum/Math/Algorithms/Test/QrTest.cpp diff --git a/src/Magnum/Math/Algorithms/CMakeLists.txt b/src/Magnum/Math/Algorithms/CMakeLists.txt index 06c46f8bf..cfddc216e 100644 --- a/src/Magnum/Math/Algorithms/CMakeLists.txt +++ b/src/Magnum/Math/Algorithms/CMakeLists.txt @@ -26,6 +26,7 @@ set(MagnumMathAlgorithms_HEADERS GaussJordan.h GramSchmidt.h + Qr.h Svd.h) # Force IDEs to display all header files in project view diff --git a/src/Magnum/Math/Algorithms/Qr.h b/src/Magnum/Math/Algorithms/Qr.h new file mode 100644 index 000000000..7ddfe91b4 --- /dev/null +++ b/src/Magnum/Math/Algorithms/Qr.h @@ -0,0 +1,59 @@ +#ifndef Magnum_Math_Algorithms_Qr_h +#define Magnum_Math_Algorithms_Qr_h +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +/** @file + * @brief Function @ref Magnum::Math::Algorithms::qr() + */ + +#include "Magnum/Math/Matrix.h" + +namespace Magnum { namespace Math { namespace Algorithms { + +/** +@brief QR decomposition + +Calculated using classic Gram-Schmidt process. +*/ +template std::pair, Matrix> qr(const Matrix& matrix) { + Matrix q, r; + + for(std::size_t k = 0; k != size; ++k) { + Vector p = matrix[k]; + for(std::size_t j = 0; j != k; ++j) { + r[k][j] = Math::dot(p, q[j]); + p -= q[j]*r[k][j]; + } + r[k][k] = p.length(); + q[k] = p/r[k][k]; + } + + return {q, r}; +} + +}}} + +#endif diff --git a/src/Magnum/Math/Algorithms/Test/CMakeLists.txt b/src/Magnum/Math/Algorithms/Test/CMakeLists.txt index 5ab52b53b..926d21613 100644 --- a/src/Magnum/Math/Algorithms/Test/CMakeLists.txt +++ b/src/Magnum/Math/Algorithms/Test/CMakeLists.txt @@ -25,4 +25,5 @@ corrade_add_test(MathAlgorithmsGaussJordanTest GaussJordanTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathAlgorithmsGramSchmidtTest GramSchmidtTest.cpp LIBRARIES MagnumMathTestLib) +corrade_add_test(MathAlgorithmsQrTest QrTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathAlgorithmsSvdTest SvdTest.cpp LIBRARIES MagnumMathTestLib) diff --git a/src/Magnum/Math/Algorithms/Test/QrTest.cpp b/src/Magnum/Math/Algorithms/Test/QrTest.cpp new file mode 100644 index 000000000..272bfa466 --- /dev/null +++ b/src/Magnum/Math/Algorithms/Test/QrTest.cpp @@ -0,0 +1,69 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include +#include + +#include "Magnum/Math/Matrix3.h" +#include "Magnum/Math/Algorithms/Qr.h" + +namespace Magnum { namespace Math { namespace Algorithms { namespace Test { + +struct QrTest: Corrade::TestSuite::Tester { + explicit QrTest(); + + void test(); +}; + +typedef Matrix3 Matrix3; + +QrTest::QrTest() { + addTests({&QrTest::test}); +} + +void QrTest::test() { + Matrix3 a{{ 0.0f, 3.0f, 4.0f}, + {-20.0f, 27.0f, 11.0f}, + {-14.0f, -4.0f, -2.0f}}; + + Matrix3 q, r; + std::tie(q, r) = Algorithms::qr(a); + + CORRADE_COMPARE(q*r, a); + + Matrix3 qExpected = Matrix3{{ 0.0f, 15.0f, 20.0f}, + {-20.0f, 12.0f, -9.0f}, + {-15.0f, -16.0f, 12.0f}}/25.0f; + CORRADE_COMPARE(q, qExpected); + + Matrix3 rExpected{{ 5.0f, 0.0f, 0.0f}, + {25.0f, 25.0f, 0.0f}, + {-4.0f, 10.0f, 10.0f}}; + CORRADE_COMPARE(r, rExpected); +} + +}}}} + +CORRADE_TEST_MAIN(Magnum::Math::Algorithms::Test::QrTest) From 633d792e3dac5eef37ed4b25e73ea16d41a9a211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 4 Aug 2016 10:04:57 +0200 Subject: [PATCH 103/290] Math: added Vector::flipped(). --- src/Magnum/Math/BoolVector.h | 7 +++++++ src/Magnum/Math/Test/VectorTest.cpp | 13 +++++++++++++ src/Magnum/Math/Vector.h | 16 ++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/src/Magnum/Math/BoolVector.h b/src/Magnum/Math/BoolVector.h index 40cf5e3f4..87df34d18 100644 --- a/src/Magnum/Math/BoolVector.h +++ b/src/Magnum/Math/BoolVector.h @@ -49,6 +49,13 @@ namespace Implementation { template struct GenerateSequence<0, sequence...> { typedef Sequence Type; }; + + template struct GenerateReverseSequence: + GenerateReverseSequence {}; + + template struct GenerateReverseSequence<0, sequence...> { + typedef Sequence Type; + }; #endif template constexpr T repeat(T value, std::size_t) { return value; } diff --git a/src/Magnum/Math/Test/VectorTest.cpp b/src/Magnum/Math/Test/VectorTest.cpp index 2c835d5f4..c4f25cc90 100644 --- a/src/Magnum/Math/Test/VectorTest.cpp +++ b/src/Magnum/Math/Test/VectorTest.cpp @@ -100,6 +100,8 @@ struct VectorTest: Corrade::TestSuite::Tester { void projected(); void projectedOntoNormalized(); + void flipped(); + void angle(); void subclassTypes(); @@ -158,6 +160,8 @@ VectorTest::VectorTest() { &VectorTest::projected, &VectorTest::projectedOntoNormalized, + &VectorTest::flipped, + &VectorTest::angle, &VectorTest::subclassTypes, @@ -462,6 +466,12 @@ void VectorTest::projectedOntoNormalized() { CORRADE_COMPARE(projected, vector.projected(line)); } +void VectorTest::flipped() { + constexpr Vector4 vector{1.0f, -3.5f, 2.1f, 0.5f}; + constexpr Vector4 flipped = vector.flipped(); + CORRADE_COMPARE(flipped, (Vector4{0.5f, 2.1f, -3.5f, 1.0f})); +} + void VectorTest::angle() { std::ostringstream o; Error redirectError{&o}; @@ -557,6 +567,7 @@ void VectorTest::subclassTypes() { CORRADE_VERIFY((std::is_same::value)); CORRADE_VERIFY((std::is_same::value)); CORRADE_VERIFY((std::is_same::value)); + CORRADE_VERIFY((std::is_same::value)); } void VectorTest::subclass() { @@ -638,6 +649,8 @@ void VectorTest::subclass() { CORRADE_COMPARE(Vec2(3.0f, 0.0f).resized(6.0f), Vec2(6.0f, 0.0f)); CORRADE_COMPARE(Vec2(1.0f, 1.0f).projected({0.0f, 2.0f}), Vec2(0.0f, 1.0f)); CORRADE_COMPARE(Vec2(1.0f, 1.0f).projectedOntoNormalized({0.0f, 1.0f}), Vec2(0.0f, 1.0f)); + constexpr Vec2 flipped = Vec2{1.0f, 0.4f}.flipped(); + CORRADE_COMPARE(flipped, (Vec2{0.4f, 1.0f})); } void VectorTest::debug() { diff --git a/src/Magnum/Math/Vector.h b/src/Magnum/Math/Vector.h index c78619a1c..5c435b826 100644 --- a/src/Magnum/Math/Vector.h +++ b/src/Magnum/Math/Vector.h @@ -536,6 +536,15 @@ template class Vector { */ Vector projectedOntoNormalized(const Vector& line) const; + /** + * @brief Flipped vector + * + * Returns the vector with components in reverse order. + */ + constexpr Vector flipped() const { + return flippedInternal(typename Implementation::GenerateReverseSequence::Type{}); + } + /** * @brief Sum of values in the vector * @@ -575,6 +584,10 @@ template class Vector { return {sequence < otherSize ? a[sequence] : value...}; } + template constexpr Vector flippedInternal(Implementation::Sequence) const { + return {(*this)[sequence]...}; + } + T _data[size]; }; @@ -1164,6 +1177,9 @@ extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utili } \ Type projectedOntoNormalized(const Math::Vector& other) const { \ return Math::Vector::projectedOntoNormalized(other); \ + } \ + constexpr Type flipped() const { \ + return Math::Vector::flipped(); \ } #define MAGNUM_VECTORn_OPERATOR_IMPLEMENTATION(size, Type) \ From 951f116f5b9edb0e0a78f647814f1822ce69e2d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 4 Aug 2016 10:30:20 +0200 Subject: [PATCH 104/290] Math: added RectangularMatrix::flipped{Cols,Rows}(). --- src/Magnum/Math/RectangularMatrix.h | 38 ++++++++++++++- .../Math/Test/RectangularMatrixTest.cpp | 48 +++++++++++++++++++ src/Magnum/Math/Vector.h | 2 + 3 files changed, 86 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Math/RectangularMatrix.h b/src/Magnum/Math/RectangularMatrix.h index 64e1fdab1..1a05db7ac 100644 --- a/src/Magnum/Math/RectangularMatrix.h +++ b/src/Magnum/Math/RectangularMatrix.h @@ -342,10 +342,30 @@ template class RectangularMatrix { /** * @brief Transposed matrix * - * @see @ref row() + * @see @ref row(), @ref flippedCols(), @ref flippedRows() */ RectangularMatrix transposed() const; + /** + * @brief Matrix with flipped cols + * + * The order of columns is reversed. + * @see @ref transposed(), @ref flippedRows(), @ref Vector::flipped() + */ + constexpr RectangularMatrix flippedCols() const { + return flippedColsInternal(typename Implementation::GenerateReverseSequence::Type{}); + } + + /** + * @brief Matrix with flipped rows + * + * The order of rows is reversed. + * @see @ref transposed(), @ref flippedCols(), @ref Vector::flipped() + */ + constexpr RectangularMatrix flippedRows() const { + return flippedRowsInternal(typename Implementation::GenerateSequence::Type{}); + } + /** * @brief Values on diagonal * @@ -382,6 +402,14 @@ template class RectangularMatrix { /* MSVC 2015 can't handle {} here */ template constexpr explicit RectangularMatrix(Implementation::Sequence, U): _data{Vector((static_cast(sequence), U{typename U::Init{}}))...} {} + template constexpr RectangularMatrix flippedColsInternal(Implementation::Sequence) const { + return {(*this)[sequence]...}; + } + + template constexpr RectangularMatrix flippedRowsInternal(Implementation::Sequence) const { + return {(*this)[sequence].flipped()...}; + } + template constexpr Vector diagonalInternal(Implementation::Sequence) const; Vector _data[cols]; @@ -583,7 +611,13 @@ extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utili } \ __VA_ARGS__ operator/(T number) const { \ return Math::RectangularMatrix::operator/(number); \ - } + } \ + constexpr __VA_ARGS__ flippedCols() const { \ + return Math::RectangularMatrix::flippedCols(); \ + } \ + constexpr __VA_ARGS__ flippedRows() const { \ + return Math::RectangularMatrix::flippedRows(); \ + } \ #define MAGNUM_MATRIX_OPERATOR_IMPLEMENTATION(...) \ template inline __VA_ARGS__ operator*(typename std::common_type::type number, const __VA_ARGS__& matrix) { \ diff --git a/src/Magnum/Math/Test/RectangularMatrixTest.cpp b/src/Magnum/Math/Test/RectangularMatrixTest.cpp index 36a496df4..b782b2f8b 100644 --- a/src/Magnum/Math/Test/RectangularMatrixTest.cpp +++ b/src/Magnum/Math/Test/RectangularMatrixTest.cpp @@ -81,6 +81,8 @@ struct RectangularMatrixTest: Corrade::TestSuite::Tester { void multiplyVector(); void transposed(); + void flippedCols(); + void flippedRows(); void diagonal(); void vector(); @@ -128,6 +130,8 @@ RectangularMatrixTest::RectangularMatrixTest() { &RectangularMatrixTest::multiplyVector, &RectangularMatrixTest::transposed, + &RectangularMatrixTest::flippedCols, + &RectangularMatrixTest::flippedRows, &RectangularMatrixTest::diagonal, &RectangularMatrixTest::vector, @@ -409,6 +413,36 @@ void RectangularMatrixTest::transposed() { CORRADE_COMPARE(original.transposed(), transposed); } +void RectangularMatrixTest::flippedCols() { + constexpr Matrix4x3 original{Vector3{ 0.0f, 1.0f, 3.0f}, + Vector3{ 4.0f, 5.0f, 7.0f}, + Vector3{ 8.0f, 9.0f, 11.0f}, + Vector3{12.0f, 13.0f, 15.0f}}; + constexpr Matrix4x3 flipped = original.flippedCols(); + + Matrix4x3 expectedFlipped{Vector3{12.0f, 13.0f, 15.0f}, + Vector3{ 8.0f, 9.0f, 11.0f}, + Vector3{ 4.0f, 5.0f, 7.0f}, + Vector3{ 0.0f, 1.0f, 3.0f}}; + + CORRADE_COMPARE(flipped, expectedFlipped); +} + +void RectangularMatrixTest::flippedRows() { + constexpr Matrix4x3 original{Vector3{ 0.0f, 1.0f, 3.0f}, + Vector3{ 4.0f, 5.0f, 7.0f}, + Vector3{ 8.0f, 9.0f, 11.0f}, + Vector3{12.0f, 13.0f, 15.0f}}; + constexpr Matrix4x3 flipped = original.flippedRows(); + + Matrix4x3 expectedFlipped{Vector3{ 3.0f, 1.0f, 0.0f}, + Vector3{ 7.0f, 5.0f, 4.0f}, + Vector3{11.0f, 9.0f, 8.0f}, + Vector3{15.0f, 13.0f, 12.0f}}; + + CORRADE_COMPARE(flipped, expectedFlipped); +} + void RectangularMatrixTest::diagonal() { Vector3 diagonal(-1.0f, 5.0f, 11.0f); @@ -500,6 +534,10 @@ void RectangularMatrixTest::subclassTypes() { CORRADE_VERIFY((std::is_same>::value)); CORRADE_VERIFY((std::is_same>::value)); CORRADE_VERIFY((std::is_same()), BasicMat<3, Float>>::value)); + + /* Functions */ + CORRADE_VERIFY((std::is_same::value)); + CORRADE_VERIFY((std::is_same::value)); } void RectangularMatrixTest::subclass() { @@ -560,6 +598,16 @@ void RectangularMatrixTest::subclass() { const Math::Vector<1, Float> i(2.0f); const Math::RectangularMatrix<1, 1, Float> j(3.0f); CORRADE_COMPARE(i*j, (BasicMat<1, Float>(6.0f))); + + /* Functions */ + constexpr Mat2x2 flippedCols = Mat2x2{Vector2{-1.0f, 5.0f}, + Vector2{ 7.0f, -2.0f}}.flippedCols(); + CORRADE_COMPARE(flippedCols, (Mat2x2{Vector2{ 7.0f, -2.0f}, + Vector2{-1.0f, 5.0f}})); + constexpr Mat2x2 flippedRows = Mat2x2{Vector2{-1.0f, 5.0f}, + Vector2{ 7.0f, -2.0f}}.flippedRows(); + CORRADE_COMPARE(flippedRows, (Mat2x2{Vector2{ 5.0f, -1.0f}, + Vector2{-2.0f, 7.0f}})); } void RectangularMatrixTest::debug() { diff --git a/src/Magnum/Math/Vector.h b/src/Magnum/Math/Vector.h index 5c435b826..fb3ffe7db 100644 --- a/src/Magnum/Math/Vector.h +++ b/src/Magnum/Math/Vector.h @@ -540,6 +540,8 @@ template class Vector { * @brief Flipped vector * * Returns the vector with components in reverse order. + * @see @ref RectangularMatrix::flippedCols(), + * @ref RectangularMatrix::flippedRows() */ constexpr Vector flipped() const { return flippedInternal(typename Implementation::GenerateReverseSequence::Type{}); From bf393fad5992b2c519d7fdc43e35b831e1ee60f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 4 Aug 2016 12:53:09 +0200 Subject: [PATCH 105/290] Math: fix/workaround constexpr test compilation on MSVC 2015. --- src/Magnum/Math/Test/RectangularMatrixTest.cpp | 14 ++++++++++---- src/Magnum/Math/Test/VectorTest.cpp | 5 ++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Magnum/Math/Test/RectangularMatrixTest.cpp b/src/Magnum/Math/Test/RectangularMatrixTest.cpp index b782b2f8b..964e8f961 100644 --- a/src/Magnum/Math/Test/RectangularMatrixTest.cpp +++ b/src/Magnum/Math/Test/RectangularMatrixTest.cpp @@ -600,12 +600,18 @@ void RectangularMatrixTest::subclass() { CORRADE_COMPARE(i*j, (BasicMat<1, Float>(6.0f))); /* Functions */ - constexpr Mat2x2 flippedCols = Mat2x2{Vector2{-1.0f, 5.0f}, - Vector2{ 7.0f, -2.0f}}.flippedCols(); + #ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */ + constexpr + #endif + Mat2x2 flippedCols = Mat2x2{Vector2{-1.0f, 5.0f}, + Vector2{ 7.0f, -2.0f}}.flippedCols(); CORRADE_COMPARE(flippedCols, (Mat2x2{Vector2{ 7.0f, -2.0f}, Vector2{-1.0f, 5.0f}})); - constexpr Mat2x2 flippedRows = Mat2x2{Vector2{-1.0f, 5.0f}, - Vector2{ 7.0f, -2.0f}}.flippedRows(); + #ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */ + constexpr + #endif + Mat2x2 flippedRows = Mat2x2{Vector2{-1.0f, 5.0f}, + Vector2{ 7.0f, -2.0f}}.flippedRows(); CORRADE_COMPARE(flippedRows, (Mat2x2{Vector2{ 5.0f, -1.0f}, Vector2{-2.0f, 7.0f}})); } diff --git a/src/Magnum/Math/Test/VectorTest.cpp b/src/Magnum/Math/Test/VectorTest.cpp index c4f25cc90..c525242b9 100644 --- a/src/Magnum/Math/Test/VectorTest.cpp +++ b/src/Magnum/Math/Test/VectorTest.cpp @@ -649,7 +649,10 @@ void VectorTest::subclass() { CORRADE_COMPARE(Vec2(3.0f, 0.0f).resized(6.0f), Vec2(6.0f, 0.0f)); CORRADE_COMPARE(Vec2(1.0f, 1.0f).projected({0.0f, 2.0f}), Vec2(0.0f, 1.0f)); CORRADE_COMPARE(Vec2(1.0f, 1.0f).projectedOntoNormalized({0.0f, 1.0f}), Vec2(0.0f, 1.0f)); - constexpr Vec2 flipped = Vec2{1.0f, 0.4f}.flipped(); + #ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */ + constexpr + #endif + Vec2 flipped = Vec2{1.0f, 0.4f}.flipped(); CORRADE_COMPARE(flipped, (Vec2{0.4f, 1.0f})); } From 612fa59dd683e0b2ad7e353e98ecbc9c3e646805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 9 Aug 2016 11:06:37 +0200 Subject: [PATCH 106/290] Test another pixel storage corner case. The calculated size is again larger than expected. This is getting tiresome. --- src/Magnum/Test/PixelStorageTest.cpp | 36 ++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Test/PixelStorageTest.cpp b/src/Magnum/Test/PixelStorageTest.cpp index 82cfc5b7b..15de32f0b 100644 --- a/src/Magnum/Test/PixelStorageTest.cpp +++ b/src/Magnum/Test/PixelStorageTest.cpp @@ -182,7 +182,6 @@ void PixelStorageTest::dataSize1D() { } void PixelStorageTest::dataSize2D() { - /* The same parameters as in PixelStorageGLTest 3D case */ const Image2D image{PixelStorage{}.setAlignment(2) #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) .setRowLength(7) @@ -197,10 +196,25 @@ void PixelStorageTest::dataSize2D() { CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector2i{5, 9}), (3 + 9)*22); #endif + + #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) + /* This shouldn't overflow the 128x128 rectangle */ + const Image2D image2{PixelStorage{}.setSkip({64, 0, 0}) + .setRowLength(128), + PixelFormat::RGBA, PixelType::UnsignedByte}; + + CORRADE_COMPARE(Implementation::imageDataSizeFor(image2, Vector2i{64, 128}), 65536); + + /* This shouldn't overflow the 128x128 rectangle */ + const Image2D image3{PixelStorage{}.setSkip({64, 64, 0}) + .setRowLength(128), + PixelFormat::RGBA, PixelType::UnsignedByte}; + + CORRADE_COMPARE(Implementation::imageDataSizeFor(image3, Vector2i{64, 64}), 65536); + #endif } void PixelStorageTest::dataSize3D() { - /* The same parameters as in PixelStorageGLTest 3D case */ const Image3D image{PixelStorage{}.setAlignment(2) #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) .setRowLength(7) @@ -221,6 +235,24 @@ void PixelStorageTest::dataSize3D() { CORRADE_COMPARE(Implementation::imageDataSizeFor(image, Vector3i{5, 9, 3}), (1 + 3)*10*22); #endif + + #ifndef MAGNUM_TARGET_GLES2 + /* This shouldn't overflow the 128x128x128 cube */ + const Image3D image2{PixelStorage{}.setSkip({64, 64, 0}) + .setRowLength(128) + .setImageHeight(128), + PixelFormat::RGBA, PixelType::UnsignedByte}; + + CORRADE_COMPARE(Implementation::imageDataSizeFor(image2, Vector3i{64, 64, 128}), 8388608); + + /* This shouldn't overflow the 128x128x128 cube */ + const Image3D image3{PixelStorage{}.setSkip({64, 64, 64}) + .setRowLength(128) + .setImageHeight(128), + PixelFormat::RGBA, PixelType::UnsignedByte}; + + CORRADE_COMPARE(Implementation::imageDataSizeFor(image3, Vector3i{64, 64, 64}), 8388608); + #endif } #ifndef MAGNUM_TARGET_GLES From d998cb0f769854973412032ae673eaadfb5b3a84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 9 Aug 2016 11:07:44 +0200 Subject: [PATCH 107/290] Fix another pixel storage corner case. The test passes again. --- src/Magnum/PixelStorage.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Magnum/PixelStorage.h b/src/Magnum/PixelStorage.h index 8ccf35c0f..51b42da92 100644 --- a/src/Magnum/PixelStorage.h +++ b/src/Magnum/PixelStorage.h @@ -397,10 +397,21 @@ namespace Implementation { std::size_t dataOffset = 0; if(offset.z()) dataOffset += offset.z(); - else if(offset.y()) - dataOffset += offset.y(); - else if(offset.x()) - dataOffset += offset.x(); + else if(offset.y()) { + #ifndef MAGNUM_TARGET_GLES2 + if(!image.storage().imageHeight()) + #endif + { + dataOffset += offset.y(); + } + } else if(offset.x()) { + #if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)) + if(!image.storage().rowLength()) + #endif + { + dataOffset += offset.x(); + } + } return dataOffset + dataSize.product(); } From 96e57ff876176ed5ffb7ce33dbf518a7f60cc128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 15 Aug 2016 22:43:23 +0200 Subject: [PATCH 108/290] Math: simplify the SVD test code by making it templated. --- src/Magnum/Math/Algorithms/Test/SvdTest.cpp | 92 +++++++-------------- 1 file changed, 29 insertions(+), 63 deletions(-) diff --git a/src/Magnum/Math/Algorithms/Test/SvdTest.cpp b/src/Magnum/Math/Algorithms/Test/SvdTest.cpp index b9ffeb8e5..ee10b342a 100644 --- a/src/Magnum/Math/Algorithms/Test/SvdTest.cpp +++ b/src/Magnum/Math/Algorithms/Test/SvdTest.cpp @@ -32,81 +32,47 @@ namespace Magnum { namespace Math { namespace Algorithms { namespace Test { struct SvdTest: Corrade::TestSuite::Tester { explicit SvdTest(); - void testDouble(); - void testFloat(); + template void test(); }; -typedef RectangularMatrix<5, 8, Double> Matrix5x8d; -typedef Matrix<8, Double> Matrix8d; -typedef Matrix<5, Double> Matrix5d; -typedef Vector<8, Double> Vector8d; -typedef Vector<5, Double> Vector5d; - -typedef RectangularMatrix<5, 8, Float> Matrix5x8f; -typedef Matrix<8, Float> Matrix8f; -typedef Matrix<5, Float> Matrix5f; -typedef Vector<8, Float> Vector8f; -typedef Vector<5, Float> Vector5f; - -constexpr static Matrix5x8d ad( - Vector8d(22.0, 14.0, -1.0, -3.0, 9.0, 9.0, 2.0, 4.0), - Vector8d(10.0, 7.0, 13.0, -2.0, 8.0, 1.0, -6.0, 5.0), - Vector8d( 2.0, 10.0, -1.0, 13.0, 1.0, -7.0, 6.0, 0.0), - Vector8d( 3.0, 0.0, -11.0, -2.0, -2.0, 5.0, 5.0, -2.0), - Vector8d( 7.0, 8.0, 3.0, 4.0, 4.0, -1.0, 1.0, 2.0) -); -static const Vector5d expectedd(std::sqrt(1248.0), 0.0, 20.0, std::sqrt(384.0), 0.0); - -constexpr static Matrix5x8f af( - Vector8f(22.0f, 14.0f, -1.0f, -3.0f, 9.0f, 9.0f, 2.0f, 4.0f), - Vector8f(10.0f, 7.0f, 13.0f, -2.0f, 8.0f, 1.0f, -6.0f, 5.0f), - Vector8f( 2.0f, 10.0f, -1.0f, 13.0f, 1.0f, -7.0f, 6.0f, 0.0f), - Vector8f( 3.0f, 0.0f, -11.0f, -2.0f, -2.0f, 5.0f, 5.0f, -2.0f), - Vector8f( 7.0f, 8.0f, 3.0f, 4.0f, 4.0f, -1.0f, 1.0f, 2.0f) -); -static const Vector5f expectedf(std::sqrt(1248.0f), 0.0f, 20.0f, std::sqrt(384.0f), 0.0f); +template using Matrix5x8 = RectangularMatrix<5, 8, T>; +template using Matrix8 = Matrix<8, T>; +template using Matrix5 = Matrix<5, T>; +template using Vector8 = Vector<8, T>; +template using Vector5 = Vector<5, T>; SvdTest::SvdTest() { - addTests({&SvdTest::testDouble, - &SvdTest::testFloat}); + addTests({&SvdTest::test, + &SvdTest::test}); } -void SvdTest::testDouble() { - Matrix5x8d u; - Vector5d w; - Matrix5d v; - std::tie(u, w, v) = Algorithms::svd(ad); +template void SvdTest::test() { + setTestCaseName(std::is_same::value ? "test" : "test"); - /* Test composition */ - Matrix8d u2(u[0], u[1], u[2], u[3], u[4], Vector8d(), Vector8d(), Vector8d()); - Matrix5x8d w2 = Matrix5x8d::fromDiagonal(w); - CORRADE_COMPARE(u2*w2*v.transposed(), ad); - - /* Test that V is unitary */ - CORRADE_COMPARE(v*v.transposed(), Matrix5d{IdentityInit}); - CORRADE_COMPARE(v.transposed()*v, Matrix5d{IdentityInit}); - - /* Test W */ - CORRADE_COMPARE(w, expectedd); -} + constexpr const Matrix5x8 a{ + Vector8{T{22}, T{14}, T{ -1}, T{-3}, T{ 9}, T{ 9}, T{ 2}, T{ 4}}, + Vector8{T{10}, T{ 7}, T{ 13}, T{-2}, T{ 8}, T{ 1}, T{-6}, T{ 5}}, + Vector8{T{ 2}, T{10}, T{ -1}, T{13}, T{ 1}, T{-7}, T{ 6}, T{ 0}}, + Vector8{T{ 3}, T{ 0}, T{-11}, T{-2}, T{-2}, T{ 5}, T{ 5}, T{-2}}, + Vector8{T{ 7}, T{ 8}, T{ 3}, T{ 4}, T{ 4}, T{-1}, T{ 1}, T{ 2}}}; + const Vector5 expected(std::sqrt(T{1248}), T{0}, T{20}, std::sqrt(T{384}), T{0}); -void SvdTest::testFloat() { - Matrix5x8f u; - Vector5f w; - Matrix5f v; - std::tie(u, w, v) = Algorithms::svd(af); + Matrix5x8 u{NoInit}; + Vector5 w{NoInit}; + Matrix5 v{NoInit}; + std::tie(u, w, v) = Algorithms::svd(a); - /* Test composition (single precision is not enough, test for similarity) */ - Matrix8f u2(u[0], u[1], u[2], u[3], u[4], Vector8f(), Vector8f(), Vector8f()); - Matrix5x8f w2 = Matrix5x8f::fromDiagonal(w); - CORRADE_VERIFY(Math::abs((u2*w2*v.transposed()-af).toVector()).max() < 1.0e-5f); + /* Test composition */ + Matrix8 u2{u[0], u[1], u[2], u[3], u[4], Vector8{}, Vector8{}, Vector8{}}; + Matrix5x8 w2 = Matrix5x8::fromDiagonal(w); + CORRADE_COMPARE(u2*w2*v.transposed(), a); /* Test that V is unitary */ - CORRADE_COMPARE(v*v.transposed(), Matrix5f{IdentityInit}); - CORRADE_COMPARE(v.transposed()*v, Matrix5f{IdentityInit}); + CORRADE_COMPARE(v*v.transposed(), Matrix5{IdentityInit}); + CORRADE_COMPARE(v.transposed()*v, Matrix5{IdentityInit}); - /* Test W (single precision is not enough, test for similarity) */ - CORRADE_VERIFY(Math::abs(w-expectedf).max() < 1.0e-5f); + /* Test W */ + CORRADE_COMPARE(w, expected); } }}}} From ac1cda6334e98d138becde50b00c628c93b24d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 15 Aug 2016 22:47:43 +0200 Subject: [PATCH 109/290] Math: simplify Constants test by making it templated. --- src/Magnum/Math/Test/ConstantsTest.cpp | 30 ++++++++++---------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/Magnum/Math/Test/ConstantsTest.cpp b/src/Magnum/Math/Test/ConstantsTest.cpp index 9606298c5..4ac226d81 100644 --- a/src/Magnum/Math/Test/ConstantsTest.cpp +++ b/src/Magnum/Math/Test/ConstantsTest.cpp @@ -34,30 +34,20 @@ namespace Magnum { namespace Math { namespace Test { struct ConstantsTest: Corrade::TestSuite::Tester { explicit ConstantsTest(); - void constants(); - void specials(); - - private: - template void _constants(); - template void _specials(); + template void constants(); + template void specials(); }; ConstantsTest::ConstantsTest() { - addTests({&ConstantsTest::constants, - &ConstantsTest::specials}); + addTests({&ConstantsTest::constants, + &ConstantsTest::constants, + &ConstantsTest::specials, + &ConstantsTest::specials}); } -void ConstantsTest::constants() { - _constants(); - _constants(); -} +template void ConstantsTest::constants() { + setTestCaseName(std::is_same::value ? "constants" : "constants"); -void ConstantsTest::specials() { - _specials(); - _specials(); -} - -template void ConstantsTest::_constants() { constexpr T a = Constants::sqrt2(); constexpr T b = Constants::sqrt3(); CORRADE_COMPARE(Math::pow<2>(a), T(2)); @@ -73,7 +63,9 @@ template void ConstantsTest::_constants() { CORRADE_COMPARE(std::log(f), T(1)); } -template void ConstantsTest::_specials() { +template void ConstantsTest::specials() { + setTestCaseName(std::is_same::value ? "specials" : "specials"); + #ifndef CORRADE_MSVC2015_COMPATIBILITY /* NaN is not constexpr */ constexpr #endif From c5e22ae560fbaf152b5645204bb8d8732685d5bc Mon Sep 17 00:00:00 2001 From: Elliot Saba Date: Tue, 16 Aug 2016 17:46:50 +0200 Subject: [PATCH 110/290] Platform: send GLFW_REPEAT events through `keyPressEvent()` --- src/Magnum/Platform/GlfwApplication.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Platform/GlfwApplication.cpp b/src/Magnum/Platform/GlfwApplication.cpp index 6b40eda54..f5cd03abe 100644 --- a/src/Magnum/Platform/GlfwApplication.cpp +++ b/src/Magnum/Platform/GlfwApplication.cpp @@ -168,7 +168,9 @@ void GlfwApplication::staticKeyEvent(GLFWwindow*, int key, int, int action, int _instance->keyPressEvent(e); } else if(action == GLFW_RELEASE) { _instance->keyReleaseEvent(e); - } /* we don't handle GLFW_REPEAT */ + } else if(action == GLFW_REPEAT) { + _instance->keyPressEvent(e); + } } void GlfwApplication::staticMouseMoveEvent(GLFWwindow* window, double x, double y) { From 7c631d714af5af15644913a876ece38dd544528e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 16 Aug 2016 17:48:00 +0200 Subject: [PATCH 111/290] Platform: expose key repeat in *Application::KeyEvent::isRepeated(). --- src/Magnum/Platform/GlfwApplication.cpp | 2 +- src/Magnum/Platform/GlfwApplication.h | 11 ++++++++++- src/Magnum/Platform/Sdl2Application.cpp | 2 +- src/Magnum/Platform/Sdl2Application.h | 11 ++++++++++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Magnum/Platform/GlfwApplication.cpp b/src/Magnum/Platform/GlfwApplication.cpp index f5cd03abe..c17b8b477 100644 --- a/src/Magnum/Platform/GlfwApplication.cpp +++ b/src/Magnum/Platform/GlfwApplication.cpp @@ -162,7 +162,7 @@ int GlfwApplication::exec() { } void GlfwApplication::staticKeyEvent(GLFWwindow*, int key, int, int action, int mods) { - KeyEvent e(static_cast(key), {static_cast(mods)}); + KeyEvent e(static_cast(key), {static_cast(mods)}, action == GLFW_REPEAT); if(action == GLFW_PRESS) { _instance->keyPressEvent(e); diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index 008281d24..63c44e4a0 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -750,13 +750,22 @@ class GlfwApplication::KeyEvent: public GlfwApplication::InputEvent { /** @brief Modifiers */ constexpr Modifiers modifiers() const { return _modifiers; } + /** + * @brief Whether the key press is repeated + * + * Returns `true` if the key press event is repeated, `false` if not or + * if this was key release event. + */ + constexpr bool isRepeated() const { return _repeated; } + private: static Modifiers getCurrentGlfwModifiers(GLFWwindow* window); - constexpr KeyEvent(Key key, Modifiers modifiers): _key(key), _modifiers(modifiers) {} + constexpr KeyEvent(Key key, Modifiers modifiers, bool repeated): _key{key}, _modifiers{modifiers}, _repeated{repeated} {} const Key _key; const Modifiers _modifiers; + const bool _repeated; }; /** diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index b316c9cc4..881652409 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -377,7 +377,7 @@ void Sdl2Application::mainLoop() { case SDL_KEYDOWN: case SDL_KEYUP: { - KeyEvent e(static_cast(event.key.keysym.sym), fixedModifiers(event.key.keysym.mod)); + KeyEvent e(static_cast(event.key.keysym.sym), fixedModifiers(event.key.keysym.mod), event.key.repeat != 0); event.type == SDL_KEYDOWN ? keyPressEvent(e) : keyReleaseEvent(e); } break; diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index 24c1b1d24..cf2d4e01d 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -1218,11 +1218,20 @@ class Sdl2Application::KeyEvent: public Sdl2Application::InputEvent { /** @brief Modifiers */ constexpr Modifiers modifiers() const { return _modifiers; } + /** + * @brief Whether the key press is repeated + * + * Returns `true` if the key press event is repeated, `false` if not or + * if this was key release event. + */ + constexpr bool isRepeated() const { return _repeated; } + private: - constexpr KeyEvent(Key key, Modifiers modifiers): _key(key), _modifiers(modifiers) {} + constexpr KeyEvent(Key key, Modifiers modifiers, bool repeated): _key{key}, _modifiers{modifiers}, _repeated{repeated} {} const Key _key; const Modifiers _modifiers; + const bool _repeated; }; /** From 8e632130b827f5542020cd820d2efe60f4cf07b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 16 Aug 2016 19:14:25 +0200 Subject: [PATCH 112/290] Platform: added *Application::KeyEvent::keyName(). The SDL2 variant works better than expected, however the GLFW variant underdelivers -- no key names for modifier keys, the accent keys are not UTF-8... I don't care ATM, will solve it once someone actually complains. --- src/Magnum/Platform/GlfwApplication.cpp | 10 +++++++++ src/Magnum/Platform/GlfwApplication.h | 8 +++++++- src/Magnum/Platform/Sdl2Application.cpp | 8 ++++++++ src/Magnum/Platform/Sdl2Application.h | 27 ++++++++++++++++++++++++- 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Platform/GlfwApplication.cpp b/src/Magnum/Platform/GlfwApplication.cpp index c17b8b477..3b65d9450 100644 --- a/src/Magnum/Platform/GlfwApplication.cpp +++ b/src/Magnum/Platform/GlfwApplication.cpp @@ -27,6 +27,7 @@ #include "GlfwApplication.h" #include +#include #include "Magnum/Version.h" #include "Magnum/Platform/Context.h" @@ -245,6 +246,15 @@ GlfwApplication::Configuration::Configuration(): GlfwApplication::Configuration::~Configuration() = default; +std::string GlfwApplication::KeyEvent::keyName(const Key key) { + /* It can return null, so beware */ + return Utility::String::fromArray(glfwGetKeyName(int(key), 0)); +} + +std::string GlfwApplication::KeyEvent::keyName() const { + return keyName(_key); +} + template class BasicScreen; template class BasicScreenedApplication; diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index 63c44e4a0..af7a002bf 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -744,9 +744,15 @@ class GlfwApplication::KeyEvent: public GlfwApplication::InputEvent { Menu = GLFW_KEY_MENU /**< Menu */ }; - /** @brief Key */ + /** @copydoc Sdl2Application::KeyEvent::keyName(Key) */ + static std::string keyName(Key key); + + /** @copydoc Sdl2Application::KeyEvent::key() */ constexpr Key key() const { return _key; } + /** @copydoc Sdl2Application::KeyEvent::keyName() const */ + std::string keyName() const; + /** @brief Modifiers */ constexpr Modifiers modifiers() const { return _modifiers; } diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index 881652409..30b6ec26f 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -552,6 +552,14 @@ Sdl2Application::Configuration::Configuration(): Sdl2Application::Configuration::~Configuration() = default; +std::string Sdl2Application::KeyEvent::keyName(const Key key) { + return SDL_GetKeyName(SDL_Keycode(key)); +} + +std::string Sdl2Application::KeyEvent::keyName() const { + return keyName(_key); +} + Sdl2Application::InputEvent::Modifiers Sdl2Application::MouseEvent::modifiers() { if(_modifiersLoaded) return _modifiers; _modifiersLoaded = true; diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index cf2d4e01d..751c478e9 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -1212,9 +1212,34 @@ class Sdl2Application::KeyEvent: public Sdl2Application::InputEvent { Z = SDLK_z /**< Letter Z */ }; - /** @brief Key */ + /** + * @brief Name for given key + * + * Human-readable localized UTF-8 name for given @p key, intended for + * displaying to the user in e.g. key binding configuration. If there + * is no name for given key, empty string is returned. + * @see @ref keyName(Key) + */ + static std::string keyName(Key key); + + /** + * @brief Key + * + * @see @ref keyName() + */ constexpr Key key() const { return _key; } + /** + * @brief Key name + * + * Human-readable localized UTF-8 name for the key returned by + * @ref key(), intended for displaying to the user in e.g. + * key binding configuration. If there is no name for that key, empty + * string is returned. + * @see @ref keyName(Key) + */ + std::string keyName() const; + /** @brief Modifiers */ constexpr Modifiers modifiers() const { return _modifiers; } From bd24edd2adacff55fa9635e1c661c75edeade513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 16 Aug 2016 19:17:28 +0200 Subject: [PATCH 113/290] Platform: doc cleanup. --- src/Magnum/Platform/GlfwApplication.h | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index af7a002bf..1dfdfad48 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -569,7 +569,7 @@ CORRADE_ENUMSET_OPERATORS(GlfwApplication::InputEvent::Modifiers) /** @brief Key event -@see @ref keyPressEvent() +@see @ref keyPressEvent(), @ref keyReleaseEvent() */ class GlfwApplication::KeyEvent: public GlfwApplication::InputEvent { friend GlfwApplication; @@ -756,12 +756,7 @@ class GlfwApplication::KeyEvent: public GlfwApplication::InputEvent { /** @brief Modifiers */ constexpr Modifiers modifiers() const { return _modifiers; } - /** - * @brief Whether the key press is repeated - * - * Returns `true` if the key press event is repeated, `false` if not or - * if this was key release event. - */ + /** @copydoc Sdl2Application::KeyEvent::isRepeated() */ constexpr bool isRepeated() const { return _repeated; } private: From 4fe3afed2df473f7e85ab7e89af2ee43e6f16ecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 1 Aug 2016 23:35:17 +0200 Subject: [PATCH 114/290] package/ci: enable coverage reports on Travis CI. --- package/ci/travis-desktop.sh | 1 + package/ci/travis.yml | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/package/ci/travis-desktop.sh b/package/ci/travis-desktop.sh index b308763d2..de2dd4f8c 100755 --- a/package/ci/travis-desktop.sh +++ b/package/ci/travis-desktop.sh @@ -15,6 +15,7 @@ cd ../.. mkdir build && cd build cmake .. \ + -DCMAKE_CXX_FLAGS=$COVERAGE \ -DCMAKE_PREFIX_PATH="$HOME/deps;$HOME/sdl2;$HOME/glfw" \ -DCMAKE_BUILD_TYPE=Release \ -DWITH_AUDIO=ON \ diff --git a/package/ci/travis.yml b/package/ci/travis.yml index c4f9f1ef9..a8dbc4be9 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -57,8 +57,10 @@ cache: install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then pip install --user cpp-coveralls; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export CXX=g++-4.7; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export PLATFORM_GL_API=GLX; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then export COVERAGE="--coverage"; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then export PLATFORM_GL_API=CGL; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then gem install xcpretty; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then brew install emscripten && export LLVM=/usr/local/opt/emscripten/libexec/llvm/bin && emcc; fi @@ -80,3 +82,6 @@ script: - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then ./package/ci/travis-emscripten.sh; fi # Travis somehow is not able to gather all output, try to force it using this - sync + +after_success: +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -E ".*/(Test|magnum/build)/.*" --gcov-options '\-lp'; fi From e86d9100e32ff5b13cc20391c16cf933ce3062c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 2 Aug 2016 00:34:55 +0200 Subject: [PATCH 115/290] package/ci: ignore all GL-related code in the code coverage report. Can't run tests for that on Travis... --- package/ci/travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package/ci/travis.yml b/package/ci/travis.yml index a8dbc4be9..7005163e3 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -84,4 +84,5 @@ script: - sync after_success: -- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -E ".*/(Test|magnum/build)/.*" --gcov-options '\-lp'; fi +# Ignoring all stuff that needs GL context and thus can't be run on Travis +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -E "(.*/(Test|magnum/build|MagnumExternal|Shaders|Platform)/.*|.*/src/Magnum/(AbstractFramebuffer|AbstractObject|AbstractQuery|AbstractShaderProgram|AbstractTexture|Attribute|Buffer|BufferImage|BufferTexture|Context|CubeMapTexture|CubeMapTextureArray|DebugOutput|DefaultFramebuffer|Framebuffer|Mesh|MeshView|MultisampleTexture|OpenGL|PixelStorage|PrimitiveQuery|RectangleTexture|Renderbuffer|Renderer|SampleQuery|Sampler|Shader|Texture|TextureArray|TimeQuery|TransformFeedback|Implementation/BufferState|Implementation/DebugState|Implementation/driverSpecific|Implementation/FramebufferState|Implementation/maxTextureSize|Implementation/MeshState|Implementation/QueryState|Implementation/RendererState|Implementation/ShaderProgramState|Implementation/ShaderState|Implementation/State|Implementation/TextureState|Implementation/TransformFeedbackState)\\.(cpp|h))" --gcov-options '\-lp'; fi From 771b4d517a84660933f73cdca1471d3db1e00e51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 2 Aug 2016 01:13:36 +0200 Subject: [PATCH 116/290] Exclude debug operators from code coverage. --- src/Magnum/Attribute.cpp | 26 +++++++++++++++++++++++ src/Magnum/Audio/Buffer.cpp | 2 ++ src/Magnum/Audio/Context.cpp | 2 ++ src/Magnum/Audio/Renderer.cpp | 4 ++++ src/Magnum/Audio/Source.cpp | 2 ++ src/Magnum/Buffer.cpp | 2 ++ src/Magnum/Context.cpp | 2 ++ src/Magnum/DebugOutput.cpp | 8 +++++++ src/Magnum/DefaultFramebuffer.cpp | 2 ++ src/Magnum/Framebuffer.cpp | 2 ++ src/Magnum/Mesh.cpp | 4 ++++ src/Magnum/PixelFormat.cpp | 6 ++++++ src/Magnum/Renderer.cpp | 6 ++++++ src/Magnum/Resource.cpp | 2 ++ src/Magnum/Sampler.cpp | 12 +++++++++++ src/Magnum/SceneGraph/Animable.cpp | 2 ++ src/Magnum/Shader.cpp | 2 ++ src/Magnum/Shapes/shapeImplementation.cpp | 4 ++++ src/Magnum/Trade/AbstractMaterialData.cpp | 2 ++ src/Magnum/Trade/ObjectData2D.cpp | 2 ++ src/Magnum/Trade/ObjectData3D.cpp | 2 ++ src/Magnum/Trade/TextureData.cpp | 2 ++ src/Magnum/Version.cpp | 2 ++ 23 files changed, 100 insertions(+) diff --git a/src/Magnum/Attribute.cpp b/src/Magnum/Attribute.cpp index c3af6c051..901aa2c53 100644 --- a/src/Magnum/Attribute.cpp +++ b/src/Magnum/Attribute.cpp @@ -141,8 +141,10 @@ UnsignedInt Attribute>::size(GLint components, DataType d Debug& operator<<(Debug& debug, SizedAttribute<1, 1>::Components value) { switch(value) { + /* LCOV_EXCL_START */ case SizedAttribute<1, 1>::Components::One: return debug << "Attribute::Components::One"; + /* LCOV_EXCL_STOP */ } return debug << "Attribute::Components::(invalid)"; @@ -150,10 +152,12 @@ Debug& operator<<(Debug& debug, SizedAttribute<1, 1>::Components value) { Debug& operator<<(Debug& debug, SizedAttribute<1, 2>::Components value) { switch(value) { + /* LCOV_EXCL_START */ case SizedAttribute<1, 2>::Components::One: return debug << "Attribute::Components::One"; case SizedAttribute<1, 2>::Components::Two: return debug << "Attribute::Components::Two"; + /* LCOV_EXCL_STOP */ } return debug << "Attribute::Components::(invalid)"; @@ -161,12 +165,14 @@ Debug& operator<<(Debug& debug, SizedAttribute<1, 2>::Components value) { Debug& operator<<(Debug& debug, SizedAttribute<1, 3>::Components value) { switch(value) { + /* LCOV_EXCL_START */ case SizedAttribute<1, 3>::Components::One: return debug << "Attribute::Components::One"; case SizedAttribute<1, 3>::Components::Two: return debug << "Attribute::Components::Two"; case SizedAttribute<1, 3>::Components::Three: return debug << "Attribute::Components::Three"; + /* LCOV_EXCL_STOP */ } return debug << "Attribute::Components::(invalid)"; @@ -174,6 +180,7 @@ Debug& operator<<(Debug& debug, SizedAttribute<1, 3>::Components value) { Debug& operator<<(Debug& debug, SizedAttribute<1, 4>::Components value) { switch(value) { + /* LCOV_EXCL_START */ case SizedAttribute<1, 4>::Components::One: return debug << "Attribute::Components::One"; case SizedAttribute<1, 4>::Components::Two: @@ -182,6 +189,7 @@ Debug& operator<<(Debug& debug, SizedAttribute<1, 4>::Components value) { return debug << "Attribute::Components::Three"; case SizedAttribute<1, 4>::Components::Four: return debug << "Attribute::Components::Four"; + /* LCOV_EXCL_STOP */ } return debug << "Attribute::Components::(invalid)"; @@ -189,8 +197,10 @@ Debug& operator<<(Debug& debug, SizedAttribute<1, 4>::Components value) { Debug& operator<<(Debug& debug, SizedMatrixAttribute<2>::Components value) { switch(value) { + /* LCOV_EXCL_START */ case SizedMatrixAttribute<2>::Components::Two: return debug << "Attribute::Components::Two"; + /* LCOV_EXCL_STOP */ } return debug << "Attribute::Components::(invalid)"; @@ -198,8 +208,10 @@ Debug& operator<<(Debug& debug, SizedMatrixAttribute<2>::Components value) { Debug& operator<<(Debug& debug, SizedMatrixAttribute<3>::Components value) { switch(value) { + /* LCOV_EXCL_START */ case SizedMatrixAttribute<3>::Components::Three: return debug << "Attribute::Components::Three"; + /* LCOV_EXCL_STOP */ } return debug << "Attribute::Components::(invalid)"; @@ -207,8 +219,10 @@ Debug& operator<<(Debug& debug, SizedMatrixAttribute<3>::Components value) { Debug& operator<<(Debug& debug, SizedMatrixAttribute<4>::Components value) { switch(value) { + /* LCOV_EXCL_START */ case SizedMatrixAttribute<4>::Components::Four: return debug << "Attribute::Components::Four"; + /* LCOV_EXCL_STOP */ } return debug << "Attribute::Components::(invalid)"; @@ -216,6 +230,7 @@ Debug& operator<<(Debug& debug, SizedMatrixAttribute<4>::Components value) { Debug& operator<<(Debug& debug, Attribute>::Components value) { switch(value) { + /* LCOV_EXCL_START */ case Attribute>::Components::One: return debug << "Attribute::Components::One"; case Attribute>::Components::Two: @@ -228,6 +243,7 @@ Debug& operator<<(Debug& debug, Attribute>::Components va case Attribute>::Components::BGRA: return debug << "Attribute::Components::BGRA"; #endif + /* LCOV_EXCL_STOP */ } return debug << "Attribute::Components::(invalid)"; @@ -235,6 +251,7 @@ Debug& operator<<(Debug& debug, Attribute>::Components va Debug& operator<<(Debug& debug, FloatAttribute::DataType value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case FloatAttribute::DataType::value: return debug << "Attribute::DataType::" #value; _c(UnsignedByte) _c(Byte) @@ -248,6 +265,7 @@ Debug& operator<<(Debug& debug, FloatAttribute::DataType value) { _c(Double) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Attribute::DataType::(invalid)"; @@ -256,6 +274,7 @@ Debug& operator<<(Debug& debug, FloatAttribute::DataType value) { #ifndef MAGNUM_TARGET_GLES2 Debug& operator<<(Debug& debug, IntAttribute::DataType value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case IntAttribute::DataType::value: return debug << "Attribute::DataType::" #value; _c(UnsignedByte) _c(Byte) @@ -264,6 +283,7 @@ Debug& operator<<(Debug& debug, IntAttribute::DataType value) { _c(UnsignedInt) _c(Int) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Attribute::DataType::(invalid)"; @@ -273,9 +293,11 @@ Debug& operator<<(Debug& debug, IntAttribute::DataType value) { #ifndef MAGNUM_TARGET_GLES Debug& operator<<(Debug& debug, DoubleAttribute::DataType value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case DoubleAttribute::DataType::value: return debug << "Attribute::DataType::" #value; _c(Double) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Attribute::DataType::(invalid)"; @@ -284,6 +306,7 @@ Debug& operator<<(Debug& debug, DoubleAttribute::DataType value) { Debug& operator<<(Debug& debug, Attribute>::DataType value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Attribute>::DataType::value: return debug << "Attribute::DataType::" #value; _c(UnsignedByte) _c(Byte) @@ -298,6 +321,7 @@ Debug& operator<<(Debug& debug, Attribute>::DataType valu _c(UnsignedInt10f11f11fRev) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Attribute::DataType::(invalid)"; @@ -305,6 +329,7 @@ Debug& operator<<(Debug& debug, Attribute>::DataType valu Debug& operator<<(Debug& debug, Attribute>::DataType value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Attribute>::DataType::value: return debug << "Attribute::DataType::" #value; _c(UnsignedByte) _c(Byte) @@ -322,6 +347,7 @@ Debug& operator<<(Debug& debug, Attribute>::DataType valu _c(Int2101010Rev) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Attribute::DataType::(invalid)"; diff --git a/src/Magnum/Audio/Buffer.cpp b/src/Magnum/Audio/Buffer.cpp index cc1f00cde..8b0990d73 100644 --- a/src/Magnum/Audio/Buffer.cpp +++ b/src/Magnum/Audio/Buffer.cpp @@ -31,6 +31,7 @@ namespace Magnum { namespace Audio { Debug& operator<<(Debug& debug, const Buffer::Format value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Buffer::Format::value: return debug << "Audio::Buffer::Format::" #value; _c(Mono8) _c(Mono16) @@ -42,6 +43,7 @@ Debug& operator<<(Debug& debug, const Buffer::Format value) { _c(MonoDouble) _c(StereoDouble) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Audio::Buffer::Format::(invalid)"; diff --git a/src/Magnum/Audio/Context.cpp b/src/Magnum/Audio/Context.cpp index 70a331db2..44855aac5 100644 --- a/src/Magnum/Audio/Context.cpp +++ b/src/Magnum/Audio/Context.cpp @@ -55,6 +55,7 @@ const std::vector& Extension::extensions() { Debug& operator<<(Debug& debug, const Context::HrtfStatus value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Context::HrtfStatus::value: return debug << "Audio::Context::HrtfStatus::" #value; _c(Disabled) _c(Enabled) @@ -63,6 +64,7 @@ Debug& operator<<(Debug& debug, const Context::HrtfStatus value) { _c(Detected) _c(UnsupportedFormat) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Audio::Context::HrtfStatus::(invalid)"; diff --git a/src/Magnum/Audio/Renderer.cpp b/src/Magnum/Audio/Renderer.cpp index db5fcee9b..afe320893 100644 --- a/src/Magnum/Audio/Renderer.cpp +++ b/src/Magnum/Audio/Renderer.cpp @@ -31,6 +31,7 @@ namespace Magnum { namespace Audio { Debug& operator<<(Debug& debug, const Renderer::Error value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Renderer::Error::value: return debug << "Audio::Renderer::Error::" #value; _c(NoError) _c(InvalidName) @@ -39,6 +40,7 @@ Debug& operator<<(Debug& debug, const Renderer::Error value) { _c(InvalidOperation) _c(OutOfMemory) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Audio::Renderer::Error::(invalid)"; @@ -46,6 +48,7 @@ Debug& operator<<(Debug& debug, const Renderer::Error value) { Debug& operator<<(Debug& debug, const Renderer::DistanceModel value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Renderer::DistanceModel::value: return debug << "Audio::Renderer::DistanceModel::" #value; _c(None) _c(Inverse) @@ -55,6 +58,7 @@ Debug& operator<<(Debug& debug, const Renderer::DistanceModel value) { _c(Exponent) _c(ExponentClamped) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Audio::Renderer::DistanceModel::(invalid)"; diff --git a/src/Magnum/Audio/Source.cpp b/src/Magnum/Audio/Source.cpp index 7e47c1f5e..c659d6ab5 100644 --- a/src/Magnum/Audio/Source.cpp +++ b/src/Magnum/Audio/Source.cpp @@ -98,12 +98,14 @@ void Source::rewind(const std::vector>& sources) Debug& operator<<(Debug& debug, const Source::State value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Source::State::value: return debug << "Audio::Source::State::" #value; _c(Initial) _c(Playing) _c(Paused) _c(Stopped) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Audio::Source::State::(invalid)"; diff --git a/src/Magnum/Buffer.cpp b/src/Magnum/Buffer.cpp index 00a72cd83..b111181af 100644 --- a/src/Magnum/Buffer.cpp +++ b/src/Magnum/Buffer.cpp @@ -624,6 +624,7 @@ bool Buffer::unmapImplementationDSAEXT() { #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, Buffer::TargetHint value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Buffer::TargetHint::value: return debug << "Buffer::TargetHint::" #value; _c(Array) #ifndef MAGNUM_TARGET_GLES2 @@ -653,6 +654,7 @@ Debug& operator<<(Debug& debug, Buffer::TargetHint value) { _c(Uniform) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Buffer::TargetHint::(invalid)"; diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index ed1c6e892..4d6095d23 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -830,6 +830,7 @@ void Context::resetState(const States states) { #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const Context::Flag value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Context::Flag::value: return debug << "Context::Flag::" #value; _c(Debug) _c(NoError) @@ -837,6 +838,7 @@ Debug& operator<<(Debug& debug, const Context::Flag value) { _c(RobustAccess) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Context::Flag::(invalid)"; diff --git a/src/Magnum/DebugOutput.cpp b/src/Magnum/DebugOutput.cpp index f6cfe733e..a9e69bc3b 100644 --- a/src/Magnum/DebugOutput.cpp +++ b/src/Magnum/DebugOutput.cpp @@ -227,6 +227,7 @@ void DebugOutput::callbackImplementationKhr(const Callback callback, const void* #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const DebugOutput::Source value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case DebugOutput::Source::value: return debug << "DebugOutput::Source::" #value; _c(Api) _c(WindowSystem) @@ -235,6 +236,7 @@ Debug& operator<<(Debug& debug, const DebugOutput::Source value) { _c(Application) _c(Other) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "DebugOutput::Source::(invalid)"; @@ -242,6 +244,7 @@ Debug& operator<<(Debug& debug, const DebugOutput::Source value) { Debug& operator<<(Debug& debug, const DebugOutput::Type value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case DebugOutput::Type::value: return debug << "DebugOutput::Type::" #value; _c(Error) _c(DeprecatedBehavior) @@ -253,6 +256,7 @@ Debug& operator<<(Debug& debug, const DebugOutput::Type value) { _c(PopGroup) _c(Other) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "DebugOutput::Type::(invalid)"; @@ -314,6 +318,7 @@ void DebugMessage::insertImplementationGremedy(Source, Type, UnsignedInt, DebugO #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const DebugMessage::Source value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case DebugMessage::Source::value: return debug << "DebugMessage::Source::" #value; _c(ThirdParty) _c(Application) @@ -325,6 +330,7 @@ Debug& operator<<(Debug& debug, const DebugMessage::Source value) { case DebugMessage::Source::Other: return debug << DebugOutput::Source(value); #endif + /* LCOV_EXCL_STOP */ } return debug << "DebugMessage::Source::(invalid)"; @@ -426,10 +432,12 @@ void DebugGroup::popImplementationExt() { #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const DebugGroup::Source value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case DebugGroup::Source::value: return debug << "DebugGroup::Source::" #value; _c(ThirdParty) _c(Application) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "DebugGroup::Source::(invalid)"; diff --git a/src/Magnum/DefaultFramebuffer.cpp b/src/Magnum/DefaultFramebuffer.cpp index c8a148676..2f980fe47 100644 --- a/src/Magnum/DefaultFramebuffer.cpp +++ b/src/Magnum/DefaultFramebuffer.cpp @@ -117,12 +117,14 @@ void DefaultFramebuffer::initializeContextBasedFunctionality(Context& context) { #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const DefaultFramebuffer::Status value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case DefaultFramebuffer::Status::value: return debug << "DefaultFramebuffer::Status::" #value; _c(Complete) #ifndef MAGNUM_TARGET_WEBGL _c(Undefined) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "DefaultFramebuffer::Status::(invalid)"; diff --git a/src/Magnum/Framebuffer.cpp b/src/Magnum/Framebuffer.cpp index 096e47620..7bc67dea3 100644 --- a/src/Magnum/Framebuffer.cpp +++ b/src/Magnum/Framebuffer.cpp @@ -408,6 +408,7 @@ void Framebuffer::textureLayerImplementationDSAEXT(BufferAttachment attachment, #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const Framebuffer::Status value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Framebuffer::Status::value: return debug << "Framebuffer::Status::" #value; _c(Complete) _c(IncompleteAttachment) @@ -424,6 +425,7 @@ Debug& operator<<(Debug& debug, const Framebuffer::Status value) { _c(IncompleteLayerTargets) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Framebuffer::Status::(invalid)"; diff --git a/src/Magnum/Mesh.cpp b/src/Magnum/Mesh.cpp index 96631277f..b6799676c 100644 --- a/src/Magnum/Mesh.cpp +++ b/src/Magnum/Mesh.cpp @@ -637,6 +637,7 @@ void Mesh::drawElementsInstancedImplementationNV(const GLsizei count, const GLin #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, MeshPrimitive value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case MeshPrimitive::value: return debug << "MeshPrimitive::" #value; _c(Points) _c(LineStrip) @@ -655,6 +656,7 @@ Debug& operator<<(Debug& debug, MeshPrimitive value) { _c(Patches) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "MeshPrimitive::(invalid)"; @@ -662,11 +664,13 @@ Debug& operator<<(Debug& debug, MeshPrimitive value) { Debug& operator<<(Debug& debug, Mesh::IndexType value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Mesh::IndexType::value: return debug << "Mesh::IndexType::" #value; _c(UnsignedByte) _c(UnsignedShort) _c(UnsignedInt) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Mesh::IndexType::(invalid)"; diff --git a/src/Magnum/PixelFormat.cpp b/src/Magnum/PixelFormat.cpp index 7059b7a38..4fe23e67a 100644 --- a/src/Magnum/PixelFormat.cpp +++ b/src/Magnum/PixelFormat.cpp @@ -32,6 +32,7 @@ namespace Magnum { #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const PixelFormat value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case PixelFormat::value: return debug << "PixelFormat::" #value; #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) _c(Red) @@ -77,6 +78,7 @@ Debug& operator<<(Debug& debug, const PixelFormat value) { #endif _c(DepthStencil) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "PixelFormat::(invalid)"; @@ -84,6 +86,7 @@ Debug& operator<<(Debug& debug, const PixelFormat value) { Debug& operator<<(Debug& debug, const PixelType value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case PixelType::value: return debug << "PixelType::" #value; _c(UnsignedByte) #ifndef MAGNUM_TARGET_GLES2 @@ -132,6 +135,7 @@ Debug& operator<<(Debug& debug, const PixelType value) { _c(Float32UnsignedInt248Rev) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "PixelType::(invalid)"; @@ -139,6 +143,7 @@ Debug& operator<<(Debug& debug, const PixelType value) { Debug& operator<<(Debug& debug, const CompressedPixelFormat value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case CompressedPixelFormat::value: return debug << "CompressedPixelFormat::" #value; #ifndef MAGNUM_TARGET_GLES _c(Red) @@ -201,6 +206,7 @@ Debug& operator<<(Debug& debug, const CompressedPixelFormat value) { _c(SRGB8Alpha8Astc12x12) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "CompressedPixelFormat::(invalid)"; diff --git a/src/Magnum/Renderer.cpp b/src/Magnum/Renderer.cpp index ef9338896..0b1a7de29 100644 --- a/src/Magnum/Renderer.cpp +++ b/src/Magnum/Renderer.cpp @@ -241,6 +241,7 @@ Renderer::GraphicsResetStatus Renderer::graphicsResetStatusImplementationRobustn #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const Renderer::Error value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Renderer::Error::value: return debug << "Renderer::Error::" #value; _c(NoError) _c(InvalidEnum) @@ -253,6 +254,7 @@ Debug& operator<<(Debug& debug, const Renderer::Error value) { _c(StackOverflow) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Renderer::Error::(invalid)"; @@ -261,10 +263,12 @@ Debug& operator<<(Debug& debug, const Renderer::Error value) { #ifndef MAGNUM_TARGET_WEBGL Debug& operator<<(Debug& debug, const Renderer::ResetNotificationStrategy value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Renderer::ResetNotificationStrategy::value: return debug << "Renderer::ResetNotificationStrategy::" #value; _c(NoResetNotification) _c(LoseContextOnReset) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Renderer::ResetNotificationStrategy::(invalid)"; @@ -272,12 +276,14 @@ Debug& operator<<(Debug& debug, const Renderer::ResetNotificationStrategy value) Debug& operator<<(Debug& debug, const Renderer::GraphicsResetStatus value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Renderer::GraphicsResetStatus::value: return debug << "Renderer::GraphicsResetStatus::" #value; _c(NoError) _c(GuiltyContextReset) _c(InnocentContextReset) _c(UnknownContextReset) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Renderer::ResetNotificationStrategy::(invalid)"; diff --git a/src/Magnum/Resource.cpp b/src/Magnum/Resource.cpp index 8106b18ed..5aac6adab 100644 --- a/src/Magnum/Resource.cpp +++ b/src/Magnum/Resource.cpp @@ -30,6 +30,7 @@ namespace Magnum { #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const ResourceState value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case ResourceState::value: return debug << "ResourceState::" #value; _c(NotLoaded) _c(NotLoadedFallback) @@ -40,6 +41,7 @@ Debug& operator<<(Debug& debug, const ResourceState value) { _c(Mutable) _c(Final) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "ResourceState::(invalid)"; diff --git a/src/Magnum/Sampler.cpp b/src/Magnum/Sampler.cpp index e2a8fee14..fbf9e4740 100644 --- a/src/Magnum/Sampler.cpp +++ b/src/Magnum/Sampler.cpp @@ -63,10 +63,12 @@ Float Sampler::maxMaxAnisotropy() { #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const Sampler::Filter value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Sampler::Filter::value: return debug << "Sampler::Filter::" #value; _c(Nearest) _c(Linear) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Sampler::Filter::(invalid)"; @@ -74,11 +76,13 @@ Debug& operator<<(Debug& debug, const Sampler::Filter value) { Debug& operator<<(Debug& debug, const Sampler::Mipmap value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Sampler::Mipmap::value: return debug << "Sampler::Mipmap::" #value; _c(Base) _c(Nearest) _c(Linear) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Sampler::Mipmap::(invalid)"; @@ -86,6 +90,7 @@ Debug& operator<<(Debug& debug, const Sampler::Mipmap value) { Debug& operator<<(Debug& debug, const Sampler::Wrapping value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Sampler::Wrapping::value: return debug << "Sampler::Wrapping::" #value; _c(Repeat) _c(MirroredRepeat) @@ -97,6 +102,7 @@ Debug& operator<<(Debug& debug, const Sampler::Wrapping value) { _c(MirrorClampToEdge) #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Sampler::Wrapping::(invalid)"; @@ -105,10 +111,12 @@ Debug& operator<<(Debug& debug, const Sampler::Wrapping value) { #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) Debug& operator<<(Debug& debug, const Sampler::CompareMode value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Sampler::CompareMode::value: return debug << "Sampler::CompareMode::" #value; _c(None) _c(CompareRefToTexture) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Sampler::CompareFunction::(invalid)"; @@ -116,6 +124,7 @@ Debug& operator<<(Debug& debug, const Sampler::CompareMode value) { Debug& operator<<(Debug& debug, const Sampler::CompareFunction value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Sampler::CompareFunction::value: return debug << "Sampler::CompareFunction::" #value; _c(Never) _c(Always) @@ -126,6 +135,7 @@ Debug& operator<<(Debug& debug, const Sampler::CompareFunction value) { _c(GreaterOrEqual) _c(Greater) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Sampler::CompareFunction::(invalid)"; @@ -135,10 +145,12 @@ Debug& operator<<(Debug& debug, const Sampler::CompareFunction value) { #ifndef MAGNUM_TARGET_GLES Debug& operator<<(Debug& debug, const Sampler::DepthStencilMode value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Sampler::DepthStencilMode::value: return debug << "Sampler::DepthStencilMode::" #value; _c(DepthComponent) _c(StencilIndex) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Sampler::DepthStencilMode::(invalid)"; diff --git a/src/Magnum/SceneGraph/Animable.cpp b/src/Magnum/SceneGraph/Animable.cpp index 4ea4ce845..504f3079c 100644 --- a/src/Magnum/SceneGraph/Animable.cpp +++ b/src/Magnum/SceneGraph/Animable.cpp @@ -31,11 +31,13 @@ namespace Magnum { namespace SceneGraph { Debug& operator<<(Debug& debug, AnimationState value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case AnimationState::value: return debug << "SceneGraph::AnimationState::" #value; _c(Stopped) _c(Paused) _c(Running) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "SceneGraph::AnimationState::(invalid)"; diff --git a/src/Magnum/Shader.cpp b/src/Magnum/Shader.cpp index eba5bb1ad..e1435b542 100644 --- a/src/Magnum/Shader.cpp +++ b/src/Magnum/Shader.cpp @@ -892,6 +892,7 @@ bool Shader::compile(std::initializer_list> shade #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const Shader::Type value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case Shader::Type::value: return debug << "Shader::Type::" #value; _c(Vertex) #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) @@ -902,6 +903,7 @@ Debug& operator<<(Debug& debug, const Shader::Type value) { #endif _c(Fragment) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Shader::Type::(invalid)"; diff --git a/src/Magnum/Shapes/shapeImplementation.cpp b/src/Magnum/Shapes/shapeImplementation.cpp index b2fc534df..f48741e4d 100644 --- a/src/Magnum/Shapes/shapeImplementation.cpp +++ b/src/Magnum/Shapes/shapeImplementation.cpp @@ -31,6 +31,7 @@ namespace Magnum { namespace Shapes { namespace Implementation { Debug& operator<<(Debug& debug, ShapeDimensionTraits<2>::Type value) { switch(value) { + /* LCOV_EXCL_START */ #define _val(value) case ShapeDimensionTraits<2>::Type::value: return debug << "Shapes::Shape2D::Type::" #value; _val(Point) _val(Line) @@ -43,6 +44,7 @@ Debug& operator<<(Debug& debug, ShapeDimensionTraits<2>::Type value) { _val(Box) _val(Composition) #undef _val + /* LCOV_EXCL_STOP */ } return debug << "Shapes::Shape2D::Type::(unknown)"; @@ -50,6 +52,7 @@ Debug& operator<<(Debug& debug, ShapeDimensionTraits<2>::Type value) { Debug& operator<<(Debug& debug, ShapeDimensionTraits<3>::Type value) { switch(value) { + /* LCOV_EXCL_START */ #define _val(value) case ShapeDimensionTraits<3>::Type::value: return debug << "Shapes::Shape3D::Type::" #value; _val(Point) _val(Line) @@ -63,6 +66,7 @@ Debug& operator<<(Debug& debug, ShapeDimensionTraits<3>::Type value) { _val(Plane) _val(Composition) #undef _val + /* LCOV_EXCL_STOP */ } return debug << "Shapes::Shape3D::Type::(unknown)"; diff --git a/src/Magnum/Trade/AbstractMaterialData.cpp b/src/Magnum/Trade/AbstractMaterialData.cpp index c60d10001..1e585630c 100644 --- a/src/Magnum/Trade/AbstractMaterialData.cpp +++ b/src/Magnum/Trade/AbstractMaterialData.cpp @@ -35,9 +35,11 @@ AbstractMaterialData::~AbstractMaterialData() {} Debug& operator<<(Debug& debug, const MaterialType value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case MaterialType::value: return debug << "Trade::MaterialType::" #value; _c(Phong) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Trade::MaterialType::(unknown)"; diff --git a/src/Magnum/Trade/ObjectData2D.cpp b/src/Magnum/Trade/ObjectData2D.cpp index 4ea19c029..7505e4528 100644 --- a/src/Magnum/Trade/ObjectData2D.cpp +++ b/src/Magnum/Trade/ObjectData2D.cpp @@ -40,11 +40,13 @@ ObjectData2D& ObjectData2D::operator=(ObjectData2D&&) = default; #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, ObjectInstanceType2D value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case ObjectInstanceType2D::value: return debug << "Trade::ObjectInstanceType2D::" #value; _c(Camera) _c(Mesh) _c(Empty) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Trade::ObjectInstanceType2D::(invalid)"; diff --git a/src/Magnum/Trade/ObjectData3D.cpp b/src/Magnum/Trade/ObjectData3D.cpp index c0e0cfc94..c86829bc2 100644 --- a/src/Magnum/Trade/ObjectData3D.cpp +++ b/src/Magnum/Trade/ObjectData3D.cpp @@ -40,12 +40,14 @@ ObjectData3D& ObjectData3D::operator=(ObjectData3D&&) = default; #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, ObjectInstanceType3D value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case ObjectInstanceType3D::value: return debug << "Trade::ObjectInstanceType3D::" #value; _c(Camera) _c(Light) _c(Mesh) _c(Empty) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Trade::ObjectInstanceType3D::(invalid)"; diff --git a/src/Magnum/Trade/TextureData.cpp b/src/Magnum/Trade/TextureData.cpp index d0be1a163..b646306b3 100644 --- a/src/Magnum/Trade/TextureData.cpp +++ b/src/Magnum/Trade/TextureData.cpp @@ -30,12 +30,14 @@ namespace Magnum { namespace Trade { #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, const TextureData::Type value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value) case TextureData::Type::value: return debug << "Trade::TextureData::Type::" #value; _c(Texture1D) _c(Texture2D) _c(Texture3D) _c(Cube) #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Trade::TextureData::Type::(unknown)"; diff --git a/src/Magnum/Version.cpp b/src/Magnum/Version.cpp index c0853dff7..43c42aa51 100644 --- a/src/Magnum/Version.cpp +++ b/src/Magnum/Version.cpp @@ -32,6 +32,7 @@ namespace Magnum { #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, Version value) { switch(value) { + /* LCOV_EXCL_START */ #define _c(value, string) case Version::value: return debug << string; _c(None, "None") #ifndef MAGNUM_TARGET_GLES @@ -56,6 +57,7 @@ Debug& operator<<(Debug& debug, Version value) { _c(GLES310, "OpenGL ES 3.1") #endif #undef _c + /* LCOV_EXCL_STOP */ } return debug << "Invalid"; From d9f83f1fd2a1cfdeb73b406c8776ebdfe3fbdb89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 16 Aug 2016 16:32:18 +0200 Subject: [PATCH 117/290] Audio: test Buffer construction. --- src/Magnum/Audio/Test/BufferTest.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Audio/Test/BufferTest.cpp b/src/Magnum/Audio/Test/BufferTest.cpp index c98c6e746..8de56d8b9 100644 --- a/src/Magnum/Audio/Test/BufferTest.cpp +++ b/src/Magnum/Audio/Test/BufferTest.cpp @@ -27,17 +27,27 @@ #include #include "Magnum/Audio/Buffer.h" +#include "Magnum/Audio/Context.h" namespace Magnum { namespace Audio { namespace Test { struct BufferTest: TestSuite::Tester { explicit BufferTest(); + void construct(); void debugFormat(); + + Context _context; }; BufferTest::BufferTest() { - addTests({&BufferTest::debugFormat}); + addTests({&BufferTest::construct, + &BufferTest::debugFormat}); +} + +void BufferTest::construct() { + Buffer buf; + CORRADE_VERIFY(buf.id() != 0); } void BufferTest::debugFormat() { From b969c714034b2e9b0cdda47a31e382a44a0cdfec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 16 Aug 2016 16:49:20 +0200 Subject: [PATCH 118/290] Audio: minor cleanup. --- src/Magnum/Audio/Buffer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Audio/Buffer.h b/src/Magnum/Audio/Buffer.h index fec59322f..4f521fc21 100644 --- a/src/Magnum/Audio/Buffer.h +++ b/src/Magnum/Audio/Buffer.h @@ -55,7 +55,7 @@ class Buffer { Mono8 = AL_FORMAT_MONO8, /**< 8-bit unsigned mono */ Mono16 = AL_FORMAT_MONO16, /**< 16-bit signed mono */ Stereo8 = AL_FORMAT_STEREO8, /**< 8-bit interleaved unsigned stereo */ - Stereo16 = AL_FORMAT_STEREO16, /**< 16-bit interleaved signed stereo */ + Stereo16 = AL_FORMAT_STEREO16, /**< 16-bit interleaved signed stereo */ /** * @brief 32-bit floating-point mono From 26d0df06b7ecf9e489388707da7863b58220176b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 16 Aug 2016 16:32:38 +0200 Subject: [PATCH 119/290] Test ResourceState debug output. --- src/Magnum/Test/ResourceManagerTest.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Test/ResourceManagerTest.cpp b/src/Magnum/Test/ResourceManagerTest.cpp index d746901cf..58d5d19ba 100644 --- a/src/Magnum/Test/ResourceManagerTest.cpp +++ b/src/Magnum/Test/ResourceManagerTest.cpp @@ -45,6 +45,8 @@ struct ResourceManagerTest: TestSuite::Tester { void clear(); void clearWhileReferenced(); void loader(); + + void debugResourceState(); }; struct Data { @@ -69,7 +71,9 @@ ResourceManagerTest::ResourceManagerTest() { &ResourceManagerTest::defaults, &ResourceManagerTest::clear, &ResourceManagerTest::clearWhileReferenced, - &ResourceManagerTest::loader}); + &ResourceManagerTest::loader, + + &ResourceManagerTest::debugResourceState}); } void ResourceManagerTest::state() { @@ -326,6 +330,12 @@ void ResourceManagerTest::loader() { CORRADE_COMPARE(Data::count, 0); } +void ResourceManagerTest::debugResourceState() { + std::ostringstream out; + Debug{&out} << ResourceState::Loading; + CORRADE_COMPARE(out.str(), "ResourceState::Loading\n"); +} + }} CORRADE_TEST_MAIN(Magnum::Test::ResourceManagerTest) From 6a8c121c81fdebc7108d53c4db0e3d89c56a4733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 17 Aug 2016 09:32:40 +0200 Subject: [PATCH 120/290] Platform: glfwGetKeyName() is since 3.2. --- src/Magnum/Platform/GlfwApplication.cpp | 2 ++ src/Magnum/Platform/GlfwApplication.h | 25 +++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Platform/GlfwApplication.cpp b/src/Magnum/Platform/GlfwApplication.cpp index 3b65d9450..65e1d7780 100644 --- a/src/Magnum/Platform/GlfwApplication.cpp +++ b/src/Magnum/Platform/GlfwApplication.cpp @@ -246,6 +246,7 @@ GlfwApplication::Configuration::Configuration(): GlfwApplication::Configuration::~Configuration() = default; +#if defined(DOXYGEN_GENERATING_OUTPUT) || GLFW_VERSION_MAJOR*100 + GLFW_VERSION_MINOR >= 302 std::string GlfwApplication::KeyEvent::keyName(const Key key) { /* It can return null, so beware */ return Utility::String::fromArray(glfwGetKeyName(int(key), 0)); @@ -254,6 +255,7 @@ std::string GlfwApplication::KeyEvent::keyName(const Key key) { std::string GlfwApplication::KeyEvent::keyName() const { return keyName(_key); } +#endif template class BasicScreen; template class BasicScreenedApplication; diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index 1dfdfad48..8d0655cfa 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -744,14 +744,35 @@ class GlfwApplication::KeyEvent: public GlfwApplication::InputEvent { Menu = GLFW_KEY_MENU /**< Menu */ }; - /** @copydoc Sdl2Application::KeyEvent::keyName(Key) */ + #if defined(DOXYGEN_GENERATING_OUTPUT) || GLFW_VERSION_MAJOR*100 + GLFW_VERSION_MINOR >= 302 + /** + * @brief Name for given key + * + * Human-readable localized UTF-8 name for given @p key, intended for + * displaying to the user in e.g. key binding configuration. If there + * is no name for given key, empty string is returned. + * @see @ref keyName(Key) + * @note Supported since GLFW 3.2. + */ static std::string keyName(Key key); + #endif /** @copydoc Sdl2Application::KeyEvent::key() */ constexpr Key key() const { return _key; } - /** @copydoc Sdl2Application::KeyEvent::keyName() const */ + #if defined(DOXYGEN_GENERATING_OUTPUT) || GLFW_VERSION_MAJOR*100 + GLFW_VERSION_MINOR >= 302 + /** + * @brief Key name + * + * Human-readable localized UTF-8 name for the key returned by + * @ref key(), intended for displaying to the user in e.g. + * key binding configuration. If there is no name for that key, empty + * string is returned. + * @see @ref keyName(Key) + * @note Supported since GLFW 3.2. + */ std::string keyName() const; + #endif /** @brief Modifiers */ constexpr Modifiers modifiers() const { return _modifiers; } From f3f4f1c779adf4eb4770e66a7201435a98549129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 17 Aug 2016 09:41:44 +0200 Subject: [PATCH 121/290] Platform: include version-specific APIs in Doxygen, too. --- src/Magnum/Platform/GlfwApplication.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index 8d0655cfa..8613213f5 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -276,7 +276,7 @@ class GlfwApplication::Configuration { * @see @ref Flags, @ref setFlags(), @ref Context::Flag */ enum class Flag: Int { - #ifdef GLFW_CONTEXT_NO_ERROR + #if defined(DOXYGEN_GENERATING_OUTPUT) || defined(GLFW_CONTEXT_NO_ERROR) /** * Specifies whether errors should be generated by the context. * If enabled, situations that would have generated errors instead @@ -308,7 +308,7 @@ class GlfwApplication::Configuration { Resizeable = 1 << 1, /**< Resizeable window */ Hidden = 1 << 2, /**< Hidden window */ - #ifdef GLFW_MAXIMIZED + #if defined(DOXYGEN_GENERATING_OUTPUT) || defined(GLFW_MAXIMIZED) /** * Maximized window * From 3ab77b91126f558b7e6d1c51628e82ac85cc90e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 20 Aug 2016 23:59:15 +0200 Subject: [PATCH 122/290] Stress how Array instances returned from plugins should look like. --- src/Magnum/Audio/AbstractImporter.h | 5 +++++ src/Magnum/Text/AbstractFontConverter.h | 5 +++++ src/Magnum/Trade/AbstractImageConverter.h | 5 +++++ src/Magnum/Trade/AbstractImporter.h | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/src/Magnum/Audio/AbstractImporter.h b/src/Magnum/Audio/AbstractImporter.h index 13daf32dd..1e069f2e5 100644 --- a/src/Magnum/Audio/AbstractImporter.h +++ b/src/Magnum/Audio/AbstractImporter.h @@ -61,6 +61,11 @@ checked by the implementation: there is any file opened. Plugin interface string is `"cz.mosra.magnum.Audio.AbstractImporter/0.1"`. + +@attention @ref Containers::Array instances returned from the plugin should + *not* use anything else than the default deleter, otherwise this can cause + dangling function pointer call on array destruction if the plugin gets + unloaded before the array is destroyed. */ class MAGNUM_AUDIO_EXPORT AbstractImporter: public PluginManager::AbstractManagingPlugin { CORRADE_PLUGIN_INTERFACE("cz.mosra.magnum.Audio.AbstractImporter/0.1") diff --git a/src/Magnum/Text/AbstractFontConverter.h b/src/Magnum/Text/AbstractFontConverter.h index 22c4c264c..04ceeef0e 100644 --- a/src/Magnum/Text/AbstractFontConverter.h +++ b/src/Magnum/Text/AbstractFontConverter.h @@ -69,6 +69,11 @@ checked by the implementation: array passed. Plugin interface string is `"cz.mosra.magnum.Text.AbstractFontConverter/0.1.2"`. + +@attention @ref Containers::Array instances returned from the plugin should + *not* use anything else than the default deleter, otherwise this can cause + dangling function pointer call on array destruction if the plugin gets + unloaded before the array is destroyed. */ class MAGNUM_TEXT_EXPORT AbstractFontConverter: public PluginManager::AbstractPlugin { CORRADE_PLUGIN_INTERFACE("cz.mosra.magnum.Text.AbstractFontConverter/0.1.2") diff --git a/src/Magnum/Trade/AbstractImageConverter.h b/src/Magnum/Trade/AbstractImageConverter.h index b5215f60d..9613d9932 100644 --- a/src/Magnum/Trade/AbstractImageConverter.h +++ b/src/Magnum/Trade/AbstractImageConverter.h @@ -63,6 +63,11 @@ checked by the implementation: if @ref Feature::ConvertCompressedData is supported. Plugin interface string is `"cz.mosra.magnum.Trade.AbstractImageConverter/0.2.1"`. + +@attention @ref Containers::Array instances returned from the plugin should + *not* use anything else than the default deleter, otherwise this can cause + dangling function pointer call on array destruction if the plugin gets + unloaded before the array is destroyed. */ class MAGNUM_EXPORT AbstractImageConverter: public PluginManager::AbstractManagingPlugin { CORRADE_PLUGIN_INTERFACE("cz.mosra.magnum.Trade.AbstractImageConverter/0.2.1") diff --git a/src/Magnum/Trade/AbstractImporter.h b/src/Magnum/Trade/AbstractImporter.h index f0bf089e3..2c4ef1d9e 100644 --- a/src/Magnum/Trade/AbstractImporter.h +++ b/src/Magnum/Trade/AbstractImporter.h @@ -74,6 +74,11 @@ checked by the implementation: Plugin interface string is `"cz.mosra.magnum.Trade.AbstractImporter/0.3"`. +@attention @ref Containers::Array instances returned from the plugin should + *not* use anything else than the default deleter, otherwise this can cause + dangling function pointer call on array destruction if the plugin gets + unloaded before the array is destroyed. + @todo How to handle casting from std::unique_ptr<> in more convenient way? */ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractManagingPlugin { From 7d8b2ce9a62a7f6321e5cc8545baa7486c86e55f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 21 Aug 2016 20:53:42 +0200 Subject: [PATCH 123/290] Print value of invalid enums in debug output, test those cases. --- src/Magnum/Attribute.cpp | 26 +-- src/Magnum/Audio/Buffer.cpp | 2 +- src/Magnum/Audio/Context.cpp | 2 +- src/Magnum/Audio/Renderer.cpp | 4 +- src/Magnum/Audio/Source.cpp | 2 +- src/Magnum/Audio/Test/BufferTest.cpp | 4 +- src/Magnum/Audio/Test/ContextTest.cpp | 13 +- src/Magnum/Audio/Test/RendererTest.cpp | 37 +-- src/Magnum/Audio/Test/SourceTest.cpp | 19 +- src/Magnum/Buffer.cpp | 4 +- src/Magnum/Context.cpp | 2 +- src/Magnum/DebugOutput.cpp | 12 +- src/Magnum/DefaultFramebuffer.cpp | 2 +- src/Magnum/Framebuffer.cpp | 2 +- src/Magnum/Mesh.cpp | 4 +- src/Magnum/PixelFormat.cpp | 6 +- src/Magnum/Renderer.cpp | 6 +- src/Magnum/Resource.cpp | 2 +- src/Magnum/Sampler.cpp | 12 +- src/Magnum/SceneGraph/Animable.cpp | 2 +- src/Magnum/SceneGraph/Test/AnimableTest.cpp | 4 +- src/Magnum/Shader.cpp | 2 +- .../Shapes/Test/ShapeImplementationTest.cpp | 8 +- src/Magnum/Shapes/shapeImplementation.cpp | 4 +- ...haderProgramTest.cpp => AttributeTest.cpp} | 215 +++++++++++++++--- src/Magnum/Test/BufferTest.cpp | 67 ++++++ src/Magnum/Test/CMakeLists.txt | 3 +- src/Magnum/Test/ContextTest.cpp | 4 +- src/Magnum/Test/DebugOutputTest.cpp | 24 +- src/Magnum/Test/DefaultFramebufferTest.cpp | 4 +- src/Magnum/Test/FormatTest.cpp | 12 +- src/Magnum/Test/FramebufferTest.cpp | 4 +- src/Magnum/Test/MeshTest.cpp | 8 +- src/Magnum/Test/RendererTest.cpp | 12 +- src/Magnum/Test/ResourceManagerTest.cpp | 4 +- src/Magnum/Test/SamplerTest.cpp | 24 +- src/Magnum/Test/ShaderTest.cpp | 4 +- src/Magnum/Trade/AbstractMaterialData.cpp | 2 +- src/Magnum/Trade/ObjectData2D.cpp | 2 +- src/Magnum/Trade/ObjectData3D.cpp | 2 +- src/Magnum/Trade/Test/CMakeLists.txt | 2 +- ...erialDataTest.cpp => MaterialDataTest.cpp} | 20 +- src/Magnum/Trade/Test/ObjectData2DTest.cpp | 4 +- src/Magnum/Trade/Test/ObjectData3DTest.cpp | 4 +- src/Magnum/Trade/Test/TextureDataTest.cpp | 4 +- src/Magnum/Trade/TextureData.cpp | 2 +- 46 files changed, 415 insertions(+), 193 deletions(-) rename src/Magnum/Test/{AbstractShaderProgramTest.cpp => AttributeTest.cpp} (57%) create mode 100644 src/Magnum/Test/BufferTest.cpp rename src/Magnum/Trade/Test/{AbstractMaterialDataTest.cpp => MaterialDataTest.cpp} (74%) diff --git a/src/Magnum/Attribute.cpp b/src/Magnum/Attribute.cpp index 901aa2c53..f3177be70 100644 --- a/src/Magnum/Attribute.cpp +++ b/src/Magnum/Attribute.cpp @@ -147,7 +147,7 @@ Debug& operator<<(Debug& debug, SizedAttribute<1, 1>::Components value) { /* LCOV_EXCL_STOP */ } - return debug << "Attribute::Components::(invalid)"; + return debug << "Attribute::Components(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, SizedAttribute<1, 2>::Components value) { @@ -160,7 +160,7 @@ Debug& operator<<(Debug& debug, SizedAttribute<1, 2>::Components value) { /* LCOV_EXCL_STOP */ } - return debug << "Attribute::Components::(invalid)"; + return debug << "Attribute::Components(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, SizedAttribute<1, 3>::Components value) { @@ -175,7 +175,7 @@ Debug& operator<<(Debug& debug, SizedAttribute<1, 3>::Components value) { /* LCOV_EXCL_STOP */ } - return debug << "Attribute::Components::(invalid)"; + return debug << "Attribute::Components(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, SizedAttribute<1, 4>::Components value) { @@ -192,7 +192,7 @@ Debug& operator<<(Debug& debug, SizedAttribute<1, 4>::Components value) { /* LCOV_EXCL_STOP */ } - return debug << "Attribute::Components::(invalid)"; + return debug << "Attribute::Components(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, SizedMatrixAttribute<2>::Components value) { @@ -203,7 +203,7 @@ Debug& operator<<(Debug& debug, SizedMatrixAttribute<2>::Components value) { /* LCOV_EXCL_STOP */ } - return debug << "Attribute::Components::(invalid)"; + return debug << "Attribute::Components(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, SizedMatrixAttribute<3>::Components value) { @@ -214,7 +214,7 @@ Debug& operator<<(Debug& debug, SizedMatrixAttribute<3>::Components value) { /* LCOV_EXCL_STOP */ } - return debug << "Attribute::Components::(invalid)"; + return debug << "Attribute::Components(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, SizedMatrixAttribute<4>::Components value) { @@ -225,7 +225,7 @@ Debug& operator<<(Debug& debug, SizedMatrixAttribute<4>::Components value) { /* LCOV_EXCL_STOP */ } - return debug << "Attribute::Components::(invalid)"; + return debug << "Attribute::Components(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, Attribute>::Components value) { @@ -246,7 +246,7 @@ Debug& operator<<(Debug& debug, Attribute>::Components va /* LCOV_EXCL_STOP */ } - return debug << "Attribute::Components::(invalid)"; + return debug << "Attribute::Components(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, FloatAttribute::DataType value) { @@ -268,7 +268,7 @@ Debug& operator<<(Debug& debug, FloatAttribute::DataType value) { /* LCOV_EXCL_STOP */ } - return debug << "Attribute::DataType::(invalid)"; + return debug << "Attribute::DataType(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #ifndef MAGNUM_TARGET_GLES2 @@ -286,7 +286,7 @@ Debug& operator<<(Debug& debug, IntAttribute::DataType value) { /* LCOV_EXCL_STOP */ } - return debug << "Attribute::DataType::(invalid)"; + return debug << "Attribute::DataType(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif @@ -300,7 +300,7 @@ Debug& operator<<(Debug& debug, DoubleAttribute::DataType value) { /* LCOV_EXCL_STOP */ } - return debug << "Attribute::DataType::(invalid)"; + return debug << "Attribute::DataType(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif @@ -324,7 +324,7 @@ Debug& operator<<(Debug& debug, Attribute>::DataType valu /* LCOV_EXCL_STOP */ } - return debug << "Attribute::DataType::(invalid)"; + return debug << "Attribute::DataType(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, Attribute>::DataType value) { @@ -350,7 +350,7 @@ Debug& operator<<(Debug& debug, Attribute>::DataType valu /* LCOV_EXCL_STOP */ } - return debug << "Attribute::DataType::(invalid)"; + return debug << "Attribute::DataType(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } }} diff --git a/src/Magnum/Audio/Buffer.cpp b/src/Magnum/Audio/Buffer.cpp index 8b0990d73..2ca64a6d0 100644 --- a/src/Magnum/Audio/Buffer.cpp +++ b/src/Magnum/Audio/Buffer.cpp @@ -46,7 +46,7 @@ Debug& operator<<(Debug& debug, const Buffer::Format value) { /* LCOV_EXCL_STOP */ } - return debug << "Audio::Buffer::Format::(invalid)"; + return debug << "Audio::Buffer::Format(" << Debug::nospace << reinterpret_cast(ALenum(value)) << Debug::nospace << ")"; } }} diff --git a/src/Magnum/Audio/Context.cpp b/src/Magnum/Audio/Context.cpp index 44855aac5..7ccb27479 100644 --- a/src/Magnum/Audio/Context.cpp +++ b/src/Magnum/Audio/Context.cpp @@ -67,7 +67,7 @@ Debug& operator<<(Debug& debug, const Context::HrtfStatus value) { /* LCOV_EXCL_STOP */ } - return debug << "Audio::Context::HrtfStatus::(invalid)"; + return debug << "Audio::Context::HrtfStatus(" << Debug::nospace << reinterpret_cast(ALenum(value)) << Debug::nospace << ")"; } Context* Context::_current = nullptr; diff --git a/src/Magnum/Audio/Renderer.cpp b/src/Magnum/Audio/Renderer.cpp index afe320893..69e7be426 100644 --- a/src/Magnum/Audio/Renderer.cpp +++ b/src/Magnum/Audio/Renderer.cpp @@ -43,7 +43,7 @@ Debug& operator<<(Debug& debug, const Renderer::Error value) { /* LCOV_EXCL_STOP */ } - return debug << "Audio::Renderer::Error::(invalid)"; + return debug << "Audio::Renderer::Error(" << Debug::nospace << reinterpret_cast(ALenum(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, const Renderer::DistanceModel value) { @@ -61,7 +61,7 @@ Debug& operator<<(Debug& debug, const Renderer::DistanceModel value) { /* LCOV_EXCL_STOP */ } - return debug << "Audio::Renderer::DistanceModel::(invalid)"; + return debug << "Audio::Renderer::DistanceModel(" << Debug::nospace << reinterpret_cast(ALenum(value)) << Debug::nospace << ")"; } }} diff --git a/src/Magnum/Audio/Source.cpp b/src/Magnum/Audio/Source.cpp index c659d6ab5..7c3554b15 100644 --- a/src/Magnum/Audio/Source.cpp +++ b/src/Magnum/Audio/Source.cpp @@ -108,7 +108,7 @@ Debug& operator<<(Debug& debug, const Source::State value) { /* LCOV_EXCL_STOP */ } - return debug << "Audio::Source::State::(invalid)"; + return debug << "Audio::Source::State(" << Debug::nospace << reinterpret_cast(ALint(value)) << Debug::nospace << ")"; } }} diff --git a/src/Magnum/Audio/Test/BufferTest.cpp b/src/Magnum/Audio/Test/BufferTest.cpp index 8de56d8b9..1522d1558 100644 --- a/src/Magnum/Audio/Test/BufferTest.cpp +++ b/src/Magnum/Audio/Test/BufferTest.cpp @@ -52,8 +52,8 @@ void BufferTest::construct() { void BufferTest::debugFormat() { std::ostringstream out; - Debug(&out) << Buffer::Format::Stereo16; - CORRADE_COMPARE(out.str(), "Audio::Buffer::Format::Stereo16\n"); + Debug(&out) << Buffer::Format::Stereo16 << Buffer::Format(0xdead); + CORRADE_COMPARE(out.str(), "Audio::Buffer::Format::Stereo16 Audio::Buffer::Format(0xdead)\n"); } }}} diff --git a/src/Magnum/Audio/Test/ContextTest.cpp b/src/Magnum/Audio/Test/ContextTest.cpp index bb15c2856..452ac51d8 100644 --- a/src/Magnum/Audio/Test/ContextTest.cpp +++ b/src/Magnum/Audio/Test/ContextTest.cpp @@ -37,8 +37,8 @@ struct ContextTest: TestSuite::Tester { void extensionsString(); void isExtensionEnabled(); - void hrtfStatus(); - void hrtfs(); + + void debugHrtfStatus(); Context _context; }; @@ -46,7 +46,8 @@ struct ContextTest: TestSuite::Tester { ContextTest::ContextTest() { addTests({&ContextTest::extensionsString, &ContextTest::isExtensionEnabled, - &ContextTest::hrtfStatus}); + + &ContextTest::debugHrtfStatus}); } void ContextTest::extensionsString() { @@ -59,10 +60,10 @@ void ContextTest::isExtensionEnabled() { CORRADE_VERIFY(Context::current().isExtensionSupported()); } -void ContextTest::hrtfStatus() { +void ContextTest::debugHrtfStatus() { std::ostringstream out; - Debug(&out) << Context::HrtfStatus::Denied; - CORRADE_COMPARE(out.str(), "Audio::Context::HrtfStatus::Denied\n"); + Debug(&out) << Context::HrtfStatus::Denied << Context::HrtfStatus(0xdead); + CORRADE_COMPARE(out.str(), "Audio::Context::HrtfStatus::Denied Audio::Context::HrtfStatus(0xdead)\n"); } }}} diff --git a/src/Magnum/Audio/Test/RendererTest.cpp b/src/Magnum/Audio/Test/RendererTest.cpp index 634865b82..123e07371 100644 --- a/src/Magnum/Audio/Test/RendererTest.cpp +++ b/src/Magnum/Audio/Test/RendererTest.cpp @@ -34,9 +34,6 @@ namespace Magnum { namespace Audio { namespace Test { struct RendererTest: TestSuite::Tester { explicit RendererTest(); - - void debugError(); - void debugDistanceModel(); void listenerOrientation(); void listenerPosition(); void listenerVelocity(); @@ -45,31 +42,23 @@ struct RendererTest: TestSuite::Tester { void dopplerFactor(); void distanceModel(); + void debugError(); + void debugDistanceModel(); + Context _context; }; RendererTest::RendererTest() { - addTests({&RendererTest::debugError, - &RendererTest::debugDistanceModel, - &RendererTest::listenerOrientation, + addTests({&RendererTest::listenerOrientation, &RendererTest::listenerPosition, &RendererTest::listenerVelocity, &RendererTest::listenerGain, &RendererTest::speedOfSound, &RendererTest::dopplerFactor, - &RendererTest::distanceModel}); -} + &RendererTest::distanceModel, -void RendererTest::debugError() { - std::ostringstream out; - Debug(&out) << Renderer::Error::InvalidOperation; - CORRADE_COMPARE(out.str(), "Audio::Renderer::Error::InvalidOperation\n"); -} - -void RendererTest::debugDistanceModel() { - std::ostringstream out; - Debug(&out) << Renderer::DistanceModel::Inverse; - CORRADE_COMPARE(out.str(), "Audio::Renderer::DistanceModel::Inverse\n"); + &RendererTest::debugError, + &RendererTest::debugDistanceModel}); } void RendererTest::listenerOrientation() { @@ -123,6 +112,18 @@ void RendererTest::distanceModel() { CORRADE_COMPARE(Renderer::distanceModel(), model); } +void RendererTest::debugError() { + std::ostringstream out; + Debug(&out) << Renderer::Error::InvalidOperation << Renderer::Error(0xdead); + CORRADE_COMPARE(out.str(), "Audio::Renderer::Error::InvalidOperation Audio::Renderer::Error(0xdead)\n"); +} + +void RendererTest::debugDistanceModel() { + std::ostringstream out; + Debug(&out) << Renderer::DistanceModel::Inverse << Renderer::DistanceModel(0xdead); + CORRADE_COMPARE(out.str(), "Audio::Renderer::DistanceModel::Inverse Audio::Renderer::DistanceModel(0xdead)\n"); +} + }}} CORRADE_TEST_MAIN(Magnum::Audio::Test::RendererTest) diff --git a/src/Magnum/Audio/Test/SourceTest.cpp b/src/Magnum/Audio/Test/SourceTest.cpp index 563d66c52..7b8dbb033 100644 --- a/src/Magnum/Audio/Test/SourceTest.cpp +++ b/src/Magnum/Audio/Test/SourceTest.cpp @@ -34,7 +34,6 @@ namespace Magnum { namespace Audio { namespace Test { struct SourceTest: TestSuite::Tester { explicit SourceTest(); - void debugState(); void position(); void direction(); void velocity(); @@ -47,12 +46,13 @@ struct SourceTest: TestSuite::Tester { void coneAnglesAndGain(); void rolloffFactor(); + void debugState(); + Context _context; }; SourceTest::SourceTest() { - addTests({&SourceTest::debugState, - &SourceTest::position, + addTests({&SourceTest::position, &SourceTest::direction, &SourceTest::velocity, &SourceTest::gain, @@ -62,13 +62,9 @@ SourceTest::SourceTest() { &SourceTest::maxGain, &SourceTest::minGain, &SourceTest::coneAnglesAndGain, - &SourceTest::rolloffFactor}); -} + &SourceTest::rolloffFactor, -void SourceTest::debugState() { - std::ostringstream out; - Debug(&out) << Source::State::Playing; - CORRADE_COMPARE(out.str(), "Audio::Source::State::Playing\n"); + &SourceTest::debugState}); } void SourceTest::position() { @@ -168,6 +164,11 @@ void SourceTest::rolloffFactor() { CORRADE_COMPARE(source.rolloffFactor(), fact); } +void SourceTest::debugState() { + std::ostringstream out; + Debug(&out) << Source::State::Playing << Source::State(0xdead); + CORRADE_COMPARE(out.str(), "Audio::Source::State::Playing Audio::Source::State(0xdead)\n"); +} }}} diff --git a/src/Magnum/Buffer.cpp b/src/Magnum/Buffer.cpp index b111181af..d36748df0 100644 --- a/src/Magnum/Buffer.cpp +++ b/src/Magnum/Buffer.cpp @@ -657,7 +657,7 @@ Debug& operator<<(Debug& debug, Buffer::TargetHint value) { /* LCOV_EXCL_STOP */ } - return debug << "Buffer::TargetHint::(invalid)"; + return debug << "Buffer::TargetHint(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif @@ -700,7 +700,7 @@ Debug& operator<<(Debug& debug, Buffer::Target value) { #endif } - return debug << "Buffer::Target::(invalid)"; + return debug << "Buffer::Target(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif #endif diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index 4d6095d23..9a37c40fd 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -841,7 +841,7 @@ Debug& operator<<(Debug& debug, const Context::Flag value) { /* LCOV_EXCL_STOP */ } - return debug << "Context::Flag::(invalid)"; + return debug << "Context::Flag(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } #endif #endif diff --git a/src/Magnum/DebugOutput.cpp b/src/Magnum/DebugOutput.cpp index a9e69bc3b..f9013ded3 100644 --- a/src/Magnum/DebugOutput.cpp +++ b/src/Magnum/DebugOutput.cpp @@ -239,7 +239,7 @@ Debug& operator<<(Debug& debug, const DebugOutput::Source value) { /* LCOV_EXCL_STOP */ } - return debug << "DebugOutput::Source::(invalid)"; + return debug << "DebugOutput::Source(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, const DebugOutput::Type value) { @@ -259,7 +259,7 @@ Debug& operator<<(Debug& debug, const DebugOutput::Type value) { /* LCOV_EXCL_STOP */ } - return debug << "DebugOutput::Type::(invalid)"; + return debug << "DebugOutput::Type(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, const DebugOutput::Severity value) { @@ -272,7 +272,7 @@ Debug& operator<<(Debug& debug, const DebugOutput::Severity value) { #undef _c } - return debug << "DebugOutput::Severity::(invalid)"; + return debug << "DebugOutput::Severity(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif @@ -333,7 +333,7 @@ Debug& operator<<(Debug& debug, const DebugMessage::Source value) { /* LCOV_EXCL_STOP */ } - return debug << "DebugMessage::Source::(invalid)"; + return debug << "DebugMessage::Source(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, const DebugMessage::Type value) { @@ -349,7 +349,7 @@ Debug& operator<<(Debug& debug, const DebugMessage::Type value) { #undef _c } - return debug << "DebugMessage::Type::(invalid)"; + return debug << "DebugMessage::Type(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif @@ -440,7 +440,7 @@ Debug& operator<<(Debug& debug, const DebugGroup::Source value) { /* LCOV_EXCL_STOP */ } - return debug << "DebugGroup::Source::(invalid)"; + return debug << "DebugGroup::Source(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif diff --git a/src/Magnum/DefaultFramebuffer.cpp b/src/Magnum/DefaultFramebuffer.cpp index 2f980fe47..5129efb6b 100644 --- a/src/Magnum/DefaultFramebuffer.cpp +++ b/src/Magnum/DefaultFramebuffer.cpp @@ -127,7 +127,7 @@ Debug& operator<<(Debug& debug, const DefaultFramebuffer::Status value) { /* LCOV_EXCL_STOP */ } - return debug << "DefaultFramebuffer::Status::(invalid)"; + return debug << "DefaultFramebuffer::Status(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif diff --git a/src/Magnum/Framebuffer.cpp b/src/Magnum/Framebuffer.cpp index 7bc67dea3..5d05524e9 100644 --- a/src/Magnum/Framebuffer.cpp +++ b/src/Magnum/Framebuffer.cpp @@ -428,7 +428,7 @@ Debug& operator<<(Debug& debug, const Framebuffer::Status value) { /* LCOV_EXCL_STOP */ } - return debug << "Framebuffer::Status::(invalid)"; + return debug << "Framebuffer::Status(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif diff --git a/src/Magnum/Mesh.cpp b/src/Magnum/Mesh.cpp index b6799676c..9dd2c8070 100644 --- a/src/Magnum/Mesh.cpp +++ b/src/Magnum/Mesh.cpp @@ -659,7 +659,7 @@ Debug& operator<<(Debug& debug, MeshPrimitive value) { /* LCOV_EXCL_STOP */ } - return debug << "MeshPrimitive::(invalid)"; + return debug << "MeshPrimitive(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, Mesh::IndexType value) { @@ -673,7 +673,7 @@ Debug& operator<<(Debug& debug, Mesh::IndexType value) { /* LCOV_EXCL_STOP */ } - return debug << "Mesh::IndexType::(invalid)"; + return debug << "Mesh::IndexType(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif diff --git a/src/Magnum/PixelFormat.cpp b/src/Magnum/PixelFormat.cpp index 4fe23e67a..caea62d40 100644 --- a/src/Magnum/PixelFormat.cpp +++ b/src/Magnum/PixelFormat.cpp @@ -81,7 +81,7 @@ Debug& operator<<(Debug& debug, const PixelFormat value) { /* LCOV_EXCL_STOP */ } - return debug << "PixelFormat::(invalid)"; + return debug << "PixelFormat(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, const PixelType value) { @@ -138,7 +138,7 @@ Debug& operator<<(Debug& debug, const PixelType value) { /* LCOV_EXCL_STOP */ } - return debug << "PixelType::(invalid)"; + return debug << "PixelType(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, const CompressedPixelFormat value) { @@ -209,7 +209,7 @@ Debug& operator<<(Debug& debug, const CompressedPixelFormat value) { /* LCOV_EXCL_STOP */ } - return debug << "CompressedPixelFormat::(invalid)"; + return debug << "CompressedPixelFormat(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif diff --git a/src/Magnum/Renderer.cpp b/src/Magnum/Renderer.cpp index 0b1a7de29..2be283e8f 100644 --- a/src/Magnum/Renderer.cpp +++ b/src/Magnum/Renderer.cpp @@ -257,7 +257,7 @@ Debug& operator<<(Debug& debug, const Renderer::Error value) { /* LCOV_EXCL_STOP */ } - return debug << "Renderer::Error::(invalid)"; + return debug << "Renderer::Error(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #ifndef MAGNUM_TARGET_WEBGL @@ -271,7 +271,7 @@ Debug& operator<<(Debug& debug, const Renderer::ResetNotificationStrategy value) /* LCOV_EXCL_STOP */ } - return debug << "Renderer::ResetNotificationStrategy::(invalid)"; + return debug << "Renderer::ResetNotificationStrategy(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, const Renderer::GraphicsResetStatus value) { @@ -286,7 +286,7 @@ Debug& operator<<(Debug& debug, const Renderer::GraphicsResetStatus value) { /* LCOV_EXCL_STOP */ } - return debug << "Renderer::ResetNotificationStrategy::(invalid)"; + return debug << "Renderer::GraphicsResetStatus(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif #endif diff --git a/src/Magnum/Resource.cpp b/src/Magnum/Resource.cpp index 5aac6adab..678453048 100644 --- a/src/Magnum/Resource.cpp +++ b/src/Magnum/Resource.cpp @@ -44,7 +44,7 @@ Debug& operator<<(Debug& debug, const ResourceState value) { /* LCOV_EXCL_STOP */ } - return debug << "ResourceState::(invalid)"; + return debug << "ResourceState(" << Debug::nospace << reinterpret_cast(UnsignedByte(value)) << Debug::nospace << ")"; } #endif diff --git a/src/Magnum/Sampler.cpp b/src/Magnum/Sampler.cpp index fbf9e4740..f4cb95804 100644 --- a/src/Magnum/Sampler.cpp +++ b/src/Magnum/Sampler.cpp @@ -71,7 +71,7 @@ Debug& operator<<(Debug& debug, const Sampler::Filter value) { /* LCOV_EXCL_STOP */ } - return debug << "Sampler::Filter::(invalid)"; + return debug << "Sampler::Filter(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, const Sampler::Mipmap value) { @@ -85,7 +85,7 @@ Debug& operator<<(Debug& debug, const Sampler::Mipmap value) { /* LCOV_EXCL_STOP */ } - return debug << "Sampler::Mipmap::(invalid)"; + return debug << "Sampler::Mipmap(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, const Sampler::Wrapping value) { @@ -105,7 +105,7 @@ Debug& operator<<(Debug& debug, const Sampler::Wrapping value) { /* LCOV_EXCL_STOP */ } - return debug << "Sampler::Wrapping::(invalid)"; + return debug << "Sampler::Wrapping(" << Debug::nospace << reinterpret_cast(GLint(value)) << Debug::nospace << ")"; } #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) @@ -119,7 +119,7 @@ Debug& operator<<(Debug& debug, const Sampler::CompareMode value) { /* LCOV_EXCL_STOP */ } - return debug << "Sampler::CompareFunction::(invalid)"; + return debug << "Sampler::CompareMode(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, const Sampler::CompareFunction value) { @@ -138,7 +138,7 @@ Debug& operator<<(Debug& debug, const Sampler::CompareFunction value) { /* LCOV_EXCL_STOP */ } - return debug << "Sampler::CompareFunction::(invalid)"; + return debug << "Sampler::CompareFunction(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif @@ -153,7 +153,7 @@ Debug& operator<<(Debug& debug, const Sampler::DepthStencilMode value) { /* LCOV_EXCL_STOP */ } - return debug << "Sampler::DepthStencilMode::(invalid)"; + return debug << "Sampler::DepthStencilMode(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif #endif diff --git a/src/Magnum/SceneGraph/Animable.cpp b/src/Magnum/SceneGraph/Animable.cpp index 504f3079c..6bbcb843a 100644 --- a/src/Magnum/SceneGraph/Animable.cpp +++ b/src/Magnum/SceneGraph/Animable.cpp @@ -40,7 +40,7 @@ Debug& operator<<(Debug& debug, AnimationState value) { /* LCOV_EXCL_STOP */ } - return debug << "SceneGraph::AnimationState::(invalid)"; + return debug << "SceneGraph::AnimationState(" << Debug::nospace << reinterpret_cast(UnsignedByte(value)) << Debug::nospace << ")"; } }} diff --git a/src/Magnum/SceneGraph/Test/AnimableTest.cpp b/src/Magnum/SceneGraph/Test/AnimableTest.cpp index 844cc2090..28911e177 100644 --- a/src/Magnum/SceneGraph/Test/AnimableTest.cpp +++ b/src/Magnum/SceneGraph/Test/AnimableTest.cpp @@ -353,8 +353,8 @@ void AnimableTest::pause() { void AnimableTest::debug() { std::ostringstream o; - Debug(&o) << AnimationState::Running; - CORRADE_COMPARE(o.str(), "SceneGraph::AnimationState::Running\n"); + Debug(&o) << AnimationState::Running << AnimationState(0xbe); + CORRADE_COMPARE(o.str(), "SceneGraph::AnimationState::Running SceneGraph::AnimationState(0xbe)\n"); } }}} diff --git a/src/Magnum/Shader.cpp b/src/Magnum/Shader.cpp index e1435b542..cbb4b2963 100644 --- a/src/Magnum/Shader.cpp +++ b/src/Magnum/Shader.cpp @@ -906,7 +906,7 @@ Debug& operator<<(Debug& debug, const Shader::Type value) { /* LCOV_EXCL_STOP */ } - return debug << "Shader::Type::(invalid)"; + return debug << "Shader::Type(" << Debug::nospace << reinterpret_cast(GLenum(value)) << Debug::nospace << ")"; } #endif diff --git a/src/Magnum/Shapes/Test/ShapeImplementationTest.cpp b/src/Magnum/Shapes/Test/ShapeImplementationTest.cpp index 6f7d9f16c..f2efaf7cd 100644 --- a/src/Magnum/Shapes/Test/ShapeImplementationTest.cpp +++ b/src/Magnum/Shapes/Test/ShapeImplementationTest.cpp @@ -42,12 +42,12 @@ ShapeImplementationTest::ShapeImplementationTest() { void ShapeImplementationTest::debug() { std::ostringstream o; - Debug(&o) << Implementation::ShapeDimensionTraits<2>::Type::Composition; - CORRADE_COMPARE(o.str(), "Shapes::Shape2D::Type::Composition\n"); + Debug(&o) << Implementation::ShapeDimensionTraits<2>::Type::Composition << Implementation::ShapeDimensionTraits<2>::Type(0xbe); + CORRADE_COMPARE(o.str(), "Shapes::Shape2D::Type::Composition Shapes::Shape2D::Type(0xbe)\n"); o.str({}); - Debug(&o) << Implementation::ShapeDimensionTraits<3>::Type::Plane; - CORRADE_COMPARE(o.str(), "Shapes::Shape3D::Type::Plane\n"); + Debug(&o) << Implementation::ShapeDimensionTraits<3>::Type::Plane << Implementation::ShapeDimensionTraits<3>::Type(0xbe); + CORRADE_COMPARE(o.str(), "Shapes::Shape3D::Type::Plane Shapes::Shape3D::Type(0xbe)\n"); } }}} diff --git a/src/Magnum/Shapes/shapeImplementation.cpp b/src/Magnum/Shapes/shapeImplementation.cpp index f48741e4d..704efcf1c 100644 --- a/src/Magnum/Shapes/shapeImplementation.cpp +++ b/src/Magnum/Shapes/shapeImplementation.cpp @@ -47,7 +47,7 @@ Debug& operator<<(Debug& debug, ShapeDimensionTraits<2>::Type value) { /* LCOV_EXCL_STOP */ } - return debug << "Shapes::Shape2D::Type::(unknown)"; + return debug << "Shapes::Shape2D::Type(" << Debug::nospace << reinterpret_cast(UnsignedByte(value)) << Debug::nospace << ")"; } Debug& operator<<(Debug& debug, ShapeDimensionTraits<3>::Type value) { @@ -69,7 +69,7 @@ Debug& operator<<(Debug& debug, ShapeDimensionTraits<3>::Type value) { /* LCOV_EXCL_STOP */ } - return debug << "Shapes::Shape3D::Type::(unknown)"; + return debug << "Shapes::Shape3D::Type(" << Debug::nospace << reinterpret_cast(UnsignedByte(value)) << Debug::nospace << ")"; } template AbstractShape::~AbstractShape() = default; diff --git a/src/Magnum/Test/AbstractShaderProgramTest.cpp b/src/Magnum/Test/AttributeTest.cpp similarity index 57% rename from src/Magnum/Test/AbstractShaderProgramTest.cpp rename to src/Magnum/Test/AttributeTest.cpp index 089b0f573..7c2a5e709 100644 --- a/src/Magnum/Test/AbstractShaderProgramTest.cpp +++ b/src/Magnum/Test/AttributeTest.cpp @@ -23,14 +23,15 @@ DEALINGS IN THE SOFTWARE. */ +#include #include #include "Magnum/AbstractShaderProgram.h" namespace Magnum { namespace Test { -struct AbstractShaderProgramTest: TestSuite::Tester { - explicit AbstractShaderProgramTest(); +struct AttributeTest: TestSuite::Tester { + explicit AttributeTest(); void attributeScalar(); void attributeScalarInt(); @@ -50,30 +51,70 @@ struct AbstractShaderProgramTest: TestSuite::Tester { #endif void attributeMatrixNxNd(); void attributeMatrixMxNd(); + + void debugComponents1(); + void debugComponents2(); + void debugComponents3(); + #ifndef MAGNUM_TARGET_GLES2 + void debugComponents4(); + #endif + void debugComponentsMatrix2(); + void debugComponentsMatrix3(); + void debugComponentsMatrix4(); + void debugComponentsVector4(); + void debugDataTypeFloat(); + #ifndef MAGNUM_TARGET_GLES2 + void debugDataTypeInt(); + #endif + #ifndef MAGNUM_TARGET_GLES + void debugDataTypeDouble(); + #endif + void debugDataTypeVector3(); + void debugDataTypeVector4(); }; -AbstractShaderProgramTest::AbstractShaderProgramTest() { - addTests({&AbstractShaderProgramTest::attributeScalar, - &AbstractShaderProgramTest::attributeScalarInt, - &AbstractShaderProgramTest::attributeScalarUnsignedInt, - &AbstractShaderProgramTest::attributeScalarDouble, +AttributeTest::AttributeTest() { + addTests({&AttributeTest::attributeScalar, + &AttributeTest::attributeScalarInt, + &AttributeTest::attributeScalarUnsignedInt, + &AttributeTest::attributeScalarDouble, - &AbstractShaderProgramTest::attributeVector, - &AbstractShaderProgramTest::attributeVectorInt, - &AbstractShaderProgramTest::attributeVectorUnsignedInt, - &AbstractShaderProgramTest::attributeVectorDouble, - &AbstractShaderProgramTest::attributeVector4, - &AbstractShaderProgramTest::attributeVectorBGRA, + &AttributeTest::attributeVector, + &AttributeTest::attributeVectorInt, + &AttributeTest::attributeVectorUnsignedInt, + &AttributeTest::attributeVectorDouble, + &AttributeTest::attributeVector4, + &AttributeTest::attributeVectorBGRA, - &AbstractShaderProgramTest::attributeMatrixNxN, + &AttributeTest::attributeMatrixNxN, #ifndef MAGNUM_TARGET_GLES2 - &AbstractShaderProgramTest::attributeMatrixMxN, + &AttributeTest::attributeMatrixMxN, #endif - &AbstractShaderProgramTest::attributeMatrixNxNd, - &AbstractShaderProgramTest::attributeMatrixMxNd}); + &AttributeTest::attributeMatrixNxNd, + &AttributeTest::attributeMatrixMxNd, + + &AttributeTest::debugComponents1, + &AttributeTest::debugComponents2, + &AttributeTest::debugComponents3, + #ifndef MAGNUM_TARGET_GLES2 + &AttributeTest::debugComponents4, + #endif + &AttributeTest::debugComponentsMatrix2, + &AttributeTest::debugComponentsMatrix3, + &AttributeTest::debugComponentsMatrix4, + &AttributeTest::debugComponentsVector4, + &AttributeTest::debugDataTypeFloat, + #ifndef MAGNUM_TARGET_GLES + &AttributeTest::debugDataTypeInt, + #endif + #ifndef MAGNUM_TARGET_GLES + &AttributeTest::debugDataTypeDouble, + #endif + &AttributeTest::debugDataTypeVector3, + &AttributeTest::debugDataTypeVector4}); } -void AbstractShaderProgramTest::attributeScalar() { +void AttributeTest::attributeScalar() { typedef Attribute<3, Float> Attribute; CORRADE_VERIFY((std::is_same{})); CORRADE_COMPARE(Attribute::Location, 3); @@ -92,7 +133,7 @@ void AbstractShaderProgramTest::attributeScalar() { CORRADE_VERIFY(b.dataOptions() <= Attribute::DataOption::Normalized); } -void AbstractShaderProgramTest::attributeScalarInt() { +void AttributeTest::attributeScalarInt() { #ifndef MAGNUM_TARGET_GLES2 typedef Attribute<3, Int> Attribute; CORRADE_VERIFY((std::is_same{})); @@ -110,7 +151,7 @@ void AbstractShaderProgramTest::attributeScalarInt() { #endif } -void AbstractShaderProgramTest::attributeScalarUnsignedInt() { +void AttributeTest::attributeScalarUnsignedInt() { #ifndef MAGNUM_TARGET_GLES2 typedef Attribute<3, UnsignedInt> Attribute; CORRADE_VERIFY((std::is_same{})); @@ -128,7 +169,7 @@ void AbstractShaderProgramTest::attributeScalarUnsignedInt() { #endif } -void AbstractShaderProgramTest::attributeScalarDouble() { +void AttributeTest::attributeScalarDouble() { #ifndef MAGNUM_TARGET_GLES typedef Attribute<3, Double> Attribute; CORRADE_VERIFY((std::is_same{})); @@ -142,7 +183,7 @@ void AbstractShaderProgramTest::attributeScalarDouble() { #endif } -void AbstractShaderProgramTest::attributeVector() { +void AttributeTest::attributeVector() { typedef Attribute<3, Vector3> Attribute; CORRADE_VERIFY((std::is_same{})); CORRADE_COMPARE(Attribute::VectorCount, 1); @@ -165,7 +206,7 @@ void AbstractShaderProgramTest::attributeVector() { #endif } -void AbstractShaderProgramTest::attributeVectorInt() { +void AttributeTest::attributeVectorInt() { #ifndef MAGNUM_TARGET_GLES2 typedef Attribute<3, Vector2i> Attribute; CORRADE_VERIFY((std::is_same{})); @@ -185,7 +226,7 @@ void AbstractShaderProgramTest::attributeVectorInt() { #endif } -void AbstractShaderProgramTest::attributeVectorUnsignedInt() { +void AttributeTest::attributeVectorUnsignedInt() { #ifndef MAGNUM_TARGET_GLES2 typedef Attribute<3, Vector4ui> Attribute; CORRADE_VERIFY((std::is_same{})); @@ -205,7 +246,7 @@ void AbstractShaderProgramTest::attributeVectorUnsignedInt() { #endif } -void AbstractShaderProgramTest::attributeVectorDouble() { +void AttributeTest::attributeVectorDouble() { #ifndef MAGNUM_TARGET_GLES typedef Attribute<3, Vector2d> Attribute; CORRADE_VERIFY((std::is_same{})); @@ -225,7 +266,7 @@ void AbstractShaderProgramTest::attributeVectorDouble() { #endif } -void AbstractShaderProgramTest::attributeVector4() { +void AttributeTest::attributeVector4() { typedef Attribute<3, Vector4> Attribute; CORRADE_VERIFY((std::is_same{})); CORRADE_COMPARE(Attribute::VectorCount, 1); @@ -240,7 +281,7 @@ void AbstractShaderProgramTest::attributeVector4() { #endif } -void AbstractShaderProgramTest::attributeVectorBGRA() { +void AttributeTest::attributeVectorBGRA() { #ifndef MAGNUM_TARGET_GLES typedef Attribute<3, Vector4> Attribute; CORRADE_VERIFY((std::is_same{})); @@ -254,7 +295,7 @@ void AbstractShaderProgramTest::attributeVectorBGRA() { #endif } -void AbstractShaderProgramTest::attributeMatrixNxN() { +void AttributeTest::attributeMatrixNxN() { typedef Attribute<3, Matrix3> Attribute; CORRADE_VERIFY((std::is_same{})); CORRADE_COMPARE(Attribute::VectorCount, 3); @@ -267,7 +308,7 @@ void AbstractShaderProgramTest::attributeMatrixNxN() { } #ifndef MAGNUM_TARGET_GLES2 -void AbstractShaderProgramTest::attributeMatrixMxN() { +void AttributeTest::attributeMatrixMxN() { typedef Attribute<3, Matrix3x4> Attribute; CORRADE_VERIFY((std::is_same{})); CORRADE_COMPARE(Attribute::VectorCount, 3); @@ -280,7 +321,7 @@ void AbstractShaderProgramTest::attributeMatrixMxN() { } #endif -void AbstractShaderProgramTest::attributeMatrixNxNd() { +void AttributeTest::attributeMatrixNxNd() { #ifndef MAGNUM_TARGET_GLES typedef Attribute<3, Matrix4d> Attribute; CORRADE_VERIFY((std::is_same{})); @@ -296,7 +337,7 @@ void AbstractShaderProgramTest::attributeMatrixNxNd() { #endif } -void AbstractShaderProgramTest::attributeMatrixMxNd() { +void AttributeTest::attributeMatrixMxNd() { #ifndef MAGNUM_TARGET_GLES typedef Attribute<3, Matrix4x2d> Attribute; CORRADE_VERIFY((std::is_same{})); @@ -312,6 +353,116 @@ void AbstractShaderProgramTest::attributeMatrixMxNd() { #endif } +void AttributeTest::debugComponents1() { + typedef Attribute<3, Float> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::Components::One << Attribute::Components(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::Components::One Attribute::Components(0xdead)\n"); +} + +void AttributeTest::debugComponents2() { + typedef Attribute<3, Vector2> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::Components::Two << Attribute::Components(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::Components::Two Attribute::Components(0xdead)\n"); +} + +void AttributeTest::debugComponents3() { + typedef Attribute<3, Vector3> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::Components::Three << Attribute::Components(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::Components::Three Attribute::Components(0xdead)\n"); +} + +#ifndef MAGNUM_TARGET_GLES2 +void AttributeTest::debugComponents4() { + typedef Attribute<3, Vector4i> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::Components::Four << Attribute::Components(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::Components::Four Attribute::Components(0xdead)\n"); +} +#endif + +void AttributeTest::debugComponentsMatrix2() { + typedef Attribute<3, Matrix2x2> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::Components::Two << Attribute::Components(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::Components::Two Attribute::Components(0xdead)\n"); +} + +void AttributeTest::debugComponentsMatrix3() { + typedef Attribute<3, Matrix3> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::Components::Three << Attribute::Components(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::Components::Three Attribute::Components(0xdead)\n"); +} + +void AttributeTest::debugComponentsMatrix4() { + typedef Attribute<3, Matrix4> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::Components::Four << Attribute::Components(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::Components::Four Attribute::Components(0xdead)\n"); +} + +void AttributeTest::debugComponentsVector4() { + typedef Attribute<3, Vector4> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::Components::Three << Attribute::Components(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::Components::Three Attribute::Components(0xdead)\n"); +} + +void AttributeTest::debugDataTypeFloat() { + typedef Attribute<3, Float> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::DataType::HalfFloat << Attribute::DataType(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::DataType::HalfFloat Attribute::DataType(0xdead)\n"); +} + +#ifndef MAGNUM_TARGET_GLES2 +void AttributeTest::debugDataTypeInt() { + typedef Attribute<3, Int> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::DataType::Short << Attribute::DataType(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::DataType::Short Attribute::DataType(0xdead)\n"); +} +#endif + +#ifndef MAGNUM_TARGET_GLES +void AttributeTest::debugDataTypeDouble() { + typedef Attribute<3, Double> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::DataType::Double << Attribute::DataType(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::DataType::Double Attribute::DataType(0xdead)\n"); +} +#endif + +void AttributeTest::debugDataTypeVector3() { + typedef Attribute<3, Vector3> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::DataType::HalfFloat << Attribute::DataType(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::DataType::HalfFloat Attribute::DataType(0xdead)\n"); +} + +void AttributeTest::debugDataTypeVector4() { + typedef Attribute<3, Vector4> Attribute; + + std::ostringstream out; + Debug{&out} << Attribute::DataType::HalfFloat << Attribute::DataType(0xdead); + CORRADE_COMPARE(out.str(), "Attribute::DataType::HalfFloat Attribute::DataType(0xdead)\n"); +} + }} -CORRADE_TEST_MAIN(Magnum::Test::AbstractShaderProgramTest) +CORRADE_TEST_MAIN(Magnum::Test::AttributeTest) diff --git a/src/Magnum/Test/BufferTest.cpp b/src/Magnum/Test/BufferTest.cpp new file mode 100644 index 000000000..f890f6485 --- /dev/null +++ b/src/Magnum/Test/BufferTest.cpp @@ -0,0 +1,67 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + Copyright © 2015 Jonathan Hale + + 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. +*/ + +#include +#include + +#include "Magnum/Buffer.h" + +namespace Magnum { namespace Test { + +struct BufferTest: TestSuite::Tester { + explicit BufferTest(); + + void debugTargetHint(); + #ifndef MAGNUM_TARGET_GLES2 + void debugTarget(); + #endif +}; + +BufferTest::BufferTest() { + addTests({&BufferTest::debugTargetHint, + #ifndef MAGNUM_TARGET_GLES2 + &BufferTest::debugTarget + #endif + }); +} + +void BufferTest::debugTargetHint() { + std::ostringstream out; + Debug{&out} << Buffer::TargetHint::Array << Buffer::TargetHint(0xdead); + CORRADE_COMPARE(out.str(), "Buffer::TargetHint::Array Buffer::TargetHint(0xdead)\n"); +} + +#ifndef MAGNUM_TARGET_GLES2 +void BufferTest::debugTarget() { + std::ostringstream out; + Debug{&out} << Buffer::Target::Uniform << Buffer::Target(0xdead); + CORRADE_COMPARE(out.str(), "Buffer::Target::Uniform Buffer::Target(0xdead)\n"); +} +#endif + +}} + +CORRADE_TEST_MAIN(Magnum::Test::BufferTest) diff --git a/src/Magnum/Test/CMakeLists.txt b/src/Magnum/Test/CMakeLists.txt index 8675864a1..e042bdb67 100644 --- a/src/Magnum/Test/CMakeLists.txt +++ b/src/Magnum/Test/CMakeLists.txt @@ -23,8 +23,9 @@ # DEALINGS IN THE SOFTWARE. # -corrade_add_test(AbstractShaderProgramTest AbstractShaderProgramTest.cpp LIBRARIES Magnum) corrade_add_test(ArrayTest ArrayTest.cpp LIBRARIES Magnum) +corrade_add_test(AttributeTest AttributeTest.cpp LIBRARIES Magnum) +corrade_add_test(BufferTest BufferTest.cpp LIBRARIES Magnum) corrade_add_test(FormatTest FormatTest.cpp LIBRARIES Magnum) corrade_add_test(ContextTest ContextTest.cpp LIBRARIES Magnum) if(NOT MAGNUM_TARGET_WEBGL) diff --git a/src/Magnum/Test/ContextTest.cpp b/src/Magnum/Test/ContextTest.cpp index 2a0927ca7..bad9274ee 100644 --- a/src/Magnum/Test/ContextTest.cpp +++ b/src/Magnum/Test/ContextTest.cpp @@ -45,8 +45,8 @@ void ContextTest::debugFlag() { CORRADE_SKIP("No context flags on Emscripten yet."); #else std::ostringstream out; - Debug(&out) << Context::Flag::Debug; - CORRADE_COMPARE(out.str(), "Context::Flag::Debug\n"); + Debug(&out) << Context::Flag::Debug << Context::Flag(0xdead); + CORRADE_COMPARE(out.str(), "Context::Flag::Debug Context::Flag(0xdead)\n"); #endif } diff --git a/src/Magnum/Test/DebugOutputTest.cpp b/src/Magnum/Test/DebugOutputTest.cpp index 2d33a04c9..1f9469bfb 100644 --- a/src/Magnum/Test/DebugOutputTest.cpp +++ b/src/Magnum/Test/DebugOutputTest.cpp @@ -56,38 +56,38 @@ DebugOutputTest::DebugOutputTest() { void DebugOutputTest::debugSource() { std::ostringstream o; - Debug(&o) << DebugOutput::Source::ShaderCompiler; - CORRADE_COMPARE(o.str(), "DebugOutput::Source::ShaderCompiler\n"); + Debug(&o) << DebugOutput::Source::ShaderCompiler << DebugOutput::Source(0xdead); + CORRADE_COMPARE(o.str(), "DebugOutput::Source::ShaderCompiler DebugOutput::Source(0xdead)\n"); } void DebugOutputTest::debugType() { std::ostringstream o; - Debug(&o) << DebugOutput::Type::PushGroup; - CORRADE_COMPARE(o.str(), "DebugOutput::Type::PushGroup\n"); + Debug(&o) << DebugOutput::Type::PushGroup << DebugOutput::Type(0xdead); + CORRADE_COMPARE(o.str(), "DebugOutput::Type::PushGroup DebugOutput::Type(0xdead)\n"); } void DebugOutputTest::debugSeverity() { std::ostringstream o; - Debug(&o) << DebugOutput::Severity::Notification; - CORRADE_COMPARE(o.str(), "DebugOutput::Severity::Notification\n"); + Debug(&o) << DebugOutput::Severity::Notification << DebugOutput::Severity(0xdead); + CORRADE_COMPARE(o.str(), "DebugOutput::Severity::Notification DebugOutput::Severity(0xdead)\n"); } void DebugOutputTest::debugMessageSource() { std::ostringstream o; - Debug(&o) << DebugMessage::Source::Application; - CORRADE_COMPARE(o.str(), "DebugMessage::Source::Application\n"); + Debug(&o) << DebugMessage::Source::Application << DebugMessage::Source(0xdead); + CORRADE_COMPARE(o.str(), "DebugMessage::Source::Application DebugMessage::Source(0xdead)\n"); } void DebugOutputTest::debugMessageType() { std::ostringstream o; - Debug(&o) << DebugMessage::Type::DeprecatedBehavior; - CORRADE_COMPARE(o.str(), "DebugMessage::Type::DeprecatedBehavior\n"); + Debug(&o) << DebugMessage::Type::DeprecatedBehavior << DebugMessage::Type(0xdead); + CORRADE_COMPARE(o.str(), "DebugMessage::Type::DeprecatedBehavior DebugMessage::Type(0xdead)\n"); } void DebugOutputTest::debugGroupSource() { std::ostringstream o; - Debug(&o) << DebugGroup::Source::ThirdParty; - CORRADE_COMPARE(o.str(), "DebugGroup::Source::ThirdParty\n"); + Debug(&o) << DebugGroup::Source::ThirdParty << DebugGroup::Source(0xdead); + CORRADE_COMPARE(o.str(), "DebugGroup::Source::ThirdParty DebugGroup::Source(0xdead)\n"); } }} diff --git a/src/Magnum/Test/DefaultFramebufferTest.cpp b/src/Magnum/Test/DefaultFramebufferTest.cpp index 98f64189a..31c41e5d3 100644 --- a/src/Magnum/Test/DefaultFramebufferTest.cpp +++ b/src/Magnum/Test/DefaultFramebufferTest.cpp @@ -43,8 +43,8 @@ DefaultFramebufferTest::DefaultFramebufferTest() { void DefaultFramebufferTest::debugStatus() { std::ostringstream out; - Debug(&out) << DefaultFramebuffer::Status::Complete; - CORRADE_COMPARE(out.str(), "DefaultFramebuffer::Status::Complete\n"); + Debug(&out) << DefaultFramebuffer::Status::Complete << DefaultFramebuffer::Status(0xdead); + CORRADE_COMPARE(out.str(), "DefaultFramebuffer::Status::Complete DefaultFramebuffer::Status(0xdead)\n"); } }} diff --git a/src/Magnum/Test/FormatTest.cpp b/src/Magnum/Test/FormatTest.cpp index 0e58cd210..d1ced28e7 100644 --- a/src/Magnum/Test/FormatTest.cpp +++ b/src/Magnum/Test/FormatTest.cpp @@ -47,15 +47,15 @@ FormatTest::FormatTest() { void FormatTest::debugPixelFormat() { std::ostringstream out; - Debug(&out) << PixelFormat::RGBA; - CORRADE_COMPARE(out.str(), "PixelFormat::RGBA\n"); + Debug(&out) << PixelFormat::RGBA << PixelFormat(0xdead); + CORRADE_COMPARE(out.str(), "PixelFormat::RGBA PixelFormat(0xdead)\n"); } void FormatTest::debugPixelType() { std::ostringstream out; - Debug(&out) << PixelType::UnsignedByte; - CORRADE_COMPARE(out.str(), "PixelType::UnsignedByte\n"); + Debug(&out) << PixelType::UnsignedByte << PixelType(0xdead); + CORRADE_COMPARE(out.str(), "PixelType::UnsignedByte PixelType(0xdead)\n"); } void FormatTest::debugCompressedPixelFormat() { @@ -64,8 +64,8 @@ void FormatTest::debugCompressedPixelFormat() { #else std::ostringstream out; - Debug(&out) << CompressedPixelFormat::RGBBptcUnsignedFloat; - CORRADE_COMPARE(out.str(), "CompressedPixelFormat::RGBBptcUnsignedFloat\n"); + Debug(&out) << CompressedPixelFormat::RGBBptcUnsignedFloat << CompressedPixelFormat(0xdead); + CORRADE_COMPARE(out.str(), "CompressedPixelFormat::RGBBptcUnsignedFloat CompressedPixelFormat(0xdead)\n"); #endif } diff --git a/src/Magnum/Test/FramebufferTest.cpp b/src/Magnum/Test/FramebufferTest.cpp index 2229721f5..f73180162 100644 --- a/src/Magnum/Test/FramebufferTest.cpp +++ b/src/Magnum/Test/FramebufferTest.cpp @@ -43,8 +43,8 @@ FramebufferTest::FramebufferTest() { void FramebufferTest::debugStatus() { std::ostringstream out; - Debug(&out) << Framebuffer::Status::IncompleteMissingAttachment; - CORRADE_COMPARE(out.str(), "Framebuffer::Status::IncompleteMissingAttachment\n"); + Debug(&out) << Framebuffer::Status::IncompleteMissingAttachment << Framebuffer::Status(0xdead); + CORRADE_COMPARE(out.str(), "Framebuffer::Status::IncompleteMissingAttachment Framebuffer::Status(0xdead)\n"); } }} diff --git a/src/Magnum/Test/MeshTest.cpp b/src/Magnum/Test/MeshTest.cpp index c4c382a05..9d58b17c6 100644 --- a/src/Magnum/Test/MeshTest.cpp +++ b/src/Magnum/Test/MeshTest.cpp @@ -59,14 +59,14 @@ void MeshTest::indexSize() { void MeshTest::debugPrimitive() { std::ostringstream o; - Debug(&o) << MeshPrimitive::TriangleFan; - CORRADE_COMPARE(o.str(), "MeshPrimitive::TriangleFan\n"); + Debug(&o) << MeshPrimitive::TriangleFan << MeshPrimitive(0xdead); + CORRADE_COMPARE(o.str(), "MeshPrimitive::TriangleFan MeshPrimitive(0xdead)\n"); } void MeshTest::debugIndexType() { std::ostringstream o; - Debug(&o) << Mesh::IndexType::UnsignedShort; - CORRADE_COMPARE(o.str(), "Mesh::IndexType::UnsignedShort\n"); + Debug(&o) << Mesh::IndexType::UnsignedShort << Mesh::IndexType(0xdead); + CORRADE_COMPARE(o.str(), "Mesh::IndexType::UnsignedShort Mesh::IndexType(0xdead)\n"); } void MeshTest::configurationPrimitive() { diff --git a/src/Magnum/Test/RendererTest.cpp b/src/Magnum/Test/RendererTest.cpp index 5564ccb3b..6c7665162 100644 --- a/src/Magnum/Test/RendererTest.cpp +++ b/src/Magnum/Test/RendererTest.cpp @@ -52,23 +52,23 @@ RendererTest::RendererTest() { void RendererTest::debugError() { std::ostringstream out; - Debug(&out) << Renderer::Error::InvalidOperation; - CORRADE_COMPARE(out.str(), "Renderer::Error::InvalidOperation\n"); + Debug(&out) << Renderer::Error::InvalidOperation << Renderer::Error(0xdead); + CORRADE_COMPARE(out.str(), "Renderer::Error::InvalidOperation Renderer::Error(0xdead)\n"); } #ifndef MAGNUM_TARGET_WEBGL void RendererTest::debugResetNotificationStrategy() { std::ostringstream out; - Debug(&out) << Renderer::ResetNotificationStrategy::LoseContextOnReset; - CORRADE_COMPARE(out.str(), "Renderer::ResetNotificationStrategy::LoseContextOnReset\n"); + Debug(&out) << Renderer::ResetNotificationStrategy::LoseContextOnReset << Renderer::ResetNotificationStrategy(0xdead); + CORRADE_COMPARE(out.str(), "Renderer::ResetNotificationStrategy::LoseContextOnReset Renderer::ResetNotificationStrategy(0xdead)\n"); } void RendererTest::debugGraphicsResetStatus() { std::ostringstream out; - Debug(&out) << Renderer::GraphicsResetStatus::GuiltyContextReset; - CORRADE_COMPARE(out.str(), "Renderer::GraphicsResetStatus::GuiltyContextReset\n"); + Debug(&out) << Renderer::GraphicsResetStatus::GuiltyContextReset << Renderer::GraphicsResetStatus(0xdead); + CORRADE_COMPARE(out.str(), "Renderer::GraphicsResetStatus::GuiltyContextReset Renderer::GraphicsResetStatus(0xdead)\n"); } #endif diff --git a/src/Magnum/Test/ResourceManagerTest.cpp b/src/Magnum/Test/ResourceManagerTest.cpp index 58d5d19ba..c35b07ffe 100644 --- a/src/Magnum/Test/ResourceManagerTest.cpp +++ b/src/Magnum/Test/ResourceManagerTest.cpp @@ -332,8 +332,8 @@ void ResourceManagerTest::loader() { void ResourceManagerTest::debugResourceState() { std::ostringstream out; - Debug{&out} << ResourceState::Loading; - CORRADE_COMPARE(out.str(), "ResourceState::Loading\n"); + Debug{&out} << ResourceState::Loading << ResourceState(0xbe); + CORRADE_COMPARE(out.str(), "ResourceState::Loading ResourceState(0xbe)\n"); } }} diff --git a/src/Magnum/Test/SamplerTest.cpp b/src/Magnum/Test/SamplerTest.cpp index a7e1a87f6..0d686aee1 100644 --- a/src/Magnum/Test/SamplerTest.cpp +++ b/src/Magnum/Test/SamplerTest.cpp @@ -62,37 +62,37 @@ SamplerTest::SamplerTest() { void SamplerTest::debugFilter() { std::ostringstream out; - Debug(&out) << Sampler::Filter::Linear; - CORRADE_COMPARE(out.str(), "Sampler::Filter::Linear\n"); + Debug(&out) << Sampler::Filter::Linear << Sampler::Filter(0xdead); + CORRADE_COMPARE(out.str(), "Sampler::Filter::Linear Sampler::Filter(0xdead)\n"); } void SamplerTest::debugMipmap() { std::ostringstream out; - Debug(&out) << Sampler::Mipmap::Base; - CORRADE_COMPARE(out.str(), "Sampler::Mipmap::Base\n"); + Debug(&out) << Sampler::Mipmap::Base << Sampler::Mipmap(0xdead); + CORRADE_COMPARE(out.str(), "Sampler::Mipmap::Base Sampler::Mipmap(0xdead)\n"); } void SamplerTest::debugWrapping() { std::ostringstream out; - Debug(&out) << Sampler::Wrapping::ClampToEdge; - CORRADE_COMPARE(out.str(), "Sampler::Wrapping::ClampToEdge\n"); + Debug(&out) << Sampler::Wrapping::ClampToEdge << Sampler::Wrapping(0xdead); + CORRADE_COMPARE(out.str(), "Sampler::Wrapping::ClampToEdge Sampler::Wrapping(0xdead)\n"); } #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) void SamplerTest::debugCompareMode() { std::ostringstream out; - Debug(&out) << Sampler::CompareMode::CompareRefToTexture; - CORRADE_COMPARE(out.str(), "Sampler::CompareMode::CompareRefToTexture\n"); + Debug(&out) << Sampler::CompareMode::CompareRefToTexture << Sampler::CompareMode(0xdead); + CORRADE_COMPARE(out.str(), "Sampler::CompareMode::CompareRefToTexture Sampler::CompareMode(0xdead)\n"); } void SamplerTest::debugCompareFunction() { std::ostringstream out; - Debug(&out) << Sampler::CompareFunction::GreaterOrEqual; - CORRADE_COMPARE(out.str(), "Sampler::CompareFunction::GreaterOrEqual\n"); + Debug(&out) << Sampler::CompareFunction::GreaterOrEqual << Sampler::CompareFunction(0xdead); + CORRADE_COMPARE(out.str(), "Sampler::CompareFunction::GreaterOrEqual Sampler::CompareFunction(0xdead)\n"); } #endif @@ -100,8 +100,8 @@ void SamplerTest::debugCompareFunction() { void SamplerTest::debugDepthStencilMode() { std::ostringstream out; - Debug(&out) << Sampler::DepthStencilMode::StencilIndex; - CORRADE_COMPARE(out.str(), "Sampler::DepthStencilMode::StencilIndex\n"); + Debug(&out) << Sampler::DepthStencilMode::StencilIndex << Sampler::DepthStencilMode(0xdead); + CORRADE_COMPARE(out.str(), "Sampler::DepthStencilMode::StencilIndex Sampler::DepthStencilMode(0xdead)\n"); } #endif diff --git a/src/Magnum/Test/ShaderTest.cpp b/src/Magnum/Test/ShaderTest.cpp index 6a1f928e1..aaa24a0cf 100644 --- a/src/Magnum/Test/ShaderTest.cpp +++ b/src/Magnum/Test/ShaderTest.cpp @@ -43,8 +43,8 @@ ShaderTest::ShaderTest() { void ShaderTest::debugType() { std::ostringstream out; - Debug(&out) << Shader::Type::Fragment; - CORRADE_COMPARE(out.str(), "Shader::Type::Fragment\n"); + Debug(&out) << Shader::Type::Fragment << Shader::Type(0xdead); + CORRADE_COMPARE(out.str(), "Shader::Type::Fragment Shader::Type(0xdead)\n"); } }} diff --git a/src/Magnum/Trade/AbstractMaterialData.cpp b/src/Magnum/Trade/AbstractMaterialData.cpp index 1e585630c..029004074 100644 --- a/src/Magnum/Trade/AbstractMaterialData.cpp +++ b/src/Magnum/Trade/AbstractMaterialData.cpp @@ -42,7 +42,7 @@ Debug& operator<<(Debug& debug, const MaterialType value) { /* LCOV_EXCL_STOP */ } - return debug << "Trade::MaterialType::(unknown)"; + return debug << "Trade::MaterialType(" << Debug::nospace << reinterpret_cast(UnsignedByte(value)) << Debug::nospace << ")"; } }} diff --git a/src/Magnum/Trade/ObjectData2D.cpp b/src/Magnum/Trade/ObjectData2D.cpp index 7505e4528..52926b3ba 100644 --- a/src/Magnum/Trade/ObjectData2D.cpp +++ b/src/Magnum/Trade/ObjectData2D.cpp @@ -49,7 +49,7 @@ Debug& operator<<(Debug& debug, ObjectInstanceType2D value) { /* LCOV_EXCL_STOP */ } - return debug << "Trade::ObjectInstanceType2D::(invalid)"; + return debug << "Trade::ObjectInstanceType2D(" << Debug::nospace << reinterpret_cast(UnsignedByte(value)) << Debug::nospace << ")"; } #endif diff --git a/src/Magnum/Trade/ObjectData3D.cpp b/src/Magnum/Trade/ObjectData3D.cpp index c86829bc2..d9d1d038e 100644 --- a/src/Magnum/Trade/ObjectData3D.cpp +++ b/src/Magnum/Trade/ObjectData3D.cpp @@ -50,7 +50,7 @@ Debug& operator<<(Debug& debug, ObjectInstanceType3D value) { /* LCOV_EXCL_STOP */ } - return debug << "Trade::ObjectInstanceType3D::(invalid)"; + return debug << "Trade::ObjectInstanceType3D(" << Debug::nospace << reinterpret_cast(UnsignedByte(value)) << Debug::nospace << ")"; } #endif diff --git a/src/Magnum/Trade/Test/CMakeLists.txt b/src/Magnum/Trade/Test/CMakeLists.txt index 6cbc59e29..17e56b827 100644 --- a/src/Magnum/Trade/Test/CMakeLists.txt +++ b/src/Magnum/Trade/Test/CMakeLists.txt @@ -38,8 +38,8 @@ corrade_add_test(TradeAbstractImageConverterTest AbstractImageConverterTest.cpp target_include_directories(TradeAbstractImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) corrade_add_test(TradeAbstractImporterTest AbstractImporterTest.cpp LIBRARIES Magnum) target_include_directories(TradeAbstractImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -corrade_add_test(TradeAbstractMaterialDataTest AbstractMaterialDataTest.cpp LIBRARIES Magnum) corrade_add_test(TradeImageDataTest ImageDataTest.cpp LIBRARIES Magnum) +corrade_add_test(TradeMaterialDataTest MaterialDataTest.cpp LIBRARIES Magnum) corrade_add_test(TradeObjectData2DTest ObjectData2DTest.cpp LIBRARIES Magnum) corrade_add_test(TradeObjectData3DTest ObjectData3DTest.cpp LIBRARIES Magnum) corrade_add_test(TradeTextureDataTest TextureDataTest.cpp LIBRARIES Magnum) diff --git a/src/Magnum/Trade/Test/AbstractMaterialDataTest.cpp b/src/Magnum/Trade/Test/MaterialDataTest.cpp similarity index 74% rename from src/Magnum/Trade/Test/AbstractMaterialDataTest.cpp rename to src/Magnum/Trade/Test/MaterialDataTest.cpp index 7d4054031..e87164b7d 100644 --- a/src/Magnum/Trade/Test/AbstractMaterialDataTest.cpp +++ b/src/Magnum/Trade/Test/MaterialDataTest.cpp @@ -26,28 +26,28 @@ #include #include -#include "Magnum/Trade/AbstractMaterialData.h" +#include "Magnum/Trade/PhongMaterialData.h" namespace Magnum { namespace Trade { namespace Test { -class AbstractMaterialDataTest: public TestSuite::Tester { +class MaterialDataTest: public TestSuite::Tester { public: - explicit AbstractMaterialDataTest(); + explicit MaterialDataTest(); - void debug(); + void debugType(); }; -AbstractMaterialDataTest::AbstractMaterialDataTest() { - addTests({&AbstractMaterialDataTest::debug}); +MaterialDataTest::MaterialDataTest() { + addTests({&MaterialDataTest::debugType}); } -void AbstractMaterialDataTest::debug() { +void MaterialDataTest::debugType() { std::ostringstream out; - Debug(&out) << MaterialType::Phong; - CORRADE_COMPARE(out.str(), "Trade::MaterialType::Phong\n"); + Debug(&out) << MaterialType::Phong << MaterialType(0xbe); + CORRADE_COMPARE(out.str(), "Trade::MaterialType::Phong Trade::MaterialType(0xbe)\n"); } }}} -CORRADE_TEST_MAIN(Magnum::Trade::Test::AbstractMaterialDataTest) +CORRADE_TEST_MAIN(Magnum::Trade::Test::MaterialDataTest) diff --git a/src/Magnum/Trade/Test/ObjectData2DTest.cpp b/src/Magnum/Trade/Test/ObjectData2DTest.cpp index fa65e8e78..8b83003ab 100644 --- a/src/Magnum/Trade/Test/ObjectData2DTest.cpp +++ b/src/Magnum/Trade/Test/ObjectData2DTest.cpp @@ -43,8 +43,8 @@ ObjectData2DTest::ObjectData2DTest() { void ObjectData2DTest::debug() { std::ostringstream o; - Debug(&o) << ObjectInstanceType2D::Empty; - CORRADE_COMPARE(o.str(), "Trade::ObjectInstanceType2D::Empty\n"); + Debug(&o) << ObjectInstanceType2D::Empty << ObjectInstanceType2D(0xbe); + CORRADE_COMPARE(o.str(), "Trade::ObjectInstanceType2D::Empty Trade::ObjectInstanceType2D(0xbe)\n"); } }}} diff --git a/src/Magnum/Trade/Test/ObjectData3DTest.cpp b/src/Magnum/Trade/Test/ObjectData3DTest.cpp index 4f5a0d674..54de14693 100644 --- a/src/Magnum/Trade/Test/ObjectData3DTest.cpp +++ b/src/Magnum/Trade/Test/ObjectData3DTest.cpp @@ -43,8 +43,8 @@ ObjectData3DTest::ObjectData3DTest() { void ObjectData3DTest::debug() { std::ostringstream o; - Debug(&o) << ObjectInstanceType3D::Light; - CORRADE_COMPARE(o.str(), "Trade::ObjectInstanceType3D::Light\n"); + Debug(&o) << ObjectInstanceType3D::Light << ObjectInstanceType3D(0xbe); + CORRADE_COMPARE(o.str(), "Trade::ObjectInstanceType3D::Light Trade::ObjectInstanceType3D(0xbe)\n"); } }}} diff --git a/src/Magnum/Trade/Test/TextureDataTest.cpp b/src/Magnum/Trade/Test/TextureDataTest.cpp index 30c0050c1..f14a0a98a 100644 --- a/src/Magnum/Trade/Test/TextureDataTest.cpp +++ b/src/Magnum/Trade/Test/TextureDataTest.cpp @@ -44,8 +44,8 @@ TextureDataTest::TextureDataTest() { void TextureDataTest::debug() { std::ostringstream out; - Debug(&out) << TextureData::Type::Texture3D; - CORRADE_COMPARE(out.str(), "Trade::TextureData::Type::Texture3D\n"); + Debug(&out) << TextureData::Type::Texture3D << TextureData::Type(0xbe); + CORRADE_COMPARE(out.str(), "Trade::TextureData::Type::Texture3D Trade::TextureData::Type(0xbe)\n"); } }}} diff --git a/src/Magnum/Trade/TextureData.cpp b/src/Magnum/Trade/TextureData.cpp index b646306b3..e1d4fcb2d 100644 --- a/src/Magnum/Trade/TextureData.cpp +++ b/src/Magnum/Trade/TextureData.cpp @@ -40,7 +40,7 @@ Debug& operator<<(Debug& debug, const TextureData::Type value) { /* LCOV_EXCL_STOP */ } - return debug << "Trade::TextureData::Type::(unknown)"; + return debug << "Trade::TextureData::Type(" << Debug::nospace << reinterpret_cast(UnsignedByte(value)) << Debug::nospace << ")"; } #endif From 1bfa4c9846c5c5d4f9c67e35e5854fc2c7460544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 21 Aug 2016 20:56:59 +0200 Subject: [PATCH 124/290] Trade: make most constructors and assignments noexcept. --- src/Magnum/Image.cpp | 2 +- src/Magnum/Image.h | 10 +++++----- src/Magnum/Trade/AbstractMaterialData.cpp | 2 +- src/Magnum/Trade/AbstractMaterialData.h | 22 +++++++++++----------- src/Magnum/Trade/ImageData.cpp | 2 +- src/Magnum/Trade/ImageData.h | 14 +++++++------- src/Magnum/Trade/MeshData2D.cpp | 4 ++-- src/Magnum/Trade/MeshData2D.h | 4 ++-- src/Magnum/Trade/MeshData3D.cpp | 4 ++-- src/Magnum/Trade/MeshData3D.h | 4 ++-- src/Magnum/Trade/MeshObjectData2D.h | 4 ++-- src/Magnum/Trade/MeshObjectData3D.h | 4 ++-- src/Magnum/Trade/ObjectData2D.cpp | 4 ++-- src/Magnum/Trade/ObjectData2D.h | 4 ++-- src/Magnum/Trade/ObjectData3D.cpp | 4 ++-- src/Magnum/Trade/ObjectData3D.h | 4 ++-- src/Magnum/Trade/PhongMaterialData.h | 8 ++++---- src/Magnum/Trade/SceneData.cpp | 4 ++-- src/Magnum/Trade/SceneData.h | 4 ++-- src/Magnum/Trade/TextureData.h | 6 +++--- 20 files changed, 57 insertions(+), 57 deletions(-) diff --git a/src/Magnum/Image.cpp b/src/Magnum/Image.cpp index 98c9cadf3..163ba5640 100644 --- a/src/Magnum/Image.cpp +++ b/src/Magnum/Image.cpp @@ -27,7 +27,7 @@ namespace Magnum { -template Image::Image(PixelStorage storage, PixelFormat format, PixelType type, const VectorTypeFor& size, Containers::Array&& data): _storage{storage}, _format{format}, _type{type}, _size{size}, _data{std::move(data)} { +template Image::Image(PixelStorage storage, PixelFormat format, PixelType type, const VectorTypeFor& size, Containers::Array&& data) noexcept: _storage{storage}, _format{format}, _type{type}, _size{size}, _data{std::move(data)} { CORRADE_ASSERT(Implementation::imageDataSize(*this) <= _data.size(), "Image::Image(): bad image data size, got" << _data.size() << "but expected at least" << Implementation::imageDataSize(*this), ); } diff --git a/src/Magnum/Image.h b/src/Magnum/Image.h index c62379a44..4bbbfdbe0 100644 --- a/src/Magnum/Image.h +++ b/src/Magnum/Image.h @@ -59,19 +59,19 @@ template class Image { * The data are expected to be of proper size for given @p storage * parameters. */ - explicit Image(PixelStorage storage, PixelFormat format, PixelType type, const VectorTypeFor& size, Containers::Array&& data); + explicit Image(PixelStorage storage, PixelFormat format, PixelType type, const VectorTypeFor& size, Containers::Array&& data) noexcept; /** @overload * Similar to the above, but uses default @ref PixelStorage parameters. */ - explicit Image(PixelFormat format, PixelType type, const VectorTypeFor& size, Containers::Array&& data): Image{{}, format, type, size, std::move(data)} {} + explicit Image(PixelFormat format, PixelType type, const VectorTypeFor& size, Containers::Array&& data) noexcept: Image{{}, format, type, size, std::move(data)} {} #ifdef MAGNUM_BUILD_DEPRECATED /** @copybrief Image(PixelFormat, PixelType, const VectorTypeFor&, Containers::Array&&) * @deprecated Use @ref Image(PixelFormat, PixelType, const VectorTypeFor&, Containers::Array&&) * instead. */ - explicit CORRADE_DEPRECATED("use Image(PixelFormat, PixelType, const VectorTypeFor&, Containers::Array&&) instead") Image(PixelFormat format, PixelType type, const VectorTypeFor& size, void* data): Image{{}, format, type, size, Containers::Array{reinterpret_cast(data), Implementation::imageDataSizeFor(format, type, size)}} {} + explicit CORRADE_DEPRECATED("use Image(PixelFormat, PixelType, const VectorTypeFor&, Containers::Array&&) instead") Image(PixelFormat format, PixelType type, const VectorTypeFor& size, void* data) noexcept: Image{{}, format, type, size, Containers::Array{reinterpret_cast(data), Implementation::imageDataSizeFor(format, type, size)}} {} #endif /** @@ -87,12 +87,12 @@ template class Image { * @ref AbstractFramebuffer::read() "*Framebuffer::read()" to fill the * image with data using @p storage settings. */ - /*implicit*/ Image(PixelStorage storage, PixelFormat format, PixelType type): _storage{storage}, _format{format}, _type{type}, _data{} {} + /*implicit*/ Image(PixelStorage storage, PixelFormat format, PixelType type) noexcept: _storage{storage}, _format{format}, _type{type}, _data{} {} /** @overload * Similar to the above, but uses default @ref PixelStorage parameters. */ - /*implicit*/ Image(PixelFormat format, PixelType type): Image{{}, format, type} {} + /*implicit*/ Image(PixelFormat format, PixelType type) noexcept: Image{{}, format, type} {} /** @brief Copying is not allowed */ Image(const Image&) = delete; diff --git a/src/Magnum/Trade/AbstractMaterialData.cpp b/src/Magnum/Trade/AbstractMaterialData.cpp index 029004074..9f9b33d9a 100644 --- a/src/Magnum/Trade/AbstractMaterialData.cpp +++ b/src/Magnum/Trade/AbstractMaterialData.cpp @@ -29,7 +29,7 @@ namespace Magnum { namespace Trade { -AbstractMaterialData::AbstractMaterialData(const MaterialType type, const void* const importerState): _type{type}, _importerState{importerState} {} +AbstractMaterialData::AbstractMaterialData(const MaterialType type, const void* const importerState) noexcept: _type{type}, _importerState{importerState} {} AbstractMaterialData::~AbstractMaterialData() {} diff --git a/src/Magnum/Trade/AbstractMaterialData.h b/src/Magnum/Trade/AbstractMaterialData.h index 894d10ea2..1472165bd 100644 --- a/src/Magnum/Trade/AbstractMaterialData.h +++ b/src/Magnum/Trade/AbstractMaterialData.h @@ -50,27 +50,19 @@ Subclasses provide access to parameters for given material type. */ class MAGNUM_EXPORT AbstractMaterialData { public: - /** - * @brief Constructor - * @param type Material type - * @param importerState Importer-specific state - */ - explicit AbstractMaterialData(MaterialType type, const void* importerState = nullptr); - - /** @brief Destructor */ - virtual ~AbstractMaterialData() = 0; + virtual ~AbstractMaterialData(); /** @brief Copying is not allowed */ AbstractMaterialData(const AbstractMaterialData&) = delete; /** @brief Move constructor */ - AbstractMaterialData(AbstractMaterialData&&) = default; + AbstractMaterialData(AbstractMaterialData&&) noexcept = default; /** @brief Copying is not allowed */ AbstractMaterialData& operator=(const AbstractMaterialData&) = delete; /** @brief Move assignment */ - AbstractMaterialData& operator=(AbstractMaterialData&&) = default; + AbstractMaterialData& operator=(AbstractMaterialData&&) noexcept = default; /** @brief Material type */ MaterialType type() const { return _type; } @@ -82,6 +74,14 @@ class MAGNUM_EXPORT AbstractMaterialData { */ const void* importerState() const { return _importerState; } + protected: + /** + * @brief Constructor + * @param type Material type + * @param importerState Importer-specific state + */ + explicit AbstractMaterialData(MaterialType type, const void* importerState = nullptr) noexcept; + private: MaterialType _type; const void* _importerState; diff --git a/src/Magnum/Trade/ImageData.cpp b/src/Magnum/Trade/ImageData.cpp index 587685009..f94b914f9 100644 --- a/src/Magnum/Trade/ImageData.cpp +++ b/src/Magnum/Trade/ImageData.cpp @@ -27,7 +27,7 @@ namespace Magnum { namespace Trade { -template ImageData::ImageData(const PixelStorage storage, const PixelFormat format, const PixelType type, const VectorTypeFor& size, Containers::Array&& data, const void* const importerState): _compressed{false}, _storage{storage}, _format{format}, _type{type}, _size{size}, _data{std::move(data)}, _importerState{importerState} { +template ImageData::ImageData(const PixelStorage storage, const PixelFormat format, const PixelType type, const VectorTypeFor& size, Containers::Array&& data, const void* const importerState) noexcept: _compressed{false}, _storage{storage}, _format{format}, _type{type}, _size{size}, _data{std::move(data)}, _importerState{importerState} { CORRADE_ASSERT(Implementation::imageDataSize(*this) <= _data.size(), "Trade::ImageData::ImageData(): bad image data size, got" << _data.size() << "but expected at least" << Implementation::imageDataSize(*this), ); } diff --git a/src/Magnum/Trade/ImageData.h b/src/Magnum/Trade/ImageData.h index 28f53005c..fc38a63bc 100644 --- a/src/Magnum/Trade/ImageData.h +++ b/src/Magnum/Trade/ImageData.h @@ -68,18 +68,18 @@ template class ImageData { * The data are expected to be of proper size for given @p storage * parameters. */ - explicit ImageData(PixelStorage storage, PixelFormat format, PixelType type, const VectorTypeFor& size, Containers::Array&& data, const void* importerState = nullptr); + explicit ImageData(PixelStorage storage, PixelFormat format, PixelType type, const VectorTypeFor& size, Containers::Array&& data, const void* importerState = nullptr) noexcept; /** @overload * Similar to the above, but uses default @ref PixelStorage parameters. */ - explicit ImageData(PixelFormat format, PixelType type, const VectorTypeFor& size, Containers::Array&& data, const void* importerState = nullptr): ImageData{{}, format, type, size, std::move(data), importerState} {} + explicit ImageData(PixelFormat format, PixelType type, const VectorTypeFor& size, Containers::Array&& data, const void* importerState = nullptr) noexcept: ImageData{{}, format, type, size, std::move(data), importerState} {} #ifdef MAGNUM_BUILD_DEPRECATED /** @copybrief ImageData(PixelFormat, PixelType, const VectorTypeFor&, Containers::Array&&, const void*) * @deprecated Use @ref ImageData(PixelFormat, PixelType, const VectorTypeFor&, Containers::Array&&, const void*) instead. */ - explicit CORRADE_DEPRECATED("use ImageData(PixelFormat, PixelType, const VectorTypeFor&, Containers::Array&&) instead") ImageData(PixelFormat format, PixelType type, const VectorTypeFor& size, void* data): ImageData{format, type, size, Containers::Array{reinterpret_cast(data), Magnum::Implementation::imageDataSizeFor(format, type, size)}} {} + explicit CORRADE_DEPRECATED("use ImageData(PixelFormat, PixelType, const VectorTypeFor&, Containers::Array&&) instead") ImageData(PixelFormat format, PixelType type, const VectorTypeFor& size, void* data) noexcept: ImageData{format, type, size, Containers::Array{reinterpret_cast(data), Magnum::Implementation::imageDataSizeFor(format, type, size)}} {} #endif #ifndef MAGNUM_TARGET_GLES @@ -97,7 +97,7 @@ template class ImageData { * @requires_gl Compressed pixel storage is hardcoded in OpenGL ES and * WebGL. */ - explicit ImageData(CompressedPixelStorage storage, CompressedPixelFormat format, const VectorTypeFor& size, Containers::Array&& data, const void* importerState = nullptr); + explicit ImageData(CompressedPixelStorage storage, CompressedPixelFormat format, const VectorTypeFor& size, Containers::Array&& data, const void* importerState = nullptr) noexcept; #endif /** @@ -110,7 +110,7 @@ template class ImageData { * Similar the above, but uses default @ref CompressedPixelStorage * parameters (or the hardcoded ones in OpenGL ES and WebGL). */ - explicit ImageData(CompressedPixelFormat format, const VectorTypeFor& size, Containers::Array&& data, const void* importerState = nullptr); + explicit ImageData(CompressedPixelFormat format, const VectorTypeFor& size, Containers::Array&& data, const void* importerState = nullptr) noexcept; /** @brief Copying is not allowed */ ImageData(const ImageData&) = delete; @@ -297,14 +297,14 @@ template ImageData::ImageData( #ifndef MAGNUM_TARGET_GLES const CompressedPixelStorage storage, #endif - const CompressedPixelFormat format, const VectorTypeFor& size, Containers::Array&& data, const void* importerState): _compressed{true}, + const CompressedPixelFormat format, const VectorTypeFor& size, Containers::Array&& data, const void* importerState) noexcept: _compressed{true}, #ifndef MAGNUM_TARGET_GLES _compressedStorage{storage}, #endif _compressedFormat{format}, _size{size}, _data{std::move(data)}, _importerState{importerState} {} #ifndef MAGNUM_TARGET_GLES -template inline ImageData::ImageData(const CompressedPixelFormat format, const VectorTypeFor& size, Containers::Array&& data, const void* const importerState): ImageData{{}, format, size, std::move(data), importerState} {} +template inline ImageData::ImageData(const CompressedPixelFormat format, const VectorTypeFor& size, Containers::Array&& data, const void* const importerState) noexcept: ImageData{{}, format, size, std::move(data), importerState} {} #endif template inline ImageData::ImageData(ImageData&& other) noexcept: _compressed{std::move(other._compressed)}, _size{std::move(other._size)}, _data{std::move(other._data)}, _importerState{std::move(other._importerState)} { diff --git a/src/Magnum/Trade/MeshData2D.cpp b/src/Magnum/Trade/MeshData2D.cpp index 0793d63a3..4333e8ee2 100644 --- a/src/Magnum/Trade/MeshData2D.cpp +++ b/src/Magnum/Trade/MeshData2D.cpp @@ -33,11 +33,11 @@ MeshData2D::MeshData2D(const MeshPrimitive primitive, std::vector i CORRADE_ASSERT(!_positions.empty(), "Trade::MeshData2D: no position array specified", ); } -MeshData2D::MeshData2D(MeshData2D&&) = default; +MeshData2D::MeshData2D(MeshData2D&&) noexcept = default; MeshData2D::~MeshData2D() = default; -MeshData2D& MeshData2D::operator=(MeshData2D&&) = default; +MeshData2D& MeshData2D::operator=(MeshData2D&&) noexcept = default; std::vector& MeshData2D::indices() { CORRADE_ASSERT(isIndexed(), "Trade::MeshData2D::indices(): the mesh is not indexed", _indices); diff --git a/src/Magnum/Trade/MeshData2D.h b/src/Magnum/Trade/MeshData2D.h index 69946251f..bfb566f65 100644 --- a/src/Magnum/Trade/MeshData2D.h +++ b/src/Magnum/Trade/MeshData2D.h @@ -62,7 +62,7 @@ class MAGNUM_EXPORT MeshData2D { MeshData2D(const MeshData2D&) = delete; /** @brief Move constructor */ - MeshData2D(MeshData2D&&); + MeshData2D(MeshData2D&&) noexcept; ~MeshData2D(); @@ -70,7 +70,7 @@ class MAGNUM_EXPORT MeshData2D { MeshData2D& operator=(const MeshData2D&) = delete; /** @brief Move assignment */ - MeshData2D& operator=(MeshData2D&&); + MeshData2D& operator=(MeshData2D&&) noexcept; /** @brief Primitive */ MeshPrimitive primitive() const { return _primitive; } diff --git a/src/Magnum/Trade/MeshData3D.cpp b/src/Magnum/Trade/MeshData3D.cpp index 393584993..549e23311 100644 --- a/src/Magnum/Trade/MeshData3D.cpp +++ b/src/Magnum/Trade/MeshData3D.cpp @@ -33,11 +33,11 @@ MeshData3D::MeshData3D(const MeshPrimitive primitive, std::vector i CORRADE_ASSERT(!_positions.empty(), "Trade::MeshData3D: no position array specified", ); } -MeshData3D::MeshData3D(MeshData3D&&) = default; +MeshData3D::MeshData3D(MeshData3D&&) noexcept = default; MeshData3D::~MeshData3D() = default; -MeshData3D& MeshData3D::operator=(MeshData3D&&) = default; +MeshData3D& MeshData3D::operator=(MeshData3D&&) noexcept = default; std::vector& MeshData3D::indices() { CORRADE_ASSERT(isIndexed(), "Trade::MeshData3D::indices(): the mesh is not indexed", _indices); diff --git a/src/Magnum/Trade/MeshData3D.h b/src/Magnum/Trade/MeshData3D.h index 060f78bdd..eb3fea4c5 100644 --- a/src/Magnum/Trade/MeshData3D.h +++ b/src/Magnum/Trade/MeshData3D.h @@ -63,7 +63,7 @@ class MAGNUM_EXPORT MeshData3D { MeshData3D(const MeshData3D&) = delete; /** @brief Move constructor */ - MeshData3D(MeshData3D&&); + MeshData3D(MeshData3D&&) noexcept; ~MeshData3D(); @@ -71,7 +71,7 @@ class MAGNUM_EXPORT MeshData3D { MeshData3D& operator=(const MeshData3D&) = delete; /** @brief Move assignment */ - MeshData3D& operator=(MeshData3D&&); + MeshData3D& operator=(MeshData3D&&) noexcept; /** @brief Primitive */ MeshPrimitive primitive() const { return _primitive; } diff --git a/src/Magnum/Trade/MeshObjectData2D.h b/src/Magnum/Trade/MeshObjectData2D.h index 26dad47c5..f103fd10e 100644 --- a/src/Magnum/Trade/MeshObjectData2D.h +++ b/src/Magnum/Trade/MeshObjectData2D.h @@ -57,13 +57,13 @@ class MAGNUM_EXPORT MeshObjectData2D: public ObjectData2D { MeshObjectData2D(const MeshObjectData2D&) = delete; /** @brief Move constructor */ - MeshObjectData2D(MeshObjectData2D&&) = default; + MeshObjectData2D(MeshObjectData2D&&) noexcept = default; /** @brief Copying is not allowed */ MeshObjectData2D& operator=(const MeshObjectData2D&) = delete; /** @brief Move assignment */ - MeshObjectData2D& operator=(MeshObjectData2D&&) = default; + MeshObjectData2D& operator=(MeshObjectData2D&&) noexcept = default; /** * @brief Material ID diff --git a/src/Magnum/Trade/MeshObjectData3D.h b/src/Magnum/Trade/MeshObjectData3D.h index 305b74d36..082e75166 100644 --- a/src/Magnum/Trade/MeshObjectData3D.h +++ b/src/Magnum/Trade/MeshObjectData3D.h @@ -57,13 +57,13 @@ class MAGNUM_EXPORT MeshObjectData3D: public ObjectData3D { MeshObjectData3D(const MeshObjectData3D&) = delete; /** @brief Move constructor */ - MeshObjectData3D(MeshObjectData3D&&) = default; + MeshObjectData3D(MeshObjectData3D&&) noexcept = default; /** @brief Copying is not allowed */ MeshObjectData3D& operator=(const MeshObjectData3D&) = delete; /** @brief Move assignment */ - MeshObjectData3D& operator=(MeshObjectData3D&&) = default; + MeshObjectData3D& operator=(MeshObjectData3D&&) noexcept = default; /** * @brief Material ID diff --git a/src/Magnum/Trade/ObjectData2D.cpp b/src/Magnum/Trade/ObjectData2D.cpp index 52926b3ba..8ec678f35 100644 --- a/src/Magnum/Trade/ObjectData2D.cpp +++ b/src/Magnum/Trade/ObjectData2D.cpp @@ -31,11 +31,11 @@ ObjectData2D::ObjectData2D(std::vector children, const Matrix3& tra ObjectData2D::ObjectData2D(std::vector children, const Matrix3& transformation, const void* const importerState): _children{std::move(children)}, _transformation{transformation}, _instanceType{ObjectInstanceType2D::Empty}, _instance{-1}, _importerState{importerState} {} -ObjectData2D::ObjectData2D(ObjectData2D&&) = default; +ObjectData2D::ObjectData2D(ObjectData2D&&) noexcept = default; ObjectData2D::~ObjectData2D() = default; -ObjectData2D& ObjectData2D::operator=(ObjectData2D&&) = default; +ObjectData2D& ObjectData2D::operator=(ObjectData2D&&) noexcept = default; #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, ObjectInstanceType2D value) { diff --git a/src/Magnum/Trade/ObjectData2D.h b/src/Magnum/Trade/ObjectData2D.h index 01b3cd2b2..896e7fff0 100644 --- a/src/Magnum/Trade/ObjectData2D.h +++ b/src/Magnum/Trade/ObjectData2D.h @@ -83,7 +83,7 @@ class MAGNUM_EXPORT ObjectData2D { ObjectData2D(const ObjectData2D&) = delete; /** @brief Move constructor */ - ObjectData2D(ObjectData2D&&); + ObjectData2D(ObjectData2D&&) noexcept; /** @brief Destructor */ virtual ~ObjectData2D(); @@ -92,7 +92,7 @@ class MAGNUM_EXPORT ObjectData2D { ObjectData2D& operator=(const ObjectData2D&) = delete; /** @brief Move assignment */ - ObjectData2D& operator=(ObjectData2D&&); + ObjectData2D& operator=(ObjectData2D&&) noexcept; /** @brief Child objects */ std::vector& children() { return _children; } diff --git a/src/Magnum/Trade/ObjectData3D.cpp b/src/Magnum/Trade/ObjectData3D.cpp index d9d1d038e..900156383 100644 --- a/src/Magnum/Trade/ObjectData3D.cpp +++ b/src/Magnum/Trade/ObjectData3D.cpp @@ -31,11 +31,11 @@ ObjectData3D::ObjectData3D(std::vector children, const Matrix4& tra ObjectData3D::ObjectData3D(std::vector children, const Matrix4& transformation, const void* const importerState): _children{std::move(children)}, _transformation{transformation}, _instanceType{ObjectInstanceType3D::Empty}, _instance{-1}, _importerState{importerState} {} -ObjectData3D::ObjectData3D(ObjectData3D&&) = default; +ObjectData3D::ObjectData3D(ObjectData3D&&) noexcept = default; ObjectData3D::~ObjectData3D() = default; -ObjectData3D& ObjectData3D::operator=(ObjectData3D&&) = default; +ObjectData3D& ObjectData3D::operator=(ObjectData3D&&) noexcept = default; #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, ObjectInstanceType3D value) { diff --git a/src/Magnum/Trade/ObjectData3D.h b/src/Magnum/Trade/ObjectData3D.h index 382615bc1..b2aea9419 100644 --- a/src/Magnum/Trade/ObjectData3D.h +++ b/src/Magnum/Trade/ObjectData3D.h @@ -85,7 +85,7 @@ class MAGNUM_EXPORT ObjectData3D { ObjectData3D(const ObjectData3D&) = delete; /** @brief Move constructor */ - ObjectData3D(ObjectData3D&&); + ObjectData3D(ObjectData3D&&) noexcept; /** @brief Destructor */ virtual ~ObjectData3D(); @@ -94,7 +94,7 @@ class MAGNUM_EXPORT ObjectData3D { ObjectData3D& operator=(const ObjectData3D&) = delete; /** @brief Move assignment */ - ObjectData3D& operator=(ObjectData3D&&); + ObjectData3D& operator=(ObjectData3D&&) noexcept; /** @brief Child objects */ std::vector& children() { return _children; } diff --git a/src/Magnum/Trade/PhongMaterialData.h b/src/Magnum/Trade/PhongMaterialData.h index dee266602..2b076b2e4 100644 --- a/src/Magnum/Trade/PhongMaterialData.h +++ b/src/Magnum/Trade/PhongMaterialData.h @@ -73,7 +73,7 @@ class MAGNUM_EXPORT PhongMaterialData: public AbstractMaterialData { * Colors and textures should be specified using member functions based * on what flags are set. */ - explicit PhongMaterialData(Flags flags, Float shininess, const void* importerState = nullptr): AbstractMaterialData{MaterialType::Phong, importerState}, _shininess{shininess}, _flags{flags} {} + explicit PhongMaterialData(Flags flags, Float shininess, const void* importerState = nullptr) noexcept: AbstractMaterialData{MaterialType::Phong, importerState}, _flags{flags}, _shininess{shininess} {} /** @brief Material flags */ Flags flags() const { return _flags; } @@ -139,15 +139,15 @@ class MAGNUM_EXPORT PhongMaterialData: public AbstractMaterialData { union Source { Source() {} - Vector3 color; + Color3 color; UnsignedInt texture; }; + Flags _flags; + Float _shininess; Source _ambient, _diffuse, _specular; - Float _shininess; - Flags _flags; }; CORRADE_ENUMSET_OPERATORS(PhongMaterialData::Flags) diff --git a/src/Magnum/Trade/SceneData.cpp b/src/Magnum/Trade/SceneData.cpp index f00726a0b..b51449f91 100644 --- a/src/Magnum/Trade/SceneData.cpp +++ b/src/Magnum/Trade/SceneData.cpp @@ -29,8 +29,8 @@ namespace Magnum { namespace Trade { SceneData::SceneData(std::vector children2D, std::vector children3D, const void* const importerState): _children2D{std::move(children2D)}, _children3D{std::move(children3D)}, _importerState{importerState} {} -SceneData::SceneData(SceneData&&) = default; +SceneData::SceneData(SceneData&&) noexcept = default; -SceneData& SceneData::operator=(SceneData&&) = default; +SceneData& SceneData::operator=(SceneData&&) noexcept = default; }} diff --git a/src/Magnum/Trade/SceneData.h b/src/Magnum/Trade/SceneData.h index 0c12bb7f0..edaba4bff 100644 --- a/src/Magnum/Trade/SceneData.h +++ b/src/Magnum/Trade/SceneData.h @@ -54,13 +54,13 @@ class MAGNUM_EXPORT SceneData { SceneData(const SceneData&) = delete; /** @brief Move constructor */ - SceneData(SceneData&&); + SceneData(SceneData&&) noexcept; /** @brief Copying is not allowed */ SceneData& operator=(const SceneData&) = delete; /** @brief Move assignment */ - SceneData& operator=(SceneData&&); + SceneData& operator=(SceneData&&) noexcept; /** @brief Two-dimensional child objects */ const std::vector& children2D() const { return _children2D; } diff --git a/src/Magnum/Trade/TextureData.h b/src/Magnum/Trade/TextureData.h index 23cfe3071..b942959b3 100644 --- a/src/Magnum/Trade/TextureData.h +++ b/src/Magnum/Trade/TextureData.h @@ -62,19 +62,19 @@ class TextureData { * @param image Texture image ID * @param importerState Importer-specific state */ - TextureData(Type type, Sampler::Filter minificationFilter, Sampler::Filter magnificationFilter, Sampler::Mipmap mipmapFilter, Array3D wrapping, UnsignedInt image, const void* importerState = nullptr): _type{type}, _minificationFilter{minificationFilter}, _magnificationFilter{magnificationFilter}, _mipmapFilter{mipmapFilter}, _wrapping{wrapping}, _image{image}, _importerState{importerState} {} + TextureData(Type type, Sampler::Filter minificationFilter, Sampler::Filter magnificationFilter, Sampler::Mipmap mipmapFilter, Array3D wrapping, UnsignedInt image, const void* importerState = nullptr) noexcept: _type{type}, _minificationFilter{minificationFilter}, _magnificationFilter{magnificationFilter}, _mipmapFilter{mipmapFilter}, _wrapping{wrapping}, _image{image}, _importerState{importerState} {} /** @brief Copying is not allowed */ TextureData(const TextureData&) = delete; /** @brief Move constructor */ - TextureData(TextureData&&) = default; + TextureData(TextureData&&) noexcept = default; /** @brief Copying is not allowed */ TextureData& operator=(const TextureData&) = delete; /** @brief Move assignment */ - TextureData& operator=(TextureData&&) = default; + TextureData& operator=(TextureData&&) noexcept = default; /** @brief Texture type */ Type type() const { return _type; } From db18016ef05383cf451438bf9bf92f0df25f506b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 21 Aug 2016 20:59:19 +0200 Subject: [PATCH 125/290] Trade: test construction and assignments of the container classes. --- src/Magnum/Trade/CameraData.h | 12 ++ src/Magnum/Trade/PhongMaterialData.cpp | 47 ++++- src/Magnum/Trade/PhongMaterialData.h | 32 ++-- src/Magnum/Trade/Test/CMakeLists.txt | 4 + src/Magnum/Trade/Test/CameraDataTest.cpp | 121 +++++++++++++ src/Magnum/Trade/Test/MaterialDataTest.cpp | 192 ++++++++++++++++++++- src/Magnum/Trade/Test/MeshData2DTest.cpp | 143 +++++++++++++++ src/Magnum/Trade/Test/MeshData3DTest.cpp | 169 ++++++++++++++++++ src/Magnum/Trade/Test/ObjectData2DTest.cpp | 82 ++++++++- src/Magnum/Trade/Test/ObjectData3DTest.cpp | 94 +++++++++- src/Magnum/Trade/Test/SceneDataTest.cpp | 82 +++++++++ src/Magnum/Trade/Test/TextureDataTest.cpp | 77 ++++++++- 12 files changed, 1030 insertions(+), 25 deletions(-) create mode 100644 src/Magnum/Trade/Test/CameraDataTest.cpp create mode 100644 src/Magnum/Trade/Test/MeshData2DTest.cpp create mode 100644 src/Magnum/Trade/Test/MeshData3DTest.cpp create mode 100644 src/Magnum/Trade/Test/SceneDataTest.cpp diff --git a/src/Magnum/Trade/CameraData.h b/src/Magnum/Trade/CameraData.h index 7daa4acd2..1b7f2d7b8 100644 --- a/src/Magnum/Trade/CameraData.h +++ b/src/Magnum/Trade/CameraData.h @@ -54,6 +54,18 @@ class CameraData { */ explicit CameraData(Rad fov, Float near, Float far, const void* importerState = nullptr) noexcept; + /** @brief Copying is not allowed */ + CameraData(const CameraData&) = delete; + + /** @brief Move constructor */ + CameraData(CameraData&&) noexcept = default; + + /** @brief Copying is not allowed */ + CameraData& operator=(const CameraData&) = delete; + + /** @brief Move assignment */ + CameraData& operator=(CameraData&&) noexcept = default; + /** @brief Field-of-view angle */ Rad fov() const { return _fov; } diff --git a/src/Magnum/Trade/PhongMaterialData.cpp b/src/Magnum/Trade/PhongMaterialData.cpp index ff427d677..2d8423ea2 100644 --- a/src/Magnum/Trade/PhongMaterialData.cpp +++ b/src/Magnum/Trade/PhongMaterialData.cpp @@ -27,7 +27,48 @@ namespace Magnum { namespace Trade { -Vector3& PhongMaterialData::ambientColor() { +PhongMaterialData::PhongMaterialData(PhongMaterialData&& other) noexcept: AbstractMaterialData{std::move(other)}, _flags{std::move(other._flags)}, _shininess{std::move(other._shininess)} { + if(_flags & Flag::AmbientTexture) + _ambient.texture = other._ambient.texture; + else + _ambient.color = other._ambient.color; + + if(_flags & Flag::DiffuseTexture) + _diffuse.texture = other._diffuse.texture; + else + _diffuse.color = other._diffuse.color; + + if(_flags & Flag::SpecularTexture) + _specular.texture = other._specular.texture; + else + _specular.color = other._specular.color; +} + +PhongMaterialData& PhongMaterialData::operator=(PhongMaterialData&& other) noexcept { + AbstractMaterialData::operator=(std::move(other)); + + _flags = other._flags; + _shininess = other._shininess; + + if(_flags & Flag::AmbientTexture) + _ambient.texture = other._ambient.texture; + else + _ambient.color = other._ambient.color; + + if(_flags & Flag::DiffuseTexture) + _diffuse.texture = other._diffuse.texture; + else + _diffuse.color = other._diffuse.color; + + if(_flags & Flag::SpecularTexture) + _specular.texture = other._specular.texture; + else + _specular.color = other._specular.color; + + return *this; +} + +Color3& PhongMaterialData::ambientColor() { CORRADE_ASSERT(!(_flags & Flag::AmbientTexture), "Trade::PhongMaterialData::ambientColor(): the material has ambient texture", _ambient.color); return _ambient.color; } @@ -37,7 +78,7 @@ UnsignedInt& PhongMaterialData::ambientTexture() { return _ambient.texture; } -Vector3& PhongMaterialData::diffuseColor() { +Color3& PhongMaterialData::diffuseColor() { CORRADE_ASSERT(!(_flags & Flag::DiffuseTexture), "Trade::PhongMaterialData::diffuseColor(): the material has diffuse texture", _diffuse.color); return _diffuse.color; } @@ -47,7 +88,7 @@ UnsignedInt& PhongMaterialData::diffuseTexture() { return _diffuse.texture; } -Vector3& PhongMaterialData::specularColor() { +Color3& PhongMaterialData::specularColor() { CORRADE_ASSERT(!(_flags & Flag::SpecularTexture), "Trade::PhongMaterialData::specularColor(): the material has specular texture", _specular.color); return _specular.color; } diff --git a/src/Magnum/Trade/PhongMaterialData.h b/src/Magnum/Trade/PhongMaterialData.h index 2b076b2e4..3bc231175 100644 --- a/src/Magnum/Trade/PhongMaterialData.h +++ b/src/Magnum/Trade/PhongMaterialData.h @@ -30,7 +30,7 @@ */ #include "Magnum/Magnum.h" -#include "Magnum/Math/Vector3.h" +#include "Magnum/Math/Color.h" #include "Magnum/Trade/AbstractMaterialData.h" namespace Magnum { namespace Trade { @@ -75,6 +75,18 @@ class MAGNUM_EXPORT PhongMaterialData: public AbstractMaterialData { */ explicit PhongMaterialData(Flags flags, Float shininess, const void* importerState = nullptr) noexcept: AbstractMaterialData{MaterialType::Phong, importerState}, _flags{flags}, _shininess{shininess} {} + /** @brief Copying is not allowed */ + PhongMaterialData(const PhongMaterialData&) = delete; + + /** @brief Move constructor */ + PhongMaterialData(PhongMaterialData&& other) noexcept; + + /** @brief Copying is not allowed */ + PhongMaterialData& operator=(const PhongMaterialData&) = delete; + + /** @brief Move assignment */ + PhongMaterialData& operator=(PhongMaterialData&& other) noexcept; + /** @brief Material flags */ Flags flags() const { return _flags; } @@ -84,8 +96,8 @@ class MAGNUM_EXPORT PhongMaterialData: public AbstractMaterialData { * Available only if the material doesn't have @ref Flag::AmbientTexture. * @see @ref flags() */ - Vector3& ambientColor(); - Vector3 ambientColor() const; /**< @overload */ + Color3& ambientColor(); + Color3 ambientColor() const; /**< @overload */ /** * @brief Ambient texture ID @@ -102,8 +114,8 @@ class MAGNUM_EXPORT PhongMaterialData: public AbstractMaterialData { * Available only if the material doesn't have @ref Flag::DiffuseTexture. * @see @ref flags() */ - Vector3& diffuseColor(); - Vector3 diffuseColor() const; /**< @overload */ + Color3& diffuseColor(); + Color3 diffuseColor() const; /**< @overload */ /** * @brief Diffuse texture ID @@ -120,8 +132,8 @@ class MAGNUM_EXPORT PhongMaterialData: public AbstractMaterialData { * Available only if the material doesn't have @ref Flag::SpecularTexture. * @see @ref flags() */ - Vector3& specularColor(); - Vector3 specularColor() const; /**< @overload */ + Color3& specularColor(); + Color3 specularColor() const; /**< @overload */ /** * @brief Specular texture ID @@ -154,7 +166,7 @@ CORRADE_ENUMSET_OPERATORS(PhongMaterialData::Flags) /* Ugly as hell. */ -inline Vector3 PhongMaterialData::ambientColor() const { +inline Color3 PhongMaterialData::ambientColor() const { return const_cast(this)->ambientColor(); } @@ -162,7 +174,7 @@ inline UnsignedInt PhongMaterialData::ambientTexture() const { return const_cast(this)->ambientTexture(); } -inline Vector3 PhongMaterialData::diffuseColor() const { +inline Color3 PhongMaterialData::diffuseColor() const { return const_cast(this)->diffuseColor(); } @@ -170,7 +182,7 @@ inline UnsignedInt PhongMaterialData::diffuseTexture() const { return const_cast(this)->diffuseTexture(); } -inline Vector3 PhongMaterialData::specularColor() const { +inline Color3 PhongMaterialData::specularColor() const { return const_cast(this)->specularColor(); } diff --git a/src/Magnum/Trade/Test/CMakeLists.txt b/src/Magnum/Trade/Test/CMakeLists.txt index 17e56b827..7268fef08 100644 --- a/src/Magnum/Trade/Test/CMakeLists.txt +++ b/src/Magnum/Trade/Test/CMakeLists.txt @@ -38,10 +38,14 @@ corrade_add_test(TradeAbstractImageConverterTest AbstractImageConverterTest.cpp target_include_directories(TradeAbstractImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) corrade_add_test(TradeAbstractImporterTest AbstractImporterTest.cpp LIBRARIES Magnum) target_include_directories(TradeAbstractImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +corrade_add_test(TradeCameraDataTest CameraDataTest.cpp LIBRARIES Magnum) corrade_add_test(TradeImageDataTest ImageDataTest.cpp LIBRARIES Magnum) corrade_add_test(TradeMaterialDataTest MaterialDataTest.cpp LIBRARIES Magnum) +corrade_add_test(TradeMeshData2DTest MeshData2DTest.cpp LIBRARIES Magnum) +corrade_add_test(TradeMeshData3DTest MeshData3DTest.cpp LIBRARIES Magnum) corrade_add_test(TradeObjectData2DTest ObjectData2DTest.cpp LIBRARIES Magnum) corrade_add_test(TradeObjectData3DTest ObjectData3DTest.cpp LIBRARIES Magnum) +corrade_add_test(TradeSceneDataTest SceneDataTest.cpp LIBRARIES Magnum) corrade_add_test(TradeTextureDataTest TextureDataTest.cpp LIBRARIES Magnum) if(CORRADE_TARGET_EMSCRIPTEN) diff --git a/src/Magnum/Trade/Test/CameraDataTest.cpp b/src/Magnum/Trade/Test/CameraDataTest.cpp new file mode 100644 index 000000000..be7ae405b --- /dev/null +++ b/src/Magnum/Trade/Test/CameraDataTest.cpp @@ -0,0 +1,121 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include + +#include "Magnum/Trade/CameraData.h" + +namespace Magnum { namespace Trade { namespace Test { + +struct CameraDataTest: TestSuite::Tester { + explicit CameraDataTest(); + + void construct(); + void constructDefaults(); + void constructCopy(); + void constructMove(); +}; + +namespace { + +using namespace Math::Literals; + +enum: std::size_t { ConstructDefaultsDataCount = 3 }; + +struct { + const char* name; + Rad fov, expectedFov; + Float near, expectedNear; + Float far, expectedFar; +} ConstructDefaultsData[ConstructDefaultsDataCount]{ + {"fov", Rad{Constants::nan()}, 35.0_degf, 0.5f, 0.5f, 120.0f, 120.0f}, + {"near", 25.0_degf, 25.0_degf, Constants::nan(), 0.01f, 120.0f, 120.0f}, + {"far", 25.0_degf, 25.0_degf, 0.5f, 0.5f, Constants::nan(), 100.0f} +}; + +} + +CameraDataTest::CameraDataTest() { + addTests({&CameraDataTest::construct}); + + addInstancedTests({&CameraDataTest::constructDefaults}, ConstructDefaultsDataCount); + + addTests({&CameraDataTest::constructCopy, + &CameraDataTest::constructMove}); +} + +void CameraDataTest::construct() { + const int a{}; + CameraData data{25.0_degf, 0.001f, 1000.0f, &a}; + + CORRADE_COMPARE(data.fov(), 25.0_degf); + CORRADE_COMPARE(data.near(), 0.001f); + CORRADE_COMPARE(data.far(), 1000.0f); + CORRADE_COMPARE(data.importerState(), &a); +} + +void CameraDataTest::constructDefaults() { + setTestCaseDescription(ConstructDefaultsData[testCaseInstanceId()].name); + + const int a{}; + CameraData data{ + ConstructDefaultsData[testCaseInstanceId()].fov, + ConstructDefaultsData[testCaseInstanceId()].near, + ConstructDefaultsData[testCaseInstanceId()].far, + &a}; + + CORRADE_COMPARE(data.fov(), ConstructDefaultsData[testCaseInstanceId()].expectedFov); + CORRADE_COMPARE(data.near(), ConstructDefaultsData[testCaseInstanceId()].expectedNear); + CORRADE_COMPARE(data.far(), ConstructDefaultsData[testCaseInstanceId()].expectedFar); + CORRADE_COMPARE(data.importerState(), &a); +} + +void CameraDataTest::constructCopy() { + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_assignable{})); +} + +void CameraDataTest::constructMove() { + const int a{}; + CameraData data{25.0_degf, 0.001f, 1000.0f, &a}; + + CameraData b{std::move(data)}; + CORRADE_COMPARE(b.fov(), 25.0_degf); + CORRADE_COMPARE(b.near(), 0.001f); + CORRADE_COMPARE(b.far(), 1000.0f); + CORRADE_COMPARE(b.importerState(), &a); + + const int c{}; + CameraData d{75.0_degf, 0.5f, 10.0f, &c}; + d = std::move(b); + CORRADE_COMPARE(d.fov(), 25.0_degf); + CORRADE_COMPARE(d.near(), 0.001f); + CORRADE_COMPARE(d.far(), 1000.0f); + CORRADE_COMPARE(d.importerState(), &a); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Trade::Test::CameraDataTest) diff --git a/src/Magnum/Trade/Test/MaterialDataTest.cpp b/src/Magnum/Trade/Test/MaterialDataTest.cpp index e87164b7d..1685bacd9 100644 --- a/src/Magnum/Trade/Test/MaterialDataTest.cpp +++ b/src/Magnum/Trade/Test/MaterialDataTest.cpp @@ -34,11 +34,201 @@ class MaterialDataTest: public TestSuite::Tester { public: explicit MaterialDataTest(); + void constructPhong(); + void constructPhongAmbientTexture(); + void constructPhongDiffuseTexture(); + void constructPhongSpecularTexture(); + void constructCopy(); + void constructMovePhongNoAmbientTexture(); + void constructMovePhongNoDiffuseTexture(); + void constructMovePhongNoSpecularTexture(); + void debugType(); }; MaterialDataTest::MaterialDataTest() { - addTests({&MaterialDataTest::debugType}); + addTests({&MaterialDataTest::constructPhong, + &MaterialDataTest::constructPhongAmbientTexture, + &MaterialDataTest::constructPhongDiffuseTexture, + &MaterialDataTest::constructPhongSpecularTexture, + &MaterialDataTest::constructCopy, + &MaterialDataTest::constructMovePhongNoAmbientTexture, + &MaterialDataTest::constructMovePhongNoDiffuseTexture, + &MaterialDataTest::constructMovePhongNoSpecularTexture, + + &MaterialDataTest::debugType}); +} + +void MaterialDataTest::constructPhong() { + using namespace Math::Literals; + + const int a{}; + PhongMaterialData data{{}, 80.0f, &a}; + data.ambientColor() = 0xccffbb_rgbf; + data.diffuseColor() = 0xeebbff_rgbf; + data.specularColor() = 0xacabad_rgbf; + + const PhongMaterialData& cdata = data; + + CORRADE_VERIFY(cdata.flags() == PhongMaterialData::Flags{}); + CORRADE_COMPARE(cdata.ambientColor(), 0xccffbb_rgbf); + CORRADE_COMPARE(cdata.diffuseColor(), 0xeebbff_rgbf); + CORRADE_COMPARE(cdata.specularColor(), 0xacabad_rgbf); + CORRADE_COMPARE(cdata.shininess(), 80.0f); +} + +void MaterialDataTest::constructPhongAmbientTexture() { + using namespace Math::Literals; + + const int a{}; + PhongMaterialData data{PhongMaterialData::Flag::AmbientTexture, 80.0f, &a}; + data.ambientTexture() = 42; + data.diffuseColor() = 0xeebbff_rgbf; + data.specularColor() = 0xacabad_rgbf; + + const PhongMaterialData& cdata = data; + + CORRADE_VERIFY(cdata.flags() == PhongMaterialData::Flag::AmbientTexture); + CORRADE_COMPARE(cdata.ambientTexture(), 42); + CORRADE_COMPARE(cdata.diffuseColor(), 0xeebbff_rgbf); + CORRADE_COMPARE(cdata.specularColor(), 0xacabad_rgbf); + CORRADE_COMPARE(cdata.shininess(), 80.0f); +} + +void MaterialDataTest::constructPhongDiffuseTexture() { + using namespace Math::Literals; + + const int a{}; + PhongMaterialData data{PhongMaterialData::Flag::DiffuseTexture, 80.0f, &a}; + data.ambientColor() = 0xccffbb_rgbf; + data.diffuseTexture() = 42; + data.specularColor() = 0xacabad_rgbf; + + const PhongMaterialData& cdata = data; + + CORRADE_VERIFY(cdata.flags() == PhongMaterialData::Flag::DiffuseTexture); + CORRADE_COMPARE(cdata.ambientColor(), 0xccffbb_rgbf); + CORRADE_COMPARE(cdata.diffuseTexture(), 42); + CORRADE_COMPARE(cdata.specularColor(), 0xacabad_rgbf); + CORRADE_COMPARE(cdata.shininess(), 80.0f); +} + +void MaterialDataTest::constructPhongSpecularTexture() { + using namespace Math::Literals; + + const int a{}; + PhongMaterialData data{PhongMaterialData::Flag::SpecularTexture, 30.0f, &a}; + data.ambientColor() = 0xccffbb_rgbf; + data.diffuseColor() = 0xeebbff_rgbf; + data.specularTexture() = 42; + + const PhongMaterialData& cdata = data; + + CORRADE_VERIFY(cdata.flags() == PhongMaterialData::Flag::SpecularTexture); + CORRADE_COMPARE(cdata.ambientColor(), 0xccffbb_rgbf); + CORRADE_COMPARE(cdata.diffuseColor(), 0xeebbff_rgbf); + CORRADE_COMPARE(cdata.specularTexture(), 42); + CORRADE_COMPARE(cdata.shininess(), 30.0f); +} + +void MaterialDataTest::constructCopy() { + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_assignable{})); + CORRADE_VERIFY(!(std::is_assignable{})); +} + +void MaterialDataTest::constructMovePhongNoAmbientTexture() { + using namespace Math::Literals; + + const int a{}; + PhongMaterialData data{PhongMaterialData::Flag::DiffuseTexture|PhongMaterialData::Flag::SpecularTexture, 80.0f, &a}; + data.ambientColor() = 0xccffbb_rgbf; + data.diffuseTexture() = 42; + data.specularTexture() = 13; + + PhongMaterialData b{std::move(data)}; + + CORRADE_VERIFY(b.flags() == (PhongMaterialData::Flag::DiffuseTexture|PhongMaterialData::Flag::SpecularTexture)); + CORRADE_COMPARE(b.ambientColor(), 0xccffbb_rgbf); + CORRADE_COMPARE(b.diffuseTexture(), 42); + CORRADE_COMPARE(b.specularTexture(), 13); + CORRADE_COMPARE(b.shininess(), 80.0f); + + const int c{}; + PhongMaterialData d{PhongMaterialData::Flag::AmbientTexture, 100.0f, &c}; + d.ambientTexture() = 42; + d.diffuseColor() = 0xeebbff_rgbf; + d.specularColor() = 0xacabad_rgbf; + d = std::move(b); + + CORRADE_VERIFY(d.flags() == (PhongMaterialData::Flag::DiffuseTexture|PhongMaterialData::Flag::SpecularTexture)); + CORRADE_COMPARE(d.ambientColor(), 0xccffbb_rgbf); + CORRADE_COMPARE(d.diffuseTexture(), 42); + CORRADE_COMPARE(d.specularTexture(), 13); + CORRADE_COMPARE(d.shininess(), 80.0f); +} + +void MaterialDataTest::constructMovePhongNoDiffuseTexture() { + using namespace Math::Literals; + + const int a{}; + PhongMaterialData data{PhongMaterialData::Flag::AmbientTexture|PhongMaterialData::Flag::SpecularTexture, 80.0f, &a}; + data.ambientTexture() = 42; + data.diffuseColor() = 0xeebbff_rgbf; + data.specularTexture() = 13; + + PhongMaterialData b{std::move(data)}; + + CORRADE_VERIFY(b.flags() == (PhongMaterialData::Flag::AmbientTexture|PhongMaterialData::Flag::SpecularTexture)); + CORRADE_COMPARE(b.ambientTexture(), 42); + CORRADE_COMPARE(b.diffuseColor(), 0xeebbff_rgbf); + CORRADE_COMPARE(b.specularTexture(), 13); + CORRADE_COMPARE(b.shininess(), 80.0f); + + const int c{}; + PhongMaterialData d{PhongMaterialData::Flag::DiffuseTexture, 100.0f, &c}; + d.ambientColor() = 0xccffbb_rgbf; + d.diffuseTexture() = 42; + d.specularColor() = 0xacabad_rgbf; + d = std::move(b); + + CORRADE_VERIFY(d.flags() == (PhongMaterialData::Flag::AmbientTexture|PhongMaterialData::Flag::SpecularTexture)); + CORRADE_COMPARE(d.ambientTexture(), 42); + CORRADE_COMPARE(d.diffuseColor(), 0xeebbff_rgbf); + CORRADE_COMPARE(d.specularTexture(), 13); + CORRADE_COMPARE(d.shininess(), 80.0f); +} + +void MaterialDataTest::constructMovePhongNoSpecularTexture() { + using namespace Math::Literals; + + const int a{}; + PhongMaterialData data{PhongMaterialData::Flag::AmbientTexture|PhongMaterialData::Flag::DiffuseTexture, 80.0f, &a}; + data.ambientTexture() = 13; + data.diffuseTexture() = 42; + data.specularColor() = 0xacabad_rgbf; + + PhongMaterialData b{std::move(data)}; + + CORRADE_VERIFY(b.flags() == (PhongMaterialData::Flag::AmbientTexture|PhongMaterialData::Flag::DiffuseTexture)); + CORRADE_COMPARE(b.ambientTexture(), 13); + CORRADE_COMPARE(b.diffuseTexture(), 42); + CORRADE_COMPARE(b.specularColor(), 0xacabad_rgbf); + CORRADE_COMPARE(b.shininess(), 80.0f); + + const int c{}; + PhongMaterialData d{PhongMaterialData::Flag::SpecularTexture, 30.0f, &c}; + d.ambientColor() = 0xccffbb_rgbf; + d.diffuseColor() = 0xeebbff_rgbf; + d.specularTexture() = 42; + d = std::move(b); + + CORRADE_VERIFY(d.flags() == (PhongMaterialData::Flag::AmbientTexture|PhongMaterialData::Flag::DiffuseTexture)); + CORRADE_COMPARE(d.ambientTexture(), 13); + CORRADE_COMPARE(d.diffuseTexture(), 42); + CORRADE_COMPARE(d.specularColor(), 0xacabad_rgbf); + CORRADE_COMPARE(d.shininess(), 80.0f); } void MaterialDataTest::debugType() { diff --git a/src/Magnum/Trade/Test/MeshData2DTest.cpp b/src/Magnum/Trade/Test/MeshData2DTest.cpp new file mode 100644 index 000000000..639891355 --- /dev/null +++ b/src/Magnum/Trade/Test/MeshData2DTest.cpp @@ -0,0 +1,143 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include + +#include "Magnum/Mesh.h" +#include "Magnum/Math/Vector2.h" +#include "Magnum/Trade/MeshData2D.h" + +namespace Magnum { namespace Trade { namespace Test { + +struct MeshData2DTest: TestSuite::Tester { + explicit MeshData2DTest(); + + void construct(); + void constructNonIndexed(); + void constructNoTexCoords(); + void constructCopy(); + void constructMove(); +}; + +MeshData2DTest::MeshData2DTest() { + addTests({&MeshData2DTest::construct, + &MeshData2DTest::constructNonIndexed, + &MeshData2DTest::constructNoTexCoords, + &MeshData2DTest::constructCopy, + &MeshData2DTest::constructMove}); +} + +void MeshData2DTest::construct() { + const int a{}; + const MeshData2D data{MeshPrimitive::Lines, {12, 1, 0}, + {{{0.5f, 1.0f}, {-1.0f, 0.3f}}, + {{1.4f, 0.2f}, {1.1f, 0.13f}}}, + {{{0.0f, 0.0f}, {0.3f, 0.7f}}, + {{0.1f, 0.2f}, {0.7f, 1.0f}}, + {{0.0f, 0.0f}, {1.0f, 1.0f}}}, + &a}; + + CORRADE_COMPARE(data.primitive(), MeshPrimitive::Lines); + + CORRADE_VERIFY(data.isIndexed()); + CORRADE_COMPARE(data.indices(), (std::vector{12, 1, 0})); + + CORRADE_COMPARE(data.positionArrayCount(), 2); + CORRADE_COMPARE(data.positions(0), (std::vector{{0.5f, 1.0f}, {-1.0f, 0.3f}})); + CORRADE_COMPARE(data.positions(1), (std::vector{{1.4f, 0.2f}, {1.1f, 0.13f}})); + + CORRADE_VERIFY(data.hasTextureCoords2D()); + CORRADE_COMPARE(data.textureCoords2DArrayCount(), 3); + CORRADE_COMPARE(data.textureCoords2D(0), (std::vector{{0.0f, 0.0f}, {0.3f, 0.7f}})); + CORRADE_COMPARE(data.textureCoords2D(1), (std::vector{{0.1f, 0.2f}, {0.7f, 1.0f}})); + CORRADE_COMPARE(data.textureCoords2D(2), (std::vector{{0.0f, 0.0f}, {1.0f, 1.0f}})); + + CORRADE_COMPARE(data.importerState(), &a); +} + +void MeshData2DTest::constructNonIndexed() { + const int a{}; + const MeshData2D data{MeshPrimitive::Lines, {}, + {{{0.5f, 1.0f}, {-1.0f, 0.3f}}}, + {{{0.0f, 0.0f}, {0.3f, 0.7f}}}, + &a}; + + CORRADE_VERIFY(!data.isIndexed()); +} + +void MeshData2DTest::constructNoTexCoords() { + const int a{}; + const MeshData2D data{MeshPrimitive::Lines, {12, 1, 0}, + {{{0.5f, 1.0f}, {-1.0f, 0.3f}}, + {{1.4f, 0.2f}, {1.1f, 0.13f}}}, + {}, + &a}; + + CORRADE_VERIFY(!data.hasTextureCoords2D()); + CORRADE_COMPARE(data.textureCoords2DArrayCount(), 0); +} + +void MeshData2DTest::constructCopy() { + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_assignable{})); +} + +void MeshData2DTest::constructMove() { + const int a{}; + MeshData2D data{MeshPrimitive::LineStrip, {12, 1, 0}, + {{{0.5f, 1.0f}, {-1.0f, 0.3f}}}, + {{{0.0f, 0.0f}, {0.3f, 0.7f}}}, + &a}; + + MeshData2D b{std::move(data)}; + + CORRADE_COMPARE(b.primitive(), MeshPrimitive::LineStrip); + CORRADE_VERIFY(b.isIndexed()); + CORRADE_COMPARE(b.indices(), (std::vector{12, 1, 0})); + CORRADE_COMPARE(b.positionArrayCount(), 1); + CORRADE_COMPARE(b.positions(0), (std::vector{{0.5f, 1.0f}, {-1.0f, 0.3f}})); + CORRADE_COMPARE(b.textureCoords2DArrayCount(), 1); + CORRADE_COMPARE(b.textureCoords2D(0), (std::vector{{0.0f, 0.0f}, {0.3f, 0.7f}})); + CORRADE_COMPARE(b.importerState(), &a); + + const int c{}; + MeshData2D d{MeshPrimitive::TriangleFan, {}, + {{}}, + {}, + &c}; + d = std::move(b); + CORRADE_COMPARE(d.primitive(), MeshPrimitive::LineStrip); + CORRADE_VERIFY(d.isIndexed()); + CORRADE_COMPARE(d.indices(), (std::vector{12, 1, 0})); + CORRADE_COMPARE(d.positionArrayCount(), 1); + CORRADE_COMPARE(d.positions(0), (std::vector{{0.5f, 1.0f}, {-1.0f, 0.3f}})); + CORRADE_COMPARE(d.textureCoords2DArrayCount(), 1); + CORRADE_COMPARE(d.textureCoords2D(0), (std::vector{{0.0f, 0.0f}, {0.3f, 0.7f}})); + CORRADE_COMPARE(d.importerState(), &a); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Trade::Test::MeshData2DTest) diff --git a/src/Magnum/Trade/Test/MeshData3DTest.cpp b/src/Magnum/Trade/Test/MeshData3DTest.cpp new file mode 100644 index 000000000..2ff7e8dce --- /dev/null +++ b/src/Magnum/Trade/Test/MeshData3DTest.cpp @@ -0,0 +1,169 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include + +#include "Magnum/Mesh.h" +#include "Magnum/Math/Vector3.h" +#include "Magnum/Trade/MeshData3D.h" + +namespace Magnum { namespace Trade { namespace Test { + +struct MeshData3DTest: TestSuite::Tester { + explicit MeshData3DTest(); + + void construct(); + void constructNonIndexed(); + void constructNoNormals(); + void constructNoTexCoords(); + void constructCopy(); + void constructMove(); +}; + +MeshData3DTest::MeshData3DTest() { + addTests({&MeshData3DTest::construct, + &MeshData3DTest::constructNonIndexed, + &MeshData3DTest::constructNoNormals, + &MeshData3DTest::constructNoTexCoords, + &MeshData3DTest::constructCopy, + &MeshData3DTest::constructMove}); +} + +void MeshData3DTest::construct() { + const int a{}; + const MeshData3D data{MeshPrimitive::Lines, {12, 1, 0}, + {{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}, + {{1.4f, 0.2f, 0.5f}, {1.1f, 0.13f, -0.3f}}}, + {{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}}, + {{{0.0f, 0.0f}, {0.3f, 0.7f}}, + {{0.1f, 0.2f}, {0.7f, 1.0f}}, + {{0.0f, 0.0f}, {1.0f, 1.0f}}}, + &a}; + + CORRADE_COMPARE(data.primitive(), MeshPrimitive::Lines); + + CORRADE_VERIFY(data.isIndexed()); + CORRADE_COMPARE(data.indices(), (std::vector{12, 1, 0})); + + CORRADE_COMPARE(data.positionArrayCount(), 2); + CORRADE_COMPARE(data.positions(0), (std::vector{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}})); + CORRADE_COMPARE(data.positions(1), (std::vector{{1.4f, 0.2f, 0.5f}, {1.1f, 0.13f, -0.3f}})); + + CORRADE_VERIFY(data.hasNormals()); + CORRADE_COMPARE(data.normalArrayCount(), 1); + CORRADE_COMPARE(data.normals(0), (std::vector{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}})); + + CORRADE_VERIFY(data.hasTextureCoords2D()); + CORRADE_COMPARE(data.textureCoords2DArrayCount(), 3); + CORRADE_COMPARE(data.textureCoords2D(0), (std::vector{{0.0f, 0.0f}, {0.3f, 0.7f}})); + CORRADE_COMPARE(data.textureCoords2D(1), (std::vector{{0.1f, 0.2f}, {0.7f, 1.0f}})); + CORRADE_COMPARE(data.textureCoords2D(2), (std::vector{{0.0f, 0.0f}, {1.0f, 1.0f}})); + + CORRADE_COMPARE(data.importerState(), &a); +} + +void MeshData3DTest::constructNonIndexed() { + const int a{}; + const MeshData3D data{MeshPrimitive::Lines, {}, + {{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}}, + {{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}}, + {{{0.0f, 0.0f}, {0.3f, 0.7f}}}, + &a}; + + CORRADE_VERIFY(!data.isIndexed()); +} + +void MeshData3DTest::constructNoNormals() { + const int a{}; + const MeshData3D data{MeshPrimitive::Lines, {12, 1, 0}, + {{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}}, + {}, + {{{0.0f, 0.0f}, {0.3f, 0.7f}}}, + &a}; + + CORRADE_VERIFY(!data.hasNormals()); + CORRADE_COMPARE(data.normalArrayCount(), 0); +} + +void MeshData3DTest::constructNoTexCoords() { + const int a{}; + const MeshData3D data{MeshPrimitive::Lines, {12, 1, 0}, + {{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}}, + {{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}}, + {}, + &a}; + + CORRADE_VERIFY(!data.hasTextureCoords2D()); + CORRADE_COMPARE(data.textureCoords2DArrayCount(), 0); +} + +void MeshData3DTest::constructCopy() { + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_assignable{})); +} + +void MeshData3DTest::constructMove() { + const int a{}; + MeshData3D data{MeshPrimitive::LineStrip, {12, 1, 0}, + {{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}}, + {{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}}, + {{{0.0f, 0.0f}, {0.3f, 0.7f}}}, + &a}; + + MeshData3D b{std::move(data)}; + + CORRADE_COMPARE(b.primitive(), MeshPrimitive::LineStrip); + CORRADE_VERIFY(b.isIndexed()); + CORRADE_COMPARE(b.indices(), (std::vector{12, 1, 0})); + CORRADE_COMPARE(b.positionArrayCount(), 1); + CORRADE_COMPARE(b.positions(0), (std::vector{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}})); + CORRADE_COMPARE(b.normalArrayCount(), 1); + CORRADE_COMPARE(b.normals(0), (std::vector{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}})); + CORRADE_COMPARE(b.textureCoords2DArrayCount(), 1); + CORRADE_COMPARE(b.textureCoords2D(0), (std::vector{{0.0f, 0.0f}, {0.3f, 0.7f}})); + CORRADE_COMPARE(b.importerState(), &a); + + const int c{}; + MeshData3D d{MeshPrimitive::TriangleFan, {}, + {{}}, + {}, + {{}}, + &c}; + d = std::move(b); + CORRADE_COMPARE(d.primitive(), MeshPrimitive::LineStrip); + CORRADE_VERIFY(d.isIndexed()); + CORRADE_COMPARE(d.indices(), (std::vector{12, 1, 0})); + CORRADE_COMPARE(d.positionArrayCount(), 1); + CORRADE_COMPARE(d.positions(0), (std::vector{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}})); + CORRADE_COMPARE(d.normalArrayCount(), 1); + CORRADE_COMPARE(d.normals(0), (std::vector{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}})); + CORRADE_COMPARE(d.textureCoords2DArrayCount(), 1); + CORRADE_COMPARE(d.textureCoords2D(0), (std::vector{{0.0f, 0.0f}, {0.3f, 0.7f}})); + CORRADE_COMPARE(d.importerState(), &a); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Trade::Test::MeshData3DTest) diff --git a/src/Magnum/Trade/Test/ObjectData2DTest.cpp b/src/Magnum/Trade/Test/ObjectData2DTest.cpp index 8b83003ab..5e65fe5ba 100644 --- a/src/Magnum/Trade/Test/ObjectData2DTest.cpp +++ b/src/Magnum/Trade/Test/ObjectData2DTest.cpp @@ -26,7 +26,7 @@ #include #include -#include "Magnum/Trade/ObjectData2D.h" +#include "Magnum/Trade/MeshObjectData2D.h" namespace Magnum { namespace Trade { namespace Test { @@ -34,14 +34,88 @@ class ObjectData2DTest: public TestSuite::Tester { public: explicit ObjectData2DTest(); - void debug(); + void constructEmpty(); + void constructMesh(); + void constructCamera(); + void constructCopy(); + void constructMoveMesh(); + + void debugType(); }; ObjectData2DTest::ObjectData2DTest() { - addTests({&ObjectData2DTest::debug}); + addTests({&ObjectData2DTest::constructEmpty, + &ObjectData2DTest::constructMesh, + &ObjectData2DTest::constructCamera, + &ObjectData2DTest::constructCopy, + &ObjectData2DTest::constructMoveMesh, + + &ObjectData2DTest::debugType}); +} + +void ObjectData2DTest::constructEmpty() { + const int a{}; + const ObjectData2D data{{0, 2, 3}, Matrix3::translation(Vector2::xAxis(-4.0f)), &a}; + + CORRADE_COMPARE(data.children(), (std::vector{0, 2, 3})); + CORRADE_COMPARE(data.transformation(), Matrix3::translation(Vector2::xAxis(-4.0f))); + CORRADE_COMPARE(data.instanceType(), ObjectInstanceType2D::Empty); + CORRADE_COMPARE(data.instance(), -1); +} + +void ObjectData2DTest::constructMesh() { + const int a{}; + const MeshObjectData2D data{{1, 3}, Matrix3::translation(Vector2::yAxis(5.0f)), 13, 42, &a}; + + CORRADE_COMPARE(data.children(), (std::vector{1, 3})); + CORRADE_COMPARE(data.transformation(), Matrix3::translation(Vector2::yAxis(5.0f))); + CORRADE_COMPARE(data.instanceType(), ObjectInstanceType2D::Mesh); + CORRADE_COMPARE(data.instance(), 13); + CORRADE_COMPARE(data.material(), 42); +} + +void ObjectData2DTest::constructCamera() { + const int a{}; + const ObjectData2D data{{1, 3}, Matrix3::translation(Vector2::yAxis(5.0f)), ObjectInstanceType2D::Camera, 42, &a}; + + CORRADE_COMPARE(data.children(), (std::vector{1, 3})); + CORRADE_COMPARE(data.transformation(), Matrix3::translation(Vector2::yAxis(5.0f))); + CORRADE_COMPARE(data.instanceType(), ObjectInstanceType2D::Camera); + CORRADE_COMPARE(data.instance(), 42); +} + +void ObjectData2DTest::constructCopy() { + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_assignable{})); + CORRADE_VERIFY(!(std::is_assignable{})); +} + +void ObjectData2DTest::constructMoveMesh() { + const int a{}; + MeshObjectData2D data{{1, 3}, Matrix3::translation(Vector2::yAxis(5.0f)), 13, 42, &a}; + + MeshObjectData2D b{std::move(data)}; + + CORRADE_COMPARE(b.children(), (std::vector{1, 3})); + CORRADE_COMPARE(b.transformation(), Matrix3::translation(Vector2::yAxis(5.0f))); + CORRADE_COMPARE(b.instanceType(), ObjectInstanceType2D::Mesh); + CORRADE_COMPARE(b.instance(), 13); + CORRADE_COMPARE(b.material(), 42); + + const int c{}; + MeshObjectData2D d{{0, 1}, {}, 27, -1, &c}; + + d = std::move(b); + + CORRADE_COMPARE(d.children(), (std::vector{1, 3})); + CORRADE_COMPARE(d.transformation(), Matrix3::translation(Vector2::yAxis(5.0f))); + CORRADE_COMPARE(d.instanceType(), ObjectInstanceType2D::Mesh); + CORRADE_COMPARE(d.instance(), 13); + CORRADE_COMPARE(d.material(), 42); } -void ObjectData2DTest::debug() { +void ObjectData2DTest::debugType() { std::ostringstream o; Debug(&o) << ObjectInstanceType2D::Empty << ObjectInstanceType2D(0xbe); CORRADE_COMPARE(o.str(), "Trade::ObjectInstanceType2D::Empty Trade::ObjectInstanceType2D(0xbe)\n"); diff --git a/src/Magnum/Trade/Test/ObjectData3DTest.cpp b/src/Magnum/Trade/Test/ObjectData3DTest.cpp index 54de14693..bc7d32745 100644 --- a/src/Magnum/Trade/Test/ObjectData3DTest.cpp +++ b/src/Magnum/Trade/Test/ObjectData3DTest.cpp @@ -26,7 +26,7 @@ #include #include -#include "Magnum/Trade/ObjectData3D.h" +#include "Magnum/Trade/MeshObjectData3D.h" namespace Magnum { namespace Trade { namespace Test { @@ -34,14 +34,100 @@ class ObjectData3DTest: public TestSuite::Tester { public: explicit ObjectData3DTest(); - void debug(); + void constructEmpty(); + void constructMesh(); + void constructCamera(); + void constructLight(); + void constructCopy(); + void constructMoveMesh(); + + void debugType(); }; ObjectData3DTest::ObjectData3DTest() { - addTests({&ObjectData3DTest::debug}); + addTests({&ObjectData3DTest::constructEmpty, + &ObjectData3DTest::constructMesh, + &ObjectData3DTest::constructCamera, + &ObjectData3DTest::constructLight, + &ObjectData3DTest::constructCopy, + &ObjectData3DTest::constructMoveMesh, + + &ObjectData3DTest::debugType}); +} + +void ObjectData3DTest::constructEmpty() { + const int a{}; + const ObjectData3D data{{0, 2, 3}, Matrix4::translation(Vector3::xAxis(-4.0f)), &a}; + + CORRADE_COMPARE(data.children(), (std::vector{0, 2, 3})); + CORRADE_COMPARE(data.transformation(), Matrix4::translation(Vector3::xAxis(-4.0f))); + CORRADE_COMPARE(data.instanceType(), ObjectInstanceType3D::Empty); + CORRADE_COMPARE(data.instance(), -1); +} + +void ObjectData3DTest::constructMesh() { + const int a{}; + const MeshObjectData3D data{{1, 3}, Matrix4::translation(Vector3::yAxis(5.0f)), 13, 42, &a}; + + CORRADE_COMPARE(data.children(), (std::vector{1, 3})); + CORRADE_COMPARE(data.transformation(), Matrix4::translation(Vector3::yAxis(5.0f))); + CORRADE_COMPARE(data.instanceType(), ObjectInstanceType3D::Mesh); + CORRADE_COMPARE(data.instance(), 13); + CORRADE_COMPARE(data.material(), 42); +} + +void ObjectData3DTest::constructCamera() { + const int a{}; + const ObjectData3D data{{1, 3}, Matrix4::translation(Vector3::yAxis(5.0f)), ObjectInstanceType3D::Camera, 42, &a}; + + CORRADE_COMPARE(data.children(), (std::vector{1, 3})); + CORRADE_COMPARE(data.transformation(), Matrix4::translation(Vector3::yAxis(5.0f))); + CORRADE_COMPARE(data.instanceType(), ObjectInstanceType3D::Camera); + CORRADE_COMPARE(data.instance(), 42); +} + +void ObjectData3DTest::constructLight() { + const int a{}; + const ObjectData3D data{{1, 3}, Matrix4::translation(Vector3::yAxis(5.0f)), ObjectInstanceType3D::Light, 42, &a}; + + CORRADE_COMPARE(data.children(), (std::vector{1, 3})); + CORRADE_COMPARE(data.transformation(), Matrix4::translation(Vector3::yAxis(5.0f))); + CORRADE_COMPARE(data.instanceType(), ObjectInstanceType3D::Light); + CORRADE_COMPARE(data.instance(), 42); +} + +void ObjectData3DTest::constructCopy() { + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_assignable{})); + CORRADE_VERIFY(!(std::is_assignable{})); +} + +void ObjectData3DTest::constructMoveMesh() { + const int a{}; + MeshObjectData3D data{{1, 3}, Matrix4::translation(Vector3::yAxis(5.0f)), 13, 42, &a}; + + MeshObjectData3D b{std::move(data)}; + + CORRADE_COMPARE(b.children(), (std::vector{1, 3})); + CORRADE_COMPARE(b.transformation(), Matrix4::translation(Vector3::yAxis(5.0f))); + CORRADE_COMPARE(b.instanceType(), ObjectInstanceType3D::Mesh); + CORRADE_COMPARE(b.instance(), 13); + CORRADE_COMPARE(b.material(), 42); + + const int c{}; + MeshObjectData3D d{{0, 1}, {}, 27, -1, &c}; + + d = std::move(b); + + CORRADE_COMPARE(d.children(), (std::vector{1, 3})); + CORRADE_COMPARE(d.transformation(), Matrix4::translation(Vector3::yAxis(5.0f))); + CORRADE_COMPARE(d.instanceType(), ObjectInstanceType3D::Mesh); + CORRADE_COMPARE(d.instance(), 13); + CORRADE_COMPARE(d.material(), 42); } -void ObjectData3DTest::debug() { +void ObjectData3DTest::debugType() { std::ostringstream o; Debug(&o) << ObjectInstanceType3D::Light << ObjectInstanceType3D(0xbe); CORRADE_COMPARE(o.str(), "Trade::ObjectInstanceType3D::Light Trade::ObjectInstanceType3D(0xbe)\n"); diff --git a/src/Magnum/Trade/Test/SceneDataTest.cpp b/src/Magnum/Trade/Test/SceneDataTest.cpp new file mode 100644 index 000000000..58dcc34ca --- /dev/null +++ b/src/Magnum/Trade/Test/SceneDataTest.cpp @@ -0,0 +1,82 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include + +#include "Magnum/Trade/SceneData.h" +#include "Magnum/Magnum.h" + +namespace Magnum { namespace Trade { namespace Test { + +struct SceneDataTest: TestSuite::Tester { + explicit SceneDataTest(); + + void construct(); + void constructCopy(); + void constructMove(); +}; + +SceneDataTest::SceneDataTest() { + addTests({&SceneDataTest::construct, + &SceneDataTest::constructCopy, + &SceneDataTest::constructMove}); +} + +void SceneDataTest::construct() { + const int a{}; + const SceneData data{{0, 1, 4}, {2, 5}, &a}; + + CORRADE_COMPARE(data.children2D(), (std::vector{0, 1, 4})); + CORRADE_COMPARE(data.children3D(), (std::vector{2, 5})); + CORRADE_COMPARE(data.importerState(), &a); +} + +void SceneDataTest::constructCopy() { + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_assignable{})); +} + +void SceneDataTest::constructMove() { + const int a{}; + SceneData data{{0, 1, 4}, {2, 5}, &a}; + + SceneData b{std::move(data)}; + + CORRADE_COMPARE(b.children2D(), (std::vector{0, 1, 4})); + CORRADE_COMPARE(b.children3D(), (std::vector{2, 5})); + CORRADE_COMPARE(b.importerState(), &a); + + const int c{}; + SceneData d{{1, 3}, {1, 4, 5}, &c}; + d = std::move(b); + + CORRADE_COMPARE(d.children2D(), (std::vector{0, 1, 4})); + CORRADE_COMPARE(d.children3D(), (std::vector{2, 5})); + CORRADE_COMPARE(d.importerState(), &a); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Trade::Test::SceneDataTest) diff --git a/src/Magnum/Trade/Test/TextureDataTest.cpp b/src/Magnum/Trade/Test/TextureDataTest.cpp index f14a0a98a..ed8963ad2 100644 --- a/src/Magnum/Trade/Test/TextureDataTest.cpp +++ b/src/Magnum/Trade/Test/TextureDataTest.cpp @@ -34,14 +34,85 @@ class TextureDataTest: public TestSuite::Tester { public: explicit TextureDataTest(); - void debug(); + void construct(); + void constructCopy(); + void constructMove(); + + void debugType(); }; TextureDataTest::TextureDataTest() { - addTests({&TextureDataTest::debug}); + addTests({&TextureDataTest::construct, + &TextureDataTest::constructCopy, + &TextureDataTest::constructMove, + + &TextureDataTest::debugType}); +} + +void TextureDataTest::construct() { + const int a{}; + const TextureData data{TextureData::Type::Cube, + Sampler::Filter::Linear, + Sampler::Filter::Nearest, + Sampler::Mipmap::Nearest, + {Sampler::Wrapping::Repeat, Sampler::Wrapping::ClampToEdge, Sampler::Wrapping::MirroredRepeat}, + 42, + &a}; + + CORRADE_COMPARE(data.type(), TextureData::Type::Cube); + CORRADE_COMPARE(data.minificationFilter(), Sampler::Filter::Linear); + CORRADE_COMPARE(data.magnificationFilter(), Sampler::Filter::Nearest); + CORRADE_COMPARE(data.mipmapFilter(), Sampler::Mipmap::Nearest); + CORRADE_COMPARE(data.wrapping(), (Array3D{Sampler::Wrapping::Repeat, Sampler::Wrapping::ClampToEdge, Sampler::Wrapping::MirroredRepeat})); + CORRADE_COMPARE(data.image(), 42); + CORRADE_COMPARE(data.importerState(), &a); +} + +void TextureDataTest::constructCopy() { + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_assignable{})); +} + +void TextureDataTest::constructMove() { + const int a{}; + TextureData data{TextureData::Type::Cube, + Sampler::Filter::Linear, + Sampler::Filter::Nearest, + Sampler::Mipmap::Nearest, + {Sampler::Wrapping::Repeat, Sampler::Wrapping::ClampToEdge, Sampler::Wrapping::MirroredRepeat}, + 42, + &a}; + + TextureData b{std::move(data)}; + + CORRADE_COMPARE(b.type(), TextureData::Type::Cube); + CORRADE_COMPARE(b.minificationFilter(), Sampler::Filter::Linear); + CORRADE_COMPARE(b.magnificationFilter(), Sampler::Filter::Nearest); + CORRADE_COMPARE(b.mipmapFilter(), Sampler::Mipmap::Nearest); + CORRADE_COMPARE(b.wrapping(), (Array3D{Sampler::Wrapping::Repeat, Sampler::Wrapping::ClampToEdge, Sampler::Wrapping::MirroredRepeat})); + CORRADE_COMPARE(b.image(), 42); + CORRADE_COMPARE(b.importerState(), &a); + + const int c{}; + TextureData d{TextureData::Type::Texture2D, + Sampler::Filter::Nearest, + Sampler::Filter::Linear, + Sampler::Mipmap::Base, + Sampler::Wrapping::ClampToEdge, + 13, + &c}; + d = std::move(b); + + CORRADE_COMPARE(d.type(), TextureData::Type::Cube); + CORRADE_COMPARE(d.minificationFilter(), Sampler::Filter::Linear); + CORRADE_COMPARE(d.magnificationFilter(), Sampler::Filter::Nearest); + CORRADE_COMPARE(d.mipmapFilter(), Sampler::Mipmap::Nearest); + CORRADE_COMPARE(d.wrapping(), (Array3D{Sampler::Wrapping::Repeat, Sampler::Wrapping::ClampToEdge, Sampler::Wrapping::MirroredRepeat})); + CORRADE_COMPARE(d.image(), 42); + CORRADE_COMPARE(d.importerState(), &a); } -void TextureDataTest::debug() { +void TextureDataTest::debugType() { std::ostringstream out; Debug(&out) << TextureData::Type::Texture3D << TextureData::Type(0xbe); From 326fcf91cbcd03577e8d3cd03e4a5c585b2a3d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 21 Aug 2016 20:59:53 +0200 Subject: [PATCH 126/290] Trade: doc++ --- src/Magnum/Trade/AbstractMaterialData.h | 2 +- src/Magnum/Trade/ObjectData2D.h | 6 ++++-- src/Magnum/Trade/ObjectData3D.h | 5 ++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Magnum/Trade/AbstractMaterialData.h b/src/Magnum/Trade/AbstractMaterialData.h index 1472165bd..47e89ce64 100644 --- a/src/Magnum/Trade/AbstractMaterialData.h +++ b/src/Magnum/Trade/AbstractMaterialData.h @@ -40,7 +40,7 @@ namespace Magnum { namespace Trade { @see @ref AbstractMaterialData::type() */ enum class MaterialType: UnsignedByte { - Phong /**< Phong shading */ + Phong /**< Phong shading (see @ref PhongMaterialData) */ }; /** diff --git a/src/Magnum/Trade/ObjectData2D.h b/src/Magnum/Trade/ObjectData2D.h index 896e7fff0..a95cf7f1d 100644 --- a/src/Magnum/Trade/ObjectData2D.h +++ b/src/Magnum/Trade/ObjectData2D.h @@ -110,8 +110,10 @@ class MAGNUM_EXPORT ObjectData2D { /** * @brief Instance ID - * @return ID of given camera / light / mesh etc., specified by - * @ref instanceType() + * + * Returns ID of given camera / light / mesh etc., specified by + * @ref instanceType(). If @ref instanceType() is + * @ref ObjectInstanceType2D::Empty, this function returns `-1`. */ Int instance() const { return _instance; } diff --git a/src/Magnum/Trade/ObjectData3D.h b/src/Magnum/Trade/ObjectData3D.h index b2aea9419..0bf7a3f1f 100644 --- a/src/Magnum/Trade/ObjectData3D.h +++ b/src/Magnum/Trade/ObjectData3D.h @@ -42,8 +42,8 @@ namespace Magnum { namespace Trade { @see @ref ObjectData3D::instanceType() */ enum class ObjectInstanceType3D: UnsignedByte { - Camera, /**< Camera instance (see CameraData) */ - Light, /**< Light instance (see LightData) */ + Camera, /**< Camera instance (see @ref CameraData) */ + Light, /**< Light instance (see @ref LightData) */ /** * Mesh instance. The data can be cast to @ref MeshObjectData3D to provide @@ -54,7 +54,6 @@ enum class ObjectInstanceType3D: UnsignedByte { Empty /**< Empty */ }; - /** @brief Three-dimensional object data From c22e63ef57fa8d56432bd2a3d93b42673210af1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 21 Aug 2016 21:00:00 +0200 Subject: [PATCH 127/290] package/ci: include Attribute.{h,cpp} in the code coverage report. --- package/ci/travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/ci/travis.yml b/package/ci/travis.yml index 7005163e3..835f45e40 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -85,4 +85,4 @@ script: after_success: # Ignoring all stuff that needs GL context and thus can't be run on Travis -- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -E "(.*/(Test|magnum/build|MagnumExternal|Shaders|Platform)/.*|.*/src/Magnum/(AbstractFramebuffer|AbstractObject|AbstractQuery|AbstractShaderProgram|AbstractTexture|Attribute|Buffer|BufferImage|BufferTexture|Context|CubeMapTexture|CubeMapTextureArray|DebugOutput|DefaultFramebuffer|Framebuffer|Mesh|MeshView|MultisampleTexture|OpenGL|PixelStorage|PrimitiveQuery|RectangleTexture|Renderbuffer|Renderer|SampleQuery|Sampler|Shader|Texture|TextureArray|TimeQuery|TransformFeedback|Implementation/BufferState|Implementation/DebugState|Implementation/driverSpecific|Implementation/FramebufferState|Implementation/maxTextureSize|Implementation/MeshState|Implementation/QueryState|Implementation/RendererState|Implementation/ShaderProgramState|Implementation/ShaderState|Implementation/State|Implementation/TextureState|Implementation/TransformFeedbackState)\\.(cpp|h))" --gcov-options '\-lp'; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -E "(.*/(Test|magnum/build|MagnumExternal|Shaders|Platform)/.*|.*/src/Magnum/(AbstractFramebuffer|AbstractObject|AbstractQuery|AbstractShaderProgram|AbstractTexture|Buffer|BufferImage|BufferTexture|Context|CubeMapTexture|CubeMapTextureArray|DebugOutput|DefaultFramebuffer|Framebuffer|Mesh|MeshView|MultisampleTexture|OpenGL|PixelStorage|PrimitiveQuery|RectangleTexture|Renderbuffer|Renderer|SampleQuery|Sampler|Shader|Texture|TextureArray|TimeQuery|TransformFeedback|Implementation/BufferState|Implementation/DebugState|Implementation/driverSpecific|Implementation/FramebufferState|Implementation/maxTextureSize|Implementation/MeshState|Implementation/QueryState|Implementation/RendererState|Implementation/ShaderProgramState|Implementation/ShaderState|Implementation/State|Implementation/TextureState|Implementation/TransformFeedbackState)\\.(cpp|h))" --gcov-options '\-lp'; fi From 737e92bc3eacd09ba506347cceed9714e7629163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 21 Aug 2016 23:06:32 +0200 Subject: [PATCH 128/290] Math: remove unnecessary assignment operators. Caused problems when specifying `noexcept` in classes with members from Math namespace. --- src/Magnum/Math/BoolVector.h | 3 --- src/Magnum/Math/RectangularMatrix.h | 3 --- src/Magnum/Math/Vector.h | 8 -------- 3 files changed, 14 deletions(-) diff --git a/src/Magnum/Math/BoolVector.h b/src/Magnum/Math/BoolVector.h index 87df34d18..46cbf6ccc 100644 --- a/src/Magnum/Math/BoolVector.h +++ b/src/Magnum/Math/BoolVector.h @@ -106,9 +106,6 @@ template class BoolVector { /** @brief Copy constructor */ constexpr BoolVector(const BoolVector&) = default; - /** @brief Copy assignment */ - BoolVector& operator=(const BoolVector&) = default; - /** * @brief Raw data * @return Array of DataSize length diff --git a/src/Magnum/Math/RectangularMatrix.h b/src/Magnum/Math/RectangularMatrix.h index 1a05db7ac..9e9d6a594 100644 --- a/src/Magnum/Math/RectangularMatrix.h +++ b/src/Magnum/Math/RectangularMatrix.h @@ -155,9 +155,6 @@ template class RectangularMatrix { /** @brief Copy constructor */ constexpr RectangularMatrix(const RectangularMatrix&) = default; - /** @brief Assignment operator */ - RectangularMatrix& operator=(const RectangularMatrix&) = default; - /** @brief Convert matrix to external representation */ template::to(std::declval>()))> constexpr explicit operator U() const { return Implementation::RectangularMatrixConverter::to(*this); diff --git a/src/Magnum/Math/Vector.h b/src/Magnum/Math/Vector.h index fb3ffe7db..3755feba7 100644 --- a/src/Magnum/Math/Vector.h +++ b/src/Magnum/Math/Vector.h @@ -217,9 +217,6 @@ template class Vector { /** @brief Copy constructor */ constexpr Vector(const Vector&) = default; - /** @brief Assignment operator */ - Vector& operator=(const Vector&) = default; - /** @brief Convert vector to external representation */ template::to(std::declval>()))> constexpr explicit operator U() const { return Implementation::VectorConverter::to(*this); @@ -1117,11 +1114,6 @@ extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utili return Math::Vector::pad(a, value); \ } \ \ - Type& operator=(const Type& other) { \ - Math::Vector::operator=(other); \ - return *this; \ - } \ - \ Type operator-() const { \ return Math::Vector::operator-(); \ } \ From 2fbc908de2cb62a0e78bd0203993a214c79d50d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 21 Aug 2016 23:08:14 +0200 Subject: [PATCH 129/290] Trade: initial support for Light data. --- src/Magnum/CMakeLists.txt | 1 + src/Magnum/Trade/LightData.cpp | 46 +++++++++++ src/Magnum/Trade/LightData.h | 74 ++++++++++++++++- src/Magnum/Trade/Test/CMakeLists.txt | 1 + src/Magnum/Trade/Test/LightDataTest.cpp | 101 ++++++++++++++++++++++++ 5 files changed, 221 insertions(+), 2 deletions(-) create mode 100644 src/Magnum/Trade/LightData.cpp create mode 100644 src/Magnum/Trade/Test/LightDataTest.cpp diff --git a/src/Magnum/CMakeLists.txt b/src/Magnum/CMakeLists.txt index 0365a75d4..fb728503c 100644 --- a/src/Magnum/CMakeLists.txt +++ b/src/Magnum/CMakeLists.txt @@ -67,6 +67,7 @@ set(Magnum_SRCS Trade/AbstractImporter.cpp Trade/AbstractMaterialData.cpp Trade/ImageData.cpp + Trade/LightData.cpp Trade/MeshData2D.cpp Trade/MeshData3D.cpp Trade/MeshObjectData2D.cpp diff --git a/src/Magnum/Trade/LightData.cpp b/src/Magnum/Trade/LightData.cpp new file mode 100644 index 000000000..68c04b0e6 --- /dev/null +++ b/src/Magnum/Trade/LightData.cpp @@ -0,0 +1,46 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include "LightData.h" + +namespace Magnum { namespace Trade { + +#ifndef DOXYGEN_GENERATING_OUTPUT +Debug& operator<<(Debug& debug, const LightData::Type value) { + switch(value) { + /* LCOV_EXCL_START */ + #define _c(value) case LightData::Type::value: return debug << "Trade::LightData::Type::" #value; + _c(Infinite) + _c(Point) + _c(Spot) + #undef _c + /* LCOV_EXCL_STOP */ + } + + return debug << "Trade::LightData::Type(" << Debug::nospace << reinterpret_cast(UnsignedByte(value)) << Debug::nospace << ")"; +} +#endif + +}} diff --git a/src/Magnum/Trade/LightData.h b/src/Magnum/Trade/LightData.h index 3a8163f6d..753430379 100644 --- a/src/Magnum/Trade/LightData.h +++ b/src/Magnum/Trade/LightData.h @@ -29,14 +29,84 @@ * @brief Class @ref Magnum::Trade::LightData */ -#include +#include "Magnum/Magnum.h" +#include "Magnum/Math/Color.h" namespace Magnum { namespace Trade { /** @brief Light data */ -class LightData {}; +class LightData { + public: + /** + * @brief Light type + * + * @see @ref type() + */ + enum class Type: UnsignedByte { + /** + * Light at position that is infinitely far away so its rays are + * parallel. The light rays point in a direction of negative Z + * axis. + */ + Infinite, + + /** Point light, radiating in all directions */ + Point, + + /** + * Spot light, radiating in a limited range of direction. The + * primary direction is negative Z axis. + */ + Spot + }; + + /** + * @brief Constructor + * @param color Light color + * @param intensity Light intensity + * @param importerState Importer-specific state + */ + constexpr explicit LightData(Type type, const Color3& color, Float intensity, const void* importerState = nullptr) noexcept: _type{type}, _color{color}, _intensity{intensity}, _importerState{importerState} {} + + /** @brief Copying is not allowed */ + LightData(const LightData&) = delete; + + /** @brief Move constructor */ + LightData(LightData&&) noexcept = default; + + /** @brief Copying is not allowed */ + LightData& operator=(const LightData&) = delete; + + /** @brief Move assignment */ + LightData& operator=(LightData&&) noexcept = default; + + /** @brief Light type */ + constexpr Type type() const { return _type; } + + /** @brief Light color */ + constexpr Color3 color() const { return _color; } + + /** @brief Light intensity */ + constexpr Float intensity() const { return _intensity; } + + /** + * @brief Importer-specific state + * + * See @ref AbstractImporter::importerState() for more information. + */ + const void* importerState() const { return _importerState; } + + private: + Type _type; + Vector3 _color; + Float _intensity; + const void* _importerState; +}; + +/** @debugoperatorenum{Magnum::Trade::LightData::Type} */ +MAGNUM_EXPORT Debug& operator<<(Debug& debug, LightData::Type value); }} diff --git a/src/Magnum/Trade/Test/CMakeLists.txt b/src/Magnum/Trade/Test/CMakeLists.txt index 7268fef08..674f031a3 100644 --- a/src/Magnum/Trade/Test/CMakeLists.txt +++ b/src/Magnum/Trade/Test/CMakeLists.txt @@ -40,6 +40,7 @@ corrade_add_test(TradeAbstractImporterTest AbstractImporterTest.cpp LIBRARIES Ma target_include_directories(TradeAbstractImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) corrade_add_test(TradeCameraDataTest CameraDataTest.cpp LIBRARIES Magnum) corrade_add_test(TradeImageDataTest ImageDataTest.cpp LIBRARIES Magnum) +corrade_add_test(TradeLightDataTest LightDataTest.cpp LIBRARIES Magnum) corrade_add_test(TradeMaterialDataTest MaterialDataTest.cpp LIBRARIES Magnum) corrade_add_test(TradeMeshData2DTest MeshData2DTest.cpp LIBRARIES Magnum) corrade_add_test(TradeMeshData3DTest MeshData3DTest.cpp LIBRARIES Magnum) diff --git a/src/Magnum/Trade/Test/LightDataTest.cpp b/src/Magnum/Trade/Test/LightDataTest.cpp new file mode 100644 index 000000000..54d3e6381 --- /dev/null +++ b/src/Magnum/Trade/Test/LightDataTest.cpp @@ -0,0 +1,101 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include +#include + +#include "Magnum/Trade/LightData.h" + +namespace Magnum { namespace Trade { namespace Test { + +struct LightDataTest: TestSuite::Tester { + explicit LightDataTest(); + + void construct(); + void constructCopy(); + void constructMove(); + + void debugType(); +}; + +LightDataTest::LightDataTest() { + addTests({&LightDataTest::construct, + &LightDataTest::constructCopy, + &LightDataTest::constructMove, + + &LightDataTest::debugType}); +} + +void LightDataTest::construct() { + using namespace Math::Literals; + const int a{}; + LightData data{LightData::Type::Infinite, 0xccff33_rgbf, 0.8f, &a}; + + CORRADE_COMPARE(data.type(), LightData::Type::Infinite); + CORRADE_COMPARE(data.color(), 0xccff33_rgbf); + CORRADE_COMPARE(data.intensity(), 0.8f); + CORRADE_COMPARE(data.importerState(), &a); +} + +void LightDataTest::constructCopy() { + CORRADE_VERIFY(!(std::is_constructible{})); + CORRADE_VERIFY(!(std::is_assignable{})); +} + +void LightDataTest::constructMove() { + using namespace Math::Literals; + const int a{}; + LightData data{LightData::Type::Infinite, 0xccff33_rgbf, 0.8f, &a}; + + CORRADE_COMPARE(data.type(), LightData::Type::Infinite); + CORRADE_COMPARE(data.color(), 0xccff33_rgbf); + CORRADE_COMPARE(data.intensity(), 0.8f); + CORRADE_COMPARE(data.importerState(), &a); + + LightData b{std::move(data)}; + CORRADE_COMPARE(b.type(), LightData::Type::Infinite); + CORRADE_COMPARE(b.color(), 0xccff33_rgbf); + CORRADE_COMPARE(b.intensity(), 0.8f); + CORRADE_COMPARE(b.importerState(), &a); + + const int c{}; + LightData d{LightData::Type::Point, 0xdead00_rgbf, 1.6f, &c}; + d = std::move(b); + CORRADE_COMPARE(d.type(), LightData::Type::Infinite); + CORRADE_COMPARE(d.color(), 0xccff33_rgbf); + CORRADE_COMPARE(d.intensity(), 0.8f); + CORRADE_COMPARE(d.importerState(), &a); +} + +void LightDataTest::debugType() { + std::ostringstream out; + + Debug(&out) << LightData::Type::Spot << LightData::Type(0xbe); + CORRADE_COMPARE(out.str(), "Trade::LightData::Type::Spot Trade::LightData::Type(0xbe)\n"); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Trade::Test::LightDataTest) From 9019a776a16ebc8ff5041df7fdb25bc4eb2e4dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 22 Aug 2016 11:15:34 +0200 Subject: [PATCH 130/290] package/ci: minor improvements to Travis coverage report. --- package/ci/travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package/ci/travis.yml b/package/ci/travis.yml index 835f45e40..867d50c7e 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -55,12 +55,11 @@ cache: - $HOME/sdl2 install: +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then pip install --user cpp-coveralls && export COVERAGE="--coverage"; fi - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update; fi -- if [ "$TRAVIS_OS_NAME" == "linux" ]; then pip install --user cpp-coveralls; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export CXX=g++-4.7; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export PLATFORM_GL_API=GLX; fi -- if [ "$TRAVIS_OS_NAME" == "linux" ]; then export COVERAGE="--coverage"; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then export PLATFORM_GL_API=CGL; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then gem install xcpretty; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then brew install emscripten && export LLVM=/usr/local/opt/emscripten/libexec/llvm/bin && emcc; fi @@ -85,4 +84,4 @@ script: after_success: # Ignoring all stuff that needs GL context and thus can't be run on Travis -- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -E "(.*/(Test|magnum/build|MagnumExternal|Shaders|Platform)/.*|.*/src/Magnum/(AbstractFramebuffer|AbstractObject|AbstractQuery|AbstractShaderProgram|AbstractTexture|Buffer|BufferImage|BufferTexture|Context|CubeMapTexture|CubeMapTextureArray|DebugOutput|DefaultFramebuffer|Framebuffer|Mesh|MeshView|MultisampleTexture|OpenGL|PixelStorage|PrimitiveQuery|RectangleTexture|Renderbuffer|Renderer|SampleQuery|Sampler|Shader|Texture|TextureArray|TimeQuery|TransformFeedback|Implementation/BufferState|Implementation/DebugState|Implementation/driverSpecific|Implementation/FramebufferState|Implementation/maxTextureSize|Implementation/MeshState|Implementation/QueryState|Implementation/RendererState|Implementation/ShaderProgramState|Implementation/ShaderState|Implementation/State|Implementation/TextureState|Implementation/TransformFeedbackState)\\.(cpp|h))" --gcov-options '\-lp'; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -E "(.*/(Test|corrade/build|magnum/build|MagnumExternal|Shaders|Platform)/.*|.*/src/Magnum/(AbstractFramebuffer|AbstractObject|AbstractQuery|AbstractShaderProgram|AbstractTexture|Buffer|BufferImage|BufferTexture|Context|CubeMapTexture|CubeMapTextureArray|DebugOutput|DefaultFramebuffer|Framebuffer|Mesh|MeshView|MultisampleTexture|OpenGL|PixelStorage|PrimitiveQuery|RectangleTexture|Renderbuffer|Renderer|SampleQuery|Sampler|Shader|Texture|TextureArray|TimeQuery|TransformFeedback|Implementation/BufferState|Implementation/DebugState|Implementation/driverSpecific|Implementation/FramebufferState|Implementation/maxTextureSize|Implementation/MeshState|Implementation/QueryState|Implementation/RendererState|Implementation/ShaderProgramState|Implementation/ShaderState|Implementation/State|Implementation/TextureState|Implementation/TransformFeedbackState)\\.(cpp|h))" --gcov-options '\-lp'; fi From 51658cb9ddfd27d6dba2eca9bf6f9fb0106439fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 8 Jun 2016 00:20:59 +0200 Subject: [PATCH 131/290] doc: improve Getting Started instructions. --- doc/getting-started.dox | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/getting-started.dox b/doc/getting-started.dox index 1f2bc1b42..a9dc68dac 100644 --- a/doc/getting-started.dox +++ b/doc/getting-started.dox @@ -163,8 +163,8 @@ In the following tutorials the code will be explained more thoroughly. In Linux (and other Unix-based OSs) you can build the application along with the subprojects using the following three commands: create out-of-source build directory, run cmake, enable SDL2 application in the Magnum subproject and then -build the everything. The compiled application binary will then appear in src/ -subdirectory of build dir: +build everything. The compiled application binary will then appear in `src/` +subdirectory of the build dir: mkdir -p build && cd build cmake .. -DWITH_SDL2APPLICATION=ON @@ -176,8 +176,7 @@ whether you will use command-line, QtCreator or Visual Studio. With Visual Studio the most straightforward way to create the project file is via the command-line: - mkdir build - cd build + mkdir build && cd build cmake .. -DWITH_SDL2APPLICATION=ON You can also use CMake GUI. Then open the `MyApplication.sln` project file @@ -199,7 +198,8 @@ On Windows you may get errors about missing DLLs when running the application. The solution is either compiling everything as static (enable `BUILD_STATIC` CMake option) or installing the dependencies somewhere. To install them, change `CMAKE_INSTALL_PREFIX` to your liking and run the `install` target. Then run -the application with `bin/` subdirectory of installation prefix as working dir. +the application with `bin/` subdirectory of installation prefix as working dir +or add the `bin/` subdirectory to `PATH`. @image html getting-started.png @image latex getting-started.png From 6b7097497fd7938dd0aab7baf222e848eee99287 Mon Sep 17 00:00:00 2001 From: Ashwin Ravichandran Date: Sun, 24 Jul 2016 01:53:18 -0700 Subject: [PATCH 132/290] Math: added Bezier curve --- src/Magnum/Math/Bezier.h | 140 ++++++++++++++++++++++++++++ src/Magnum/Math/CMakeLists.txt | 1 + src/Magnum/Math/Test/BezierTest.cpp | 83 +++++++++++++++++ src/Magnum/Math/Test/CMakeLists.txt | 1 + 4 files changed, 225 insertions(+) create mode 100644 src/Magnum/Math/Bezier.h create mode 100644 src/Magnum/Math/Test/BezierTest.cpp diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h new file mode 100644 index 000000000..b9ed69cca --- /dev/null +++ b/src/Magnum/Math/Bezier.h @@ -0,0 +1,140 @@ +#ifndef Magnum_Math_Bezier_h +#define Magnum_Math_Bezier_h + +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + Copyright © 2016 Ashwin Ravichandran + + 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. +*/ + +/** @file + * @brief Class @ref Magnum::Math::Bezier + */ + +#include +#include "Vector.h" + + +namespace Magnum { namespace Math { +/** +@brief Bezier +@tparam order Order of Bezier curve +@tparam dimensions Dimensions of the control points +@tparam T Underlying data type + +See Bezier Curve. +*/ +template class Bezier { + + public: + + /** @brief Default constructor */ + constexpr /*implicit*/ Bezier(ZeroInitT = ZeroInit): _points{} {} + + /** @brief Construct Bezier without initializing the contents */ + explicit Bezier(NoInitT) {} + + /** @brief Construct Bezier curve with the given array of control points */ + template constexpr Bezier(Vector first, U... next):_points{first, next...} { + static_assert(sizeof...(U) + 1 == order + 1, "Bezier : Wrong number of arguments"); + } + + /** + * @brief Divides a Bezier curve into two curves of same order having their own control points. + * De Casteljau's algorithm is used. + * @param t The interpolation factor + * + * @return Array of two Bezier curves of the same order + */ + std::array, 2> subdivide(Float t) const { + auto iPoints = calculateIntermediatePoints(t); + Bezier left, right; + for(std::size_t i = 0; i <= order; ++i) { + left[i] = iPoints[0][i]; + } + for(std::size_t i = 0, j = order; i <= order; --j, ++i) { + right[i] = iPoints[i][j]; + } + return {left, right}; + } + + /** + * @brief Finds the point in the curve for a given interpolation factor + * De Casteljau's algorithm is used. + * @param t The interpolation factor + */ + Vector lerp(Float t) const { + auto iPoints = calculateIntermediatePoints(t); + return iPoints[0][order]; + } + + /** + * @brief Control points of Bezier + * @return One-dimensional array of `size` length. + * + * @see @ref operator[]() + */ + Vector* points() { return _points; } + constexpr const Vector* points() const { return _points; } /**< @overload */ + + /** + * @brief Value at given position + * + * @see @ref points() + */ + Vector& operator[](std::size_t pos) { return _points[pos]; } + constexpr Vector operator[](std::size_t pos) const { return _points[pos]; } /**< @overload */ + + private: + + /** + * @brief Calculates and returns all intermediate points generated when using De Casteljau's algorithm + * @param t The interpolation factor + * + */ + std::array, order + 1> calculateIntermediatePoints(Float t) const { + std::array, order + 1> iPoints; + for(std::size_t i = 0; i <= order; ++i) { + iPoints[i][0] = _points[i]; + } + for(std::size_t r = 1; r <= order; ++r) { + for(std::size_t i = 0; i <= order - r; ++i) { + iPoints[i][r] = (1 - t)*iPoints[i][r - 1] + t*iPoints[i + 1][r - 1]; + } + } + return iPoints; + } + + Vector _points[order + 1]; +}; + +template using QuadraticBezier = Bezier<2, dimensions, T>; +template using CubicBezier = Bezier<3, dimensions, T>; +template using QuadraticBezier2D = QuadraticBezier<2, T>; +template using QuadraticBezier3D = QuadraticBezier<3, T>; +template using CubicBezier2D = CubicBezier<2, T>; +template using CubicBezier3D = CubicBezier<3, T>; + +}} +#endif + diff --git a/src/Magnum/Math/CMakeLists.txt b/src/Magnum/Math/CMakeLists.txt index a39dca0ab..d6783821f 100644 --- a/src/Magnum/Math/CMakeLists.txt +++ b/src/Magnum/Math/CMakeLists.txt @@ -25,6 +25,7 @@ set(MagnumMath_HEADERS Angle.h + Bezier.h BoolVector.h Color.h Complex.h diff --git a/src/Magnum/Math/Test/BezierTest.cpp b/src/Magnum/Math/Test/BezierTest.cpp new file mode 100644 index 000000000..da4368f01 --- /dev/null +++ b/src/Magnum/Math/Test/BezierTest.cpp @@ -0,0 +1,83 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + Copyright © 2016 Ashwin Ravichandran + + 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. +*/ + +#include +#include "Magnum/Math/Bezier.h" +#include "Magnum/Math/Functions.h" + + +namespace Magnum { namespace Math { namespace Test { + +typedef Math::Vector<2, Float> Vector2; + +struct BezierTest : Corrade::TestSuite::Tester { + explicit BezierTest(); + + void implicitConstructor(); + + void quadratic(); + + void cubic(); +}; + +BezierTest::BezierTest() { + addTests({&BezierTest::implicitConstructor, + &BezierTest::quadratic, + &BezierTest::cubic}); +} + +void BezierTest::implicitConstructor() { + QuadraticBezier2D bezier; + Vector2 zero; + for(int i = 0; i < 3; ++i) { + CORRADE_COMPARE(bezier[i], zero); + } +} + +void BezierTest::quadratic() { + Vector2 p0(0.0f, 0.0f), p1(10.0f, 15.0f), p2(20.0f, 4.0f); + QuadraticBezier2D bezier(p0, p1, p2); + for(Float t = 0.0; t <= 1.0f; t += 0.01f) { + Vector2 expected = Math::pow<2>(1 - t)*p0 + 2*(1 - t)*t*p1 + Math::pow<2>(t)*p2; + CORRADE_COMPARE(bezier.lerp(t), expected); + } +} + +void BezierTest::cubic() { + Vector2 p0(0.0f, 0.0f), p1(10.0f, 15.0f), p2(20.0f, 4.0f), p3(5.0f, -20.0f); + CubicBezier2D bezier(p0, p1, p2, p3); + for(Float t = 0.0; t <= 1.0f; t += 0.01f) { + Vector2 expected = Math::pow<3>(1 - t)*p0 + + 3*Math::pow<2>(1 - t)*t*p1 + + 3*(1 - t)*Math::pow<2>(t)*p2 + + Math::pow<3>(t)*p3; + CORRADE_COMPARE(bezier.lerp(t), expected); + } +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Math::Test::BezierTest) diff --git a/src/Magnum/Math/Test/CMakeLists.txt b/src/Magnum/Math/Test/CMakeLists.txt index 9eeba4cfb..39fd953fb 100644 --- a/src/Magnum/Math/Test/CMakeLists.txt +++ b/src/Magnum/Math/Test/CMakeLists.txt @@ -43,6 +43,7 @@ corrade_add_test(MathMatrix4Test Matrix4Test.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathSwizzleTest SwizzleTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathUnitTest UnitTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathAngleTest AngleTest.cpp LIBRARIES MagnumMathTestLib) +corrade_add_test(MathBezierTest BezierTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathRangeTest RangeTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathDualTest DualTest.cpp LIBRARIES MagnumMathTestLib) From 4e46a74a384fe0aee80602cca781f9b5f23996bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 15:47:23 +0200 Subject: [PATCH 133/290] Updated CREDITS.md. --- CREDITS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.md b/CREDITS.md index 4cf4d5fb1..91ac5edeb 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -35,5 +35,7 @@ Contributors to Magnum library enhancements, GlfwApplication implementation, bug reports, documentation improvements * Gerhard de Clercq -- Windows RT (Store/Phone) port +* Ashwin Ravichandran ([@](ashrko619)[https://github.com/ashrko619]) -- + Bézier curve implementation Big thanks to everyone involved! From 8bf1f5e5d8b85a26110280a02e63e48948c774b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 15:47:50 +0200 Subject: [PATCH 134/290] =?UTF-8?q?Math:=20Minor=20B=C3=A9zier=20cleanup?= =?UTF-8?q?=20and=20documentation=20improvements.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removed the points() access function, as it has no real value. --- src/Magnum/Math/Bezier.h | 136 +++++++++++++++++++--------- src/Magnum/Math/Test/BezierTest.cpp | 38 ++++---- src/Magnum/Math/Test/CMakeLists.txt | 3 +- 3 files changed, 114 insertions(+), 63 deletions(-) diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index b9ed69cca..5358d247e 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -1,6 +1,5 @@ #ifndef Magnum_Math_Bezier_h #define Magnum_Math_Bezier_h - /* This file is part of Magnum. @@ -28,46 +27,59 @@ */ /** @file - * @brief Class @ref Magnum::Math::Bezier + * @brief Class @ref Magnum::Math::Bezier, alias @ref Magnum::Math::QuadraticBezier, @ref Magnum::Math::QuadraticBezier2D, @ref Magnum::Math::QuadraticBezier3D, @ref Magnum::Math::CubicBezier, @ref Magnum::Math::CubicBezier2D, @ref Magnum::Math::CubicBezier3D */ #include -#include "Vector.h" +#include "Magnum/Math/Vector.h" namespace Magnum { namespace Math { + /** -@brief Bezier -@tparam order Order of Bezier curve -@tparam dimensions Dimensions of the control points +@brief Bézier curve +@tparam order Order of Bézier curve +@tparam dimensions Dimensions of control points @tparam T Underlying data type -See Bezier Curve. +Implementation of M-order N-dimensional +[Bézier Curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve). +@see @ref QuadraticBezier, @ref CubicBezier, @ref QuadraticBezier2D, + @ref QuadraticBezier3D, @ref CubicBezier2D, @ref CubicBezier3D */ template class Bezier { - public: + typedef T Type; /**< @brief Underlying data type */ - /** @brief Default constructor */ - constexpr /*implicit*/ Bezier(ZeroInitT = ZeroInit): _points{} {} + enum: UnsignedInt { + Order = order, /**< Order of Bézier curve */ + Dimensions = dimensions /**< Dimensions of control points */ + }; - /** @brief Construct Bezier without initializing the contents */ - explicit Bezier(NoInitT) {} + /** + * @brief Default constructor + * + * Construct the curve with all control points being zero vectors. + */ + constexpr /*implicit*/ Bezier(ZeroInitT = ZeroInit) noexcept: _data{} {} - /** @brief Construct Bezier curve with the given array of control points */ - template constexpr Bezier(Vector first, U... next):_points{first, next...} { - static_assert(sizeof...(U) + 1 == order + 1, "Bezier : Wrong number of arguments"); + /** @brief Construct Bézier without initializing the contents */ + explicit Bezier(NoInitT) noexcept {} + + /** @brief Construct Bézier curve with given array of control points */ + template constexpr Bezier(const Vector& first, U... next) noexcept: _data{first, next...} { + static_assert(sizeof...(U) + 1 == order + 1, "Wrong number of arguments"); } /** - * @brief Divides a Bezier curve into two curves of same order having their own control points. - * De Casteljau's algorithm is used. + * @brief Subdivide the curve * @param t The interpolation factor * - * @return Array of two Bezier curves of the same order + * Divides the curve into two Bézier curves of same order having their + * own control points. Uses the [De Casteljau's algorithm](https://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm). */ std::array, 2> subdivide(Float t) const { - auto iPoints = calculateIntermediatePoints(t); + const auto iPoints = calculateIntermediatePoints(t); Bezier left, right; for(std::size_t i = 0; i <= order; ++i) { left[i] = iPoints[0][i]; @@ -79,43 +91,31 @@ template class Bezier { } /** - * @brief Finds the point in the curve for a given interpolation factor - * De Casteljau's algorithm is used. + * @brief Interpolate the curve * @param t The interpolation factor + * + * Finds the point in the curve for a given interpolation factor. Uses + * the [De Casteljau's algorithm](https://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm). */ Vector lerp(Float t) const { - auto iPoints = calculateIntermediatePoints(t); + const auto iPoints = calculateIntermediatePoints(t); return iPoints[0][order]; } /** - * @brief Control points of Bezier - * @return One-dimensional array of `size` length. - * - * @see @ref operator[]() - */ - Vector* points() { return _points; } - constexpr const Vector* points() const { return _points; } /**< @overload */ - - /** - * @brief Value at given position + * @brief Control point access * - * @see @ref points() + * @p i should not be larger than @ref Order. */ - Vector& operator[](std::size_t pos) { return _points[pos]; } - constexpr Vector operator[](std::size_t pos) const { return _points[pos]; } /**< @overload */ + Vector& operator[](std::size_t i) { return _data[i]; } + constexpr Vector operator[](std::size_t i) const { return _data[i]; } /**< @overload */ private: - - /** - * @brief Calculates and returns all intermediate points generated when using De Casteljau's algorithm - * @param t The interpolation factor - * - */ + /* Calculates and returns all intermediate points generated when using De Casteljau's algorithm */ std::array, order + 1> calculateIntermediatePoints(Float t) const { std::array, order + 1> iPoints; for(std::size_t i = 0; i <= order; ++i) { - iPoints[i][0] = _points[i]; + iPoints[i][0] = _data[i]; } for(std::size_t r = 1; r <= order; ++r) { for(std::size_t i = 0; i <= order - r; ++i) { @@ -125,16 +125,64 @@ template class Bezier { return iPoints; } - Vector _points[order + 1]; + Vector _data[order + 1]; }; +/** +@brief Quadratic Bézier curve + +Convenience alternative to `Bezier<2, dimensions, T>`. See @ref Bezier for more +information. +@see @ref QuadraticBezier2D, @ref QuadraticBezier3D +*/ template using QuadraticBezier = Bezier<2, dimensions, T>; -template using CubicBezier = Bezier<3, dimensions, T>; + +/** +@brief Two-dimensional quadratic Bézier curve + +Convenience alternative to `QuadraticBezier<2, T>`. See @ref QuadraticBezier +and @ref Bezier for more information. +@see @ref QuadraticBezier3D +*/ template using QuadraticBezier2D = QuadraticBezier<2, T>; + +/** +@brief Three-dimensional quadratic Bézier curve + +Convenience alternative to `QuadraticBezier<3, T>`. See @ref QuadraticBezier +and @ref Bezier for more information. +@see @ref QuadraticBezier2D +*/ template using QuadraticBezier3D = QuadraticBezier<3, T>; + +/** +@brief Cubic Bézier curve + +Convenience alternative to `Bezier<3, dimensions, T>`. See @ref Bezier for more +information. +@see @ref CubicBezier2D, @ref CubicBezier3D +*/ +template using CubicBezier = Bezier<3, dimensions, T>; + +/** +@brief Two-dimensional cubic Bézier curve + +Convenience alternative to `CubicBezier<2, T>`. See @ref CubicBezier +and @ref Bezier for more information. +@see @ref CubicBezier3D +*/ template using CubicBezier2D = CubicBezier<2, T>; + +/** +@brief Three-dimensional cubic Bézier curve + +Convenience alternative to `CubicBezier<3, T>`. See @ref CubicBezier +and @ref Bezier for more information. +@see @ref CubicBezier2D +*/ template using CubicBezier3D = CubicBezier<3, T>; }} + #endif diff --git a/src/Magnum/Math/Test/BezierTest.cpp b/src/Magnum/Math/Test/BezierTest.cpp index da4368f01..456f81d77 100644 --- a/src/Magnum/Math/Test/BezierTest.cpp +++ b/src/Magnum/Math/Test/BezierTest.cpp @@ -25,55 +25,57 @@ */ #include + #include "Magnum/Math/Bezier.h" +#include "Magnum/Math/Vector2.h" #include "Magnum/Math/Functions.h" - namespace Magnum { namespace Math { namespace Test { -typedef Math::Vector<2, Float> Vector2; +typedef Math::Vector2 Vector2; +typedef Math::QuadraticBezier2D QuadraticBezier2D; +typedef Math::CubicBezier2D CubicBezier2D; struct BezierTest : Corrade::TestSuite::Tester { explicit BezierTest(); void implicitConstructor(); - void quadratic(); - - void cubic(); + void lerpQuadratic(); + void lerpCubic(); }; BezierTest::BezierTest() { addTests({&BezierTest::implicitConstructor, - &BezierTest::quadratic, - &BezierTest::cubic}); + + &BezierTest::lerpQuadratic, + &BezierTest::lerpCubic}); } void BezierTest::implicitConstructor() { - QuadraticBezier2D bezier; - Vector2 zero; + QuadraticBezier2D bezier; for(int i = 0; i < 3; ++i) { - CORRADE_COMPARE(bezier[i], zero); + CORRADE_COMPARE(bezier[i], Vector2{}); } } -void BezierTest::quadratic() { +void BezierTest::lerpQuadratic() { Vector2 p0(0.0f, 0.0f), p1(10.0f, 15.0f), p2(20.0f, 4.0f); - QuadraticBezier2D bezier(p0, p1, p2); + QuadraticBezier2D bezier(p0, p1, p2); for(Float t = 0.0; t <= 1.0f; t += 0.01f) { Vector2 expected = Math::pow<2>(1 - t)*p0 + 2*(1 - t)*t*p1 + Math::pow<2>(t)*p2; CORRADE_COMPARE(bezier.lerp(t), expected); } } -void BezierTest::cubic() { +void BezierTest::lerpCubic() { Vector2 p0(0.0f, 0.0f), p1(10.0f, 15.0f), p2(20.0f, 4.0f), p3(5.0f, -20.0f); - CubicBezier2D bezier(p0, p1, p2, p3); + CubicBezier2D bezier(p0, p1, p2, p3); for(Float t = 0.0; t <= 1.0f; t += 0.01f) { - Vector2 expected = Math::pow<3>(1 - t)*p0 - + 3*Math::pow<2>(1 - t)*t*p1 - + 3*(1 - t)*Math::pow<2>(t)*p2 - + Math::pow<3>(t)*p3; + Vector2 expected = Math::pow<3>(1 - t)*p0 + + 3*Math::pow<2>(1 - t)*t*p1 + + 3*(1 - t)*Math::pow<2>(t)*p2 + + Math::pow<3>(t)*p3; CORRADE_COMPARE(bezier.lerp(t), expected); } } diff --git a/src/Magnum/Math/Test/CMakeLists.txt b/src/Magnum/Math/Test/CMakeLists.txt index 39fd953fb..9f93ec1e1 100644 --- a/src/Magnum/Math/Test/CMakeLists.txt +++ b/src/Magnum/Math/Test/CMakeLists.txt @@ -43,7 +43,6 @@ corrade_add_test(MathMatrix4Test Matrix4Test.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathSwizzleTest SwizzleTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathUnitTest UnitTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathAngleTest AngleTest.cpp LIBRARIES MagnumMathTestLib) -corrade_add_test(MathBezierTest BezierTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathRangeTest RangeTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathDualTest DualTest.cpp LIBRARIES MagnumMathTestLib) @@ -52,6 +51,8 @@ corrade_add_test(MathDualComplexTest DualComplexTest.cpp LIBRARIES MagnumMathTes corrade_add_test(MathQuaternionTest QuaternionTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test(MathDualQuaternionTest DualQuaternionTest.cpp LIBRARIES MagnumMathTestLib) +corrade_add_test(MathBezierTest BezierTest.cpp LIBRARIES MagnumMathTestLib) + set_property(TARGET MathVectorTest MathMatrixTest From 4af823a674b1f20c7d4d2db826249b1dbd86abd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 15:52:08 +0200 Subject: [PATCH 135/290] Math: add the Bezier class and aliases to the forward declaration header. --- src/Magnum/Math/Bezier.h | 12 ++++++++++++ src/Magnum/Math/Math.h | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index 5358d247e..cc324be5c 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -135,7 +135,9 @@ Convenience alternative to `Bezier<2, dimensions, T>`. See @ref Bezier for more information. @see @ref QuadraticBezier2D, @ref QuadraticBezier3D */ +#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ template using QuadraticBezier = Bezier<2, dimensions, T>; +#endif /** @brief Two-dimensional quadratic Bézier curve @@ -144,7 +146,9 @@ Convenience alternative to `QuadraticBezier<2, T>`. See @ref QuadraticBezier and @ref Bezier for more information. @see @ref QuadraticBezier3D */ +#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ template using QuadraticBezier2D = QuadraticBezier<2, T>; +#endif /** @brief Three-dimensional quadratic Bézier curve @@ -153,7 +157,9 @@ Convenience alternative to `QuadraticBezier<3, T>`. See @ref QuadraticBezier and @ref Bezier for more information. @see @ref QuadraticBezier2D */ +#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ template using QuadraticBezier3D = QuadraticBezier<3, T>; +#endif /** @brief Cubic Bézier curve @@ -162,7 +168,9 @@ Convenience alternative to `Bezier<3, dimensions, T>`. See @ref Bezier for more information. @see @ref CubicBezier2D, @ref CubicBezier3D */ +#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ template using CubicBezier = Bezier<3, dimensions, T>; +#endif /** @brief Two-dimensional cubic Bézier curve @@ -171,7 +179,9 @@ Convenience alternative to `CubicBezier<2, T>`. See @ref CubicBezier and @ref Bezier for more information. @see @ref CubicBezier3D */ +#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ template using CubicBezier2D = CubicBezier<2, T>; +#endif /** @brief Three-dimensional cubic Bézier curve @@ -180,7 +190,9 @@ Convenience alternative to `CubicBezier<3, T>`. See @ref CubicBezier and @ref Bezier for more information. @see @ref CubicBezier2D */ +#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ template using CubicBezier3D = CubicBezier<3, T>; +#endif }} diff --git a/src/Magnum/Math/Math.h b/src/Magnum/Math/Math.h index f9a3d19bf..23fc234ee 100644 --- a/src/Magnum/Math/Math.h +++ b/src/Magnum/Math/Math.h @@ -41,6 +41,14 @@ namespace Magnum { namespace Math { #ifndef DOXYGEN_GENERATING_OUTPUT /* Class Constants used only statically */ +template class Bezier; +template using QuadraticBezier = Bezier<2, dimensions, T>; +template using CubicBezier = Bezier<3, dimensions, T>; +template using QuadraticBezier2D = QuadraticBezier<2, T>; +template using QuadraticBezier3D = QuadraticBezier<3, T>; +template using CubicBezier2D = CubicBezier<2, T>; +template using CubicBezier3D = CubicBezier<3, T>; + template class Complex; template class Dual; template class DualComplex; From 62214a288ccb13a1bd375d9d9eedc7da78b771bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 16:01:21 +0200 Subject: [PATCH 136/290] Add Bezier typedefs to the root Magnum.h header. --- doc/types.dox | 4 ++++ src/Magnum/Magnum.h | 24 ++++++++++++++++++++++++ src/Magnum/Math/Bezier.h | 12 ++++++++---- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/doc/types.dox b/doc/types.dox index c510c8b2c..7e5f5498e 100644 --- a/doc/types.dox +++ b/doc/types.dox @@ -157,6 +157,10 @@ Complex b = Complex::rotation(60.0_degf); Other types, which don't have their GLSL equivalent, are: +- @ref QuadraticBezier2D or @ref QuadraticBezier2Dd, @ref QuadraticBezier3D + or @ref QuadraticBezier3Dd +- @ref CubicBezier2D or @ref CubicBezier2Dd, @ref CubicBezier3D + or @ref CubicBezier3Dd - @ref Complex or @ref Complexd, @ref DualComplex or @ref DualComplexd - @ref Quaternion or @ref Quaterniond, @ref DualQuaternion or @ref DualQuaterniond diff --git a/src/Magnum/Magnum.h b/src/Magnum/Magnum.h index 5de2ae8a1..d552ce546 100644 --- a/src/Magnum/Magnum.h +++ b/src/Magnum/Magnum.h @@ -302,6 +302,18 @@ typedef Math::Matrix3x4 Matrix3x4; /** @brief Float matrix with 4 columns and 3 rows */ typedef Math::Matrix4x3 Matrix4x3; +/** @brief Float two-dimensional quadratic Bézier curve */ +typedef Math::QuadraticBezier2D QuadraticBezier2D; + +/** @brief Float three-dimensional quadratic Bézier curve */ +typedef Math::QuadraticBezier3D QuadraticBezier3D; + +/** @brief Float two-dimensional cubic Bézier curve */ +typedef Math::CubicBezier2D CubicBezier2D; + +/** @brief Float three-dimensional cubic Bézier curve */ +typedef Math::CubicBezier3D CubicBezier3D; + /** @brief Float complex number */ typedef Math::Complex Complex; @@ -411,6 +423,18 @@ typedef Math::Matrix3x4 Matrix3x4d; /** @brief Double matrix with 4 columns and 3 rows */ typedef Math::Matrix4x3 Matrix4x3d; +/** @brief Double two-dimensional quadratic Bézier curve */ +typedef Math::QuadraticBezier2D QuadraticBezier2Dd; + +/** @brief Double three-dimensional quadratic Bézier curve */ +typedef Math::QuadraticBezier3D QuadraticBezier3Dd; + +/** @brief Double two-dimensional cubic Bézier curve */ +typedef Math::CubicBezier2D CubicBezier2Dd; + +/** @brief Double three-dimensional cubic Bézier curve */ +typedef Math::CubicBezier3D CubicBezier3Dd; + /** @brief Double complex number */ typedef Math::Complex Complexd; diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index cc324be5c..4734e71a7 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -144,7 +144,8 @@ template using QuadraticBezier = Bezier<2, dime Convenience alternative to `QuadraticBezier<2, T>`. See @ref QuadraticBezier and @ref Bezier for more information. -@see @ref QuadraticBezier3D +@see @ref QuadraticBezier3D, @ref Magnum::QuadraticBezier2D, + @ref Magnum::QuadraticBezier2Dd */ #ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ template using QuadraticBezier2D = QuadraticBezier<2, T>; @@ -155,7 +156,8 @@ template using QuadraticBezier2D = QuadraticBezier<2, T>; Convenience alternative to `QuadraticBezier<3, T>`. See @ref QuadraticBezier and @ref Bezier for more information. -@see @ref QuadraticBezier2D +@see @ref QuadraticBezier2D, @ref Magnum::QuadraticBezier3D, + @ref Magnum::QuadraticBezier3Dd */ #ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ template using QuadraticBezier3D = QuadraticBezier<3, T>; @@ -177,7 +179,8 @@ template using CubicBezier = Bezier<3, dimensio Convenience alternative to `CubicBezier<2, T>`. See @ref CubicBezier and @ref Bezier for more information. -@see @ref CubicBezier3D +@see @ref CubicBezier3D, @ref Magnum::CubicBezier2D, + @ref Magnum::CubicBezier2Dd */ #ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ template using CubicBezier2D = CubicBezier<2, T>; @@ -188,7 +191,8 @@ template using CubicBezier2D = CubicBezier<2, T>; Convenience alternative to `CubicBezier<3, T>`. See @ref CubicBezier and @ref Bezier for more information. -@see @ref CubicBezier2D +@see @ref CubicBezier2D, @ref Magnum::CubicBezier3D, + @ref Magnum::CubicBezier3Dd */ #ifndef CORRADE_MSVC2015_COMPATIBILITY /* Multiple definitions still broken */ template using CubicBezier3D = CubicBezier<3, T>; From 719aff99b27886155b743f9a43a0ca02214c6003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 16:15:53 +0200 Subject: [PATCH 137/290] Math: debug operator for Bezier. --- src/Magnum/Math/Bezier.h | 24 ++++++++++++++++++++++++ src/Magnum/Math/Test/BezierTest.cpp | 13 ++++++++++++- src/Magnum/Math/instantiation.cpp | 10 ++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index 4734e71a7..106de6efd 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -198,6 +198,30 @@ and @ref Bezier for more information. template using CubicBezier3D = CubicBezier<3, T>; #endif +/** @debugoperator{Magnum::Math::Bezier} */ +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug& debug, const Bezier& value) { + debug << "Bezier(" << Corrade::Utility::Debug::nospace; + for(UnsignedInt o = 0; o != order + 1; ++o) { + debug << (o ? ", {" : "{") << Corrade::Utility::Debug::nospace << value[o][0] << Corrade::Utility::Debug::nospace; + for(UnsignedInt i = 1; i != dimensions; ++i) + debug << "," << value[o][i] << Corrade::Utility::Debug::nospace; + debug << "}" << Corrade::Utility::Debug::nospace; + } + return debug << ")"; +} + +/* Explicit instantiation for types used in OpenGL */ +#ifndef DOXYGEN_GENERATING_OUTPUT +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 2, Float>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 3, Float>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 2, Float>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 3, Float>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 2, Double>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 3, Double>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 2, Double>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 3, Double>&); +#endif + }} #endif diff --git a/src/Magnum/Math/Test/BezierTest.cpp b/src/Magnum/Math/Test/BezierTest.cpp index 456f81d77..bd15fcd67 100644 --- a/src/Magnum/Math/Test/BezierTest.cpp +++ b/src/Magnum/Math/Test/BezierTest.cpp @@ -24,6 +24,7 @@ DEALINGS IN THE SOFTWARE. */ +#include #include #include "Magnum/Math/Bezier.h" @@ -43,13 +44,17 @@ struct BezierTest : Corrade::TestSuite::Tester { void lerpQuadratic(); void lerpCubic(); + + void debug(); }; BezierTest::BezierTest() { addTests({&BezierTest::implicitConstructor, &BezierTest::lerpQuadratic, - &BezierTest::lerpCubic}); + &BezierTest::lerpCubic, + + &BezierTest::debug}); } void BezierTest::implicitConstructor() { @@ -80,6 +85,12 @@ void BezierTest::lerpCubic() { } } +void BezierTest::debug() { + std::ostringstream out; + Debug(&out) << CubicBezier2D{Vector2{0.0f, 1.0f}, Vector2{1.5f, -0.3f}, Vector2{2.1f, 0.5f}, Vector2{0.0f, 2.0f}}; + CORRADE_COMPARE(out.str(), "Bezier({0, 1}, {1.5, -0.3}, {2.1, 0.5}, {0, 2})\n"); +} + }}} CORRADE_TEST_MAIN(Magnum::Math::Test::BezierTest) diff --git a/src/Magnum/Math/instantiation.cpp b/src/Magnum/Math/instantiation.cpp index 22a02e425..1a56c4e79 100644 --- a/src/Magnum/Math/instantiation.cpp +++ b/src/Magnum/Math/instantiation.cpp @@ -23,6 +23,7 @@ DEALINGS IN THE SOFTWARE. */ +#include "Magnum/Math/Bezier.h" #include "Magnum/Math/DualComplex.h" #include "Magnum/Math/DualQuaternion.h" #include "Magnum/Math/Range.h" @@ -76,6 +77,15 @@ template struct ConfigurationValue>; namespace Magnum { namespace Math { #ifndef DOXYGEN_GENERATING_OUTPUT +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 2, Float>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 3, Float>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 2, Float>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 3, Float>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 2, Double>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 3, Double>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 2, Double>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 3, Double>&); + template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Complex&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Complex&); From 12e19eff37265ad0b60c6585e7b499239484e71b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 17:19:58 +0200 Subject: [PATCH 138/290] Math: ability to save/restore Bezier to/from Configuration. --- src/Magnum/Math/Bezier.h | 54 +++++++++++++++++++++++++++++ src/Magnum/Math/Test/BezierTest.cpp | 16 ++++++++- src/Magnum/Math/instantiation.cpp | 9 +++++ 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index 106de6efd..541df4750 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -224,5 +224,59 @@ extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utili }} +namespace Corrade { namespace Utility { + +/** @configurationvalue{Magnum::Math::Bezier} */ +template struct ConfigurationValue> { + ConfigurationValue() = delete; + + /** @brief Writes elements separated with spaces */ + static std::string toString(const Magnum::Math::Bezier& value, ConfigurationValueFlags flags) { + std::string output; + + for(std::size_t o = 0; o != order + 1; ++o) { + for(std::size_t i = 0; i != dimensions; ++i) { + if(!output.empty()) output += ' '; + output += ConfigurationValue::toString(value[o][i], flags); + } + } + + return output; + } + + /** @brief Reads elements separated with whitespace */ + static Magnum::Math::Bezier fromString(const std::string& stringValue, ConfigurationValueFlags flags) { + Magnum::Math::Bezier result; + + std::size_t oldpos = 0, pos = std::string::npos, i = 0; + do { + pos = stringValue.find(' ', oldpos); + std::string part = stringValue.substr(oldpos, pos-oldpos); + + if(!part.empty()) { + result[i/dimensions][i%dimensions] = ConfigurationValue::fromString(part, flags); + ++i; + } + + oldpos = pos+1; + } while(pos != std::string::npos); + + return result; + } +}; + +#if !defined(DOXYGEN_GENERATING_OUTPUT) && !defined(__MINGW32__) +extern template struct MAGNUM_EXPORT ConfigurationValue>; +extern template struct MAGNUM_EXPORT ConfigurationValue>; +extern template struct MAGNUM_EXPORT ConfigurationValue>; +extern template struct MAGNUM_EXPORT ConfigurationValue>; +extern template struct MAGNUM_EXPORT ConfigurationValue>; +extern template struct MAGNUM_EXPORT ConfigurationValue>; +extern template struct MAGNUM_EXPORT ConfigurationValue>; +extern template struct MAGNUM_EXPORT ConfigurationValue>; +#endif + +}} + #endif diff --git a/src/Magnum/Math/Test/BezierTest.cpp b/src/Magnum/Math/Test/BezierTest.cpp index bd15fcd67..112962aa6 100644 --- a/src/Magnum/Math/Test/BezierTest.cpp +++ b/src/Magnum/Math/Test/BezierTest.cpp @@ -26,6 +26,7 @@ #include #include +#include #include "Magnum/Math/Bezier.h" #include "Magnum/Math/Vector2.h" @@ -46,6 +47,7 @@ struct BezierTest : Corrade::TestSuite::Tester { void lerpCubic(); void debug(); + void configuration(); }; BezierTest::BezierTest() { @@ -54,7 +56,8 @@ BezierTest::BezierTest() { &BezierTest::lerpQuadratic, &BezierTest::lerpCubic, - &BezierTest::debug}); + &BezierTest::debug, + &BezierTest::configuration}); } void BezierTest::implicitConstructor() { @@ -91,6 +94,17 @@ void BezierTest::debug() { CORRADE_COMPARE(out.str(), "Bezier({0, 1}, {1.5, -0.3}, {2.1, 0.5}, {0, 2})\n"); } +void BezierTest::configuration() { + Corrade::Utility::Configuration c; + + CubicBezier2D bezier{Vector2{0.0f, 1.0f}, Vector2{1.5f, -0.3f}, Vector2{2.1f, 0.5f}, Vector2{0.0f, 2.0f}}; + std::string value("0 1 1.5 -0.3 2.1 0.5 0 2"); + + c.setValue("bezier", bezier); + CORRADE_COMPARE(c.value("bezier"), value); + CORRADE_COMPARE(c.value("bezier"), bezier); +} + }}} CORRADE_TEST_MAIN(Magnum::Math::Test::BezierTest) diff --git a/src/Magnum/Math/instantiation.cpp b/src/Magnum/Math/instantiation.cpp index 1a56c4e79..483f138fa 100644 --- a/src/Magnum/Math/instantiation.cpp +++ b/src/Magnum/Math/instantiation.cpp @@ -31,6 +31,15 @@ namespace Corrade { namespace Utility { #ifndef DOXYGEN_GENERATING_OUTPUT +template struct ConfigurationValue>; +template struct ConfigurationValue>; +template struct ConfigurationValue>; +template struct ConfigurationValue>; +template struct ConfigurationValue>; +template struct ConfigurationValue>; +template struct ConfigurationValue>; +template struct ConfigurationValue>; + template struct ConfigurationValue>; template struct ConfigurationValue>; template struct ConfigurationValue>; From 6f6d69012f45a05f96168bf68341ff9f6b9841d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 16:49:50 +0200 Subject: [PATCH 139/290] Math: added comparison operators to Bezier, expanded the test. --- src/Magnum/Math/Bezier.h | 12 +++++ src/Magnum/Math/Test/BezierTest.cpp | 75 ++++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 7 deletions(-) diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index 541df4750..7b45d7948 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -110,6 +110,18 @@ template class Bezier { Vector& operator[](std::size_t i) { return _data[i]; } constexpr Vector operator[](std::size_t i) const { return _data[i]; } /**< @overload */ + /** @brief Equality comparison */ + bool operator==(const Bezier& other) const { + for(std::size_t i = 0; i != order + 1; ++i) + if((*this)[i] != other[i]) return false; + return true; + } + + /** @brief Non-equality comparison */ + bool operator!=(const Bezier& other) const { + return !operator==(other); + } + private: /* Calculates and returns all intermediate points generated when using De Casteljau's algorithm */ std::array, order + 1> calculateIntermediatePoints(Float t) const { diff --git a/src/Magnum/Math/Test/BezierTest.cpp b/src/Magnum/Math/Test/BezierTest.cpp index 112962aa6..210fcb3be 100644 --- a/src/Magnum/Math/Test/BezierTest.cpp +++ b/src/Magnum/Math/Test/BezierTest.cpp @@ -41,7 +41,14 @@ typedef Math::CubicBezier2D CubicBezier2D; struct BezierTest : Corrade::TestSuite::Tester { explicit BezierTest(); - void implicitConstructor(); + void construct(); + void constructDefault(); + void constructNoInit(); + void constructCopy(); + + void data(); + + void compare(); void lerpQuadratic(); void lerpCubic(); @@ -51,7 +58,14 @@ struct BezierTest : Corrade::TestSuite::Tester { }; BezierTest::BezierTest() { - addTests({&BezierTest::implicitConstructor, + addTests({&BezierTest::construct, + &BezierTest::constructDefault, + &BezierTest::constructNoInit, + &BezierTest::constructCopy, + + &BezierTest::data, + + &BezierTest::compare, &BezierTest::lerpQuadratic, &BezierTest::lerpCubic, @@ -60,11 +74,58 @@ BezierTest::BezierTest() { &BezierTest::configuration}); } -void BezierTest::implicitConstructor() { - QuadraticBezier2D bezier; - for(int i = 0; i < 3; ++i) { - CORRADE_COMPARE(bezier[i], Vector2{}); - } +void BezierTest::construct() { + /* The constructor should be implicit */ + constexpr QuadraticBezier2D a = {Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}}; + CORRADE_COMPARE(a, (QuadraticBezier2D{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); +} + +void BezierTest::constructDefault() { + constexpr QuadraticBezier2D a; + constexpr QuadraticBezier2D b{ZeroInit}; + CORRADE_COMPARE(a, (QuadraticBezier2D{Vector2{}, Vector2{}, Vector2{}})); + CORRADE_COMPARE(b, (QuadraticBezier2D{Vector2{}, Vector2{}, Vector2{}})); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); +} + +void BezierTest::constructNoInit() { + QuadraticBezier2D a{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}}; + new(&a) QuadraticBezier2D{NoInit}; + CORRADE_COMPARE(a, (QuadraticBezier2D{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); +} + +void BezierTest::constructCopy() { + constexpr QuadraticBezier2D a{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}}; + constexpr QuadraticBezier2D b{a}; + CORRADE_COMPARE(b, (QuadraticBezier2D{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}})); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); +} + +void BezierTest::data() { + QuadraticBezier2D a{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}}; + a[0] = {}; + a[2] = {0.7f, 20.3f}; + + CORRADE_COMPARE(a[0], (Vector2{0.0f, 0.0f})); + CORRADE_COMPARE(a[2], (Vector2{0.7f, 20.3f})); + CORRADE_COMPARE(a, (QuadraticBezier2D{Vector2{0.0f, 0.0f}, Vector2{1.1f, 0.3f}, Vector2{0.7f, 20.3f}})); + + constexpr QuadraticBezier2D b{Vector2{3.5f, 0.1f}, Vector2{1.3f, 10.3f}, Vector2{0.0f, -1.2f}}; + constexpr Vector2 c = b[2]; + CORRADE_COMPARE(c, (Vector2{0.0f, -1.2f})); +} + +void BezierTest::compare() { + CORRADE_VERIFY((QuadraticBezier2D{Vector2{0.5f, 1.0f + TypeTraits::epsilon()/2}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}} == QuadraticBezier2D{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}})); + CORRADE_VERIFY((QuadraticBezier2D{Vector2{0.5f, 1.1f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.0f + TypeTraits::epsilon()*2}} != QuadraticBezier2D{Vector2{0.5f, 1.1f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.0f}})); } void BezierTest::lerpQuadratic() { From 4950023f5ef13a136620c2e39ee24e069981cf83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 17:37:29 +0200 Subject: [PATCH 140/290] Math: assert that Bezier has non-zero order. --- src/Magnum/Math/Bezier.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index 7b45d7948..242169886 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -48,6 +48,8 @@ Implementation of M-order N-dimensional @ref QuadraticBezier3D, @ref CubicBezier2D, @ref CubicBezier3D */ template class Bezier { + static_assert(order != 0, "Bezier cannot have zero order"); + public: typedef T Type; /**< @brief Underlying data type */ From 73ca103e1af1a6f2e38c295416a0f1690f5adb71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 17:38:58 +0200 Subject: [PATCH 141/290] Math: proper implementation for NoInit and ZeroInit Bezier constructor. --- src/Magnum/Math/Bezier.h | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index 242169886..cbefc87e9 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -63,10 +63,22 @@ template class Bezier { * * Construct the curve with all control points being zero vectors. */ - constexpr /*implicit*/ Bezier(ZeroInitT = ZeroInit) noexcept: _data{} {} + constexpr /*implicit*/ Bezier(ZeroInitT = ZeroInit) noexcept + /** @todoc remove workaround when doxygen is sane */ + #ifndef DOXYGEN_GENERATING_OUTPUT + /* MSVC 2015 can't handle {} here */ + : Bezier(typename Implementation::GenerateSequence::Type{}, ZeroInit) + #endif + {} /** @brief Construct Bézier without initializing the contents */ - explicit Bezier(NoInitT) noexcept {} + explicit Bezier(NoInitT) noexcept + /** @todoc remove workaround when doxygen is sane */ + #ifndef DOXYGEN_GENERATING_OUTPUT + /* MSVC 2015 can't handle {} here */ + : Bezier(typename Implementation::GenerateSequence::Type{}, NoInit) + #endif + {} /** @brief Construct Bézier curve with given array of control points */ template constexpr Bezier(const Vector& first, U... next) noexcept: _data{first, next...} { @@ -125,6 +137,10 @@ template class Bezier { } private: + /* Implementation for Bezier::Bezier(ZeroInitT) and Bezier::Bezier(NoInitT) */ + /* MSVC 2015 can't handle {} here */ + template constexpr explicit Bezier(Implementation::Sequence, U): _data{Vector((static_cast(sequence), U{typename U::Init{}}))...} {} + /* Calculates and returns all intermediate points generated when using De Casteljau's algorithm */ std::array, order + 1> calculateIntermediatePoints(Float t) const { std::array, order + 1> iPoints; From aaa0b0945ab91c47963aed271bc51a059dcbd41c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 17:39:25 +0200 Subject: [PATCH 142/290] Math: ability to convert Bezier underlying type. --- src/Magnum/Math/Bezier.h | 13 +++++++++++++ src/Magnum/Math/Test/BezierTest.cpp | 16 ++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index cbefc87e9..38c488cb6 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -50,6 +50,8 @@ Implementation of M-order N-dimensional template class Bezier { static_assert(order != 0, "Bezier cannot have zero order"); + template friend class Bezier; + public: typedef T Type; /**< @brief Underlying data type */ @@ -85,6 +87,14 @@ template class Bezier { static_assert(sizeof...(U) + 1 == order + 1, "Wrong number of arguments"); } + /** + * @brief Construct Bézier curve from another of different type + * + * Performs only default casting on the values, no rounding or + * anything else. + */ + template constexpr explicit Bezier(const Bezier& other) noexcept: Bezier{typename Implementation::GenerateSequence::Type(), other} {} + /** * @brief Subdivide the curve * @param t The interpolation factor @@ -137,6 +147,9 @@ template class Bezier { } private: + /* Implementation for Bezier::Bezier(const Bezier&) */ + template constexpr explicit Bezier(Implementation::Sequence, const Bezier& other) noexcept: _data{Vector(other._data[sequence])...} {} + /* Implementation for Bezier::Bezier(ZeroInitT) and Bezier::Bezier(NoInitT) */ /* MSVC 2015 can't handle {} here */ template constexpr explicit Bezier(Implementation::Sequence, U): _data{Vector((static_cast(sequence), U{typename U::Init{}}))...} {} diff --git a/src/Magnum/Math/Test/BezierTest.cpp b/src/Magnum/Math/Test/BezierTest.cpp index 210fcb3be..987ad10a5 100644 --- a/src/Magnum/Math/Test/BezierTest.cpp +++ b/src/Magnum/Math/Test/BezierTest.cpp @@ -35,7 +35,9 @@ namespace Magnum { namespace Math { namespace Test { typedef Math::Vector2 Vector2; +typedef Math::Vector2 Vector2d; typedef Math::QuadraticBezier2D QuadraticBezier2D; +typedef Math::QuadraticBezier2D QuadraticBezier2Dd; typedef Math::CubicBezier2D CubicBezier2D; struct BezierTest : Corrade::TestSuite::Tester { @@ -44,6 +46,7 @@ struct BezierTest : Corrade::TestSuite::Tester { void construct(); void constructDefault(); void constructNoInit(); + void constructConversion(); void constructCopy(); void data(); @@ -61,6 +64,7 @@ BezierTest::BezierTest() { addTests({&BezierTest::construct, &BezierTest::constructDefault, &BezierTest::constructNoInit, + &BezierTest::constructConversion, &BezierTest::constructCopy, &BezierTest::data, @@ -100,6 +104,18 @@ void BezierTest::constructNoInit() { CORRADE_VERIFY((std::is_nothrow_constructible::value)); } +void BezierTest::constructConversion() { + constexpr QuadraticBezier2Dd a{Vector2d{0.5, 1.0}, Vector2d{1.1, 0.3}, Vector2d{0.1, 1.2}}; + constexpr QuadraticBezier2D b{a}; + + CORRADE_COMPARE(b, (QuadraticBezier2D{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}})); + + /* Implicit conversion is not allowed */ + CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); +} + void BezierTest::constructCopy() { constexpr QuadraticBezier2D a{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}}; constexpr QuadraticBezier2D b{a}; From 8f7fa196a8e06daa3b64c65b809e06a9361e03d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 23:44:59 +0200 Subject: [PATCH 143/290] Math: renamed Bezier::lerp() to Bezier::value(), simplified test cases. It's interpolation, but *not* linear interpolation, so don't confuse with the naming. The test cases now compare to ground truth instead of replicating the calculation. --- src/Magnum/Math/Bezier.h | 11 +++---- src/Magnum/Math/Test/BezierTest.cpp | 47 +++++++++++++++++------------ 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index 38c488cb6..ea1783638 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -115,15 +115,14 @@ template class Bezier { } /** - * @brief Interpolate the curve - * @param t The interpolation factor + * @brief Interpolate the curve at given position * - * Finds the point in the curve for a given interpolation factor. Uses + * Returns point on the curve for given interpolation factor. Uses * the [De Casteljau's algorithm](https://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm). + * @see @ref subdivide() */ - Vector lerp(Float t) const { - const auto iPoints = calculateIntermediatePoints(t); - return iPoints[0][order]; + Vector value(Float t) const { + return calculateIntermediatePoints(t)[0][order]; } /** diff --git a/src/Magnum/Math/Test/BezierTest.cpp b/src/Magnum/Math/Test/BezierTest.cpp index 987ad10a5..bf9387bab 100644 --- a/src/Magnum/Math/Test/BezierTest.cpp +++ b/src/Magnum/Math/Test/BezierTest.cpp @@ -36,6 +36,7 @@ namespace Magnum { namespace Math { namespace Test { typedef Math::Vector2 Vector2; typedef Math::Vector2 Vector2d; +typedef Math::Bezier<1, 2, Float> LinearBezier2D; typedef Math::QuadraticBezier2D QuadraticBezier2D; typedef Math::QuadraticBezier2D QuadraticBezier2Dd; typedef Math::CubicBezier2D CubicBezier2D; @@ -53,8 +54,9 @@ struct BezierTest : Corrade::TestSuite::Tester { void compare(); - void lerpQuadratic(); - void lerpCubic(); + void valueLinear(); + void valueQuadratic(); + void valueCubic(); void debug(); void configuration(); @@ -71,8 +73,9 @@ BezierTest::BezierTest() { &BezierTest::compare, - &BezierTest::lerpQuadratic, - &BezierTest::lerpCubic, + &BezierTest::valueLinear, + &BezierTest::valueQuadratic, + &BezierTest::valueCubic, &BezierTest::debug, &BezierTest::configuration}); @@ -144,25 +147,29 @@ void BezierTest::compare() { CORRADE_VERIFY((QuadraticBezier2D{Vector2{0.5f, 1.1f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.0f + TypeTraits::epsilon()*2}} != QuadraticBezier2D{Vector2{0.5f, 1.1f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.0f}})); } -void BezierTest::lerpQuadratic() { - Vector2 p0(0.0f, 0.0f), p1(10.0f, 15.0f), p2(20.0f, 4.0f); - QuadraticBezier2D bezier(p0, p1, p2); - for(Float t = 0.0; t <= 1.0f; t += 0.01f) { - Vector2 expected = Math::pow<2>(1 - t)*p0 + 2*(1 - t)*t*p1 + Math::pow<2>(t)*p2; - CORRADE_COMPARE(bezier.lerp(t), expected); - } +void BezierTest::valueLinear() { + LinearBezier2D bezier{Vector2{0.0f, 0.0f}, Vector2{20.0f, 4.0f}}; + + CORRADE_COMPARE(bezier.value(0.2f), (Vector2{4.0f, 0.8f})); + CORRADE_COMPARE(bezier.value(0.5f), (Vector2{10.0f, 2.0f})); + CORRADE_COMPARE(bezier.value(0.2f), Math::lerp(bezier[0], bezier[1], 0.2f)); } -void BezierTest::lerpCubic() { +void BezierTest::valueQuadratic() { + QuadraticBezier2D bezier{Vector2{0.0f, 0.0f}, Vector2{10.0f, 15.0f}, Vector2{20.0f, 4.0f}}; + + CORRADE_COMPARE(bezier.value(0.2f), (Vector2{4.0f, 4.96f})); + CORRADE_COMPARE(bezier.value(0.5f), (Vector2{10.0f, 8.5f})); + CORRADE_VERIFY(bezier.value(0.2f) != Math::lerp(bezier[0], bezier[2], 0.2f)); +} + +void BezierTest::valueCubic() { Vector2 p0(0.0f, 0.0f), p1(10.0f, 15.0f), p2(20.0f, 4.0f), p3(5.0f, -20.0f); - CubicBezier2D bezier(p0, p1, p2, p3); - for(Float t = 0.0; t <= 1.0f; t += 0.01f) { - Vector2 expected = Math::pow<3>(1 - t)*p0 + - 3*Math::pow<2>(1 - t)*t*p1 + - 3*(1 - t)*Math::pow<2>(t)*p2 + - Math::pow<3>(t)*p3; - CORRADE_COMPARE(bezier.lerp(t), expected); - } + CubicBezier2D bezier{Vector2{0.0f, 0.0f}, Vector2{10.0f, 15.0f}, Vector2{20.0f, 4.0f}, Vector2{5.0f, -20.0f}}; + + CORRADE_COMPARE(bezier.value(0.2f), (Vector2{5.8f, 5.984f})); + CORRADE_COMPARE(bezier.value(0.5f), (Vector2{11.875f, 4.625f})); + CORRADE_VERIFY(bezier.value(0.2f) != Math::lerp(bezier[0], bezier[3], 0.2f)); } void BezierTest::debug() { From b59b8d431ef4455fb36f53a2649ce6a74ecbe89f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 24 Aug 2016 23:28:17 +0200 Subject: [PATCH 144/290] Math: make Bezier::subdivide() return a pair and test it. --- src/Magnum/Math/Bezier.h | 16 ++++----- src/Magnum/Math/Test/BezierTest.cpp | 51 +++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index ea1783638..9588b13ed 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -96,21 +96,19 @@ template class Bezier { template constexpr explicit Bezier(const Bezier& other) noexcept: Bezier{typename Implementation::GenerateSequence::Type(), other} {} /** - * @brief Subdivide the curve - * @param t The interpolation factor + * @brief Subdivide the curve at given position * - * Divides the curve into two Bézier curves of same order having their - * own control points. Uses the [De Casteljau's algorithm](https://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm). + * Returns two Bézier curves following the original curve, split at + * given interpolation factor. Uses the [De Casteljau's algorithm](https://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm). + * @see @ref value() */ - std::array, 2> subdivide(Float t) const { + std::pair, Bezier> subdivide(Float t) const { const auto iPoints = calculateIntermediatePoints(t); Bezier left, right; - for(std::size_t i = 0; i <= order; ++i) { + for(std::size_t i = 0; i <= order; ++i) left[i] = iPoints[0][i]; - } - for(std::size_t i = 0, j = order; i <= order; --j, ++i) { + for(std::size_t i = 0, j = order; i <= order; --j, ++i) right[i] = iPoints[i][j]; - } return {left, right}; } diff --git a/src/Magnum/Math/Test/BezierTest.cpp b/src/Magnum/Math/Test/BezierTest.cpp index bf9387bab..1d4bfbf7e 100644 --- a/src/Magnum/Math/Test/BezierTest.cpp +++ b/src/Magnum/Math/Test/BezierTest.cpp @@ -57,6 +57,9 @@ struct BezierTest : Corrade::TestSuite::Tester { void valueLinear(); void valueQuadratic(); void valueCubic(); + void subdivideLinear(); + void subdivideQuadratic(); + void subdivideCubic(); void debug(); void configuration(); @@ -76,6 +79,9 @@ BezierTest::BezierTest() { &BezierTest::valueLinear, &BezierTest::valueQuadratic, &BezierTest::valueCubic, + &BezierTest::subdivideLinear, + &BezierTest::subdivideQuadratic, + &BezierTest::subdivideCubic, &BezierTest::debug, &BezierTest::configuration}); @@ -172,6 +178,51 @@ void BezierTest::valueCubic() { CORRADE_VERIFY(bezier.value(0.2f) != Math::lerp(bezier[0], bezier[3], 0.2f)); } +void BezierTest::subdivideLinear() { + LinearBezier2D bezier{Vector2{0.0f, 0.0f}, Vector2{20.0f, 4.0f}}; + + LinearBezier2D left, right; + std::tie(left, right) = bezier.subdivide(0.25f); + + CORRADE_COMPARE(left[0], bezier[0]); + CORRADE_COMPARE(left[1], right[0]); + CORRADE_COMPARE(right[1], bezier[1]); + CORRADE_COMPARE(left.value(0.8f), bezier.value(0.2f)); + CORRADE_COMPARE(right.value(0.33333f), bezier.value(0.5f)); + CORRADE_COMPARE(left, (LinearBezier2D{Vector2{0.0f, 0.0f}, Vector2{5.0f, 1.0f}})); + CORRADE_COMPARE(right, (LinearBezier2D{Vector2{5.0f, 1.0f}, Vector2{20.0f, 4.0f}})); +} + +void BezierTest::subdivideQuadratic() { + QuadraticBezier2D bezier{Vector2{0.0f, 0.0f}, Vector2{10.0f, 15.0f}, Vector2{20.0f, 4.0f}}; + + QuadraticBezier2D left, right; + std::tie(left, right) = bezier.subdivide(0.25f); + + CORRADE_COMPARE(left[0], bezier[0]); + CORRADE_COMPARE(left[2], right[0]); + CORRADE_COMPARE(right[2], bezier[2]); + CORRADE_COMPARE(left.value(0.8f), bezier.value(0.2f)); + CORRADE_COMPARE(right.value(0.33333f), bezier.value(0.5f)); + CORRADE_COMPARE(left, (QuadraticBezier2D{Vector2{0.0f, 0.0f}, Vector2{2.5f, 3.75f}, Vector2{5.0f, 5.875f}})); + CORRADE_COMPARE(right, (QuadraticBezier2D{Vector2{5.0f, 5.875f}, Vector2{12.5f, 12.25f}, Vector2{20.0f, 4.0f}})); +} + +void BezierTest::subdivideCubic() { + CubicBezier2D bezier{Vector2{0.0f, 0.0f}, Vector2{10.0f, 15.0f}, Vector2{20.0f, 4.0f}, Vector2{5.0f, -20.0f}}; + + CubicBezier2D left, right; + std::tie(left, right) = bezier.subdivide(0.25f); + + CORRADE_COMPARE(left[0], bezier[0]); + CORRADE_COMPARE(left[3], right[0]); + CORRADE_COMPARE(right[3], bezier[3]); + CORRADE_COMPARE(left.value(0.8f), bezier.value(0.2f)); + CORRADE_COMPARE(right.value(0.33333f), bezier.value(0.5f)); + CORRADE_COMPARE(left, (CubicBezier2D{Vector2{0.0f, 0.0f}, Vector2{2.5f, 3.75f}, Vector2{5.0f, 5.875f}, Vector2{7.10938f, 6.57812f}})); + CORRADE_COMPARE(right, (CubicBezier2D{Vector2{7.10938f, 6.57812f}, Vector2{13.4375f, 8.6875f}, Vector2{16.25f, -2.0f}, Vector2{5.0f, -20.0f}})); +} + void BezierTest::debug() { std::ostringstream out; Debug(&out) << CubicBezier2D{Vector2{0.0f, 1.0f}, Vector2{1.5f, -0.3f}, Vector2{2.1f, 0.5f}, Vector2{0.0f, 2.0f}}; From 1357186fe19d0e0ac22f2b1e72b59469af6f41bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 25 Aug 2016 00:09:08 +0200 Subject: [PATCH 145/290] Math: MSVC 2015 is picky about constexpr again. No clue. --- src/Magnum/Math/Test/BezierTest.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Math/Test/BezierTest.cpp b/src/Magnum/Math/Test/BezierTest.cpp index 1d4bfbf7e..86354a47c 100644 --- a/src/Magnum/Math/Test/BezierTest.cpp +++ b/src/Magnum/Math/Test/BezierTest.cpp @@ -144,7 +144,10 @@ void BezierTest::data() { CORRADE_COMPARE(a, (QuadraticBezier2D{Vector2{0.0f, 0.0f}, Vector2{1.1f, 0.3f}, Vector2{0.7f, 20.3f}})); constexpr QuadraticBezier2D b{Vector2{3.5f, 0.1f}, Vector2{1.3f, 10.3f}, Vector2{0.0f, -1.2f}}; - constexpr Vector2 c = b[2]; + #ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why? */ + constexpr + #endif + Vector2 c = b[2]; CORRADE_COMPARE(c, (Vector2{0.0f, -1.2f})); } From 257800e6fabace91463b81d857ee33e46fe20547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 25 Aug 2016 00:19:39 +0200 Subject: [PATCH 146/290] Math: reordered Bezier members to saner order. --- src/Magnum/Math/Bezier.h | 56 ++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index 9588b13ed..f4c729514 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -95,22 +95,25 @@ template class Bezier { */ template constexpr explicit Bezier(const Bezier& other) noexcept: Bezier{typename Implementation::GenerateSequence::Type(), other} {} + /** @brief Equality comparison */ + bool operator==(const Bezier& other) const { + for(std::size_t i = 0; i != order + 1; ++i) + if((*this)[i] != other[i]) return false; + return true; + } + + /** @brief Non-equality comparison */ + bool operator!=(const Bezier& other) const { + return !operator==(other); + } + /** - * @brief Subdivide the curve at given position + * @brief Control point access * - * Returns two Bézier curves following the original curve, split at - * given interpolation factor. Uses the [De Casteljau's algorithm](https://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm). - * @see @ref value() + * @p i should not be larger than @ref Order. */ - std::pair, Bezier> subdivide(Float t) const { - const auto iPoints = calculateIntermediatePoints(t); - Bezier left, right; - for(std::size_t i = 0; i <= order; ++i) - left[i] = iPoints[0][i]; - for(std::size_t i = 0, j = order; i <= order; --j, ++i) - right[i] = iPoints[i][j]; - return {left, right}; - } + Vector& operator[](std::size_t i) { return _data[i]; } + constexpr Vector operator[](std::size_t i) const { return _data[i]; } /**< @overload */ /** * @brief Interpolate the curve at given position @@ -124,23 +127,20 @@ template class Bezier { } /** - * @brief Control point access + * @brief Subdivide the curve at given position * - * @p i should not be larger than @ref Order. + * Returns two Bézier curves following the original curve, split at + * given interpolation factor. Uses the [De Casteljau's algorithm](https://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm). + * @see @ref value() */ - Vector& operator[](std::size_t i) { return _data[i]; } - constexpr Vector operator[](std::size_t i) const { return _data[i]; } /**< @overload */ - - /** @brief Equality comparison */ - bool operator==(const Bezier& other) const { - for(std::size_t i = 0; i != order + 1; ++i) - if((*this)[i] != other[i]) return false; - return true; - } - - /** @brief Non-equality comparison */ - bool operator!=(const Bezier& other) const { - return !operator==(other); + std::pair, Bezier> subdivide(Float t) const { + const auto iPoints = calculateIntermediatePoints(t); + Bezier left, right; + for(std::size_t i = 0; i <= order; ++i) + left[i] = iPoints[0][i]; + for(std::size_t i = 0, j = order; i <= order; --j, ++i) + right[i] = iPoints[i][j]; + return {left, right}; } private: From 42d9679ac0cc3be5d91d2bcd149cbe6f2921f8b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 25 Aug 2016 15:04:03 +0200 Subject: [PATCH 147/290] Exclude unreachable code from code coverage. --- src/Magnum/AbstractFramebuffer.cpp | 16 ++++++------ src/Magnum/AbstractObject.cpp | 14 +++++----- src/Magnum/AbstractQuery.cpp | 10 +++---- src/Magnum/AbstractShaderProgram.cpp | 22 ++++++++-------- src/Magnum/AbstractTexture.cpp | 20 +++++++------- src/Magnum/Attribute.cpp | 10 +++---- src/Magnum/Buffer.cpp | 8 +++--- src/Magnum/Context.cpp | 2 +- src/Magnum/DebugOutput.cpp | 18 ++++++------- src/Magnum/Framebuffer.cpp | 2 +- src/Magnum/Implementation/BufferState.cpp | 2 +- src/Magnum/Math/Color.h | 2 +- src/Magnum/Mesh.cpp | 26 +++++++++---------- src/Magnum/MeshView.cpp | 4 +-- src/Magnum/PixelStorage.cpp | 2 +- src/Magnum/Renderbuffer.cpp | 4 +-- src/Magnum/Renderer.cpp | 4 +-- src/Magnum/Shader.cpp | 4 +-- src/Magnum/TimeQuery.h | 2 +- .../Test/MagnumFontConverterGLTest.cpp | 2 +- src/MagnumPlugins/ObjImporter/ObjImporter.cpp | 2 +- .../TgaImageConverter/TgaImageConverter.cpp | 2 +- 22 files changed, 89 insertions(+), 89 deletions(-) diff --git a/src/Magnum/AbstractFramebuffer.cpp b/src/Magnum/AbstractFramebuffer.cpp index f3c73c4c9..68a55540d 100644 --- a/src/Magnum/AbstractFramebuffer.cpp +++ b/src/Magnum/AbstractFramebuffer.cpp @@ -152,7 +152,7 @@ void AbstractFramebuffer::bindImplementationDefault(FramebufferTarget target) { } else if(target == FramebufferTarget::Draw) { if(state.drawBinding == _id) return; state.drawBinding = _id; - } else CORRADE_ASSERT_UNREACHABLE(); + } else CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ /* Binding the framebuffer finally creates it */ _flags |= ObjectFlag::Created; @@ -240,7 +240,7 @@ void AbstractFramebuffer::blitImplementationANGLE(AbstractFramebuffer& source, A static_cast(destinationRectangle); static_cast(mask); static_cast(filter); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -256,7 +256,7 @@ void AbstractFramebuffer::blitImplementationNV(AbstractFramebuffer& source, Abst static_cast(destinationRectangle); static_cast(mask); static_cast(filter); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -442,7 +442,7 @@ void AbstractFramebuffer::invalidateImplementationDefault(const GLsizei count, c #else static_cast(count); static_cast(attachments); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -515,7 +515,7 @@ void AbstractFramebuffer::drawBuffersImplementationEXT(GLsizei count, const GLen #else static_cast(count); static_cast(buffers); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -528,7 +528,7 @@ void AbstractFramebuffer::drawBuffersImplementationNV(GLsizei count, const GLenu #else static_cast(count); static_cast(buffers); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -561,7 +561,7 @@ void AbstractFramebuffer::readBufferImplementationDefault(GLenum buffer) { glReadBufferNV(buffer); #else static_cast(buffer); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -593,7 +593,7 @@ void AbstractFramebuffer::readImplementationRobustness(const Range2Di& rectangle static_cast(type); static_cast(dataSize); static_cast(data); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif diff --git a/src/Magnum/AbstractObject.cpp b/src/Magnum/AbstractObject.cpp index beaff5bca..24ac34c7a 100644 --- a/src/Magnum/AbstractObject.cpp +++ b/src/Magnum/AbstractObject.cpp @@ -107,7 +107,7 @@ namespace { return khrIdentifier; } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } } #endif @@ -140,7 +140,7 @@ void AbstractObject::labelImplementationKhr(const GLenum identifier, const GLuin static_cast(identifier); static_cast(name); static_cast(label); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -152,7 +152,7 @@ void AbstractObject::labelImplementationExt(const GLenum identifier, const GLuin static_cast(identifier); static_cast(name); static_cast(label); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -169,7 +169,7 @@ std::string AbstractObject::getLabelImplementationKhr(const GLenum identifier, c #else static_cast(identifier); static_cast(name); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif /* Make place also for the null terminator */ @@ -180,7 +180,7 @@ std::string AbstractObject::getLabelImplementationKhr(const GLenum identifier, c #elif !defined(CORRADE_TARGET_NACL) glGetObjectLabelKHR(identifier, name, size+1, nullptr, &label[0]); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif /* Pop null terminator and return the string */ @@ -198,7 +198,7 @@ std::string AbstractObject::getLabelImplementationExt(const GLenum identifier, c #else static_cast(identifier); static_cast(name); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif /* Make place also for the null terminator */ @@ -207,7 +207,7 @@ std::string AbstractObject::getLabelImplementationExt(const GLenum identifier, c #ifndef CORRADE_TARGET_NACL glGetObjectLabelEXT(type, name, size+1, nullptr, &label[0]); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif /* Pop null terminator and return the string */ diff --git a/src/Magnum/AbstractQuery.cpp b/src/Magnum/AbstractQuery.cpp index 4f90c7fd8..c4beefffe 100644 --- a/src/Magnum/AbstractQuery.cpp +++ b/src/Magnum/AbstractQuery.cpp @@ -55,7 +55,7 @@ AbstractQuery::~AbstractQuery() { #elif !defined(CORRADE_TARGET_EMSCRIPTEN) glDeleteQueriesEXT(1, &_id); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif _flags |= ObjectFlag::Created; } @@ -66,7 +66,7 @@ void AbstractQuery::createImplementationDefault() { #elif !defined(CORRADE_TARGET_EMSCRIPTEN) glGenQueriesEXT(1, &_id); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -126,7 +126,7 @@ template<> Int AbstractQuery::result() { #elif !defined(CORRADE_TARGET_NACL) glGetQueryObjectivEXT(_id, GL_QUERY_RESULT_EXT, &result); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif return result; } @@ -138,7 +138,7 @@ template<> UnsignedLong AbstractQuery::result() { #elif !defined(CORRADE_TARGET_NACL) glGetQueryObjectui64vEXT(_id, GL_QUERY_RESULT_EXT, &result); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif return result; } @@ -150,7 +150,7 @@ template<> Long AbstractQuery::result() { #elif !defined(CORRADE_TARGET_NACL) glGetQueryObjecti64vEXT(_id, GL_QUERY_RESULT_EXT, &result); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif return result; } diff --git a/src/Magnum/AbstractShaderProgram.cpp b/src/Magnum/AbstractShaderProgram.cpp index fc5f2f096..7fc4228f9 100644 --- a/src/Magnum/AbstractShaderProgram.cpp +++ b/src/Magnum/AbstractShaderProgram.cpp @@ -478,7 +478,7 @@ void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint locat static_cast(location); static_cast(count); static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -506,7 +506,7 @@ void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint locat static_cast(location); static_cast(count); static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -534,7 +534,7 @@ void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint locat static_cast(location); static_cast(count); static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -562,7 +562,7 @@ void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint locat static_cast(location); static_cast(count); static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -590,7 +590,7 @@ void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint locat static_cast(location); static_cast(count); static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -618,7 +618,7 @@ void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint locat static_cast(location); static_cast(count); static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -646,7 +646,7 @@ void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint locat static_cast(location); static_cast(count); static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -674,7 +674,7 @@ void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint locat static_cast(location); static_cast(count); static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -850,7 +850,7 @@ void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint locat static_cast(location); static_cast(count); static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -878,7 +878,7 @@ void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint locat static_cast(location); static_cast(count); static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -906,7 +906,7 @@ void AbstractShaderProgram::uniformImplementationDSAEXT_SSOEXT(const GLint locat static_cast(location); static_cast(count); static_cast(values); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif diff --git a/src/Magnum/AbstractTexture.cpp b/src/Magnum/AbstractTexture.cpp index 815c029ef..e3f3dad94 100644 --- a/src/Magnum/AbstractTexture.cpp +++ b/src/Magnum/AbstractTexture.cpp @@ -808,7 +808,7 @@ PixelFormat AbstractTexture::imageFormatForInternalFormat(const TextureFormat in return PixelFormat::DepthStencil; } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } PixelType AbstractTexture::imageTypeForInternalFormat(const TextureFormat internalFormat) { @@ -1053,7 +1053,7 @@ PixelType AbstractTexture::imageTypeForInternalFormat(const TextureFormat intern #endif } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } #endif @@ -1254,7 +1254,7 @@ void AbstractTexture::storageImplementationFallback(const GLsizei levels, const #endif /* No other targets are available */ - } else CORRADE_ASSERT_UNREACHABLE(); + } else CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } #endif @@ -1269,7 +1269,7 @@ void AbstractTexture::storageImplementationDefault(GLsizei levels, TextureFormat static_cast(levels); static_cast(internalFormat); static_cast(size); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -1313,7 +1313,7 @@ void AbstractTexture::storageImplementationFallback(GLsizei levels, TextureForma #endif /* No other targets are available */ - else CORRADE_ASSERT_UNREACHABLE(); + else CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } #endif @@ -1328,7 +1328,7 @@ void AbstractTexture::storageImplementationDefault(GLsizei levels, TextureFormat static_cast(levels); static_cast(internalFormat); static_cast(size); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -1511,7 +1511,7 @@ void AbstractTexture::subImageImplementationDefault(GLint level, const Vector3i& static_cast(format); static_cast(type); static_cast(data); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -1527,7 +1527,7 @@ void AbstractTexture::compressedSubImageImplementationDefault(const GLint level, static_cast(size); static_cast(format); static_cast(data); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -1995,7 +1995,7 @@ void AbstractTexture::DataHelper<3>::setImage(AbstractTexture& texture, const GL static_cast(level); static_cast(internalFormat); static_cast(image); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -2016,7 +2016,7 @@ void AbstractTexture::DataHelper<3>::setCompressedImage(AbstractTexture& texture #else static_cast(level); static_cast(image); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif diff --git a/src/Magnum/Attribute.cpp b/src/Magnum/Attribute.cpp index f3177be70..10c2f5c0e 100644 --- a/src/Magnum/Attribute.cpp +++ b/src/Magnum/Attribute.cpp @@ -49,7 +49,7 @@ UnsignedInt FloatAttribute::size(GLint components, DataType dataType) { #endif } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } #ifndef MAGNUM_TARGET_GLES2 @@ -66,7 +66,7 @@ UnsignedInt IntAttribute::size(GLint components, DataType dataType) { return 4*components; } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } #endif @@ -77,7 +77,7 @@ UnsignedInt DoubleAttribute::size(GLint components, DataType dataType) { return 8*components; } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } #endif @@ -103,7 +103,7 @@ UnsignedInt Attribute>::size(GLint components, DataType d #endif } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } UnsignedInt Attribute>::size(GLint components, DataType dataType) { @@ -136,7 +136,7 @@ UnsignedInt Attribute>::size(GLint components, DataType d #endif } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } Debug& operator<<(Debug& debug, SizedAttribute<1, 1>::Components value) { diff --git a/src/Magnum/Buffer.cpp b/src/Magnum/Buffer.cpp index d36748df0..f1f6f1d4c 100644 --- a/src/Magnum/Buffer.cpp +++ b/src/Magnum/Buffer.cpp @@ -537,7 +537,7 @@ void* Buffer::mapImplementationDefault(MapAccess access) { return glMapBufferOES(GLenum(bindSomewhereInternal(_targetHint)), GLenum(access)); #else static_cast(access); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -561,7 +561,7 @@ void* Buffer::mapRangeImplementationDefault(GLintptr offset, GLsizeiptr length, static_cast(offset); static_cast(length); static_cast(access); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -584,7 +584,7 @@ void Buffer::flushMappedRangeImplementationDefault(GLintptr offset, GLsizeiptr l #else static_cast(offset); static_cast(length); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -605,7 +605,7 @@ bool Buffer::unmapImplementationDefault() { #elif !defined(CORRADE_TARGET_NACL) return glUnmapBufferOES(GLenum(bindSomewhereInternal(_targetHint))); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index 9a37c40fd..2d29ce0de 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -407,7 +407,7 @@ const std::vector& Extension::extensions(Version version) { #endif } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } namespace { diff --git a/src/Magnum/DebugOutput.cpp b/src/Magnum/DebugOutput.cpp index f9013ded3..f3e505103 100644 --- a/src/Magnum/DebugOutput.cpp +++ b/src/Magnum/DebugOutput.cpp @@ -184,7 +184,7 @@ void DebugOutput::controlImplementationKhr(const GLenum source, const GLenum typ static_cast(severity); static_cast(ids); static_cast(enabled); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -206,7 +206,7 @@ void DebugOutput::callbackImplementationKhr(const Callback callback, const void* (callbackWrapper, userParam); #else static_cast(userParam); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif /* Deleting callback */ @@ -219,7 +219,7 @@ void DebugOutput::callbackImplementationKhr(const Callback callback, const void* #endif (nullptr, nullptr); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } } @@ -296,7 +296,7 @@ void DebugMessage::insertImplementationKhr(const Source source, const Type type, static_cast(id); static_cast(severity); static_cast(string); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -305,7 +305,7 @@ void DebugMessage::insertImplementationExt(Source, Type, UnsignedInt, DebugOutpu glInsertEventMarkerEXT(string.size(), string.data()); #else static_cast(string); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -396,7 +396,7 @@ void DebugGroup::pushImplementationKhr(const Source source, const UnsignedInt id static_cast(source); static_cast(id); static_cast(message); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -405,7 +405,7 @@ void DebugGroup::pushImplementationExt(Source, UnsignedInt, const Containers::Ar glPushGroupMarkerEXT(message.size(), message.data()); #else static_cast(message); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -417,7 +417,7 @@ void DebugGroup::popImplementationKhr() { #elif !defined(CORRADE_TARGET_NACL) glPopDebugGroupKHR(); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -425,7 +425,7 @@ void DebugGroup::popImplementationExt() { #ifndef CORRADE_TARGET_NACL glPopGroupMarkerEXT(); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } diff --git a/src/Magnum/Framebuffer.cpp b/src/Magnum/Framebuffer.cpp index 5d05524e9..f17245fb4 100644 --- a/src/Magnum/Framebuffer.cpp +++ b/src/Magnum/Framebuffer.cpp @@ -389,7 +389,7 @@ void Framebuffer::textureLayerImplementationDefault(BufferAttachment attachment, static_cast(textureId); static_cast(mipLevel); static_cast(layer); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif diff --git a/src/Magnum/Implementation/BufferState.cpp b/src/Magnum/Implementation/BufferState.cpp index a4181ab19..f76d4dff4 100644 --- a/src/Magnum/Implementation/BufferState.cpp +++ b/src/Magnum/Implementation/BufferState.cpp @@ -79,7 +79,7 @@ std::size_t BufferState::indexForTarget(Buffer::TargetHint target) { #endif } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } BufferState::BufferState(Context& context, std::vector& extensions): bindings() diff --git a/src/Magnum/Math/Color.h b/src/Magnum/Math/Color.h index 137ccc121..5edc72d3b 100644 --- a/src/Magnum/Math/Color.h +++ b/src/Magnum/Math/Color.h @@ -62,7 +62,7 @@ template typename std::enable_if::value, Colo case 3: return {p, q, value}; case 4: return {t, p, value}; case 5: return {value, p, q}; - default: CORRADE_ASSERT_UNREACHABLE(); + default: CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } } template inline typename std::enable_if::value, Color3>::type fromHSV(typename Color3::HSV hsv) { diff --git a/src/Magnum/Mesh.cpp b/src/Magnum/Mesh.cpp index 9dd2c8070..938f1915e 100644 --- a/src/Magnum/Mesh.cpp +++ b/src/Magnum/Mesh.cpp @@ -119,7 +119,7 @@ std::size_t Mesh::indexSize(IndexType type) { case IndexType::UnsignedInt: return 4; } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } Mesh::Mesh(const MeshPrimitive primitive): _primitive{primitive}, _flags{ObjectFlag::DeleteOnDestruction}, _count{0}, _baseVertex{0}, _instanceCount{1}, @@ -373,7 +373,7 @@ void Mesh::bindVAO() { #elif !defined(CORRADE_TARGET_NACL) glBindVertexArrayOES(current = _id); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } } @@ -389,7 +389,7 @@ void Mesh::createImplementationVAO() { #elif !defined(CORRADE_TARGET_NACL) glGenVertexArraysOES(1, &_id); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif CORRADE_INTERNAL_ASSERT(_id != Implementation::State::DisengagedBinding); } @@ -409,7 +409,7 @@ void Mesh::destroyImplementationVAO() { #elif !defined(CORRADE_TARGET_NACL) glDeleteVertexArraysOES(1, &_id); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -505,7 +505,7 @@ void Mesh::vertexAttribDivisorImplementationANGLE(const GLuint index, const GLui #else static_cast(index); static_cast(divisor); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #ifndef MAGNUM_TARGET_WEBGL @@ -515,7 +515,7 @@ void Mesh::vertexAttribDivisorImplementationEXT(const GLuint index, const GLuint #else static_cast(index); static_cast(divisor); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } void Mesh::vertexAttribDivisorImplementationNV(const GLuint index, const GLuint divisor) { @@ -524,7 +524,7 @@ void Mesh::vertexAttribDivisorImplementationNV(const GLuint index, const GLuint #else static_cast(index); static_cast(divisor); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -570,7 +570,7 @@ void Mesh::drawArraysInstancedImplementationANGLE(const GLint baseVertex, const static_cast(baseVertex); static_cast(count); static_cast(instanceCount); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -582,7 +582,7 @@ void Mesh::drawArraysInstancedImplementationEXT(const GLint baseVertex, const GL static_cast(baseVertex); static_cast(count); static_cast(instanceCount); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -593,7 +593,7 @@ void Mesh::drawArraysInstancedImplementationNV(const GLint baseVertex, const GLs static_cast(baseVertex); static_cast(count); static_cast(instanceCount); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -605,7 +605,7 @@ void Mesh::drawElementsInstancedImplementationANGLE(const GLsizei count, const G static_cast(count); static_cast(indexOffset); static_cast(instanceCount); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -617,7 +617,7 @@ void Mesh::drawElementsInstancedImplementationEXT(const GLsizei count, const GLi static_cast(count); static_cast(indexOffset); static_cast(instanceCount); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -628,7 +628,7 @@ void Mesh::drawElementsInstancedImplementationNV(const GLsizei count, const GLin static_cast(count); static_cast(indexOffset); static_cast(instanceCount); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif diff --git a/src/Magnum/MeshView.cpp b/src/Magnum/MeshView.cpp index 3e5b8d70f..aa863dca9 100644 --- a/src/Magnum/MeshView.cpp +++ b/src/Magnum/MeshView.cpp @@ -99,7 +99,7 @@ void MeshView::multiDrawImplementationDefault(std::initializer_list, Math::Vector3, std::size_t> PixelStorage::dataProperties(const PixelFormat format, const PixelType type, const Vector3i& size) const { diff --git a/src/Magnum/Renderbuffer.cpp b/src/Magnum/Renderbuffer.cpp index 6a090d29e..a11b002b1 100644 --- a/src/Magnum/Renderbuffer.cpp +++ b/src/Magnum/Renderbuffer.cpp @@ -169,7 +169,7 @@ void Renderbuffer::storageMultisampleImplementationANGLE(const GLsizei samples, static_cast(samples); static_cast(internalFormat); static_cast(size); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } @@ -181,7 +181,7 @@ void Renderbuffer::storageMultisampleImplementationNV(const GLsizei samples, con static_cast(samples); static_cast(internalFormat); static_cast(size); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif diff --git a/src/Magnum/Renderer.cpp b/src/Magnum/Renderer.cpp index 2be283e8f..5fcad0bba 100644 --- a/src/Magnum/Renderer.cpp +++ b/src/Magnum/Renderer.cpp @@ -94,7 +94,7 @@ void Renderer::setPolygonMode(const PolygonMode mode) { (GL_FRONT_AND_BACK, GLenum(mode)); #else static_cast(mode); - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif @@ -233,7 +233,7 @@ Renderer::GraphicsResetStatus Renderer::graphicsResetStatusImplementationRobustn #elif !defined(CORRADE_TARGET_NACL) return GraphicsResetStatus(glGetGraphicsResetStatusEXT()); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } #endif diff --git a/src/Magnum/Shader.cpp b/src/Magnum/Shader.cpp index cbb4b2963..9a4ef5a8d 100644 --- a/src/Magnum/Shader.cpp +++ b/src/Magnum/Shader.cpp @@ -69,7 +69,7 @@ std::string shaderName(const Shader::Type type) { case Shader::Type::Fragment: return "fragment"; } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } UnsignedInt typeToIndex(const Shader::Type type) { @@ -84,7 +84,7 @@ UnsignedInt typeToIndex(const Shader::Type type) { #endif } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } #ifndef MAGNUM_TARGET_GLES diff --git a/src/Magnum/TimeQuery.h b/src/Magnum/TimeQuery.h index 4d5b7e068..890f1adf3 100644 --- a/src/Magnum/TimeQuery.h +++ b/src/Magnum/TimeQuery.h @@ -152,7 +152,7 @@ class TimeQuery: public AbstractQuery { #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) glQueryCounterEXT(id(), GL_TIMESTAMP_EXT); #else - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ #endif } diff --git a/src/MagnumPlugins/MagnumFontConverter/Test/MagnumFontConverterGLTest.cpp b/src/MagnumPlugins/MagnumFontConverter/Test/MagnumFontConverterGLTest.cpp index 6c34c61aa..c2fbcfad6 100644 --- a/src/MagnumPlugins/MagnumFontConverter/Test/MagnumFontConverterGLTest.cpp +++ b/src/MagnumPlugins/MagnumFontConverter/Test/MagnumFontConverterGLTest.cpp @@ -88,7 +88,7 @@ void MagnumFontConverterGLTest::exportFont() { case 2: return {23, 0}; } - CORRADE_ASSERT_UNREACHABLE(); + CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } bool _opened; diff --git a/src/MagnumPlugins/ObjImporter/ObjImporter.cpp b/src/MagnumPlugins/ObjImporter/ObjImporter.cpp index 125237f54..7ccee5ed4 100644 --- a/src/MagnumPlugins/ObjImporter/ObjImporter.cpp +++ b/src/MagnumPlugins/ObjImporter/ObjImporter.cpp @@ -361,7 +361,7 @@ std::optional ObjImporter::doMesh3D(UnsignedInt id) { primitive = MeshPrimitive::Triangles; - } else CORRADE_ASSERT_UNREACHABLE(); + } else CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ for(const std::string& indexTuple: indexTuples) { std::vector indices = Utility::String::split(indexTuple, '/'); diff --git a/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp b/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp index 6383105a4..d4e37710c 100644 --- a/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp +++ b/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp @@ -91,7 +91,7 @@ Containers::Array TgaImageConverter::doExportToData(const ImageView2D& ima #endif header->imageType = 3; break; - default: CORRADE_ASSERT_UNREACHABLE(); + default: CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ } header->bpp = pixelSize*8; header->width = UnsignedShort(Utility::Endianness::littleEndian(image.size().x())); From bac5ccd8e611ff6056e0a69765fd622196af4925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 31 Aug 2016 19:24:20 +0200 Subject: [PATCH 148/290] Math: improve Angle test to be consistent with the rest. --- src/Magnum/Math/Test/AngleTest.cpp | 62 +++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/src/Magnum/Math/Test/AngleTest.cpp b/src/Magnum/Math/Test/AngleTest.cpp index f430e9475..64a8877a5 100644 --- a/src/Magnum/Math/Test/AngleTest.cpp +++ b/src/Magnum/Math/Test/AngleTest.cpp @@ -35,7 +35,11 @@ struct AngleTest: Corrade::TestSuite::Tester { explicit AngleTest(); void construct(); + void constructDefault(); void constructNoInit(); + void constructConversion(); + void constructCopy(); + void literals(); void conversion(); @@ -52,7 +56,11 @@ typedef Math::Rad Radd; AngleTest::AngleTest() { addTests({&AngleTest::construct, + &AngleTest::constructDefault, &AngleTest::constructNoInit, + &AngleTest::constructConversion, + &AngleTest::constructCopy, + &AngleTest::literals, &AngleTest::conversion, @@ -63,7 +71,17 @@ AngleTest::AngleTest() { } void AngleTest::construct() { - /* Default constructor */ + constexpr Deg b(25.0); + CORRADE_COMPARE(Float(b), 25.0f); + constexpr Radd n(3.14); + CORRADE_COMPARE(Double(n), 3.14); + + /* Implicit conversion is not allowed */ + CORRADE_VERIFY(!(std::is_convertible::value)); + CORRADE_VERIFY(!(std::is_convertible::value)); +} + +void AngleTest::constructDefault() { constexpr Deg m1; constexpr Deg m2{ZeroInit}; CORRADE_COMPARE(Float(m1), 0.0f); @@ -72,24 +90,6 @@ void AngleTest::construct() { constexpr Radd a2{ZeroInit}; CORRADE_COMPARE(Double(a1), 0.0); CORRADE_COMPARE(Double(a2), 0.0); - - /* Value constructor */ - constexpr Deg b(25.0); - CORRADE_COMPARE(Float(b), 25.0f); - constexpr Radd n(3.14); - CORRADE_COMPARE(Double(n), 3.14); - - /* Copy constructor */ - constexpr Deg c(b); - CORRADE_COMPARE(c, b); - constexpr Radd o(n); - CORRADE_COMPARE(o, n); - - /* Conversion operator */ - constexpr Rad p(n); - CORRADE_COMPARE(Float(p), 3.14f); - constexpr Degd d(b); - CORRADE_COMPARE(Double(d), 25.0); } void AngleTest::constructNoInit() { @@ -101,6 +101,30 @@ void AngleTest::constructNoInit() { CORRADE_COMPARE(Float(b), 3.14f); } +void AngleTest::constructConversion() { + constexpr Deg a(25.0); + constexpr Radd b(3.14); + + constexpr Rad c(b); + CORRADE_COMPARE(Float(c), 3.14f); + constexpr Degd d(a); + CORRADE_COMPARE(Double(d), 25.0); + + /* Implicit conversion is not allowed */ + CORRADE_VERIFY(!(std::is_convertible::value)); + CORRADE_VERIFY(!(std::is_convertible::value)); +} + +void AngleTest::constructCopy() { + constexpr Deg a(25.0); + constexpr Radd b(3.14); + + constexpr Deg c(a); + CORRADE_COMPARE(c, a); + constexpr Radd d(b); + CORRADE_COMPARE(d, b); +} + void AngleTest::literals() { using namespace Literals; From 60524e0367a0b63a0856c8f2b2dd2132bd2bf4b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 31 Aug 2016 19:41:01 +0200 Subject: [PATCH 149/290] Math: remove now redundant Color test case. At some point before the default Color constructor was different from the ZeroInit one. Not anymore. --- src/Magnum/Math/Test/ColorTest.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/Magnum/Math/Test/ColorTest.cpp b/src/Magnum/Math/Test/ColorTest.cpp index dde5d53fc..10871e926 100644 --- a/src/Magnum/Math/Test/ColorTest.cpp +++ b/src/Magnum/Math/Test/ColorTest.cpp @@ -36,7 +36,6 @@ struct ColorTest: Corrade::TestSuite::Tester { void construct(); void constructDefault(); - void constructZero(); void constructNoInit(); void constructOneValue(); void constructParts(); @@ -80,7 +79,6 @@ using namespace Literals; ColorTest::ColorTest() { addTests({&ColorTest::construct, &ColorTest::constructDefault, - &ColorTest::constructZero, &ColorTest::constructNoInit, &ColorTest::constructOneValue, &ColorTest::constructParts, @@ -129,19 +127,15 @@ void ColorTest::constructDefault() { CORRADE_COMPARE(a1, Color3(0.0f, 0.0f, 0.0f)); CORRADE_COMPARE(a2, Color3(0.0f, 0.0f, 0.0f)); - constexpr Color4 b; + constexpr Color4 b1; + constexpr Color4 b2{Math::ZeroInit}; + CORRADE_COMPARE(b1, Color4(0.0f, 0.0f, 0.0f, 0.0f)); + CORRADE_COMPARE(b2, Color4(0.0f, 0.0f, 0.0f, 0.0f)); + constexpr Color4ub c; - CORRADE_COMPARE(b, Color4(0.0f, 0.0f, 0.0f, 0.0f)); CORRADE_COMPARE(c, Color4ub(0, 0, 0, 0)); } -void ColorTest::constructZero() { - constexpr Color3 a{Math::ZeroInit}; - constexpr Color4 b{Math::ZeroInit}; - CORRADE_COMPARE(a, Color3(0.0f, 0.0f, 0.0f)); - CORRADE_COMPARE(b, Color4(0.0f, 0.0f, 0.0f, 0.0f)); -} - void ColorTest::constructNoInit() { Color3 a{1.0f, 0.5f, 0.75f}; Color4 b{1.0f, 0.5f, 0.75f, 0.5f}; From 40d60f6a3f35c8675f3cf1aebfa9e7ed2a2ed8a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 31 Aug 2016 21:04:47 +0200 Subject: [PATCH 150/290] Math: make all constructor noexcept and test their behavior. --- src/Magnum/Math/Angle.h | 28 ++++++------ src/Magnum/Math/BoolVector.h | 14 +++--- src/Magnum/Math/Color.h | 28 ++++++------ src/Magnum/Math/Complex.h | 15 ++++--- src/Magnum/Math/Dual.h | 15 ++++--- src/Magnum/Math/DualComplex.h | 18 ++++---- src/Magnum/Math/DualQuaternion.h | 18 ++++---- src/Magnum/Math/Matrix.h | 12 ++--- src/Magnum/Math/Matrix3.h | 14 +++--- src/Magnum/Math/Matrix4.h | 12 ++--- src/Magnum/Math/Quaternion.h | 15 ++++--- src/Magnum/Math/Range.h | 44 +++++++++---------- src/Magnum/Math/RectangularMatrix.h | 16 +++---- src/Magnum/Math/Test/AngleTest.cpp | 19 ++++++++ src/Magnum/Math/Test/BoolVectorTest.cpp | 14 ++++++ src/Magnum/Math/Test/ColorTest.cpp | 24 ++++++++++ src/Magnum/Math/Test/ComplexTest.cpp | 16 +++++++ src/Magnum/Math/Test/DualComplexTest.cpp | 16 +++++++ src/Magnum/Math/Test/DualQuaternionTest.cpp | 18 ++++++++ src/Magnum/Math/Test/DualTest.cpp | 18 ++++++++ src/Magnum/Math/Test/Matrix3Test.cpp | 14 ++++++ src/Magnum/Math/Test/Matrix4Test.cpp | 15 +++++++ src/Magnum/Math/Test/MatrixTest.cpp | 14 ++++++ src/Magnum/Math/Test/QuaternionTest.cpp | 16 +++++++ src/Magnum/Math/Test/RangeTest.cpp | 26 +++++++++++ .../Math/Test/RectangularMatrixTest.cpp | 12 +++++ src/Magnum/Math/Test/UnitTest.cpp | 8 ++++ src/Magnum/Math/Test/Vector2Test.cpp | 14 ++++++ src/Magnum/Math/Test/Vector3Test.cpp | 16 +++++++ src/Magnum/Math/Test/Vector4Test.cpp | 16 +++++++ src/Magnum/Math/Test/VectorTest.cpp | 16 +++++++ src/Magnum/Math/Unit.h | 11 +++-- src/Magnum/Math/Vector.h | 22 +++++----- src/Magnum/Math/Vector2.h | 12 ++--- src/Magnum/Math/Vector3.h | 14 +++--- src/Magnum/Math/Vector4.h | 14 +++--- 36 files changed, 459 insertions(+), 155 deletions(-) diff --git a/src/Magnum/Math/Angle.h b/src/Magnum/Math/Angle.h index 91ca09b73..2f8447234 100644 --- a/src/Magnum/Math/Angle.h +++ b/src/Magnum/Math/Angle.h @@ -127,20 +127,20 @@ template class Deg: public Unit { public: /** @brief Construct zero angle */ /* MSVC 2015 can't handle {} here */ - constexpr /*implicit*/ Deg(ZeroInitT = ZeroInit): Unit(ZeroInit) {} + constexpr /*implicit*/ Deg(ZeroInitT = ZeroInit) noexcept: Unit(ZeroInit) {} /** @brief Construct without initializing the contents */ /* MSVC 2015 can't handle {} here */ - explicit Deg(NoInitT): Unit(NoInit) {} + explicit Deg(NoInitT) noexcept: Unit(NoInit) {} /** @brief Explicit constructor from unitless type */ - constexpr explicit Deg(T value): Unit(value) {} - - /** @brief Copy constructor */ - constexpr /*implicit*/ Deg(Unit value): Unit(value) {} + constexpr explicit Deg(T value) noexcept: Unit(value) {} /** @brief Construct from another underlying type */ - template constexpr explicit Deg(Unit value): Unit(value) {} + template constexpr explicit Deg(Unit value) noexcept: Unit(value) {} + + /** @brief Copy constructor */ + constexpr /*implicit*/ Deg(Unit other) noexcept: Unit(other) {} /** * @brief Construct degrees from radians @@ -191,20 +191,20 @@ template class Rad: public Unit { public: /** @brief Default constructor */ /* MSVC 2015 can't handle {} here */ - constexpr /*implicit*/ Rad(ZeroInitT = ZeroInit): Unit(ZeroInit) {} + constexpr /*implicit*/ Rad(ZeroInitT = ZeroInit) noexcept: Unit(ZeroInit) {} /** @brief Construct without initializing the contents */ /* MSVC 2015 can't handle {} here */ - explicit Rad(NoInitT): Unit(NoInit) {} + explicit Rad(NoInitT) noexcept: Unit(NoInit) {} /** @brief Construct from unitless type */ - constexpr explicit Rad(T value): Unit(value) {} - - /** @brief Copy constructor */ - constexpr /*implicit*/ Rad(Unit value): Unit(value) {} + constexpr explicit Rad(T value) noexcept: Unit(value) {} /** @brief Construct from another underlying type */ - template constexpr explicit Rad(Unit value): Unit(value) {} + template constexpr explicit Rad(Unit value) noexcept: Unit(value) {} + + /** @brief Copy constructor */ + constexpr /*implicit*/ Rad(Unit value) noexcept: Unit(value) {} /** * @brief Construct radians from degrees diff --git a/src/Magnum/Math/BoolVector.h b/src/Magnum/Math/BoolVector.h index 46cbf6ccc..c2dab37a6 100644 --- a/src/Magnum/Math/BoolVector.h +++ b/src/Magnum/Math/BoolVector.h @@ -80,10 +80,10 @@ template class BoolVector { }; /** @brief Construct zero-filled boolean vector */ - constexpr /*implicit*/ BoolVector(ZeroInitT = ZeroInit): _data{} {} + constexpr /*implicit*/ BoolVector(ZeroInitT = ZeroInit) noexcept: _data{} {} /** @brief Construct without initializing the contents */ - explicit BoolVector(NoInitT) {} + explicit BoolVector(NoInitT) noexcept {} /** * @brief Construct boolean vector from segment values @@ -91,20 +91,20 @@ template class BoolVector { * @param next Values for next Bbit segments */ #ifdef DOXYGEN_GENERATING_OUTPUT - template constexpr /*implicit*/ BoolVector(UnsignedByte first, T... next); + template constexpr /*implicit*/ BoolVector(UnsignedByte first, T... next) noexcept; #else - template::type> constexpr /*implicit*/ BoolVector(UnsignedByte first, T... next): _data{first, UnsignedByte(next)...} {} + template::type> constexpr /*implicit*/ BoolVector(UnsignedByte first, T... next) noexcept: _data{first, UnsignedByte(next)...} {} #endif /** @brief Construct boolean vector with one value for all fields */ #ifdef DOXYGEN_GENERATING_OUTPUT - inline explicit BoolVector(T value); + explicit BoolVector(T value) noexcept; #else - template::value && size != 1, bool>::type> constexpr explicit BoolVector(T value): BoolVector(typename Implementation::GenerateSequence::Type(), value ? FullSegmentMask : 0) {} + template::value && size != 1, bool>::type> constexpr explicit BoolVector(T value) noexcept: BoolVector(typename Implementation::GenerateSequence::Type(), value ? FullSegmentMask : 0) {} #endif /** @brief Copy constructor */ - constexpr BoolVector(const BoolVector&) = default; + constexpr /*implicit*/ BoolVector(const BoolVector&) noexcept = default; /** * @brief Raw data diff --git a/src/Magnum/Math/Color.h b/src/Magnum/Math/Color.h index 5edc72d3b..2d7094cec 100644 --- a/src/Magnum/Math/Color.h +++ b/src/Magnum/Math/Color.h @@ -254,7 +254,7 @@ template class Color3: public Vector3 { * * All components are set to zero. */ - constexpr /*implicit*/ Color3(ZeroInitT = ZeroInit) + constexpr /*implicit*/ Color3(ZeroInitT = ZeroInit) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -263,7 +263,7 @@ template class Color3: public Vector3 { {} /** @copydoc Vector::Vector(NoInitT) */ - explicit Color3(NoInitT) + explicit Color3(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -275,7 +275,7 @@ template class Color3: public Vector3 { * @brief Gray constructor * @param rgb RGB value */ - constexpr explicit Color3(T rgb): Vector3(rgb) {} + constexpr explicit Color3(T rgb) noexcept: Vector3(rgb) {} /** * @brief Constructor @@ -283,7 +283,7 @@ template class Color3: public Vector3 { * @param g G value * @param b B value */ - constexpr /*implicit*/ Color3(T r, T g, T b): Vector3(r, g, b) {} + constexpr /*implicit*/ Color3(T r, T g, T b) noexcept: Vector3(r, g, b) {} /** * @copydoc Vector::Vector(const Vector&) @@ -292,10 +292,10 @@ template class Color3: public Vector3 { * @ref normalize() and @ref denormalize() instead. * See class documentation for more information. */ - template constexpr explicit Color3(const Vector<3, U>& other): Vector3(other) {} + template constexpr explicit Color3(const Vector<3, U>& other) noexcept: Vector3(other) {} /** @brief Copy constructor */ - constexpr Color3(const Vector<3, T>& other): Vector3(other) {} + constexpr /*implicit*/ Color3(const Vector<3, T>& other) noexcept: Vector3(other) {} /** * @brief Convert to HSV @@ -449,10 +449,10 @@ class Color4: public Vector4 { * * All components are set to zero. */ - constexpr /*implicit*/ Color4(): Vector4(T(0), T(0), T(0), T(0)) {} + constexpr /*implicit*/ Color4() noexcept: Vector4(T(0), T(0), T(0), T(0)) {} /** @copydoc Vector::Vector(ZeroInitT) */ - constexpr explicit Color4(ZeroInitT) + constexpr explicit Color4(ZeroInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -461,7 +461,7 @@ class Color4: public Vector4 { {} /** @copydoc Vector::Vector(NoInitT) */ - explicit Color4(NoInitT) + explicit Color4(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -474,7 +474,7 @@ class Color4: public Vector4 { * @param alpha Alpha value, defaults to `1.0` for floating-point types * and maximum positive value for integral types. */ - constexpr explicit Color4(T rgb, T alpha = Implementation::fullChannel()): Vector4(rgb, rgb, rgb, alpha) {} + constexpr explicit Color4(T rgb, T alpha = Implementation::fullChannel()) noexcept: Vector4(rgb, rgb, rgb, alpha) {} /** * @brief Constructor @@ -484,7 +484,7 @@ class Color4: public Vector4 { * @param a A value, defaults to `1.0` for floating-point types and * maximum positive value for integral types. */ - constexpr /*implicit*/ Color4(T r, T g, T b, T a = Implementation::fullChannel()): Vector4(r, g, b, a) {} + constexpr /*implicit*/ Color4(T r, T g, T b, T a = Implementation::fullChannel()) noexcept: Vector4(r, g, b, a) {} /** * @brief Constructor @@ -493,7 +493,7 @@ class Color4: public Vector4 { */ /* Not marked as explicit, because conversion from Color3 to Color4 is fairly common, nearly always with A set to 1 */ - constexpr /*implicit*/ Color4(const Vector3& rgb, T a = Implementation::fullChannel()): Vector4(rgb[0], rgb[1], rgb[2], a) {} + constexpr /*implicit*/ Color4(const Vector3& rgb, T a = Implementation::fullChannel()) noexcept: Vector4(rgb[0], rgb[1], rgb[2], a) {} /** * @copydoc Vector::Vector(const Vector&) @@ -502,10 +502,10 @@ class Color4: public Vector4 { * @ref normalize() and @ref denormalize() instead. * See @ref Color3 class documentation for more information. */ - template constexpr explicit Color4(const Vector<4, U>& other): Vector4(other) {} + template constexpr explicit Color4(const Vector<4, U>& other) noexcept: Vector4(other) {} /** @brief Copy constructor */ - constexpr Color4(const Vector<4, T>& other): Vector4(other) {} + constexpr /*implicit*/ Color4(const Vector<4, T>& other) noexcept: Vector4(other) {} /** @copydoc Color3::toHSV() */ constexpr HSV toHSV() const { diff --git a/src/Magnum/Math/Complex.h b/src/Magnum/Math/Complex.h index 880241970..4c6a89c42 100644 --- a/src/Magnum/Math/Complex.h +++ b/src/Magnum/Math/Complex.h @@ -142,13 +142,13 @@ template class Complex { * c = 1 + i0 * @f] */ - constexpr /*implicit*/ Complex(IdentityInitT = IdentityInit): _real(T(1)), _imaginary(T(0)) {} + constexpr /*implicit*/ Complex(IdentityInitT = IdentityInit) noexcept: _real(T(1)), _imaginary(T(0)) {} /** @brief Construct zero-initialized complex number */ - constexpr explicit Complex(ZeroInitT): _real{}, _imaginary{} {} + constexpr explicit Complex(ZeroInitT) noexcept: _real{}, _imaginary{} {} /** @brief Construct without initializing the contents */ - explicit Complex(NoInitT) {} + explicit Complex(NoInitT) noexcept {} /** * @brief Construct complex number from real and imaginary part @@ -157,7 +157,7 @@ template class Complex { * c = a + ib * @f] */ - constexpr /*implicit*/ Complex(T real, T imaginary): _real(real), _imaginary(imaginary) {} + constexpr /*implicit*/ Complex(T real, T imaginary) noexcept: _real(real), _imaginary(imaginary) {} /** * @brief Construct complex number from vector @@ -167,7 +167,7 @@ template class Complex { * @f] * @see @ref operator Vector2(), @ref transformVector() */ - constexpr explicit Complex(const Vector2& vector): _real(vector.x()), _imaginary(vector.y()) {} + constexpr explicit Complex(const Vector2& vector) noexcept: _real(vector.x()), _imaginary(vector.y()) {} /** * @brief Construct complex number from another of different type @@ -175,11 +175,14 @@ template class Complex { * Performs only default casting on the values, no rounding or anything * else. */ - template constexpr explicit Complex(const Complex& other): _real{T(other._real)}, _imaginary{T(other._imaginary)} {} + template constexpr explicit Complex(const Complex& other) noexcept: _real{T(other._real)}, _imaginary{T(other._imaginary)} {} /** @brief Construct complex number from external representation */ template::from(std::declval()))> constexpr explicit Complex(const U& other): Complex{Implementation::ComplexConverter::from(other)} {} + /** @brief Copy constructor */ + constexpr /*implicit*/ Complex(const Complex&) noexcept = default; + /** @brief Convert complex number to external representation */ template::to(std::declval>()))> constexpr explicit operator U() const { return Implementation::ComplexConverter::to(*this); diff --git a/src/Magnum/Math/Dual.h b/src/Magnum/Math/Dual.h index 5080c9b2d..da09c5757 100644 --- a/src/Magnum/Math/Dual.h +++ b/src/Magnum/Math/Dual.h @@ -57,15 +57,15 @@ template class Dual { * * Both parts are default-constructed. */ - constexpr /*implicit*/ Dual(): _real(), _dual() {} + constexpr /*implicit*/ Dual() noexcept: _real{}, _dual{} {} /** @brief Construct without initializing the contents */ #ifdef DOXYGEN_GENERATING_OUTPUT - explicit Dual(NoInitT); + explicit Dual(NoInitT) noexcept; #else /* MSVC 2015 can't handle {} instead of ::value */ - template::value>::type> Dual(NoInitT) {} - template::value>::type> Dual(NoInitT): _real{NoInit}, _dual{NoInit} {} + template::value>::type> explicit Dual(NoInitT) noexcept {} + template::value>::type> explicit Dual(NoInitT) noexcept: _real{NoInit}, _dual{NoInit} {} #endif /** @@ -75,7 +75,7 @@ template class Dual { * \hat a = a_0 + \epsilon a_\epsilon * @f] */ - constexpr /*implicit*/ Dual(const T& real, const T& dual = T()): _real(real), _dual(dual) {} + constexpr /*implicit*/ Dual(const T& real, const T& dual = T()) noexcept: _real(real), _dual(dual) {} /** * @brief Construct dual number from another of different type @@ -88,7 +88,10 @@ template class Dual { * // integral == {1, 2} * @endcode */ - template constexpr explicit Dual(const Dual& other): _real{T(other._real)}, _dual{T(other._dual)} {} + template constexpr explicit Dual(const Dual& other) noexcept: _real{T(other._real)}, _dual{T(other._dual)} {} + + /** @brief Copy constructor */ + constexpr /*implicit*/ Dual(const Dual&) noexcept = default; /** @brief Equality comparison */ bool operator==(const Dual& other) const { diff --git a/src/Magnum/Math/DualComplex.h b/src/Magnum/Math/DualComplex.h index f32876935..f1a5df321 100644 --- a/src/Magnum/Math/DualComplex.h +++ b/src/Magnum/Math/DualComplex.h @@ -104,13 +104,13 @@ template class DualComplex: public Dual> { * @f] */ #ifdef DOXYGEN_GENERATING_OUTPUT - constexpr /*implicit*/ DualComplex(IdentityInitT = IdentityInit); + constexpr /*implicit*/ DualComplex(IdentityInitT = IdentityInit) noexcept; #else - constexpr /*implicit*/ DualComplex(IdentityInitT = IdentityInit): Dual>({}, {T(0), T(0)}) {} + constexpr /*implicit*/ DualComplex(IdentityInitT = IdentityInit) noexcept: Dual>({}, {T(0), T(0)}) {} #endif /** @brief Construct zero-initialized dual complex number */ - constexpr explicit DualComplex(ZeroInitT) + constexpr explicit DualComplex(ZeroInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -119,7 +119,7 @@ template class DualComplex: public Dual> { {} /** @brief Construct without initializing the contents */ - explicit DualComplex(NoInitT) + explicit DualComplex(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -134,7 +134,7 @@ template class DualComplex: public Dual> { * \hat c = c_0 + \epsilon c_\epsilon * @f] */ - constexpr /*implicit*/ DualComplex(const Complex& real, const Complex& dual = Complex(T(0), T(0))): Dual>(real, dual) {} + constexpr /*implicit*/ DualComplex(const Complex& real, const Complex& dual = Complex(T(0), T(0))) noexcept: Dual>(real, dual) {} /** * @brief Construct dual complex number from vector @@ -144,9 +144,9 @@ template class DualComplex: public Dual> { * @f] */ #ifdef DOXYGEN_GENERATING_OUTPUT - constexpr explicit DualComplex(const Vector2& vector); + constexpr explicit DualComplex(const Vector2& vector) noexcept; #else - constexpr explicit DualComplex(const Vector2& vector): Dual>({}, Complex(vector)) {} + constexpr explicit DualComplex(const Vector2& vector) noexcept: Dual>({}, Complex(vector)) {} #endif /** @@ -155,7 +155,7 @@ template class DualComplex: public Dual> { * Performs only default casting on the values, no rounding or anything * else. */ - template constexpr explicit DualComplex(const DualComplex& other) + template constexpr explicit DualComplex(const DualComplex& other) noexcept #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ : Dual>(other) @@ -166,7 +166,7 @@ template class DualComplex: public Dual> { template::from(std::declval()))> constexpr explicit DualComplex(const U& other): DualComplex{Implementation::DualComplexConverter::from(other)} {} /** @brief Copy constructor */ - constexpr DualComplex(const Dual>& other): Dual>(other) {} + constexpr /*implicit*/ DualComplex(const Dual>& other) noexcept: Dual>(other) {} /** @brief Convert dual complex number to external representation */ template::to(std::declval>()))> constexpr explicit operator U() const { diff --git a/src/Magnum/Math/DualQuaternion.h b/src/Magnum/Math/DualQuaternion.h index 361754515..d4b6d35d3 100644 --- a/src/Magnum/Math/DualQuaternion.h +++ b/src/Magnum/Math/DualQuaternion.h @@ -163,7 +163,7 @@ template class DualQuaternion: public Dual> { * \hat q = [\boldsymbol 0, 1] + \epsilon [\boldsymbol 0, 0] * @f] */ - constexpr /*implicit*/ DualQuaternion(IdentityInitT = IdentityInit) + constexpr /*implicit*/ DualQuaternion(IdentityInitT = IdentityInit) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT : Dual>({}, {{}, T(0)}) @@ -171,7 +171,7 @@ template class DualQuaternion: public Dual> { {} /** @brief Construct zero-initialized dual quaternion */ - constexpr explicit DualQuaternion(ZeroInitT) + constexpr explicit DualQuaternion(ZeroInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -180,7 +180,7 @@ template class DualQuaternion: public Dual> { {} /** @brief Construct without initializing the contents */ - explicit DualQuaternion(NoInitT) + explicit DualQuaternion(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -195,7 +195,7 @@ template class DualQuaternion: public Dual> { * \hat q = q_0 + \epsilon q_\epsilon * @f] */ - constexpr /*implicit*/ DualQuaternion(const Quaternion& real, const Quaternion& dual = Quaternion({}, T(0))): Dual>(real, dual) {} + constexpr /*implicit*/ DualQuaternion(const Quaternion& real, const Quaternion& dual = Quaternion({}, T(0))) noexcept: Dual>(real, dual) {} /** * @brief Construct dual quaternion from dual vector and scalar parts @@ -204,7 +204,7 @@ template class DualQuaternion: public Dual> { * \hat q = [\hat{\boldsymbol v}, \hat s] = [\boldsymbol v_0, s_0] + \epsilon [\boldsymbol v_\epsilon, s_\epsilon] * @f] */ - constexpr /*implicit*/ DualQuaternion(const Dual>& vector, const Dual& scalar) + constexpr /*implicit*/ DualQuaternion(const Dual>& vector, const Dual& scalar) noexcept #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ : Dual>({vector.real(), scalar.real()}, {vector.dual(), scalar.dual()}) @@ -220,9 +220,9 @@ template class DualQuaternion: public Dual> { * @see @ref transformPointNormalized() */ #ifdef DOXYGEN_GENERATING_OUTPUT - constexpr explicit DualQuaternion(const Vector3& vector); + constexpr explicit DualQuaternion(const Vector3& vector) noexcept; #else - constexpr explicit DualQuaternion(const Vector3& vector): Dual>({}, {vector, T(0)}) {} + constexpr explicit DualQuaternion(const Vector3& vector) noexcept: Dual>({}, {vector, T(0)}) {} #endif /** @@ -231,13 +231,13 @@ template class DualQuaternion: public Dual> { * Performs only default casting on the values, no rounding or anything * else. */ - template constexpr explicit DualQuaternion(const DualQuaternion& other): Dual>(other) {} + template constexpr explicit DualQuaternion(const DualQuaternion& other) noexcept: Dual>(other) {} /** @brief Construct dual quaternion from external representation */ template::from(std::declval()))> constexpr explicit DualQuaternion(const U& other): DualQuaternion{Implementation::DualQuaternionConverter::from(other)} {} /** @brief Copy constructor */ - constexpr DualQuaternion(const Dual>& other): Dual>(other) {} + constexpr /*implicit*/ DualQuaternion(const Dual>& other) noexcept: Dual>(other) {} /** @brief Convert dual quaternion to external representation */ template::to(std::declval>()))> constexpr explicit operator U() const { diff --git a/src/Magnum/Math/Matrix.h b/src/Magnum/Math/Matrix.h index 6be18b9fd..b34c7ed90 100644 --- a/src/Magnum/Math/Matrix.h +++ b/src/Magnum/Math/Matrix.h @@ -83,7 +83,7 @@ template class Matrix: public RectangularMatrix class Matrix: public RectangularMatrix class Matrix: public RectangularMatrix class Matrix: public RectangularMatrix constexpr /*implicit*/ Matrix(const Vector& first, const U&... next): RectangularMatrix(first, next...) {} + template constexpr /*implicit*/ Matrix(const Vector& first, const U&... next) noexcept: RectangularMatrix(first, next...) {} /** * @brief Construct matrix from another of different type @@ -128,13 +128,13 @@ template class Matrix: public RectangularMatrix constexpr explicit Matrix(const RectangularMatrix& other): RectangularMatrix(other) {} + template constexpr explicit Matrix(const RectangularMatrix& other) noexcept: RectangularMatrix(other) {} /** @brief Construct matrix from external representation */ template::from(std::declval()))> constexpr explicit Matrix(const U& other): RectangularMatrix(Implementation::RectangularMatrixConverter::from(other)) {} /** @brief Copy constructor */ - constexpr Matrix(const RectangularMatrix& other): RectangularMatrix(other) {} + constexpr /*implicit*/ Matrix(const RectangularMatrix& other) noexcept: RectangularMatrix(other) {} /** * @brief Whether the matrix is orthogonal diff --git a/src/Magnum/Math/Matrix3.h b/src/Magnum/Math/Matrix3.h index 0906b4be4..be1eaa376 100644 --- a/src/Magnum/Math/Matrix3.h +++ b/src/Magnum/Math/Matrix3.h @@ -159,7 +159,7 @@ template class Matrix3: public Matrix3x3 { * Creates identity matrix. @p value allows you to specify value on * diagonal. */ - constexpr /*implicit*/ Matrix3(IdentityInitT = IdentityInit, T value = T{1}) + constexpr /*implicit*/ Matrix3(IdentityInitT = IdentityInit, T value = T{1}) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -168,7 +168,7 @@ template class Matrix3: public Matrix3x3 { {} /** @copydoc Matrix::Matrix(ZeroInitT) */ - constexpr explicit Matrix3(ZeroInitT) + constexpr explicit Matrix3(ZeroInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -177,7 +177,7 @@ template class Matrix3: public Matrix3x3 { {} /** @copydoc Matrix::Matrix(NoInitT) */ - constexpr explicit Matrix3(NoInitT) + constexpr explicit Matrix3(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -186,16 +186,16 @@ template class Matrix3: public Matrix3x3 { {} /** @brief Matrix from column vectors */ - constexpr /*implicit*/ Matrix3(const Vector3& first, const Vector3& second, const Vector3& third): Matrix3x3(first, second, third) {} + constexpr /*implicit*/ Matrix3(const Vector3& first, const Vector3& second, const Vector3& third) noexcept: Matrix3x3(first, second, third) {} /** @copydoc Matrix::Matrix(const RectangularMatrix&) */ - template constexpr explicit Matrix3(const RectangularMatrix<3, 3, U>& other): Matrix3x3(other) {} + template constexpr explicit Matrix3(const RectangularMatrix<3, 3, U>& other) noexcept: Matrix3x3(other) {} /** @brief Construct matrix from external representation */ - template::from(std::declval()))> constexpr explicit Matrix3(const U& other): Matrix3x3(Implementation::RectangularMatrixConverter<3, 3, T, U>::from(other)) {} + template::from(std::declval()))> constexpr explicit Matrix3(const U& other) noexcept: Matrix3x3(Implementation::RectangularMatrixConverter<3, 3, T, U>::from(other)) {} /** @brief Copy constructor */ - constexpr Matrix3(const RectangularMatrix<3, 3, T>& other): Matrix3x3(other) {} + constexpr /*implicit*/ Matrix3(const RectangularMatrix<3, 3, T>& other) noexcept: Matrix3x3(other) {} /** * @brief Check whether the matrix represents rigid transformation diff --git a/src/Magnum/Math/Matrix4.h b/src/Magnum/Math/Matrix4.h index 9f391399e..d3ee65716 100644 --- a/src/Magnum/Math/Matrix4.h +++ b/src/Magnum/Math/Matrix4.h @@ -255,7 +255,7 @@ template class Matrix4: public Matrix4x4 { * Creates identity matrix. @p value allows you to specify value on * diagonal. */ - constexpr /*implicit*/ Matrix4(IdentityInitT = IdentityInit, T value = T{1}) + constexpr /*implicit*/ Matrix4(IdentityInitT = IdentityInit, T value = T{1}) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -264,7 +264,7 @@ template class Matrix4: public Matrix4x4 { {} /** @copydoc Matrix::Matrix(ZeroInitT) */ - constexpr explicit Matrix4(ZeroInitT) + constexpr explicit Matrix4(ZeroInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -273,7 +273,7 @@ template class Matrix4: public Matrix4x4 { {} /** @copydoc Matrix::Matrix(NoInitT) */ - constexpr explicit Matrix4(NoInitT) + constexpr explicit Matrix4(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -282,16 +282,16 @@ template class Matrix4: public Matrix4x4 { {} /** @brief Matrix from column vectors */ - constexpr /*implicit*/ Matrix4(const Vector4& first, const Vector4& second, const Vector4& third, const Vector4& fourth): Matrix4x4(first, second, third, fourth) {} + constexpr /*implicit*/ Matrix4(const Vector4& first, const Vector4& second, const Vector4& third, const Vector4& fourth) noexcept: Matrix4x4(first, second, third, fourth) {} /** @copydoc Matrix::Matrix(const RectangularMatrix&) */ - template constexpr explicit Matrix4(const RectangularMatrix<4, 4, U>& other): Matrix4x4(other) {} + template constexpr explicit Matrix4(const RectangularMatrix<4, 4, U>& other) noexcept: Matrix4x4(other) {} /** @brief Construct matrix from external representation */ template::from(std::declval()))> constexpr explicit Matrix4(const U& other): Matrix4x4(Implementation::RectangularMatrixConverter<4, 4, T, U>::from(other)) {} /** @brief Copy constructor */ - constexpr Matrix4(const RectangularMatrix<4, 4, T>& other): Matrix4x4(other) {} + constexpr /*implicit*/ Matrix4(const RectangularMatrix<4, 4, T>& other) noexcept: Matrix4x4(other) {} /** * @brief Check whether the matrix represents rigid transformation diff --git a/src/Magnum/Math/Quaternion.h b/src/Magnum/Math/Quaternion.h index 82db72876..290949e14 100644 --- a/src/Magnum/Math/Quaternion.h +++ b/src/Magnum/Math/Quaternion.h @@ -205,13 +205,13 @@ template class Quaternion { * q = [\boldsymbol 0, 1] * @f] */ - constexpr /*implicit*/ Quaternion(IdentityInitT = IdentityInit): _scalar{T(1)} {} + constexpr /*implicit*/ Quaternion(IdentityInitT = IdentityInit) noexcept: _scalar{T(1)} {} /** @brief Construct zero-initialized quaternion */ - constexpr explicit Quaternion(ZeroInitT): _vector{ZeroInit}, _scalar{T{0}} {} + constexpr explicit Quaternion(ZeroInitT) noexcept: _vector{ZeroInit}, _scalar{T{0}} {} /** @brief Construct without initializing the contents */ - explicit Quaternion(NoInitT): _vector{NoInit} {} + explicit Quaternion(NoInitT) noexcept: _vector{NoInit} {} /** * @brief Construct quaternion from vector and scalar @@ -220,7 +220,7 @@ template class Quaternion { * q = [\boldsymbol v, s] * @f] */ - constexpr /*implicit*/ Quaternion(const Vector3& vector, T scalar): _vector(vector), _scalar(scalar) {} + constexpr /*implicit*/ Quaternion(const Vector3& vector, T scalar) noexcept: _vector(vector), _scalar(scalar) {} /** * @brief Construct quaternion from vector @@ -230,7 +230,7 @@ template class Quaternion { * @f] * @see @ref transformVector(), @ref transformVectorNormalized() */ - constexpr explicit Quaternion(const Vector3& vector): _vector(vector), _scalar(T(0)) {} + constexpr explicit Quaternion(const Vector3& vector) noexcept: _vector(vector), _scalar(T(0)) {} /** * @brief Construct dual complex number from another of different type @@ -238,11 +238,14 @@ template class Quaternion { * Performs only default casting on the values, no rounding or anything * else. */ - template constexpr explicit Quaternion(const Quaternion& other): _vector{other._vector}, _scalar{T(other._scalar)} {} + template constexpr explicit Quaternion(const Quaternion& other) noexcept: _vector{other._vector}, _scalar{T(other._scalar)} {} /** @brief Construct quaternion from external representation */ template::from(std::declval()))> constexpr explicit Quaternion(const U& other): Quaternion{Implementation::QuaternionConverter::from(other)} {} + /** @brief Copy constructor */ + constexpr /*implicit*/ Quaternion(const Quaternion&) noexcept = default; + /** @brief Convert quaternion to external representation */ template::to(std::declval>()))> constexpr explicit operator U() const { return Implementation::QuaternionConverter::to(*this); diff --git a/src/Magnum/Math/Range.h b/src/Magnum/Math/Range.h index 78a8fb195..ceefa56da 100644 --- a/src/Magnum/Math/Range.h +++ b/src/Magnum/Math/Range.h @@ -76,16 +76,13 @@ template class Range { * * Construct zero-size range positioned at origin. */ - constexpr /*implicit*/ Range(ZeroInitT = ZeroInit): _min{ZeroInit}, _max{ZeroInit} {} + constexpr /*implicit*/ Range(ZeroInitT = ZeroInit) noexcept: _min{ZeroInit}, _max{ZeroInit} {} /** @brief Construct without initializing the contents */ - explicit Range(NoInitT): _min{NoInit}, _max{NoInit} {} + explicit Range(NoInitT) noexcept: _min{NoInit}, _max{NoInit} {} /** @brief Construct range from minimal and maximal coordinates */ - constexpr /*implicit*/ Range(const VectorType& min, const VectorType& max): _min{min}, _max{max} {} - - /** @brief Copy constructor */ - constexpr Range(const Range&) = default; + constexpr /*implicit*/ Range(const VectorType& min, const VectorType& max) noexcept: _min{min}, _max{max} {} /** * @brief Construct range from another of different type @@ -97,11 +94,14 @@ template class Range { * Range2D integral(floatingPoint); // {{1, 2}, {-15, 7}} * @endcode */ - template constexpr explicit Range(const Range& other): _min(other._min), _max(other._max) {} + template constexpr explicit Range(const Range& other) noexcept: _min(other._min), _max(other._max) {} /** @brief Construct range from external representation */ template::from(std::declval()))> constexpr explicit Range(const U& other): Range{Implementation::RangeConverter::from(other)} {} + /** @brief Copy constructor */ + constexpr /*implicit*/ Range(const Range&) noexcept = default; + /** @brief Convert range to external representation */ template::to(std::declval>()))> constexpr explicit operator U() const { return Implementation::RangeConverter::to(*this); @@ -230,7 +230,7 @@ See @ref Range for more information. template class Range2D: public Range<2, T> { public: /** @copydoc Range(ZeroInitT) */ - constexpr /*implicit*/ Range2D(ZeroInitT = ZeroInit) + constexpr /*implicit*/ Range2D(ZeroInitT = ZeroInit) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -239,7 +239,7 @@ template class Range2D: public Range<2, T> { {} /** @copydoc Range(NoInitT) */ - explicit Range2D(NoInitT) + explicit Range2D(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -248,13 +248,10 @@ template class Range2D: public Range<2, T> { {} /** @copydoc Range(const VectorType&, const VectorType&) */ - constexpr /*implicit*/ Range2D(const Vector2& min, const Vector2& max): Range<2, T>(min, max) {} - - /** @copydoc Range(const Range&) */ - constexpr /*implicit*/ Range2D(const Range<2, T>& other): Range<2, T>(other) {} + constexpr /*implicit*/ Range2D(const Vector2& min, const Vector2& max) noexcept: Range<2, T>(min, max) {} /** @copydoc Range(const Range&) */ - template constexpr explicit Range2D(const Range2D& other): Range<2, T>(other) {} + template constexpr explicit Range2D(const Range2D& other) noexcept: Range<2, T>(other) {} /** * @brief Construct range from external representation @@ -274,6 +271,9 @@ template class Range2D: public Range<2, T> { #endif {} + /** @copydoc Range(const Range&) */ + constexpr /*implicit*/ Range2D(const Range<2, T>& other) noexcept: Range<2, T>(other) {} + /** * @brief Bottom left corner * @@ -364,7 +364,7 @@ See @ref Range for more information. template class Range3D: public Range<3, T> { public: /** @copydoc Range(ZeroInitT) */ - constexpr /*implicit*/ Range3D(ZeroInitT = ZeroInit) + constexpr /*implicit*/ Range3D(ZeroInitT = ZeroInit) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -373,7 +373,7 @@ template class Range3D: public Range<3, T> { {} /** @copybrief Range(NoInitT) */ - explicit Range3D(NoInitT) + explicit Range3D(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -382,25 +382,25 @@ template class Range3D: public Range<3, T> { {} /** @copydoc Range(const VectorType&, const VectorType&) */ - constexpr /*implicit*/ Range3D(const Vector3& min, const Vector3& max): Range<3, T>(min, max) {} - - /** @copydoc Range(const Range&) */ - constexpr /*implicit*/ Range3D(const Range<3, T>& other): Range<3, T>(other) {} + constexpr /*implicit*/ Range3D(const Vector3& min, const Vector3& max) noexcept: Range<3, T>(min, max) {} /** @copydoc Range(const Range&) */ - template constexpr explicit Range3D(const Range3D& other): Range<3, T>(other) {} + template constexpr explicit Range3D(const Range3D& other) noexcept: Range<3, T>(other) {} /** * @brief Construct range from external representation * @todoc Remove workaround when Doxygen no longer chokes on that line */ - template::from(std::declval()))> constexpr explicit Range3D(const U& other) + template::from(std::declval()))> constexpr explicit Range3D(const U& other) noexcept #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ : Range<3, T>(Implementation::RangeConverter<3, T, U>::from(other)) #endif {} + /** @copydoc Range(const Range&) */ + constexpr /*implicit*/ Range3D(const Range<3, T>& other) noexcept: Range<3, T>(other) {} + /** * @brief Back bottom left corner * diff --git a/src/Magnum/Math/RectangularMatrix.h b/src/Magnum/Math/RectangularMatrix.h index 9e9d6a594..76b8d67e0 100644 --- a/src/Magnum/Math/RectangularMatrix.h +++ b/src/Magnum/Math/RectangularMatrix.h @@ -103,12 +103,12 @@ template class RectangularMatrix { * * @see @ref diagonal() */ - constexpr static RectangularMatrix fromDiagonal(const Vector& diagonal) { + constexpr static RectangularMatrix fromDiagonal(const Vector& diagonal) noexcept { return RectangularMatrix(typename Implementation::GenerateSequence::Type(), diagonal); } /** @brief Construct zero-filled matrix */ - constexpr /*implicit*/ RectangularMatrix(ZeroInitT = ZeroInit) + constexpr /*implicit*/ RectangularMatrix(ZeroInitT = ZeroInit) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -117,7 +117,7 @@ template class RectangularMatrix { {} /** @brief Construct matrix without initializing the contents */ - explicit RectangularMatrix(NoInitT) + explicit RectangularMatrix(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -132,7 +132,7 @@ template class RectangularMatrix { * * @todo Creating matrix from arbitrary combination of matrices with n rows */ - template constexpr /*implicit*/ RectangularMatrix(const Vector& first, const U&... next): _data{first, next...} { + template constexpr /*implicit*/ RectangularMatrix(const Vector& first, const U&... next) noexcept: _data{first, next...} { static_assert(sizeof...(next)+1 == cols, "Improper number of arguments passed to RectangularMatrix constructor"); } @@ -147,13 +147,13 @@ template class RectangularMatrix { * // integral == {1, 2, -15, 7} * @endcode */ - template constexpr explicit RectangularMatrix(const RectangularMatrix& other): RectangularMatrix(typename Implementation::GenerateSequence::Type(), other) {} + template constexpr explicit RectangularMatrix(const RectangularMatrix& other) noexcept: RectangularMatrix(typename Implementation::GenerateSequence::Type(), other) {} /** @brief Construct matrix from external representation */ template::from(std::declval()))> constexpr explicit RectangularMatrix(const U& other): RectangularMatrix(Implementation::RectangularMatrixConverter::from(other)) {} /** @brief Copy constructor */ - constexpr RectangularMatrix(const RectangularMatrix&) = default; + constexpr /*implicit*/ RectangularMatrix(const RectangularMatrix&) noexcept = default; /** @brief Convert matrix to external representation */ template::to(std::declval>()))> constexpr explicit operator U() const { @@ -393,11 +393,11 @@ template class RectangularMatrix { private: /* Implementation for RectangularMatrix::RectangularMatrix(const RectangularMatrix&) */ - template constexpr explicit RectangularMatrix(Implementation::Sequence, const RectangularMatrix& matrix): _data{Vector(matrix[sequence])...} {} + template constexpr explicit RectangularMatrix(Implementation::Sequence, const RectangularMatrix& matrix) noexcept: _data{Vector(matrix[sequence])...} {} /* Implementation for RectangularMatrix::RectangularMatrix(ZeroInitT) and RectangularMatrix::RectangularMatrix(NoInitT) */ /* MSVC 2015 can't handle {} here */ - template constexpr explicit RectangularMatrix(Implementation::Sequence, U): _data{Vector((static_cast(sequence), U{typename U::Init{}}))...} {} + template constexpr explicit RectangularMatrix(Implementation::Sequence, U) noexcept: _data{Vector((static_cast(sequence), U{typename U::Init{}}))...} {} template constexpr RectangularMatrix flippedColsInternal(Implementation::Sequence) const { return {(*this)[sequence]...}; diff --git a/src/Magnum/Math/Test/AngleTest.cpp b/src/Magnum/Math/Test/AngleTest.cpp index 64a8877a5..5cc6056be 100644 --- a/src/Magnum/Math/Test/AngleTest.cpp +++ b/src/Magnum/Math/Test/AngleTest.cpp @@ -79,6 +79,9 @@ void AngleTest::construct() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void AngleTest::constructDefault() { @@ -90,6 +93,11 @@ void AngleTest::constructDefault() { constexpr Radd a2{ZeroInit}; CORRADE_COMPARE(Double(a1), 0.0); CORRADE_COMPARE(Double(a2), 0.0); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void AngleTest::constructNoInit() { @@ -99,6 +107,9 @@ void AngleTest::constructNoInit() { new(&b) Rad{NoInit}; CORRADE_COMPARE(Float(a), 25.0f); CORRADE_COMPARE(Float(b), 3.14f); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void AngleTest::constructConversion() { @@ -113,6 +124,9 @@ void AngleTest::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void AngleTest::constructCopy() { @@ -123,6 +137,11 @@ void AngleTest::constructCopy() { CORRADE_COMPARE(c, a); constexpr Radd d(b); CORRADE_COMPARE(d, b); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void AngleTest::literals() { diff --git a/src/Magnum/Math/Test/BoolVectorTest.cpp b/src/Magnum/Math/Test/BoolVectorTest.cpp index 4a6d8c78d..a380b34f8 100644 --- a/src/Magnum/Math/Test/BoolVectorTest.cpp +++ b/src/Magnum/Math/Test/BoolVectorTest.cpp @@ -83,6 +83,8 @@ BoolVectorTest::BoolVectorTest() { void BoolVectorTest::construct() { constexpr BoolVector19 a = {0xa5, 0x5f, 0x07}; CORRADE_COMPARE(a, BoolVector19(0xa5, 0x5f, 0x07)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void BoolVectorTest::constructDefault() { @@ -90,12 +92,17 @@ void BoolVectorTest::constructDefault() { constexpr BoolVector19 b{ZeroInit}; CORRADE_COMPARE(a, BoolVector19(0x00, 0x00, 0x00)); CORRADE_COMPARE(b, BoolVector19(0x00, 0x00, 0x00)); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void BoolVectorTest::constructNoInit() { BoolVector19 a{0xa5, 0x5f, 0x07}; new(&a) BoolVector19{NoInit}; CORRADE_COMPARE(a, BoolVector19(0xa5, 0x5f, 0x07)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void BoolVectorTest::constructOneValue() { @@ -106,6 +113,8 @@ void BoolVectorTest::constructOneValue() { CORRADE_COMPARE(b, BoolVector19(0xff, 0xff, 0x07)); CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void BoolVectorTest::constructOneElement() { @@ -113,12 +122,17 @@ void BoolVectorTest::constructOneElement() { constexpr BoolVector1 a = 0x01; CORRADE_COMPARE(a, BoolVector1(0x01)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void BoolVectorTest::constructCopy() { constexpr BoolVector19 a = {0xa5, 0x5f, 0x07}; constexpr BoolVector19 b(a); CORRADE_COMPARE(b, BoolVector19(0xa5, 0x5f, 0x07)); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void BoolVectorTest::data() { diff --git a/src/Magnum/Math/Test/ColorTest.cpp b/src/Magnum/Math/Test/ColorTest.cpp index 10871e926..85fef7b08 100644 --- a/src/Magnum/Math/Test/ColorTest.cpp +++ b/src/Magnum/Math/Test/ColorTest.cpp @@ -119,6 +119,9 @@ void ColorTest::construct() { constexpr Color4ub d = {10, 25, 176}; CORRADE_COMPARE(c, Vector4(1.0f, 0.5f, 0.75f, 1.0f)); CORRADE_COMPARE(d, Math::Vector4(10, 25, 176, 255)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ColorTest::constructDefault() { @@ -134,6 +137,11 @@ void ColorTest::constructDefault() { constexpr Color4ub c; CORRADE_COMPARE(c, Color4ub(0, 0, 0, 0)); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ColorTest::constructNoInit() { @@ -143,6 +151,9 @@ void ColorTest::constructNoInit() { new(&b) Color4{Math::NoInit}; CORRADE_COMPARE(a, (Color3{1.0f, 0.5f, 0.75f})); CORRADE_COMPARE(b, (Color4{1.0f, 0.5f, 0.75f, 0.5f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ColorTest::constructOneValue() { @@ -161,6 +172,9 @@ void ColorTest::constructOneValue() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ColorTest::constructParts() { @@ -175,6 +189,8 @@ void ColorTest::constructParts() { constexpr Color4ub e = c; CORRADE_COMPARE(d, Color4(1.0f, 0.5f, 0.75f, 1.0f)); CORRADE_COMPARE(e, Color4ub(10, 25, 176, 255)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ColorTest::constructConversion() { @@ -189,6 +205,9 @@ void ColorTest::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ColorTest::constructNormalization() { @@ -215,6 +234,11 @@ void ColorTest::constructCopy() { #endif Color4 d(c); CORRADE_COMPARE(d, Color4(1.0f, 0.5f, 0.75f, 0.25f)); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void ColorTest::literals() { diff --git a/src/Magnum/Math/Test/ComplexTest.cpp b/src/Magnum/Math/Test/ComplexTest.cpp index c24dff8d4..70e7c5862 100644 --- a/src/Magnum/Math/Test/ComplexTest.cpp +++ b/src/Magnum/Math/Test/ComplexTest.cpp @@ -141,6 +141,8 @@ void ComplexTest::construct() { constexpr Float c = a.imaginary(); CORRADE_COMPARE(b, 0.5f); CORRADE_COMPARE(c, -3.7f); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ComplexTest::constructIdentity() { @@ -150,17 +152,24 @@ void ComplexTest::constructIdentity() { CORRADE_COMPARE(b, Complex(1.0f, 0.0f)); CORRADE_COMPARE(a.length(), 1.0f); CORRADE_COMPARE(b.length(), 1.0f); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ComplexTest::constructZero() { constexpr Complex a{ZeroInit}; CORRADE_COMPARE(a, Complex(0.0f, 0.0f)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ComplexTest::constructNoInit() { Complex a{0.5f, -3.7f}; new(&a) Complex{NoInit}; CORRADE_COMPARE(a, Complex(0.5f, -3.7f)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ComplexTest::constructFromVector() { @@ -175,6 +184,8 @@ void ComplexTest::constructFromVector() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ComplexTest::constructConversion() { @@ -187,12 +198,17 @@ void ComplexTest::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void ComplexTest::constructCopy() { constexpr Complex a(2.5f, -5.0f); constexpr Complex b(a); CORRADE_COMPARE(b, Complex(2.5f, -5.0f)); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void ComplexTest::convert() { diff --git a/src/Magnum/Math/Test/DualComplexTest.cpp b/src/Magnum/Math/Test/DualComplexTest.cpp index 892f9d36c..f077bb0e8 100644 --- a/src/Magnum/Math/Test/DualComplexTest.cpp +++ b/src/Magnum/Math/Test/DualComplexTest.cpp @@ -141,6 +141,8 @@ void DualComplexTest::construct() { constexpr DualComplex d(Complex(-1.0f, 2.5f)); CORRADE_COMPARE(d, DualComplex({-1.0f, 2.5f}, {0.0f, 0.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualComplexTest::constructIdentity() { @@ -150,17 +152,24 @@ void DualComplexTest::constructIdentity() { CORRADE_COMPARE(b, DualComplex({1.0f, 0.0f}, {0.0f, 0.0f})); CORRADE_COMPARE(a.length(), 1.0f); CORRADE_COMPARE(b.length(), 1.0f); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualComplexTest::constructZero() { constexpr DualComplex a{ZeroInit}; CORRADE_COMPARE(a, DualComplex({0.0f, 0.0f}, {0.0f, 0.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualComplexTest::constructNoInit() { DualComplex a{{-1.0f, 2.5f}, {3.0f, -7.5f}}; new(&a) DualComplex{NoInit}; CORRADE_COMPARE(a, DualComplex({-1.0f, 2.5f}, {3.0f, -7.5f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualComplexTest::constructFromVector() { @@ -169,6 +178,8 @@ void DualComplexTest::constructFromVector() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualComplexTest::constructConversion() { @@ -181,6 +192,8 @@ void DualComplexTest::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualComplexTest::constructCopy() { @@ -190,6 +203,9 @@ void DualComplexTest::constructCopy() { #endif DualComplex b(a); CORRADE_COMPARE(b, DualComplex({-1.0f, 2.5f}, {3.0f, -7.5f})); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void DualComplexTest::convert() { diff --git a/src/Magnum/Math/Test/DualQuaternionTest.cpp b/src/Magnum/Math/Test/DualQuaternionTest.cpp index 7d8884026..a83535c10 100644 --- a/src/Magnum/Math/Test/DualQuaternionTest.cpp +++ b/src/Magnum/Math/Test/DualQuaternionTest.cpp @@ -150,6 +150,8 @@ void DualQuaternionTest::construct() { constexpr DualQuaternion d({{1.0f, 2.0f, 3.0f}, -4.0f}); CORRADE_COMPARE(d, DualQuaternion({{1.0f, 2.0f, 3.0f}, -4.0f}, {{0.0f, 0.0f, 0.0f}, 0.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualQuaternionTest::constructVectorScalar() { @@ -161,6 +163,8 @@ void DualQuaternionTest::constructVectorScalar() { constexpr Quaternion c = a.dual(); CORRADE_COMPARE(c, Quaternion({0.5f, -3.1f, 3.3f}, 2.0f)); + + CORRADE_VERIFY((std::is_nothrow_constructible, Math::Dual>::value)); } void DualQuaternionTest::constructIdentity() { @@ -170,17 +174,24 @@ void DualQuaternionTest::constructIdentity() { CORRADE_COMPARE(b, DualQuaternion({{0.0f, 0.0f, 0.0f}, 1.0f}, {{0.0f, 0.0f, 0.0f}, 0.0f})); CORRADE_COMPARE(a.length(), 1.0f); CORRADE_COMPARE(b.length(), 1.0f); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualQuaternionTest::constructZero() { constexpr DualQuaternion a{ZeroInit}; CORRADE_COMPARE(a, DualQuaternion({{0.0f, 0.0f, 0.0f}, 0.0f}, {{0.0f, 0.0f, 0.0f}, 0.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualQuaternionTest::constructNoInit() { DualQuaternion a{{{1.0f, 2.0f, 3.0f}, -4.0f}, {{0.5f, -3.1f, 3.3f}, 2.0f}}; new(&a) DualQuaternion{NoInit}; CORRADE_COMPARE(a, DualQuaternion({{1.0f, 2.0f, 3.0f}, -4.0f}, {{0.5f, -3.1f, 3.3f}, 2.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualQuaternionTest::constructFromVector() { @@ -189,6 +200,8 @@ void DualQuaternionTest::constructFromVector() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualQuaternionTest::constructConversion() { @@ -201,6 +214,8 @@ void DualQuaternionTest::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualQuaternionTest::constructCopy() { @@ -210,6 +225,9 @@ void DualQuaternionTest::constructCopy() { #endif DualQuaternion b(a); CORRADE_COMPARE(b, DualQuaternion({{1.0f, 2.0f, -3.0f}, -3.5f}, {{4.5f, -7.0f, 2.0f}, 1.0f})); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void DualQuaternionTest::convert() { diff --git a/src/Magnum/Math/Test/DualTest.cpp b/src/Magnum/Math/Test/DualTest.cpp index c99cebcbf..dbb5c4b44 100644 --- a/src/Magnum/Math/Test/DualTest.cpp +++ b/src/Magnum/Math/Test/DualTest.cpp @@ -27,6 +27,7 @@ #include #include "Magnum/Math/Dual.h" +#include "Magnum/Math/Quaternion.h" #include "Magnum/Math/Vector2.h" namespace Magnum { namespace Math { namespace Test { @@ -106,17 +107,29 @@ void DualTest::construct() { constexpr Dual d(3.0f); CORRADE_COMPARE(d.real(), 3.0f); CORRADE_COMPARE(d.dual(), 0.0f); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualTest::constructDefault() { constexpr Dual a; + constexpr Math::Dual> b; CORRADE_COMPARE(a, Dual(0.0f, 0.0f)); + CORRADE_COMPARE(b, Math::Dual>({{0.0f, 0.0f, 0.0f}, 1.0f}, {{0.0f, 0.0f, 0.0f}, 1.0f})); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); } void DualTest::constructNoInit() { Dual a{2.0f, -7.5f}; + Math::Dual> b{{{3.0f, 0.1f, 1.0f}, 1.0f}, {{0.1f, 0.0f, 1.0f}, 0.3f}}; new(&a) Dual{NoInit}; + new(&b) Math::Dual>{NoInit}; CORRADE_COMPARE(a, Dual(2.0f, -7.5f)); + CORRADE_COMPARE(b, (Math::Dual>{{{3.0f, 0.1f, 1.0f}, 1.0f}, {{0.1f, 0.0f, 1.0f}, 0.3f}})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible>, NoInitT>::value)); } void DualTest::constructConversion() { @@ -129,12 +142,17 @@ void DualTest::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void DualTest::constructCopy() { constexpr Dual a(2.0f, 3.0f); constexpr Dual b(a); CORRADE_COMPARE(b, Dual(2.0f, 3.0f)); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void DualTest::compare() { diff --git a/src/Magnum/Math/Test/Matrix3Test.cpp b/src/Magnum/Math/Test/Matrix3Test.cpp index be6d680e0..322181471 100644 --- a/src/Magnum/Math/Test/Matrix3Test.cpp +++ b/src/Magnum/Math/Test/Matrix3Test.cpp @@ -136,6 +136,8 @@ void Matrix3Test::construct() { CORRADE_COMPARE(a, Matrix3({3.0f, 5.0f, 8.0f}, {4.5f, 4.0f, 7.0f}, {7.9f, -1.0f, 8.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Matrix3Test::constructIdentity() { @@ -154,6 +156,9 @@ void Matrix3Test::constructIdentity() { CORRADE_COMPARE(identity, identityExpected); CORRADE_COMPARE(identity2, identityExpected); CORRADE_COMPARE(identity3, identity3Expected); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Matrix3Test::constructZero() { @@ -161,6 +166,8 @@ void Matrix3Test::constructZero() { CORRADE_COMPARE(a, Matrix3({0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Matrix3Test::constructNoInit() { @@ -171,6 +178,8 @@ void Matrix3Test::constructNoInit() { CORRADE_COMPARE(a, Matrix3({3.0f, 5.0f, 8.0f}, {4.5f, 4.0f, 7.0f}, {7.9f, -1.0f, 8.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Matrix3Test::constructConversion() { @@ -184,6 +193,8 @@ void Matrix3Test::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Matrix3Test::constructCopy() { @@ -197,6 +208,9 @@ void Matrix3Test::constructCopy() { CORRADE_COMPARE(b, Matrix3({3.0f, 5.0f, 8.0f}, {4.5f, 4.0f, 7.0f}, {7.9f, -1.0f, 8.0f})); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void Matrix3Test::convert() { diff --git a/src/Magnum/Math/Test/Matrix4Test.cpp b/src/Magnum/Math/Test/Matrix4Test.cpp index 7d1bf5ae5..49e20cade 100644 --- a/src/Magnum/Math/Test/Matrix4Test.cpp +++ b/src/Magnum/Math/Test/Matrix4Test.cpp @@ -107,6 +107,7 @@ typedef Math::Matrix4 Matrix4; typedef Math::Matrix4 Matrix4i; typedef Math::Matrix<3, Float> Matrix3x3; typedef Math::Vector3 Vector3; +typedef Math::Vector4 Vector4; typedef Math::Constants Constants; Matrix4Test::Matrix4Test() { @@ -159,6 +160,8 @@ void Matrix4Test::construct() { {4.5f, 4.0f, 7.0f, 2.0f}, {1.0f, 2.0f, 3.0f, -1.0f}, {7.9f, -1.0f, 8.0f, -1.5f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Matrix4Test::constructIdentity() { @@ -179,6 +182,9 @@ void Matrix4Test::constructIdentity() { CORRADE_COMPARE(identity, identityExpected); CORRADE_COMPARE(identity2, identityExpected); CORRADE_COMPARE(identity3, identity3Expected); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Matrix4Test::constructZero() { @@ -187,6 +193,8 @@ void Matrix4Test::constructZero() { {0.0f, 0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f, 0.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Matrix4Test::constructNoInit() { @@ -199,6 +207,8 @@ void Matrix4Test::constructNoInit() { {4.5f, 4.0f, 7.0f, 2.0f}, {1.0f, 2.0f, 3.0f, -1.0f}, {7.9f, -1.0f, 8.0f, -1.5f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Matrix4Test::constructConversion() { @@ -214,6 +224,8 @@ void Matrix4Test::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Matrix4Test::constructCopy() { @@ -229,6 +241,9 @@ void Matrix4Test::constructCopy() { {4.5f, 4.0f, 7.0f, 2.0f}, {1.0f, 2.0f, 3.0f, -1.0f}, {7.9f, -1.0f, 8.0f, -1.5f})); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void Matrix4Test::convert() { diff --git a/src/Magnum/Math/Test/MatrixTest.cpp b/src/Magnum/Math/Test/MatrixTest.cpp index 7a216e220..8b124f0a7 100644 --- a/src/Magnum/Math/Test/MatrixTest.cpp +++ b/src/Magnum/Math/Test/MatrixTest.cpp @@ -123,6 +123,8 @@ void MatrixTest::construct() { Vector4(4.5f, 4.0f, 7.0f, 2.0f), Vector4(1.0f, 2.0f, 3.0f, -1.0f), Vector4(7.9f, -1.0f, 8.0f, -1.5f))); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void MatrixTest::constructIdentity() { @@ -143,6 +145,9 @@ void MatrixTest::constructIdentity() { CORRADE_COMPARE(identity, identityExpected); CORRADE_COMPARE(identity2, identityExpected); CORRADE_COMPARE(identity3, identity3Expected); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void MatrixTest::constructZero() { @@ -151,6 +156,8 @@ void MatrixTest::constructZero() { Vector4(0.0f, 0.0f, 0.0f, 0.0f), Vector4(0.0f, 0.0f, 0.0f, 0.0f), Vector4(0.0f, 0.0f, 0.0f, 0.0f))); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void MatrixTest::constructNoInit() { @@ -163,6 +170,8 @@ void MatrixTest::constructNoInit() { Vector4(4.5f, 4.0f, 7.0f, 2.0f), Vector4(1.0f, 2.0f, 3.0f, -1.0f), Vector4(7.9f, -1.0f, 8.0f, -1.5f))); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void MatrixTest::constructConversion() { @@ -178,6 +187,8 @@ void MatrixTest::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void MatrixTest::constructCopy() { @@ -193,6 +204,9 @@ void MatrixTest::constructCopy() { Vector4(4.5f, 4.0f, 7.0f, 2.0f), Vector4(1.0f, 2.0f, 3.0f, -1.0f), Vector4(7.9f, -1.0f, 8.0f, -1.5f))); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void MatrixTest::convert() { diff --git a/src/Magnum/Math/Test/QuaternionTest.cpp b/src/Magnum/Math/Test/QuaternionTest.cpp index 106c3a366..908dc7ac3 100644 --- a/src/Magnum/Math/Test/QuaternionTest.cpp +++ b/src/Magnum/Math/Test/QuaternionTest.cpp @@ -148,6 +148,8 @@ void QuaternionTest::construct() { constexpr Float c = a.scalar(); CORRADE_COMPARE(b, Vector3(1.0f, 2.0f, 3.0f)); CORRADE_COMPARE(c, -4.0f); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void QuaternionTest::constructIdentity() { @@ -157,17 +159,24 @@ void QuaternionTest::constructIdentity() { CORRADE_COMPARE(b, Quaternion({0.0f, 0.0f, 0.0f}, 1.0f)); CORRADE_COMPARE(a.length(), 1.0f); CORRADE_COMPARE(b.length(), 1.0f); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void QuaternionTest::constructZero() { constexpr Quaternion a{ZeroInit}; CORRADE_COMPARE(a, Quaternion({0.0f, 0.0f, 0.0f}, 0.0f)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void QuaternionTest::constructNoInit() { Quaternion a{{1.0f, 2.0f, 3.0f}, -4.0f}; new(&a) Quaternion{NoInit}; CORRADE_COMPARE(a, Quaternion({1.0f, 2.0f, 3.0f}, -4.0f)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void QuaternionTest::constructFromVector() { @@ -176,6 +185,8 @@ void QuaternionTest::constructFromVector() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void QuaternionTest::constructConversion() { @@ -188,12 +199,17 @@ void QuaternionTest::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void QuaternionTest::constructCopy() { constexpr Quaternion a({1.0f, -3.0f, 7.0f}, 2.5f); constexpr Quaternion b(a); CORRADE_COMPARE(b, Quaternion({1.0f, -3.0f, 7.0f}, 2.5f)); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void QuaternionTest::convert() { diff --git a/src/Magnum/Math/Test/RangeTest.cpp b/src/Magnum/Math/Test/RangeTest.cpp index a428f77d9..d1efadc7e 100644 --- a/src/Magnum/Math/Test/RangeTest.cpp +++ b/src/Magnum/Math/Test/RangeTest.cpp @@ -178,6 +178,10 @@ void RangeTest::construct() { CORRADE_COMPARE(a, (Range<1, Int>(3, 23))); CORRADE_COMPARE(b, (Range<2, Int>({3, 5}, {23, 78}))); CORRADE_COMPARE(c, (Range<3, Int>({3, 5, -7}, {23, 78, 2}))); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void RangeTest::constructDefault() { @@ -194,6 +198,13 @@ void RangeTest::constructDefault() { CORRADE_COMPARE(b2, Range2Di({0, 0}, {0, 0})); CORRADE_COMPARE(c1, Range3Di({0, 0, 0}, {0, 0, 0})); CORRADE_COMPARE(c2, Range3Di({0, 0, 0}, {0, 0, 0})); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void RangeTest::constructNoInit() { @@ -208,6 +219,10 @@ void RangeTest::constructNoInit() { CORRADE_COMPARE(a, (Range1Di{3, 23})); CORRADE_COMPARE(b, (Range2Di{{3, 5}, {23, 78}})); CORRADE_COMPARE(c, (Range3Di{{3, 5, -7}, {23, 78, 2}})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void RangeTest::constructFromSize() { @@ -235,6 +250,10 @@ void RangeTest::constructConversion() { CORRADE_VERIFY(!(std::is_convertible::value)); CORRADE_VERIFY(!(std::is_convertible::value)); CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void RangeTest::constructCopy() { @@ -249,6 +268,13 @@ void RangeTest::constructCopy() { CORRADE_COMPARE(d, Range1Di(3, 23)); CORRADE_COMPARE(e, Range2Di({3, 5}, {23, 78})); CORRADE_COMPARE(f, Range3Di({3, 5, -7}, {23, 78, 2})); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void RangeTest::convert() { diff --git a/src/Magnum/Math/Test/RectangularMatrixTest.cpp b/src/Magnum/Math/Test/RectangularMatrixTest.cpp index 964e8f961..7deb7e198 100644 --- a/src/Magnum/Math/Test/RectangularMatrixTest.cpp +++ b/src/Magnum/Math/Test/RectangularMatrixTest.cpp @@ -150,6 +150,8 @@ void RectangularMatrixTest::construct() { CORRADE_COMPARE(a, Matrix3x4(Vector4(1.0f, 2.0f, 3.0f, 4.0f), Vector4(5.0f, 6.0f, 7.0f, 8.0f), Vector4(9.0f, 10.0f, 11.0f, 12.0f))); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void RectangularMatrixTest::constructDefault() { @@ -163,6 +165,9 @@ void RectangularMatrixTest::constructDefault() { Vector3(0.0f, 0.0f, 0.0f), Vector3(0.0f, 0.0f, 0.0f), Vector3(0.0f, 0.0f, 0.0f))); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void RectangularMatrixTest::constructNoInit() { @@ -173,6 +178,8 @@ void RectangularMatrixTest::constructNoInit() { CORRADE_COMPARE(a, Matrix3x4(Vector4(1.0f, 2.0f, 3.0f, 4.0f), Vector4(5.0f, 6.0f, 7.0f, 8.0f), Vector4(9.0f, 10.0f, 11.0f, 12.0f))); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void RectangularMatrixTest::constructConversion() { @@ -185,6 +192,8 @@ void RectangularMatrixTest::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void RectangularMatrixTest::constructFromData() { @@ -226,6 +235,9 @@ void RectangularMatrixTest::constructCopy() { CORRADE_COMPARE(b, Matrix3x4(Vector4(1.0f, 2.0f, 3.0f, 4.0f), Vector4(5.0f, 6.0f, 7.0f, 8.0f), Vector4(9.0f, 10.0f, 11.0f, 12.0f))); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void RectangularMatrixTest::convert() { diff --git a/src/Magnum/Math/Test/UnitTest.cpp b/src/Magnum/Math/Test/UnitTest.cpp index 256497e90..8234958df 100644 --- a/src/Magnum/Math/Test/UnitTest.cpp +++ b/src/Magnum/Math/Test/UnitTest.cpp @@ -74,17 +74,23 @@ void UnitTest::construct() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void UnitTest::constructDefault() { constexpr Sec b; CORRADE_COMPARE(b, Sec(0.0f)); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); } void UnitTest::constructNoInit() { Sec a{25.0f}; new(&a) Sec{NoInit}; CORRADE_COMPARE(a, Sec{25.0f}); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void UnitTest::constructConversion() { @@ -94,6 +100,8 @@ void UnitTest::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void UnitTest::compare() { diff --git a/src/Magnum/Math/Test/Vector2Test.cpp b/src/Magnum/Math/Test/Vector2Test.cpp index d066d8e21..55bee65e3 100644 --- a/src/Magnum/Math/Test/Vector2Test.cpp +++ b/src/Magnum/Math/Test/Vector2Test.cpp @@ -104,6 +104,8 @@ Vector2Test::Vector2Test() { void Vector2Test::construct() { constexpr Vector2 a = {1.5f, 2.5f}; CORRADE_COMPARE(a, (Vector<2, Float>(1.5f, 2.5f))); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector2Test::constructDefault() { @@ -111,12 +113,17 @@ void Vector2Test::constructDefault() { constexpr Vector2 b{ZeroInit}; CORRADE_COMPARE(a, Vector2(0.0f, 0.0f)); CORRADE_COMPARE(b, Vector2(0.0f, 0.0f)); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector2Test::constructNoInit() { Vector2 a{1.5f, 2.5f}; new(&a) Vector2{NoInit}; CORRADE_COMPARE(a, (Vector2{1.5f, 2.5f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector2Test::constructOneValue() { @@ -125,6 +132,8 @@ void Vector2Test::constructOneValue() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector2Test::constructConversion() { @@ -134,6 +143,8 @@ void Vector2Test::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector2Test::constructCopy() { @@ -143,6 +154,9 @@ void Vector2Test::constructCopy() { #endif Vector2 b(a); CORRADE_COMPARE(b, Vector2(1.5f, 2.5f)); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void Vector2Test::convert() { diff --git a/src/Magnum/Math/Test/Vector3Test.cpp b/src/Magnum/Math/Test/Vector3Test.cpp index 8d53b8f79..72c5be4c1 100644 --- a/src/Magnum/Math/Test/Vector3Test.cpp +++ b/src/Magnum/Math/Test/Vector3Test.cpp @@ -102,6 +102,8 @@ Vector3Test::Vector3Test() { void Vector3Test::construct() { constexpr Vector3 a = {1.0f, 2.5f, -3.0f}; CORRADE_COMPARE(a, (Vector<3, Float>(1.0f, 2.5f, -3.0f))); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector3Test::constructDefault() { @@ -109,12 +111,17 @@ void Vector3Test::constructDefault() { constexpr Vector3 b{ZeroInit}; CORRADE_COMPARE(a, Vector3(0.0f, 0.0f, 0.0f)); CORRADE_COMPARE(b, Vector3(0.0f, 0.0f, 0.0f)); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector3Test::constructNoInit() { Vector3 a{1.0f, 2.5f, -3.0f}; new(&a) Vector3{NoInit}; CORRADE_COMPARE(a, (Vector3{1.0f, 2.5f, -3.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector3Test::constructOneValue() { @@ -123,12 +130,16 @@ void Vector3Test::constructOneValue() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector3Test::constructParts() { constexpr Vector2 a(1.0f, 2.0f); constexpr Vector3 b = {a, 3.0f}; CORRADE_COMPARE(b, Vector3(1.0f, 2.0f, 3.0f)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector3Test::constructConversion() { @@ -138,6 +149,8 @@ void Vector3Test::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector3Test::constructCopy() { @@ -147,6 +160,9 @@ void Vector3Test::constructCopy() { #endif Vector3 b(a); CORRADE_COMPARE(b, Vector3(1.0f, 2.5f, -3.0f)); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void Vector3Test::convert() { diff --git a/src/Magnum/Math/Test/Vector4Test.cpp b/src/Magnum/Math/Test/Vector4Test.cpp index 5eff2562a..2dcce57b8 100644 --- a/src/Magnum/Math/Test/Vector4Test.cpp +++ b/src/Magnum/Math/Test/Vector4Test.cpp @@ -101,6 +101,8 @@ Vector4Test::Vector4Test() { void Vector4Test::construct() { constexpr Vector4 a = {1.0f, -2.5f, 3.0f, 4.1f}; CORRADE_COMPARE(a, (Vector<4, Float>(1.0f, -2.5f, 3.0f, 4.1f))); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector4Test::constructPad() { @@ -124,12 +126,17 @@ void Vector4Test::constructDefault() { constexpr Vector4 b{ZeroInit}; CORRADE_COMPARE(a, Vector4(0.0f, 0.0f, 0.0f, 0.0f)); CORRADE_COMPARE(b, Vector4(0.0f, 0.0f, 0.0f, 0.0f)); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector4Test::constructNoInit() { Vector4 a{1.0f, -2.5f, 3.0f, 4.1f}; new(&a) Vector4{NoInit}; CORRADE_COMPARE(a, (Vector4{1.0f, -2.5f, 3.0f, 4.1f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector4Test::constructOneValue() { @@ -138,12 +145,16 @@ void Vector4Test::constructOneValue() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector4Test::constructParts() { constexpr Vector3 a(1.0f, 2.0f, 3.0f); constexpr Vector4 b = {a, 4.0f}; CORRADE_COMPARE(b, Vector4(1.0f, 2.0f, 3.0f, 4.0f)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector4Test::constructConversion() { @@ -153,6 +164,8 @@ void Vector4Test::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void Vector4Test::constructCopy() { @@ -162,6 +175,9 @@ void Vector4Test::constructCopy() { #endif Vector4 b(a); CORRADE_COMPARE(b, Vector4(1.0f, -2.5f, 3.0f, 4.1f)); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void Vector4Test::convert() { diff --git a/src/Magnum/Math/Test/VectorTest.cpp b/src/Magnum/Math/Test/VectorTest.cpp index c525242b9..5c754a3b6 100644 --- a/src/Magnum/Math/Test/VectorTest.cpp +++ b/src/Magnum/Math/Test/VectorTest.cpp @@ -174,6 +174,8 @@ VectorTest::VectorTest() { void VectorTest::construct() { constexpr Vector4 a = {1.0f, 2.0f, -3.0f, 4.5f}; CORRADE_COMPARE(a, Vector4(1.0f, 2.0f, -3.0f, 4.5f)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void VectorTest::constructFromData() { @@ -198,12 +200,17 @@ void VectorTest::constructDefault() { constexpr Vector4 b{ZeroInit}; CORRADE_COMPARE(a, Vector4(0.0f, 0.0f, 0.0f, 0.0f)); CORRADE_COMPARE(b, Vector4(0.0f, 0.0f, 0.0f, 0.0f)); + + CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void VectorTest::constructNoInit() { Vector4 a{1.0f, 2.0f, -3.0f, 4.5f}; new(&a) Vector4{NoInit}; CORRADE_COMPARE(a, (Vector4{1.0f, 2.0f, -3.0f, 4.5f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void VectorTest::constructOneValue() { @@ -213,6 +220,8 @@ void VectorTest::constructOneValue() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void VectorTest::constructOneComponent() { @@ -221,6 +230,8 @@ void VectorTest::constructOneComponent() { /* Implicit constructor must work */ constexpr Vector1 vec = 1.0f; CORRADE_COMPARE(vec, Vector1(1)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void VectorTest::constructConversion() { @@ -231,12 +242,17 @@ void VectorTest::constructConversion() { /* Implicit conversion is not allowed */ CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void VectorTest::constructCopy() { constexpr Vector4 a(1.0f, 3.5f, 4.0f, -2.7f); constexpr Vector4 b(a); CORRADE_COMPARE(b, Vector4(1.0f, 3.5f, 4.0f, -2.7f)); + + CORRADE_VERIFY(std::is_nothrow_copy_constructible::value); + CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } void VectorTest::convert() { diff --git a/src/Magnum/Math/Unit.h b/src/Magnum/Math/Unit.h index 840df7f47..571b98e22 100644 --- a/src/Magnum/Math/Unit.h +++ b/src/Magnum/Math/Unit.h @@ -47,16 +47,19 @@ template class Derived, class T> class Unit { typedef T Type; /**< @brief Underlying data type */ /** @brief Construct zero value */ - constexpr /*implicit*/ Unit(ZeroInitT = ZeroInit): _value(T(0)) {} + constexpr /*implicit*/ Unit(ZeroInitT = ZeroInit) noexcept: _value(T(0)) {} /** @brief Construct without initializing the contents */ - explicit Unit(NoInitT) {} + explicit Unit(NoInitT) noexcept {} /** @brief Explicit conversion from unitless type */ - constexpr explicit Unit(T value): _value(value) {} + constexpr explicit Unit(T value) noexcept: _value(value) {} /** @brief Construct from another underlying type */ - template constexpr explicit Unit(Unit value): _value(T(value._value)) {} + template constexpr explicit Unit(Unit value) noexcept: _value(T(value._value)) {} + + /** @brief Copy constructor */ + constexpr /*implicit*/ Unit(const Unit& other) noexcept = default; /** @brief Explicit conversion to underlying type */ constexpr explicit operator T() const { return _value; } diff --git a/src/Magnum/Math/Vector.h b/src/Magnum/Math/Vector.h index 3755feba7..7f40e1d65 100644 --- a/src/Magnum/Math/Vector.h +++ b/src/Magnum/Math/Vector.h @@ -173,10 +173,10 @@ template class Vector { * \boldsymbol v = \boldsymbol 0 * @f] */ - constexpr /*implicit*/ Vector(ZeroInitT = ZeroInit): _data{} {} + constexpr /*implicit*/ Vector(ZeroInitT = ZeroInit) noexcept: _data{} {} /** @brief Construct vector without initializing the contents */ - explicit Vector(NoInitT) {} + explicit Vector(NoInitT) noexcept {} /** @todo Creating Vector from combination of vector and scalar types */ @@ -186,16 +186,16 @@ template class Vector { * @param next Next values */ #ifdef DOXYGEN_GENERATING_OUTPUT - template constexpr /*implicit*/ Vector(T first, U... next); + template constexpr /*implicit*/ Vector(T first, U... next) noexcept; #else - template::type> constexpr /*implicit*/ Vector(T first, U... next): _data{first, next...} {} + template::type> constexpr /*implicit*/ Vector(T first, U... next) noexcept: _data{first, next...} {} #endif /** @brief Construct vector with one value for all fields */ #ifdef DOXYGEN_GENERATING_OUTPUT - constexpr explicit Vector(T value); + constexpr explicit Vector(T value) noexcept; #else - template::value && size != 1, T>::type> constexpr explicit Vector(U value): Vector(typename Implementation::GenerateSequence::Type(), value) {} + template::value && size != 1, T>::type> constexpr explicit Vector(U value) noexcept: Vector(typename Implementation::GenerateSequence::Type(), value) {} #endif /** @@ -209,13 +209,13 @@ template class Vector { * // integral == {1, 2, -15, 7} * @endcode */ - template constexpr explicit Vector(const Vector& other): Vector(typename Implementation::GenerateSequence::Type(), other) {} + template constexpr explicit Vector(const Vector& other) noexcept: Vector(typename Implementation::GenerateSequence::Type(), other) {} /** @brief Construct vector from external representation */ - template::from(std::declval()))> constexpr explicit Vector(const U& other): Vector(Implementation::VectorConverter::from(other)) {} + template::from(std::declval()))> constexpr explicit Vector(const U& other) noexcept: Vector(Implementation::VectorConverter::from(other)) {} /** @brief Copy constructor */ - constexpr Vector(const Vector&) = default; + constexpr /*implicit*/ Vector(const Vector&) noexcept = default; /** @brief Convert vector to external representation */ template::to(std::declval>()))> constexpr explicit operator U() const { @@ -574,10 +574,10 @@ template class Vector { private: /* Implementation for Vector::Vector(const Vector&) */ - template constexpr explicit Vector(Implementation::Sequence, const Vector& vector): _data{T(vector._data[sequence])...} {} + template constexpr explicit Vector(Implementation::Sequence, const Vector& vector) noexcept: _data{T(vector._data[sequence])...} {} /* Implementation for Vector::Vector(U) */ - template constexpr explicit Vector(Implementation::Sequence, T value): _data{Implementation::repeat(value, sequence)...} {} + template constexpr explicit Vector(Implementation::Sequence, T value) noexcept: _data{Implementation::repeat(value, sequence)...} {} template constexpr static Vector padInternal(Implementation::Sequence, const Vector& a, T value) { return {sequence < otherSize ? a[sequence] : value...}; diff --git a/src/Magnum/Math/Vector2.h b/src/Magnum/Math/Vector2.h index 9bd0809ff..1c6d68e2d 100644 --- a/src/Magnum/Math/Vector2.h +++ b/src/Magnum/Math/Vector2.h @@ -112,7 +112,7 @@ template class Vector2: public Vector<2, T> { #endif /** @copydoc Vector::Vector(ZeroInitT) */ - constexpr /*implicit*/ Vector2(ZeroInitT = ZeroInit) + constexpr /*implicit*/ Vector2(ZeroInitT = ZeroInit) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -121,7 +121,7 @@ template class Vector2: public Vector<2, T> { {} /** @copydoc Vector::Vector(NoInitT) */ - explicit Vector2(NoInitT) + explicit Vector2(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -130,7 +130,7 @@ template class Vector2: public Vector<2, T> { {} /** @copydoc Vector::Vector(T) */ - constexpr explicit Vector2(T value): Vector<2, T>(value) {} + constexpr explicit Vector2(T value) noexcept: Vector<2, T>(value) {} /** * @brief Constructor @@ -139,10 +139,10 @@ template class Vector2: public Vector<2, T> { * \boldsymbol v = \begin{pmatrix} x \\ y \end{pmatrix} * @f] */ - constexpr /*implicit*/ Vector2(T x, T y): Vector<2, T>(x, y) {} + constexpr /*implicit*/ Vector2(T x, T y) noexcept: Vector<2, T>(x, y) {} /** @copydoc Vector::Vector(const Vector&) */ - template constexpr explicit Vector2(const Vector<2, U>& other): Vector<2, T>(other) {} + template constexpr explicit Vector2(const Vector<2, U>& other) noexcept: Vector<2, T>(other) {} /** @brief Construct vector from external representation */ template class Vector2: public Vector<2, T> { constexpr explicit Vector2(const U& other): Vector<2, T>(Implementation::VectorConverter<2, T, U>::from(other)) {} /** @brief Copy constructor */ - constexpr Vector2(const Vector<2, T>& other): Vector<2, T>(other) {} + constexpr /*implicit*/ Vector2(const Vector<2, T>& other) noexcept: Vector<2, T>(other) {} T& x() { return (*this)[0]; } /**< @brief X component */ constexpr T x() const { return (*this)[0]; } /**< @overload */ diff --git a/src/Magnum/Math/Vector3.h b/src/Magnum/Math/Vector3.h index 4302c5322..0b14ea04e 100644 --- a/src/Magnum/Math/Vector3.h +++ b/src/Magnum/Math/Vector3.h @@ -134,7 +134,7 @@ template class Vector3: public Vector<3, T> { #endif /** @copydoc Vector::Vector(ZeroInitT) */ - constexpr /*implicit*/ Vector3(ZeroInitT = ZeroInit) + constexpr /*implicit*/ Vector3(ZeroInitT = ZeroInit) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -143,7 +143,7 @@ template class Vector3: public Vector<3, T> { {} /** @copydoc Vector::Vector(NoInitT) */ - explicit Vector3(NoInitT) + explicit Vector3(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -152,7 +152,7 @@ template class Vector3: public Vector<3, T> { {} /** @copydoc Vector::Vector(T) */ - constexpr explicit Vector3(T value): Vector<3, T>(value) {} + constexpr explicit Vector3(T value) noexcept: Vector<3, T>(value) {} /** * @brief Constructor @@ -161,7 +161,7 @@ template class Vector3: public Vector<3, T> { * \boldsymbol v = \begin{pmatrix} x \\ y \\ z \end{pmatrix} * @f] */ - constexpr /*implicit*/ Vector3(T x, T y, T z): Vector<3, T>(x, y, z) {} + constexpr /*implicit*/ Vector3(T x, T y, T z) noexcept: Vector<3, T>(x, y, z) {} /** * @brief Constructor @@ -170,10 +170,10 @@ template class Vector3: public Vector<3, T> { * \boldsymbol v = \begin{pmatrix} v_x \\ v_y \\ z \end{pmatrix} * @f] */ - constexpr /*implicit*/ Vector3(const Vector2& xy, T z): Vector<3, T>(xy[0], xy[1], z) {} + constexpr /*implicit*/ Vector3(const Vector2& xy, T z) noexcept: Vector<3, T>(xy[0], xy[1], z) {} /** @copydoc Vector::Vector(const Vector&) */ - template constexpr explicit Vector3(const Vector<3, U>& other): Vector<3, T>(other) {} + template constexpr explicit Vector3(const Vector<3, U>& other) noexcept: Vector<3, T>(other) {} /** @brief Construct vector from external representation */ template class Vector3: public Vector<3, T> { constexpr explicit Vector3(const U& other): Vector<3, T>(Implementation::VectorConverter<3, T, U>::from(other)) {} /** @brief Copy constructor */ - constexpr Vector3(const Vector<3, T>& other): Vector<3, T>(other) {} + constexpr /*implicit*/ Vector3(const Vector<3, T>& other) noexcept: Vector<3, T>(other) {} /** * @brief X component diff --git a/src/Magnum/Math/Vector4.h b/src/Magnum/Math/Vector4.h index baf4c7ee0..1323b3ee4 100644 --- a/src/Magnum/Math/Vector4.h +++ b/src/Magnum/Math/Vector4.h @@ -60,7 +60,7 @@ template class Vector4: public Vector<4, T> { } /** @copydoc Vector::Vector(ZeroInitT) */ - constexpr /*implicit*/ Vector4(ZeroInitT = ZeroInit) + constexpr /*implicit*/ Vector4(ZeroInitT = ZeroInit) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -69,7 +69,7 @@ template class Vector4: public Vector<4, T> { {} /** @copydoc Vector::Vector(NoInitT) */ - explicit Vector4(NoInitT) + explicit Vector4(NoInitT) noexcept /** @todoc remove workaround when doxygen is sane */ #ifndef DOXYGEN_GENERATING_OUTPUT /* MSVC 2015 can't handle {} here */ @@ -78,7 +78,7 @@ template class Vector4: public Vector<4, T> { {} /** @copydoc Vector::Vector(T) */ - constexpr explicit Vector4(T value): Vector<4, T>(value) {} + constexpr explicit Vector4(T value) noexcept: Vector<4, T>(value) {} /** * @brief Constructor @@ -87,7 +87,7 @@ template class Vector4: public Vector<4, T> { * \boldsymbol v = \begin{pmatrix} x \\ y \\ z \\ w \end{pmatrix} * @f] */ - constexpr /*implicit*/ Vector4(T x, T y, T z, T w): Vector<4, T>(x, y, z, w) {} + constexpr /*implicit*/ Vector4(T x, T y, T z, T w) noexcept: Vector<4, T>(x, y, z, w) {} /** * @brief Constructor @@ -96,16 +96,16 @@ template class Vector4: public Vector<4, T> { * \boldsymbol v = \begin{pmatrix} v_x \\ v_y \\ v_z \\ w \end{pmatrix} * @f] */ - constexpr /*implicit*/ Vector4(const Vector3& xyz, T w): Vector<4, T>(xyz[0], xyz[1], xyz[2], w) {} + constexpr /*implicit*/ Vector4(const Vector3& xyz, T w) noexcept: Vector<4, T>(xyz[0], xyz[1], xyz[2], w) {} /** @copydoc Vector::Vector(const Vector&) */ - template constexpr explicit Vector4(const Vector<4, U>& other): Vector<4, T>(other) {} + template constexpr explicit Vector4(const Vector<4, U>& other) noexcept: Vector<4, T>(other) {} /** @brief Construct vector from external representation */ template::from(std::declval()))> constexpr explicit Vector4(const U& other): Vector<4, T>(Implementation::VectorConverter<4, T, U>::from(other)) {} /** @brief Copy constructor */ - constexpr Vector4(const Vector<4, T>& other): Vector<4, T>(other) {} + constexpr /*implicit*/ Vector4(const Vector<4, T>& other) noexcept: Vector<4, T>(other) {} /** * @brief X component From 844bfcce5a7c04bf7b71fb384ff58b48bfff899e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 31 Aug 2016 21:06:16 +0200 Subject: [PATCH 151/290] Math: ability to create Dual with ZeroInit tag. It does slightly different things than the implicit constructor for some types. --- src/Magnum/Math/Dual.h | 9 +++++++++ src/Magnum/Math/Test/DualTest.cpp | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/Magnum/Math/Dual.h b/src/Magnum/Math/Dual.h index da09c5757..14aa88488 100644 --- a/src/Magnum/Math/Dual.h +++ b/src/Magnum/Math/Dual.h @@ -59,6 +59,15 @@ template class Dual { */ constexpr /*implicit*/ Dual() noexcept: _real{}, _dual{} {} + /** @brief Construct zero-initialized dual number */ + #ifdef DOXYGEN_GENERATING_OUTPUT + constexpr /*implicit*/ Dual(ZeroInitT) noexcept; + #else + /* MSVC 2015 can't handle {} instead of ::value */ + template::value>::type> constexpr /*implicit*/ Dual(ZeroInitT) noexcept: _real{}, _dual{} {} + template::value>::type> constexpr /*implicit*/ Dual(ZeroInitT) noexcept: _real{ZeroInit}, _dual{ZeroInit} {} + #endif + /** @brief Construct without initializing the contents */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit Dual(NoInitT) noexcept; diff --git a/src/Magnum/Math/Test/DualTest.cpp b/src/Magnum/Math/Test/DualTest.cpp index dbb5c4b44..973b56f7c 100644 --- a/src/Magnum/Math/Test/DualTest.cpp +++ b/src/Magnum/Math/Test/DualTest.cpp @@ -37,6 +37,7 @@ struct DualTest: Corrade::TestSuite::Tester { void construct(); void constructDefault(); + void constructZero(); void constructNoInit(); void constructConversion(); void constructCopy(); @@ -73,6 +74,7 @@ using namespace Literals; DualTest::DualTest() { addTests({&DualTest::construct, &DualTest::constructDefault, + &DualTest::constructZero, &DualTest::constructNoInit, &DualTest::constructConversion, &DualTest::constructCopy, @@ -120,6 +122,16 @@ void DualTest::constructDefault() { CORRADE_VERIFY(std::is_nothrow_default_constructible::value); } +void DualTest::constructZero() { + constexpr Dual a{ZeroInit}; + constexpr Math::Dual> b{ZeroInit}; + CORRADE_COMPARE(a, Dual(0.0f, 0.0f)); + CORRADE_COMPARE(b, Math::Dual>({{0.0f, 0.0f, 0.0f}, 0.0f}, {{0.0f, 0.0f, 0.0f}, 0.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible>, ZeroInitT>::value)); +} + void DualTest::constructNoInit() { Dual a{2.0f, -7.5f}; Math::Dual> b{{{3.0f, 0.1f, 1.0f}, 1.0f}, {{0.1f, 0.0f, 1.0f}, 0.3f}}; From 7bebbbb1ec068af525b187f98892db6f067f9e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 31 Aug 2016 21:07:15 +0200 Subject: [PATCH 152/290] Math: minor cleanup. --- src/Magnum/Math/Range.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magnum/Math/Range.h b/src/Magnum/Math/Range.h index ceefa56da..19c4339c5 100644 --- a/src/Magnum/Math/Range.h +++ b/src/Magnum/Math/Range.h @@ -200,6 +200,7 @@ template class Range { static Type fromSize(const VectorType& min, const VectorType& size) { \ return Range::fromSize(min, size); \ } \ + \ Type translated(const VectorType& vector) const { \ return Range::translated(vector); \ } \ From fa36cf648cad653a19d5b5f6aa9fd03337caccf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 31 Aug 2016 21:07:36 +0200 Subject: [PATCH 153/290] Math: document facts for older version of me. I spent some minutes actually implementing that until I realized that this would lead only to pain and misery. --- src/Magnum/Math/DualComplex.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Magnum/Math/DualComplex.h b/src/Magnum/Math/DualComplex.h index f1a5df321..ad13a5095 100644 --- a/src/Magnum/Math/DualComplex.h +++ b/src/Magnum/Math/DualComplex.h @@ -136,6 +136,9 @@ template class DualComplex: public Dual> { */ constexpr /*implicit*/ DualComplex(const Complex& real, const Complex& dual = Complex(T(0), T(0))) noexcept: Dual>(real, dual) {} + /* No constructor from a pair of Dual values because that would be + ambiguous with the above */ + /** * @brief Construct dual complex number from vector * From 48dfdc1da5054dcc3d94320eadbbc2210e3d1197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 31 Aug 2016 21:08:17 +0200 Subject: [PATCH 154/290] Math: properly test constructing Unit with ZeroInit tag. --- src/Magnum/Math/Test/UnitTest.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Math/Test/UnitTest.cpp b/src/Magnum/Math/Test/UnitTest.cpp index 8234958df..0bbf1a7ed 100644 --- a/src/Magnum/Math/Test/UnitTest.cpp +++ b/src/Magnum/Math/Test/UnitTest.cpp @@ -79,10 +79,13 @@ void UnitTest::construct() { } void UnitTest::constructDefault() { - constexpr Sec b; + constexpr Sec a; + constexpr Sec b{ZeroInit}; + CORRADE_COMPARE(a, Sec(0.0f)); CORRADE_COMPARE(b, Sec(0.0f)); CORRADE_VERIFY(std::is_nothrow_default_constructible::value); + CORRADE_VERIFY((std::is_nothrow_constructible::value)); } void UnitTest::constructNoInit() { From 9ade2cae479ad904e26c52d5689bc5522798c5c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 12:01:50 +0200 Subject: [PATCH 155/290] Math: added TypeTraits::name(), using that in the test. --- src/Magnum/Math/Test/TypeTraitsTest.cpp | 63 +++++++++++++++++-------- src/Magnum/Math/TypeTraits.h | 31 +++++++++++- 2 files changed, 72 insertions(+), 22 deletions(-) diff --git a/src/Magnum/Math/Test/TypeTraitsTest.cpp b/src/Magnum/Math/Test/TypeTraitsTest.cpp index 82d22fcbd..b3767e999 100644 --- a/src/Magnum/Math/Test/TypeTraitsTest.cpp +++ b/src/Magnum/Math/Test/TypeTraitsTest.cpp @@ -33,6 +33,8 @@ namespace Magnum { namespace Math { namespace Test { struct TypeTraitsTest: Corrade::TestSuite::Tester { explicit TypeTraitsTest(); + void name(); + template void equalsIntegral(); template void equalsFloatingPoint0(); template void equalsFloatingPoint1(); @@ -42,53 +44,74 @@ struct TypeTraitsTest: Corrade::TestSuite::Tester { }; TypeTraitsTest::TypeTraitsTest() { - addTests({&TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - #ifndef CORRADE_TARGET_EMSCRIPTEN - &TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - #endif - &TypeTraitsTest::equalsFloatingPoint0, - &TypeTraitsTest::equalsFloatingPoint0, - &TypeTraitsTest::equalsFloatingPoint1, - &TypeTraitsTest::equalsFloatingPoint1, - &TypeTraitsTest::equalsFloatingPointLarge, - &TypeTraitsTest::equalsFloatingPointLarge, - &TypeTraitsTest::equalsFloatingPointInfinity, - &TypeTraitsTest::equalsFloatingPointInfinity, - &TypeTraitsTest::equalsFloatingPointNaN, - &TypeTraitsTest::equalsFloatingPointNaN}); + addTests({ + &TypeTraitsTest::name, + + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + #ifndef CORRADE_TARGET_EMSCRIPTEN + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + #endif + + &TypeTraitsTest::equalsFloatingPoint0, + &TypeTraitsTest::equalsFloatingPoint0, + &TypeTraitsTest::equalsFloatingPoint1, + &TypeTraitsTest::equalsFloatingPoint1, + &TypeTraitsTest::equalsFloatingPointLarge, + &TypeTraitsTest::equalsFloatingPointLarge, + &TypeTraitsTest::equalsFloatingPointInfinity, + &TypeTraitsTest::equalsFloatingPointInfinity, + &TypeTraitsTest::equalsFloatingPointNaN, + &TypeTraitsTest::equalsFloatingPointNaN}); +} + +void TypeTraitsTest::name() { + CORRADE_COMPARE(TypeTraits::name(), "UnsignedShort"); + CORRADE_COMPARE(TypeTraits::name(), "Float"); } template void TypeTraitsTest::equalsIntegral() { + setTestCaseName(std::string{"equalsIntegral<"} + TypeTraits::name() + ">"); + CORRADE_VERIFY(!TypeTraits::equals(1, 1+TypeTraits::epsilon())); } template void TypeTraitsTest::equalsFloatingPoint0() { + setTestCaseName(std::string{"equalsFloatingPoint0<"} + TypeTraits::name() + ">"); + CORRADE_VERIFY(TypeTraits::equals(T(0)+TypeTraits::epsilon()/T(2), T(0))); CORRADE_VERIFY(!TypeTraits::equals(T(0)+TypeTraits::epsilon()*T(2), T(0))); } template void TypeTraitsTest::equalsFloatingPoint1() { + setTestCaseName(std::string{"equalsFloatingPoint1<"} + TypeTraits::name() + ">"); + CORRADE_VERIFY(TypeTraits::equals(T(1)+TypeTraits::epsilon()/T(2), T(1))); CORRADE_VERIFY(!TypeTraits::equals(T(1)+TypeTraits::epsilon()*T(3), T(1))); } template void TypeTraitsTest::equalsFloatingPointLarge() { + setTestCaseName(std::string{"equalsFloatingPointLarge<"} + TypeTraits::name() + ">"); + CORRADE_VERIFY(TypeTraits::equals(T(25)+TypeTraits::epsilon()*T(2), T(25))); CORRADE_VERIFY(!TypeTraits::equals(T(25)+TypeTraits::epsilon()*T(75), T(25))); } template void TypeTraitsTest::equalsFloatingPointInfinity() { + setTestCaseName(std::string{"equalsFloatingPointInfinity<"} + TypeTraits::name() + ">"); + CORRADE_VERIFY(TypeTraits::equals(Constants::inf(), Constants::inf())); } template void TypeTraitsTest::equalsFloatingPointNaN() { + setTestCaseName(std::string{"equalsFloatingPointNaN<"} + TypeTraits::name() + ">"); + CORRADE_VERIFY(!TypeTraits::equals(Constants::nan(), Constants::nan())); } diff --git a/src/Magnum/Math/TypeTraits.h b/src/Magnum/Math/TypeTraits.h index b15869ea6..1632b7c89 100644 --- a/src/Magnum/Math/TypeTraits.h +++ b/src/Magnum/Math/TypeTraits.h @@ -87,6 +87,14 @@ template struct TypeTraits: Implementation::TypeTraitsDefault { */ typedef U FloatingPointType; + /** + * @brief Type name + * + * Returns a string representation of type name, such as `"UnsignedInt"` + * for @ref UnsignedInt. + */ + constexpr static const char* name(); + /** * @brief Epsilon value for fuzzy compare * @@ -108,7 +116,26 @@ template struct TypeTraits: Implementation::TypeTraitsDefault { /* Integral scalar types */ namespace Implementation { - template struct TypeTraitsIntegral: TypeTraitsDefault { + template struct TypeTraitsName; + #define _c(type) template<> struct TypeTraitsName { \ + constexpr static const char* name() { return #type; } \ + }; + _c(UnsignedByte) + _c(Byte) + _c(UnsignedShort) + _c(Short) + _c(UnsignedInt) + _c(Int) + #ifndef MAGNUM_TARGET_WEBGL + _c(UnsignedLong) + _c(Long) + #endif + _c(Float) + _c(Double) + _c(long double) + #undef _c + + template struct TypeTraitsIntegral: TypeTraitsDefault, TypeTraitsName { constexpr static T epsilon() { return T(1); } }; } @@ -144,7 +171,7 @@ template<> struct TypeTraits: Implementation::TypeTraitsIntegral { /* Floating-point scalar types */ namespace Implementation { -template struct TypeTraitsFloatingPoint { +template struct TypeTraitsFloatingPoint: TypeTraitsName { TypeTraitsFloatingPoint() = delete; static bool equals(T a, T b); From 70ebf8299231c5258374a8f6a18f71f277b50ec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 18:15:56 +0200 Subject: [PATCH 156/290] Math: updated fuzzy comparison epsilon values for long double and double. To be consistent with what's for floats. Maybe I'll need to decrease the precision later again, but at least this has now some real background instead of being a guesstimate. --- src/Magnum/Math/TypeTraits.h | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Magnum/Math/TypeTraits.h b/src/Magnum/Math/TypeTraits.h index 1632b7c89..1e0db2f5b 100644 --- a/src/Magnum/Math/TypeTraits.h +++ b/src/Magnum/Math/TypeTraits.h @@ -33,22 +33,34 @@ #include "Magnum/Types.h" -/** @brief Precision when testing floats for equality */ +/** +@brief Precision when testing floats for equality + +They have "at least" 6 significant digits of precision, taking one digit less +for more headroom. +*/ #ifndef FLOAT_EQUALITY_PRECISION #define FLOAT_EQUALITY_PRECISION 1.0e-5f #endif -/** @brief Precision when testing doubles for equality */ +/** +@brief Precision when testing doubles for equality + +They have "at least" 15 significant digits of precision, taking one digit less +for more headroom. +*/ #ifndef DOUBLE_EQUALITY_PRECISION -#define DOUBLE_EQUALITY_PRECISION 1.0e-12 +#define DOUBLE_EQUALITY_PRECISION 1.0e-14 #endif /** @brief Precision when testing long doubles for equality -@todo some proper value please + +They have "at least" 18 significant digits of precision, taking one digit less +for more headroom. */ #ifndef LONG_DOUBLE_EQUALITY_PRECISION -#define LONG_DOUBLE_EQUALITY_PRECISION 1.0e-18l +#define LONG_DOUBLE_EQUALITY_PRECISION 1.0e-17l #endif namespace Magnum { namespace Math { From 3c17a53fb33ac921ca769e8d96755d343b00f147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 18:19:52 +0200 Subject: [PATCH 157/290] Math: test also long double versions of TypeTraits. --- src/Magnum/Math/Test/TypeTraitsTest.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Magnum/Math/Test/TypeTraitsTest.cpp b/src/Magnum/Math/Test/TypeTraitsTest.cpp index b3767e999..7790269b8 100644 --- a/src/Magnum/Math/Test/TypeTraitsTest.cpp +++ b/src/Magnum/Math/Test/TypeTraitsTest.cpp @@ -60,10 +60,19 @@ TypeTraitsTest::TypeTraitsTest() { &TypeTraitsTest::equalsFloatingPoint0, &TypeTraitsTest::equalsFloatingPoint0, + #ifndef CORRADE_TARGET_EMSCRIPTEN + &TypeTraitsTest::equalsFloatingPoint0, + #endif &TypeTraitsTest::equalsFloatingPoint1, &TypeTraitsTest::equalsFloatingPoint1, + #ifndef CORRADE_TARGET_EMSCRIPTEN + &TypeTraitsTest::equalsFloatingPoint1, + #endif &TypeTraitsTest::equalsFloatingPointLarge, &TypeTraitsTest::equalsFloatingPointLarge, + #ifndef CORRADE_TARGET_EMSCRIPTEN + &TypeTraitsTest::equalsFloatingPointLarge, + #endif &TypeTraitsTest::equalsFloatingPointInfinity, &TypeTraitsTest::equalsFloatingPointInfinity, &TypeTraitsTest::equalsFloatingPointNaN, @@ -78,6 +87,8 @@ void TypeTraitsTest::name() { template void TypeTraitsTest::equalsIntegral() { setTestCaseName(std::string{"equalsIntegral<"} + TypeTraits::name() + ">"); + CORRADE_VERIFY(TypeTraits::equals(1, 1)); + CORRADE_VERIFY(!TypeTraits::equals(1, -1)); CORRADE_VERIFY(!TypeTraits::equals(1, 1+TypeTraits::epsilon())); } From 74c75998b099ec340ba68ec9451c6445436aada1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 18:20:49 +0200 Subject: [PATCH 158/290] Math: added TypeTraits::equalsZero(). --- src/Magnum/Math/Test/TypeTraitsTest.cpp | 89 ++++++++++++++++++++++++- src/Magnum/Math/TypeTraits.h | 35 ++++++++++ 2 files changed, 123 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Math/Test/TypeTraitsTest.cpp b/src/Magnum/Math/Test/TypeTraitsTest.cpp index 7790269b8..cb24fc050 100644 --- a/src/Magnum/Math/Test/TypeTraitsTest.cpp +++ b/src/Magnum/Math/Test/TypeTraitsTest.cpp @@ -41,8 +41,37 @@ struct TypeTraitsTest: Corrade::TestSuite::Tester { template void equalsFloatingPointLarge(); template void equalsFloatingPointInfinity(); template void equalsFloatingPointNaN(); + + template void equalsZeroIntegral(); + template void equalsZeroFloatingPoint(); + template void equalsZeroFloatingPointSmall(); + template void equalsZeroFloatingPointLarge(); +}; + +namespace { + +enum: std::size_t { EqualsZeroDataCount = 3 }; + +struct { + const char* name; + Float a, aStep; + Double b, bStep; + long double c, cStep; + + Float get(Float) const { return a; } + Float getStep(Float) const { return aStep; } + Double get(Double) const { return b; } + Double getStep(Double) const { return bStep; } + long double get(long double) const { return c; } + long double getStep(long double) const { return cStep; } +} EqualsZeroData[EqualsZeroDataCount] = { + {"", -3.141592653589793f, 5.0e-5f, -3.141592653589793, 5.0e-14, -3.141592653589793l, 5.0e-17l}, + {"small", 1.0e-6f, 5.0e-6f, -1.0e-15, 5.0e-15, 1.0e-18l, 5.0e-18l}, + {"large", 12345.0f, 0.2f, 12345678901234.0, 0.2, -12345678901234567.0l, 0.2l}, }; +} + TypeTraitsTest::TypeTraitsTest() { addTests({ &TypeTraitsTest::name, @@ -76,7 +105,27 @@ TypeTraitsTest::TypeTraitsTest() { &TypeTraitsTest::equalsFloatingPointInfinity, &TypeTraitsTest::equalsFloatingPointInfinity, &TypeTraitsTest::equalsFloatingPointNaN, - &TypeTraitsTest::equalsFloatingPointNaN}); + &TypeTraitsTest::equalsFloatingPointNaN, + + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + #ifndef CORRADE_TARGET_EMSCRIPTEN + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + #endif + }); + + addInstancedTests({ + &TypeTraitsTest::equalsZeroFloatingPoint, + &TypeTraitsTest::equalsZeroFloatingPoint, + #ifndef CORRADE_TARGET_EMSCRIPTEN + &TypeTraitsTest::equalsZeroFloatingPoint + #endif + }, EqualsZeroDataCount); } void TypeTraitsTest::name() { @@ -127,6 +176,44 @@ template void TypeTraitsTest::equalsFloatingPointNaN() { Constants::nan())); } +namespace { + /* Argh! Why there is no standard std::abs() for unsigned types? */ + template::value>::type> T abs(T value) { + return value; + } + template::value>::type> T abs(T value) { + return std::abs(value); + } +} + +template void TypeTraitsTest::equalsZeroIntegral() { + setTestCaseName(std::string{"equalsZeroIntegral<"} + TypeTraits::name() + ">"); + + const T a(-123); + const T b(-123); + const T magnitude = std::max(abs(a), abs(b)); + + CORRADE_VERIFY(TypeTraits::equals(a, b)); + CORRADE_VERIFY(TypeTraits::equalsZero(a - b, magnitude)); + CORRADE_VERIFY(!TypeTraits::equalsZero(a - b + TypeTraits::epsilon(), magnitude)); +} + +template void TypeTraitsTest::equalsZeroFloatingPoint() { + setTestCaseName(std::string{"equalsZeroFloatingPoint<"} + TypeTraits::name() + ">"); + setTestCaseDescription(EqualsZeroData[testCaseInstanceId()].name); + + const T a = EqualsZeroData[testCaseInstanceId()].get(T{}); + const T b = EqualsZeroData[testCaseInstanceId()].get(T{}); + const T step = EqualsZeroData[testCaseInstanceId()].getStep(T{}); + const T magnitude = std::max(abs(a), abs(b)); + + CORRADE_VERIFY(TypeTraits::equals(a + step/T(2.0), b)); + CORRADE_VERIFY(TypeTraits::equalsZero(a + step/T(2.0) - b, magnitude)); + + CORRADE_VERIFY(!TypeTraits::equals(a - step*T(2.0), b)); + CORRADE_VERIFY(!TypeTraits::equalsZero(a - step*T(2.0) - b, magnitude)); +} + }}} CORRADE_TEST_MAIN(Magnum::Math::Test::TypeTraitsTest) diff --git a/src/Magnum/Math/TypeTraits.h b/src/Magnum/Math/TypeTraits.h index 1e0db2f5b..22d725c16 100644 --- a/src/Magnum/Math/TypeTraits.h +++ b/src/Magnum/Math/TypeTraits.h @@ -72,6 +72,10 @@ namespace Implementation { constexpr static bool equals(T a, T b) { return a == b; } + + constexpr static bool equalsZero(T a, T) { + return !a; + } }; } @@ -123,6 +127,22 @@ template struct TypeTraits: Implementation::TypeTraitsDefault { * value), pure equality comparison everywhere else. */ static bool equals(T a, T b); + + /** + * @brief Fuzzy compare to zero with magnitude + * + * Uses fuzzy compare for floating-point types (using @ref epsilon() + * value), pure equality comparison everywhere else. Use this function when + * comparing e.g. a calculated nearly-zero difference with zero, knowing + * the magnitude of original values so the epsilon can be properly scaled. + * In other words, the following lines are equivalent: + * @code + * Float a, b; + * Math::TypeTraits::equals(a, b); + * Math::TypeTraits::equalsZero(a - b, Math::max(Math::abs(a), Math::abs(b))); + * @endcode + */ + static bool equalsZero(T a, T magnitude); #endif }; @@ -187,6 +207,7 @@ template struct TypeTraitsFloatingPoint: TypeTraitsName { TypeTraitsFloatingPoint() = delete; static bool equals(T a, T b); + static bool equalsZero(T a, T epsilon); }; /* Adapted from http://floating-point-gui.de/errors/comparison/ */ @@ -207,6 +228,20 @@ template bool TypeTraitsFloatingPoint::equals(const T a, const T b) return difference/(absA + absB) < TypeTraits::epsilon(); } +template bool TypeTraitsFloatingPoint::equalsZero(const T a, const T magnitude) { + /* Shortcut for binary equality */ + if(a == T(0.0)) return true; + + const T absA = std::abs(a); + + /* The value is extremely close to zero, relative error is meaningless */ + if(absA < TypeTraits::epsilon()) + return absA < TypeTraits::epsilon(); + + /* Relative error */ + return absA*T(0.5)/magnitude < TypeTraits::epsilon(); +} + } template<> struct TypeTraits: Implementation::TypeTraitsFloatingPoint { From 1dc1fc79b09e57c7a037999f396dc4950a92aee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 19:04:39 +0200 Subject: [PATCH 159/290] Math: better test cases for {*Complex,Quaternion}::isNormalized(). The expectation is that the values are considered normalized only if the difference is small enough. This should have been tested since the beginning, but instead this was waved away with a dumb test case testing obviously denormalized value and obviously normalized value. The test fails for DualQuaternion with large translation values (as expected). Will be fixed in following commits. --- src/Magnum/Math/Test/ComplexTest.cpp | 10 ++++++++ src/Magnum/Math/Test/DualComplexTest.cpp | 21 +++++++++++++++++ src/Magnum/Math/Test/DualQuaternionTest.cpp | 26 ++++++++++++++++++++- src/Magnum/Math/Test/QuaternionTest.cpp | 10 ++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Math/Test/ComplexTest.cpp b/src/Magnum/Math/Test/ComplexTest.cpp index 70e7c5862..cb364335c 100644 --- a/src/Magnum/Math/Test/ComplexTest.cpp +++ b/src/Magnum/Math/Test/ComplexTest.cpp @@ -68,6 +68,7 @@ struct ComplexTest: Corrade::TestSuite::Tester { void compare(); void isNormalized(); + template void isNormalizedEpsilon(); void addSubtract(); void negated(); @@ -103,6 +104,8 @@ ComplexTest::ComplexTest() { &ComplexTest::compare, &ComplexTest::isNormalized, + &ComplexTest::isNormalizedEpsilon, + &ComplexTest::isNormalizedEpsilon, &ComplexTest::addSubtract, &ComplexTest::negated, @@ -245,6 +248,13 @@ void ComplexTest::isNormalized() { CORRADE_VERIFY(Complex::rotation(Deg(23.0f)).isNormalized()); } +template void ComplexTest::isNormalizedEpsilon() { + setTestCaseName(std::string{"isNormalizedEpsilon<"} + TypeTraits::name() + ">"); + + CORRADE_VERIFY((Math::Complex{T(0.801775644243754) + TypeTraits::epsilon()/T(2.0), T(0.597625146975521)}.isNormalized())); + CORRADE_VERIFY(!(Math::Complex{T(0.801775644243754) + TypeTraits::epsilon()*T(2.0), T(0.597625146975521)}.isNormalized())); +} + void ComplexTest::addSubtract() { Complex a( 1.7f, -3.7f); Complex b(-3.6f, 0.2f); diff --git a/src/Magnum/Math/Test/DualComplexTest.cpp b/src/Magnum/Math/Test/DualComplexTest.cpp index f077bb0e8..f4f34d5e8 100644 --- a/src/Magnum/Math/Test/DualComplexTest.cpp +++ b/src/Magnum/Math/Test/DualComplexTest.cpp @@ -67,6 +67,8 @@ struct DualComplexTest: Corrade::TestSuite::Tester { void convert(); void isNormalized(); + template void isNormalizedEpsilonRotation(); + template void isNormalizedEpsilonTranslation(); void multiply(); @@ -108,6 +110,10 @@ DualComplexTest::DualComplexTest() { &DualComplexTest::convert, &DualComplexTest::isNormalized, + &DualComplexTest::isNormalizedEpsilonRotation, + &DualComplexTest::isNormalizedEpsilonRotation, + &DualComplexTest::isNormalizedEpsilonTranslation, + &DualComplexTest::isNormalizedEpsilonTranslation, &DualComplexTest::multiply, @@ -237,6 +243,21 @@ void DualComplexTest::isNormalized() { CORRADE_VERIFY((DualComplex::rotation(Deg(23.0f))*DualComplex::translation({6.0f, 3.0f})).isNormalized()); } +template void DualComplexTest::isNormalizedEpsilonRotation() { + setTestCaseName(std::string{"isNormalizedEpsilonRotation<"} + TypeTraits::name() + ">"); + + CORRADE_VERIFY((Math::DualComplex{{T(0.801775644243754) + TypeTraits::epsilon()/T(2.0), T(0.597625146975521)}, {T(8018055.25501103), T(5975850.58193309)}}.isNormalized())); + CORRADE_VERIFY(!(Math::DualComplex{{T(0.801775644243754) + TypeTraits::epsilon()*T(2.0), T(0.597625146975521)}, {T(8018055.25501103), T(5975850.58193309)}}.isNormalized())); +} + +template void DualComplexTest::isNormalizedEpsilonTranslation() { + setTestCaseName(std::string{"isNormalizedEpsilonTranslation<"} + TypeTraits::name() + ">"); + + /* Translation does not affect normalization */ + CORRADE_VERIFY((Math::DualComplex{{T(0.801775644243754), T(0.597625146975521)}, {T(8018055.25501103), T(20.5)}}.isNormalized())); + CORRADE_VERIFY((Math::DualComplex{{T(0.801775644243754), T(0.597625146975521)}, {T(8018055.25501103), T(-200000000.0)}}.isNormalized())); +} + void DualComplexTest::multiply() { DualComplex a({-1.5f, 2.0f}, { 3.0f, -6.5f}); DualComplex b({ 2.0f, -7.5f}, {-0.5f, 1.0f});; diff --git a/src/Magnum/Math/Test/DualQuaternionTest.cpp b/src/Magnum/Math/Test/DualQuaternionTest.cpp index a83535c10..4ceb749d2 100644 --- a/src/Magnum/Math/Test/DualQuaternionTest.cpp +++ b/src/Magnum/Math/Test/DualQuaternionTest.cpp @@ -70,6 +70,8 @@ struct DualQuaternionTest: Corrade::TestSuite::Tester { void convert(); void isNormalized(); + template void isNormalizedEpsilonRotation(); + template void isNormalizedEpsilonTranslation(); void lengthSquared(); void length(); @@ -115,6 +117,10 @@ DualQuaternionTest::DualQuaternionTest() { &DualQuaternionTest::convert, &DualQuaternionTest::isNormalized, + &DualQuaternionTest::isNormalizedEpsilonRotation, + &DualQuaternionTest::isNormalizedEpsilonRotation, + &DualQuaternionTest::isNormalizedEpsilonTranslation, + &DualQuaternionTest::isNormalizedEpsilonTranslation, &DualQuaternionTest::lengthSquared, &DualQuaternionTest::length, @@ -260,7 +266,25 @@ void DualQuaternionTest::convert() { void DualQuaternionTest::isNormalized() { CORRADE_VERIFY(!DualQuaternion({{1.0f, 2.0f, 3.0f}, 4.0f}, {}).isNormalized()); - CORRADE_VERIFY((DualQuaternion::rotation(Deg(23.0f), Vector3::xAxis())*DualQuaternion::translation({3.0f, 1.0f, -0.5f})).isNormalized()); + CORRADE_VERIFY((DualQuaternion::rotation(Deg(23.0f), Vector3::xAxis())*DualQuaternion::translation({0.9f, -1.0f, -0.5f})).isNormalized()); +} + +template void DualQuaternionTest::isNormalizedEpsilonRotation() { + setTestCaseName(std::string{"isNormalizedEpsilonRotation<"} + TypeTraits::name() + ">"); + + CORRADE_VERIFY((Math::DualQuaternion{{{T(0.199367934417197) + TypeTraits::epsilon()/T(2.0), T(0.0), T(0.0)}, T(0.97992470462083)}, {{T(0.440966117079373), T(-0.440120368706115), T(-0.344665143363806)}, T(-0.0897155704877387)}}.isNormalized())); + CORRADE_VERIFY(!(Math::DualQuaternion{{{T(0.199367934417197), T(0.0), T(0.0)}, T(0.97992470462083) + TypeTraits::epsilon()*T(2.0)}, {{T(0.440966117079373), T(-0.440120368706115), T(-0.344665143363806)}, T(-0.0897155704877387)}}.isNormalized())); +} + +template void DualQuaternionTest::isNormalizedEpsilonTranslation() { + setTestCaseName(std::string{"isNormalizedEpsilonTranslation<"} + TypeTraits::name() + ">"); + + CORRADE_VERIFY((Math::DualQuaternion{{{T(0.199367934417197), T(0.0), T(0.0)}, T(0.97992470462083)}, {{T(0.440966117079373), T(-0.440120368706115) + TypeTraits::epsilon()*T(2.0), T(-0.344665143363806)}, T(-0.0897155704877387)}}.isNormalized())); + CORRADE_VERIFY(!(Math::DualQuaternion{{{T(0.199367934417197), T(0.0), T(0.0)}, T(0.97992470462083)}, {{T(0.440966117079373) + TypeTraits::epsilon()*T(4.0), T(-0.440120368706115), T(-0.344665143363806)}, T(-0.0897155704877387)}}.isNormalized())); + + /* Large translation -- large epsilon */ + CORRADE_VERIFY((Math::DualQuaternion{{{T(0.0106550719778129), T(0.311128101752138), T(-0.0468823167023769)}, T(0.949151106053128)}, {{T(5056871.9114386), T(-245303.943266211) + TypeTraits::epsilon()*T(10000000.0), T(-606492.066475555)}, T(-6315.26116124973)}}.isNormalized())); + CORRADE_VERIFY(!(Math::DualQuaternion{{{T(0.0106550719778129), T(0.311128101752138), T(-0.0468823167023769)}, T(0.949151106053128)}, {{T(5056871.9114386), T(-245303.943266211) + TypeTraits::epsilon()*T(20000000.0), T(-606492.066475555)}, T(-6315.26116124973)}}.isNormalized())); } void DualQuaternionTest::lengthSquared() { diff --git a/src/Magnum/Math/Test/QuaternionTest.cpp b/src/Magnum/Math/Test/QuaternionTest.cpp index 908dc7ac3..5e1174be5 100644 --- a/src/Magnum/Math/Test/QuaternionTest.cpp +++ b/src/Magnum/Math/Test/QuaternionTest.cpp @@ -68,6 +68,7 @@ struct QuaternionTest: Corrade::TestSuite::Tester { void compare(); void isNormalized(); + template void isNormalizedEpsilon(); void addSubtract(); void negated(); @@ -114,6 +115,8 @@ QuaternionTest::QuaternionTest() { &QuaternionTest::compare, &QuaternionTest::isNormalized, + &QuaternionTest::isNormalizedEpsilon, + &QuaternionTest::isNormalizedEpsilon, &QuaternionTest::addSubtract, &QuaternionTest::negated, @@ -248,6 +251,13 @@ void QuaternionTest::isNormalized() { CORRADE_VERIFY(Quaternion::rotation(Deg(23.0f), Vector3::xAxis()).isNormalized()); } +template void QuaternionTest::isNormalizedEpsilon() { + setTestCaseName(std::string{"isNormalizedEpsilon<"} + TypeTraits::name() + ">"); + + CORRADE_VERIFY((Math::Quaternion{{T(0.0106550719778129), T(0.311128101752138), T(-0.0468823167023769)}, T(0.949151106053128) + TypeTraits::epsilon()/T(2.0)}.isNormalized())); + CORRADE_VERIFY(!(Math::Quaternion{{T(0.0106550719778129), T(0.311128101752138), T(-0.0468823167023769)}, T(0.949151106053128) + TypeTraits::epsilon()*T(2.0)}.isNormalized())); +} + void QuaternionTest::addSubtract() { Quaternion a({ 1.0f, 3.0f, -2.0f}, -4.0f); Quaternion b({-0.5f, 1.4f, 3.0f}, 12.0f); From aef580ec627f223d088abcdb16f6af76dbea9f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 19:06:33 +0200 Subject: [PATCH 160/290] Math: test iterative normalization of Complex/Quaternion transformations. If the values are renormalized after every step, it shouldn't happen that the value is denormalized even after calling `normalized()`. The test fails for DualQuaternion with large values, as expected. Will be fixed in the next commit. --- src/Magnum/Math/Test/ComplexTest.cpp | 21 ++++++++++++-- src/Magnum/Math/Test/DualComplexTest.cpp | 31 ++++++++++++++++++-- src/Magnum/Math/Test/DualQuaternionTest.cpp | 32 +++++++++++++++++++-- src/Magnum/Math/Test/QuaternionTest.cpp | 22 ++++++++++++-- 4 files changed, 98 insertions(+), 8 deletions(-) diff --git a/src/Magnum/Math/Test/ComplexTest.cpp b/src/Magnum/Math/Test/ComplexTest.cpp index cb364335c..b5ca99653 100644 --- a/src/Magnum/Math/Test/ComplexTest.cpp +++ b/src/Magnum/Math/Test/ComplexTest.cpp @@ -79,6 +79,7 @@ struct ComplexTest: Corrade::TestSuite::Tester { void dotSelf(); void length(); void normalized(); + template void normalizedIterative(); void conjugated(); void inverted(); @@ -115,9 +116,13 @@ ComplexTest::ComplexTest() { &ComplexTest::dot, &ComplexTest::dotSelf, &ComplexTest::length, - &ComplexTest::normalized, + &ComplexTest::normalized}); - &ComplexTest::conjugated, + addRepeatedTests({ + &ComplexTest::normalizedIterative, + &ComplexTest::normalizedIterative}, 1000); + + addTests({&ComplexTest::conjugated, &ComplexTest::inverted, &ComplexTest::invertedNormalized, @@ -312,6 +317,18 @@ void ComplexTest::normalized() { CORRADE_COMPARE(a.normalized().length(), 1.0f); } +template void ComplexTest::normalizedIterative() { + setTestCaseName(std::string{"normalizedIterative<"} + TypeTraits::name() + ">"); + + auto a = Math::Complex::rotation(Math::Deg{T(36.7)}); + for(std::size_t i = 0; i != testCaseRepeatId(); ++i) { + a = Math::Complex::rotation(Math::Deg{T(87.1)})*a; + a = a.normalized(); + } + + CORRADE_VERIFY(a.isNormalized()); +} + void ComplexTest::conjugated() { CORRADE_COMPARE(Complex(-3.0f, 4.5f).conjugated(), Complex(-3.0f, -4.5f)); } diff --git a/src/Magnum/Math/Test/DualComplexTest.cpp b/src/Magnum/Math/Test/DualComplexTest.cpp index f4f34d5e8..033f4d710 100644 --- a/src/Magnum/Math/Test/DualComplexTest.cpp +++ b/src/Magnum/Math/Test/DualComplexTest.cpp @@ -75,6 +75,7 @@ struct DualComplexTest: Corrade::TestSuite::Tester { void lengthSquared(); void length(); void normalized(); + template void normalizedIterative(); void complexConjugated(); void dualConjugated(); @@ -119,9 +120,13 @@ DualComplexTest::DualComplexTest() { &DualComplexTest::lengthSquared, &DualComplexTest::length, - &DualComplexTest::normalized, + &DualComplexTest::normalized}); - &DualComplexTest::complexConjugated, + addRepeatedTests({ + &DualComplexTest::normalizedIterative, + &DualComplexTest::normalizedIterative}, 1000); + + addTests({&DualComplexTest::complexConjugated, &DualComplexTest::dualConjugated, &DualComplexTest::conjugated, &DualComplexTest::inverted, @@ -281,6 +286,28 @@ void DualComplexTest::normalized() { CORRADE_COMPARE(a.normalized(), b); } +namespace { + template struct NormalizedIterativeData; + template<> struct NormalizedIterativeData { + static Math::Vector2 translation() { return {10000.0f, -50.0f}; } + }; + template<> struct NormalizedIterativeData { + static Math::Vector2 translation() { return {10000000.0, -500.0}; } + }; +} + +template void DualComplexTest::normalizedIterative() { + setTestCaseName(std::string{"normalizedIterative<"} + TypeTraits::name() + ">"); + + auto a = Math::DualComplex::rotation(Math::Deg{T(36.7)})*Math::DualComplex::translation(NormalizedIterativeData::translation()); + for(std::size_t i = 0; i != testCaseRepeatId(); ++i) { + a = Math::DualComplex::rotation(Math::Deg{T(87.1)})*a; + a = a.normalized(); + } + + CORRADE_VERIFY(a.isNormalized()); +} + void DualComplexTest::complexConjugated() { DualComplex a({-1.0f, 2.5f}, {3.0f, -7.5f}); DualComplex b({-1.0f, -2.5f}, {3.0f, 7.5f}); diff --git a/src/Magnum/Math/Test/DualQuaternionTest.cpp b/src/Magnum/Math/Test/DualQuaternionTest.cpp index 4ceb749d2..338ededaf 100644 --- a/src/Magnum/Math/Test/DualQuaternionTest.cpp +++ b/src/Magnum/Math/Test/DualQuaternionTest.cpp @@ -76,6 +76,7 @@ struct DualQuaternionTest: Corrade::TestSuite::Tester { void lengthSquared(); void length(); void normalized(); + template void normalizedIterative(); void quaternionConjugated(); void dualConjugated(); @@ -124,9 +125,13 @@ DualQuaternionTest::DualQuaternionTest() { &DualQuaternionTest::lengthSquared, &DualQuaternionTest::length, - &DualQuaternionTest::normalized, + &DualQuaternionTest::normalized}); - &DualQuaternionTest::quaternionConjugated, + addRepeatedTests({ + &DualQuaternionTest::normalizedIterative, + &DualQuaternionTest::normalizedIterative}, 1000); + + addTests({&DualQuaternionTest::quaternionConjugated, &DualQuaternionTest::dualConjugated, &DualQuaternionTest::conjugated, &DualQuaternionTest::inverted, @@ -304,6 +309,29 @@ void DualQuaternionTest::normalized() { CORRADE_COMPARE(a.normalized(), b); } +namespace { + template struct NormalizedIterativeData; + template<> struct NormalizedIterativeData { + static Math::Vector3 translation() { return {10000.0f, -50.0f, 20000.0f}; } + }; + template<> struct NormalizedIterativeData { + static Math::Vector3 translation() { return {10000000000000.0, -500.0, 20000000000000.0}; } + }; +} + +template void DualQuaternionTest::normalizedIterative() { + setTestCaseName(std::string{"normalizedIterative<"} + TypeTraits::name() + ">"); + + const auto axis = Math::Vector3{T(0.5), T(7.9), T(0.1)}.normalized(); + auto a = Math::DualQuaternion::rotation(Math::Deg{T(36.7)}, Math::Vector3{T(0.25), T(7.3), T(-1.1)}.normalized())*Math::DualQuaternion::translation(NormalizedIterativeData::translation()); + for(std::size_t i = 0; i != testCaseRepeatId(); ++i) { + a = Math::DualQuaternion::rotation(Math::Deg{T(87.1)}, axis)*a; + a = a.normalized(); + } + + CORRADE_VERIFY(a.isNormalized()); +} + void DualQuaternionTest::quaternionConjugated() { DualQuaternion a({{ 1.0f, 2.0f, 3.0f}, -4.0f}, {{ 0.5f, -3.1f, 3.3f}, 2.0f}); DualQuaternion b({{-1.0f, -2.0f, -3.0f}, -4.0f}, {{-0.5f, 3.1f, -3.3f}, 2.0f}); diff --git a/src/Magnum/Math/Test/QuaternionTest.cpp b/src/Magnum/Math/Test/QuaternionTest.cpp index 5e1174be5..e85fd26dc 100644 --- a/src/Magnum/Math/Test/QuaternionTest.cpp +++ b/src/Magnum/Math/Test/QuaternionTest.cpp @@ -79,6 +79,7 @@ struct QuaternionTest: Corrade::TestSuite::Tester { void dotSelf(); void length(); void normalized(); + template void normalizedIterative(); void conjugated(); void inverted(); @@ -126,9 +127,13 @@ QuaternionTest::QuaternionTest() { &QuaternionTest::dot, &QuaternionTest::dotSelf, &QuaternionTest::length, - &QuaternionTest::normalized, + &QuaternionTest::normalized}); - &QuaternionTest::conjugated, + addRepeatedTests({ + &QuaternionTest::normalizedIterative, + &QuaternionTest::normalizedIterative}, 1000); + + addTests({&QuaternionTest::conjugated, &QuaternionTest::inverted, &QuaternionTest::invertedNormalized, @@ -308,6 +313,19 @@ void QuaternionTest::normalized() { CORRADE_COMPARE(normalized, Quaternion({1.0f, 3.0f, -2.0f}, -4.0f)/std::sqrt(30.0f)); } +template void QuaternionTest::normalizedIterative() { + setTestCaseName(std::string{"normalizedIterative<"} + TypeTraits::name() + ">"); + + const auto axis = Math::Vector3{T(0.5), T(7.9), T(0.1)}.normalized(); + auto a = Math::Quaternion::rotation(Math::Deg{T(36.7)}, Math::Vector3{T(0.25), T(7.3), T(-1.1)}.normalized()); + for(std::size_t i = 0; i != testCaseRepeatId(); ++i) { + a = Math::Quaternion::rotation(Math::Deg{T(87.1)}, axis)*a; + a = a.normalized(); + } + + CORRADE_VERIFY(a.isNormalized()); +} + void QuaternionTest::conjugated() { CORRADE_COMPARE(Quaternion({ 1.0f, 3.0f, -2.0f}, -4.0f).conjugated(), Quaternion({-1.0f, -3.0f, 2.0f}, -4.0f)); From 5ddc877a1dc4aea0490982f678ee2894ee7277b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 19:08:53 +0200 Subject: [PATCH 161/290] Math: consider magnitude of translation in DualQuaternion::isNormalized(). Fixes the failing tests. --- src/Magnum/Math/DualQuaternion.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Magnum/Math/DualQuaternion.h b/src/Magnum/Math/DualQuaternion.h index d4b6d35d3..d938f8b0e 100644 --- a/src/Magnum/Math/DualQuaternion.h +++ b/src/Magnum/Math/DualQuaternion.h @@ -32,6 +32,7 @@ #include #include "Magnum/Math/Dual.h" +#include "Magnum/Math/Functions.h" #include "Magnum/Math/Matrix4.h" #include "Magnum/Math/Quaternion.h" @@ -254,11 +255,11 @@ template class DualQuaternion: public Dual> { * @todoc Improve the equation as in Quaternion::isNormalized() */ bool isNormalized() const { - /* Comparing dual part classically, as comparing sqrt() of it would - lead to overly strict precision */ + /* Comparing dual part to zero considering the magnitude of the + translation -- the epsilon be much larger for large values. */ Dual a = lengthSquared(); return Implementation::isNormalizedSquared(a.real()) && - TypeTraits::equals(a.dual(), T(0)); + TypeTraits::equalsZero(a.dual(), Math::max(Math::abs(Math::Dual>::dual().vector()).max(), Math::abs(Math::Dual>::dual().scalar()))); } /** From cadd28276a8add821385369c5ec1df68d11e4b99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 19:24:32 +0200 Subject: [PATCH 162/290] Math: conditionally include for std::max() in MSVC. Don't want to include it for every platform, as it is pretty huge... --- src/Magnum/Math/Test/TypeTraitsTest.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Magnum/Math/Test/TypeTraitsTest.cpp b/src/Magnum/Math/Test/TypeTraitsTest.cpp index cb24fc050..ff31c7ee6 100644 --- a/src/Magnum/Math/Test/TypeTraitsTest.cpp +++ b/src/Magnum/Math/Test/TypeTraitsTest.cpp @@ -24,6 +24,9 @@ */ #include +#ifdef _MSC_VER +#include /* std::max() */ +#endif #include "Magnum/Math/TypeTraits.h" #include "Magnum/Math/Constants.h" From 4a395ac4907f26fd3636897ddaf5a371539576e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 21:52:41 +0200 Subject: [PATCH 163/290] Math: enlarge epsilon value for long doubles on MSVC. They are internally treated as 64-bit doubles, so there's no difference. --- src/Magnum/Math/Test/TypeTraitsTest.cpp | 24 +++++++++++++++++++++--- src/Magnum/Math/TypeTraits.h | 8 ++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/Magnum/Math/Test/TypeTraitsTest.cpp b/src/Magnum/Math/Test/TypeTraitsTest.cpp index ff31c7ee6..fd34cfa06 100644 --- a/src/Magnum/Math/Test/TypeTraitsTest.cpp +++ b/src/Magnum/Math/Test/TypeTraitsTest.cpp @@ -68,9 +68,27 @@ struct { long double get(long double) const { return c; } long double getStep(long double) const { return cStep; } } EqualsZeroData[EqualsZeroDataCount] = { - {"", -3.141592653589793f, 5.0e-5f, -3.141592653589793, 5.0e-14, -3.141592653589793l, 5.0e-17l}, - {"small", 1.0e-6f, 5.0e-6f, -1.0e-15, 5.0e-15, 1.0e-18l, 5.0e-18l}, - {"large", 12345.0f, 0.2f, 12345678901234.0, 0.2, -12345678901234567.0l, 0.2l}, + {"", -3.141592653589793f, 5.0e-5f, -3.141592653589793, 5.0e-14, -3.141592653589793l, + #ifndef _MSC_VER + 5.0e-17l + #else + 5.0e-14 + #endif + }, + {"small", 1.0e-6f, 5.0e-6f, -1.0e-15, 5.0e-15, 1.0e-18l, + #ifndef _MSC_VER + 5.0e-18l + #else + 5.0e-15 + #endif + }, + {"large", 12345.0f, 0.2f, 12345678901234.0, 0.2, + #ifndef _MSC_VER + -12345678901234567.0l, + #else + -12345678901234.0l, + #endif + 0.2l}, }; } diff --git a/src/Magnum/Math/TypeTraits.h b/src/Magnum/Math/TypeTraits.h index 22d725c16..645e81612 100644 --- a/src/Magnum/Math/TypeTraits.h +++ b/src/Magnum/Math/TypeTraits.h @@ -58,9 +58,17 @@ for more headroom. They have "at least" 18 significant digits of precision, taking one digit less for more headroom. + +@attention On MSVC the precision is the same as for doubles, because + they are internally the same type. Source: + https://msdn.microsoft.com/en-us/library/9cx8xs15.aspx */ #ifndef LONG_DOUBLE_EQUALITY_PRECISION +#ifndef _MSC_VER #define LONG_DOUBLE_EQUALITY_PRECISION 1.0e-17l +#else +#define LONG_DOUBLE_EQUALITY_PRECISION 1.0e-14l +#endif #endif namespace Magnum { namespace Math { From a6e457ebffc8aae141b4df18d3b2aa1b2d7e7612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 3 Sep 2016 18:21:07 +0200 Subject: [PATCH 164/290] package/ci: exclude Corrade sources from code coverage. --- package/ci/travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/ci/travis.yml b/package/ci/travis.yml index 867d50c7e..e9b572a03 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -84,4 +84,4 @@ script: after_success: # Ignoring all stuff that needs GL context and thus can't be run on Travis -- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -E "(.*/(Test|corrade/build|magnum/build|MagnumExternal|Shaders|Platform)/.*|.*/src/Magnum/(AbstractFramebuffer|AbstractObject|AbstractQuery|AbstractShaderProgram|AbstractTexture|Buffer|BufferImage|BufferTexture|Context|CubeMapTexture|CubeMapTextureArray|DebugOutput|DefaultFramebuffer|Framebuffer|Mesh|MeshView|MultisampleTexture|OpenGL|PixelStorage|PrimitiveQuery|RectangleTexture|Renderbuffer|Renderer|SampleQuery|Sampler|Shader|Texture|TextureArray|TimeQuery|TransformFeedback|Implementation/BufferState|Implementation/DebugState|Implementation/driverSpecific|Implementation/FramebufferState|Implementation/maxTextureSize|Implementation/MeshState|Implementation/QueryState|Implementation/RendererState|Implementation/ShaderProgramState|Implementation/ShaderState|Implementation/State|Implementation/TextureState|Implementation/TransformFeedbackState)\\.(cpp|h))" --gcov-options '\-lp'; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -E "(.*/(Test|corrade/src|corrade/build|magnum/build|MagnumExternal|Shaders|Platform)/.*|.*/src/Magnum/(AbstractFramebuffer|AbstractObject|AbstractQuery|AbstractShaderProgram|AbstractTexture|Buffer|BufferImage|BufferTexture|Context|CubeMapTexture|CubeMapTextureArray|DebugOutput|DefaultFramebuffer|Framebuffer|Mesh|MeshView|MultisampleTexture|OpenGL|PixelStorage|PrimitiveQuery|RectangleTexture|Renderbuffer|Renderer|SampleQuery|Sampler|Shader|Texture|TextureArray|TimeQuery|TransformFeedback|Implementation/BufferState|Implementation/DebugState|Implementation/driverSpecific|Implementation/FramebufferState|Implementation/maxTextureSize|Implementation/MeshState|Implementation/QueryState|Implementation/RendererState|Implementation/ShaderProgramState|Implementation/ShaderState|Implementation/State|Implementation/TextureState|Implementation/TransformFeedbackState)\\.(cpp|h))" --gcov-options '\-lp'; fi From 07607f3f63a76835f8eb132e4111926af86c325e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 3 Sep 2016 18:54:47 +0200 Subject: [PATCH 165/290] package/ci: properly set up code coverage include/exclude patterns. --- package/ci/travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/ci/travis.yml b/package/ci/travis.yml index e9b572a03..4bddc287e 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -84,4 +84,4 @@ script: after_success: # Ignoring all stuff that needs GL context and thus can't be run on Travis -- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -E "(.*/(Test|corrade/src|corrade/build|magnum/build|MagnumExternal|Shaders|Platform)/.*|.*/src/Magnum/(AbstractFramebuffer|AbstractObject|AbstractQuery|AbstractShaderProgram|AbstractTexture|Buffer|BufferImage|BufferTexture|Context|CubeMapTexture|CubeMapTextureArray|DebugOutput|DefaultFramebuffer|Framebuffer|Mesh|MeshView|MultisampleTexture|OpenGL|PixelStorage|PrimitiveQuery|RectangleTexture|Renderbuffer|Renderer|SampleQuery|Sampler|Shader|Texture|TextureArray|TimeQuery|TransformFeedback|Implementation/BufferState|Implementation/DebugState|Implementation/driverSpecific|Implementation/FramebufferState|Implementation/maxTextureSize|Implementation/MeshState|Implementation/QueryState|Implementation/RendererState|Implementation/ShaderProgramState|Implementation/ShaderState|Implementation/State|Implementation/TextureState|Implementation/TransformFeedbackState)\\.(cpp|h))" --gcov-options '\-lp'; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -i src/ -E "(.*/(Test|MagnumExternal|Shaders|Platform)/.*|.*/src/Magnum/(AbstractFramebuffer|AbstractObject|AbstractQuery|AbstractShaderProgram|AbstractTexture|Buffer|BufferImage|BufferTexture|Context|CubeMapTexture|CubeMapTextureArray|DebugOutput|DefaultFramebuffer|Framebuffer|Mesh|MeshView|MultisampleTexture|OpenGL|PixelStorage|PrimitiveQuery|RectangleTexture|Renderbuffer|Renderer|SampleQuery|Sampler|Shader|Texture|TextureArray|TimeQuery|TransformFeedback|Implementation/BufferState|Implementation/DebugState|Implementation/driverSpecific|Implementation/FramebufferState|Implementation/maxTextureSize|Implementation/MeshState|Implementation/QueryState|Implementation/RendererState|Implementation/ShaderProgramState|Implementation/ShaderState|Implementation/State|Implementation/TextureState|Implementation/TransformFeedbackState)\\.(cpp|h))" --gcov-options '\-lp'; fi From 1a10ee751586bb8f933943cc5336aff239209b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 00:05:30 +0200 Subject: [PATCH 166/290] doc: don't use deprecated functionality. Thanks, Clang integrated into KDevelop! --- doc/generated/hello.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/generated/hello.cpp b/doc/generated/hello.cpp index 2af5e7207..5912b10c4 100644 --- a/doc/generated/hello.cpp +++ b/doc/generated/hello.cpp @@ -43,8 +43,8 @@ private: Hello::Hello(const Arguments& arguments): Platform::Application(arguments) { Renderer::setClearColor(Color3::fromHSV(216.0_degf, 0.85f, 1.0f)); - Debug() << "Hello! This application is running on" << Context::current()->version() - << "using" << Context::current()->rendererString(); + Debug() << "Hello! This application is running on" << Context::current().version() + << "using" << Context::current().rendererString(); } void Hello::drawEvent() { From 138547282412a9c4abc347750303a2ec3a1a2478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 00:06:08 +0200 Subject: [PATCH 167/290] Remove bogus \return value documentation. Thanks, KDevelop 5! --- src/Magnum/MultisampleTexture.h | 2 -- src/Magnum/TextureArray.h | 6 ------ 2 files changed, 8 deletions(-) diff --git a/src/Magnum/MultisampleTexture.h b/src/Magnum/MultisampleTexture.h index 52e4e4d30..7d03446ca 100644 --- a/src/Magnum/MultisampleTexture.h +++ b/src/Magnum/MultisampleTexture.h @@ -291,7 +291,6 @@ template class MultisampleTexture: public AbstractTextur /** * @copybrief Texture::invalidateImage() - * @return Reference to self (for method chaining) * * See @ref Texture::invalidateImage() for more information. */ @@ -299,7 +298,6 @@ template class MultisampleTexture: public AbstractTextur /** * @copybrief Texture::invalidateSubImage() - * @return Reference to self (for method chaining) * * See @ref Texture::invalidateSubImage() for more information. */ diff --git a/src/Magnum/TextureArray.h b/src/Magnum/TextureArray.h index 5e9d364a6..c9c25a5f4 100644 --- a/src/Magnum/TextureArray.h +++ b/src/Magnum/TextureArray.h @@ -472,7 +472,6 @@ template class TextureArray: public AbstractTexture { #ifndef MAGNUM_TARGET_GLES /** * @copybrief Texture::image(Int, Image&) - * @return Reference to self (for method chaining) * * See @ref Texture::image(Int, Image&) for more information. * @requires_gl Texture image queries are not available in OpenGL ES or @@ -493,7 +492,6 @@ template class TextureArray: public AbstractTexture { /** * @copybrief Texture::image(Int, BufferImage&, BufferUsage) - * @return Reference to self (for method chaining) * * See @ref Texture::image(Int, BufferImage&, BufferUsage) for more * information. @@ -515,7 +513,6 @@ template class TextureArray: public AbstractTexture { /** * @copybrief Texture::compressedImage(Int, CompressedImage&) - * @return Reference to self (for method chaining) * * See @ref Texture::compressedImage(Int, CompressedImage&) for more * information. @@ -537,7 +534,6 @@ template class TextureArray: public AbstractTexture { /** * @copybrief Texture::compressedImage(Int, CompressedBufferImage&, BufferUsage) - * @return Reference to self (for method chaining) * * See @ref Texture::compressedImage(Int, CompressedBufferImage&, BufferUsage) * for more information. @@ -794,7 +790,6 @@ template class TextureArray: public AbstractTexture { /** * @copybrief Texture::invalidateImage() - * @return Reference to self (for method chaining) * * See @ref Texture::invalidateImage() for more information. */ @@ -802,7 +797,6 @@ template class TextureArray: public AbstractTexture { /** * @copybrief Texture::invalidateSubImage() - * @return Reference to self (for method chaining) * * See @ref Texture::invalidateSubImage() for more information. */ From b8ae18509971350e73d3e17ac3a9144f17a15e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 00:12:47 +0200 Subject: [PATCH 168/290] Properly mark all deprecated APIs. Thanks also for this, KDevelop 5! --- src/Magnum/DebugOutput.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Magnum/DebugOutput.h b/src/Magnum/DebugOutput.h index aa16b0c77..f4724d14f 100644 --- a/src/Magnum/DebugOutput.h +++ b/src/Magnum/DebugOutput.h @@ -480,17 +480,17 @@ class MAGNUM_EXPORT DebugMessage { /** @copydoc DebugOutput::Source::Api * @deprecated Use @ref DebugOutput::Source::Api instead. */ - Api = GLenum(DebugOutput::Source::Api), + Api CORRADE_DEPRECATED_ENUM("use DebugOutput::Source::Api instead") = GLenum(DebugOutput::Source::Api), /** @copydoc DebugOutput::Source::WindowSystem * @deprecated Use @ref DebugOutput::Source::WindowSystem instead. */ - WindowSystem = GLenum(DebugOutput::Source::WindowSystem), + WindowSystem CORRADE_DEPRECATED_ENUM("use DebugOutput::Source::WindowSystem instead") = GLenum(DebugOutput::Source::WindowSystem), /** @copydoc DebugOutput::Source::ShaderCompiler * @deprecated Use @ref DebugOutput::Source::ShaderCompiler instead. */ - ShaderCompiler = GLenum(DebugOutput::Source::ShaderCompiler), + ShaderCompiler CORRADE_DEPRECATED_ENUM("use DebugOutput::Source::ShaderCompiler instead") = GLenum(DebugOutput::Source::ShaderCompiler), #endif /** External debugger or third-party middleware */ @@ -511,7 +511,7 @@ class MAGNUM_EXPORT DebugMessage { /** @copydoc DebugOutput::Source::Other * @deprecated Use @ref DebugOutput::Source::Other instead. */ - Other = GLenum(DebugOutput::Source::Other) + Other CORRADE_DEPRECATED_ENUM("use DebugOutput::Source::Other instead") = GLenum(DebugOutput::Source::Other) #endif }; @@ -581,7 +581,7 @@ class MAGNUM_EXPORT DebugMessage { * @deprecated Use @ref DebugOutput::Callback instead. */ /* Can't mark this as deprecated because compiler then complains when I use it as a parameter in setCallback() */ - typedef void(*Callback)(DebugMessage::Source, DebugMessage::Type, UnsignedInt, DebugOutput::Severity, const std::string&, const void*); + typedef CORRADE_DEPRECATED("use DebugOutput::Callback instead") void(*Callback)(DebugMessage::Source, DebugMessage::Type, UnsignedInt, DebugOutput::Severity, const std::string&, const void*); /** @copybrief DebugOutput::maxLoggedMessages() * @deprecated Use @ref DebugOutput::maxLoggedMessages() instead. From 967448069c2bcc16cb0cf79f292526b4b787e119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 00:13:27 +0200 Subject: [PATCH 169/290] Forgotten include guards. Thanks again, KDevelop 5! --- src/Magnum/Platform/ScreenedApplication.hpp | 4 ++++ src/Magnum/ResourceManager.hpp | 4 ++++ src/Magnum/configure.h.cmake | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/src/Magnum/Platform/ScreenedApplication.hpp b/src/Magnum/Platform/ScreenedApplication.hpp index ef4abb1b2..b2b1c43a9 100644 --- a/src/Magnum/Platform/ScreenedApplication.hpp +++ b/src/Magnum/Platform/ScreenedApplication.hpp @@ -1,3 +1,5 @@ +#ifndef Magnum_Platform_ScreenedApplication_hpp +#define Magnum_Platform_ScreenedApplication_hpp /* This file is part of Magnum. @@ -141,3 +143,5 @@ template void BasicScreenedApplication::mouseMov } }} + +#endif diff --git a/src/Magnum/ResourceManager.hpp b/src/Magnum/ResourceManager.hpp index d0fc54225..02a10e73b 100644 --- a/src/Magnum/ResourceManager.hpp +++ b/src/Magnum/ResourceManager.hpp @@ -1,3 +1,5 @@ +#ifndef Magnum_ResourceManager_hpp +#define Magnum_ResourceManager_hpp /* This file is part of Magnum. @@ -48,3 +50,5 @@ ResourceManager*& ResourceManagerLocalInstanceImplementation } }} + +#endif diff --git a/src/Magnum/configure.h.cmake b/src/Magnum/configure.h.cmake index 0026bbee1..7b6751ded 100644 --- a/src/Magnum/configure.h.cmake +++ b/src/Magnum/configure.h.cmake @@ -1,3 +1,5 @@ +#ifndef Magnum_configure_h +#define Magnum_configure_h /* This file is part of Magnum. @@ -32,3 +34,5 @@ #cmakedefine MAGNUM_TARGET_DESKTOP_GLES #cmakedefine MAGNUM_TARGET_WEBGL #cmakedefine MAGNUM_TARGET_HEADLESS + +#endif From 4064c563c9966b171fba7e6165e06ed3b846210d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 01:36:36 +0200 Subject: [PATCH 170/290] package/ci: build for x64 on MSVC. --- package/ci/appveyor-desktop.bat | 4 ++-- package/ci/appveyor-rt.bat | 14 +++++++------- package/ci/appveyor.yml | 3 +-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/package/ci/appveyor-desktop.bat b/package/ci/appveyor-desktop.bat index 427cf6647..fb262784d 100644 --- a/package/ci/appveyor-desktop.bat +++ b/package/ci/appveyor-desktop.bat @@ -1,5 +1,5 @@ -call "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/vcvarsall.bat" || exit /b -set PATH=%APPVEYOR_BUILD_FOLDER%/openal/bin/Win32;%APPVEYOR_BUILD_FOLDER%\deps\bin;%PATH% +call "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/vcvarsall.bat" x64 || exit /b +set PATH=%APPVEYOR_BUILD_FOLDER%/openal/bin/Win64;%APPVEYOR_BUILD_FOLDER%\deps\bin;%PATH% rem Build Corrade git clone --depth 1 git://github.com/mosra/corrade.git || exit /b diff --git a/package/ci/appveyor-rt.bat b/package/ci/appveyor-rt.bat index d1c33ad71..760f1d64f 100644 --- a/package/ci/appveyor-rt.bat +++ b/package/ci/appveyor-rt.bat @@ -1,4 +1,4 @@ -call "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/vcvarsall.bat" || exit /b +call "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/vcvarsall.bat" x64 || exit /b set PATH=%APPVEYOR_BUILD_FOLDER%\deps-native\bin;%PATH% rem Build ANGLE @@ -39,7 +39,7 @@ cmake .. ^ -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ -DWITH_INTERCONNECT=OFF ^ -DBUILD_STATIC=ON ^ - -G "Visual Studio 14 2015" || exit /b + -G "Visual Studio 14 2015" -A x64 || exit /b cmake --build . --config Release --target install -- /m /v:m || exit /b cd .. || exit /b @@ -52,13 +52,13 @@ cmake .. ^ -DCMAKE_SYSTEM_VERSION=10.0 ^ -DCORRADE_RC_EXECUTABLE=%APPVEYOR_BUILD_FOLDER%/deps-native/bin/corrade-rc.exe ^ -DCMAKE_PREFIX_PATH=%APPVEYOR_BUILD_FOLDER%/deps ^ - -DEGL_LIBRARY=%APPVEYOR_BUILD_FOLDER%/angle/winrt/10/src/Release_Win32/lib/libEGL.lib ^ + -DEGL_LIBRARY=%APPVEYOR_BUILD_FOLDER%/angle/winrt/10/src/Release_x64/lib/libEGL.lib ^ -DEGL_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%/angle/include ^ - -DOPENGLES2_LIBRARY=%APPVEYOR_BUILD_FOLDER%/angle/winrt/10/src/Release_Win32/lib/libGLESv2.lib ^ + -DOPENGLES2_LIBRARY=%APPVEYOR_BUILD_FOLDER%/angle/winrt/10/src/Release_x64/lib/libGLESv2.lib ^ -DOPENGLES2_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%/angle/include ^ - -DOPENGLES3_LIBRARY=%APPVEYOR_BUILD_FOLDER%/angle/winrt/10/src/Release_Win32/lib/libGLESv2.lib ^ + -DOPENGLES3_LIBRARY=%APPVEYOR_BUILD_FOLDER%/angle/winrt/10/src/Release_x64/lib/libGLESv2.lib ^ -DOPENGLES3_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%/angle/include ^ - -DSDL2_LIBRARY=%APPVEYOR_BUILD_FOLDER%/SDL/VisualC-WinRT/UWP_VS2015/Release/SDL-UWP/SDL2.lib ^ + -DSDL2_LIBRARY=%APPVEYOR_BUILD_FOLDER%/SDL/VisualC-WinRT/UWP_VS2015/X64/Release/SDL-UWP/SDL2.lib ^ -DSDL2_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%/SDL/include ^ -DWITH_AUDIO=OFF ^ -DWITH_SDL2APPLICATION=ON ^ @@ -72,5 +72,5 @@ cmake .. ^ -DBUILD_TESTS=ON ^ -DBUILD_STATIC=ON ^ -DBUILD_PLUGINS_STATIC=ON ^ - -G "Visual Studio 14 2015" || exit /b + -G "Visual Studio 14 2015" -A x64 || exit /b cmake --build . --config Release -- /m /v:m || exit /b diff --git a/package/ci/appveyor.yml b/package/ci/appveyor.yml index 9f2bb1f23..fe32a6125 100644 --- a/package/ci/appveyor.yml +++ b/package/ci/appveyor.yml @@ -30,8 +30,7 @@ install: # OpenAL - IF NOT "%TARGET%" == "rt" IF NOT EXIST %APPVEYOR_BUILD_FOLDER%\openal-soft-1.17.2-bin.zip appveyor DownloadFile http://kcat.strangesoft.net/openal-binaries/openal-soft-1.17.2-bin.zip - IF NOT "%TARGET%" == "rt" 7z x openal-soft-1.17.2-bin.zip && ren openal-soft-1.17.2-bin openal && echo [General] > %APPDATA%/alsoft.ini & echo drivers=null >> %APPDATA%/alsoft.ini -- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "msvc" ren openal\bin\Win32\soft_oal.dll OpenAL32.dll -- IF "%TARGET%" == "desktop" IF "%COMPILER%" == "mingw" ren openal\bin\Win64\soft_oal.dll OpenAL32.dll +- IF "%TARGET%" == "desktop" ren openal\bin\Win64\soft_oal.dll OpenAL32.dll # SDL2 - IF "%TARGET%" == "desktop" IF "%COMPILER%" == "msvc" IF NOT EXIST %APPVEYOR_BUILD_FOLDER%\SDL2-devel-2.0.4-VC.zip appveyor DownloadFile http://www.libsdl.org/release/SDL2-devel-2.0.4-VC.zip From c7d63511b35c320315946d627d470aa529616c0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 02:39:55 +0200 Subject: [PATCH 171/290] doc: mention all CI targets, update the README and mainpage, add badges. --- README.md | 12 ++++++------ doc/building.dox | 10 ++++++---- doc/mainpage.dox | 6 +++--- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index a65735174..7bf455e59 100644 --- a/README.md +++ b/README.md @@ -53,15 +53,15 @@ Graphics APIs: Platforms: * **Linux** and embedded Linux (natively using GLX/EGL and Xlib or through - SDL2 or GLUT toolkit) [![Build Status](https://travis-ci.org/mosra/magnum.svg?branch=master)](https://travis-ci.org/mosra/magnum) -* **Windows** natively or using ANGLE (through SDL2 or GLUT toolkit) [![Build status](https://ci.appveyor.com/api/projects/status/5b477m034cfaskse/branch/master?svg=true)](https://ci.appveyor.com/project/mosra/magnum/branch/master) -* **OS X** (through SDL2 toolkit) [![Build Status](https://travis-ci.org/mosra/magnum.svg?branch=master)](https://travis-ci.org/mosra/magnum) -* **iOS** (through SDL2 toolkit) + SDL2, GLFW or GLUT toolkit) [![Build Status](https://travis-ci.org/mosra/magnum.svg?branch=master)](https://travis-ci.org/mosra/magnum) [![Coverage Status](https://coveralls.io/repos/github/mosra/magnum/badge.svg?branch=master)](https://coveralls.io/github/mosra/magnum?branch=master) +* **Windows** on both MSVC and MinGW, natively or using ANGLE (through SDL2, GLFW or GLUT toolkit) [![Build Status](https://ci.appveyor.com/api/projects/status/5b477m034cfaskse/branch/master?svg=true)](https://ci.appveyor.com/project/mosra/magnum/branch/master) +* **OS X** (through SDL2 or GLFW toolkit) [![Build Status](https://travis-ci.org/mosra/magnum.svg?branch=master)](https://travis-ci.org/mosra/magnum) +* **iOS** (through SDL2 toolkit) [![Build Status](https://travis-ci.org/mosra/magnum.svg?branch=master)](https://travis-ci.org/mosra/magnum) * **Android** 2.3 (API Level 9) and higher -* **Windows RT** (Store/Phone) using ANGLE (through SDL2 toolkit) +* **Windows RT** (Store/Phone) using ANGLE (through SDL2 toolkit) [![Build Status](https://ci.appveyor.com/api/projects/status/5b477m034cfaskse/branch/master?svg=true)](https://ci.appveyor.com/project/mosra/magnum/branch/master) * **Google Chrome** (through [Native Client](https://developers.google.com/native-client/), both `newlib` and `glibc` toolchains are supported) -* **HTML5/JavaScript** (through [Emscripten](https://github.com/kripken/emscripten/wiki)) +* **HTML5/JavaScript** (through [Emscripten](https://github.com/kripken/emscripten/wiki)) [![Build Status](https://travis-ci.org/mosra/magnum.svg?branch=master)](https://travis-ci.org/mosra/magnum) FEATURES ======== diff --git a/doc/building.dox b/doc/building.dox index e5cac6fbe..7ffe554ee 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -629,13 +629,15 @@ building your projects for Android. @subsection building-ci-travis Travis -In `package/ci/` there is `travis.yml` file with Linux GCC 4.7 and OSX Clang -configuration. Online at https://travis-ci.org/mosra/magnum. +In `package/ci/` there is `travis.yml` file with Linux GCC 4.7, OSX Clang, iOS +GLES2/GLES3 and Emscripten WebGL1/WebGL2 configuration. Online at +https://travis-ci.org/mosra/magnum. The Linux build has code coverage reports +available online at https://coveralls.io/github/mosra/magnum. @subsection building-ci-appveyor AppVeyor -In `package/ci/` there is `appveyor.yml` file with Windows MSVC configuration. -Online at https://ci.appveyor.com/project/mosra/magnum. +In `package/ci/` there is `appveyor.yml` file with Windows desktop MSVC, MinGW +and Windows RT GLES2/GLES3 configuration. Online at https://ci.appveyor.com/project/mosra/magnum. @subsection building-ci-jenkins Jenkins diff --git a/doc/mainpage.dox b/doc/mainpage.dox index e1af78bb3..9d9a9b9a4 100644 --- a/doc/mainpage.dox +++ b/doc/mainpage.dox @@ -77,9 +77,9 @@ Graphics APIs: Platforms: - **Linux** and embedded Linux (natively using GLX/EGL and Xlib or through - SDL2 or GLUT toolkit) -- **Windows** natively or using ANGLE (through SDL2 or GLUT toolkit) -- **OS X**, **iOS** (through SDL2 toolkit) + SDL2, GLFW or GLUT toolkit) +- **Windows** using both MSVC and MinGW, natively or using ANGLE (through SDL2, GLFW or GLUT toolkit) +- **OS X**, **iOS** (through SDL2 or GLFW toolkit) - **Android** 2.3 (API Level 9) and higher - **Windows RT** (Store/Phone) using ANGLE (through SDL2 toolkit) - **Google Chrome** (through [Native Client](https://developers.google.com/native-client/), From c977f96d07e1f5703be39e1cb82b4dbb33ad893e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 02:41:55 +0200 Subject: [PATCH 172/290] doc: document extra CMake modules. --- doc/cmake.dox | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/doc/cmake.dox b/doc/cmake.dox index 6cfca2b53..0dbd4ff59 100644 --- a/doc/cmake.dox +++ b/doc/cmake.dox @@ -27,6 +27,8 @@ namespace Magnum { /** @page cmake Usage with CMake @brief Guide how to find and use Magnum with CMake build system +@tableofcontents + Magnum uses CMake build system for both building and integration into your projects. The logic is in module `FindMagnum.cmake` distributed with the engine in `modules/` directory, you are encouraged to copy it along with @@ -211,5 +213,27 @@ Corrade library provides also its own set of CMake macros and variables, see @ref cmake-plugins "Plugins repository", @ref cmake-integration "Integration repository" and @ref cmake-extras "Extras repository" have also their own CMake modules. +@section cmake-modules Other CMake modules + +The `modules/` directory contains more useful CMake modules: + +- `FindGLFW.cmake` -- CMake module for finding GLFW. Copy this to your module + directory if you want to use @ref Platform::GlfwApplication. +- `FindEGL.cmake` -- CMake module for finding EGL. Copy this to your + module directory if you want to target embedded platforms such as + @ref CORRADE_TARGET_IOS "iOS", @ref CORRADE_TARGET_ANDROID "Android", + @ref CORRADE_TARGET_WINDOWS_RT "Windows RT" or + @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten" or if you want to use EGL + instead of GLX/WGL/CGL on a desktop platform. +- `FindOpenGLES2.cmake`, `FindOpenGLES3.cmake` -- CMake module for finding + OpenGL ES 2.0 / 3.0 library. Copy this to your module directory if you want + to target @ref MAGNUM_TARGET_GLES "OpenGL ES". +- `FindSDL2.cmake` -- CMake module for finding SDL 2. Copy this to your + module directory if you want to use @ref Platform::Sdl2Application. + +See also relevant section for @ref corrade-cmake-modules "Corrade", +@ref cmake-plugins-modules "Plugins", @ref cmake-integration-modules "Integration" +and @ref cmake-extras-modules "Extras" projects. + */ } From 4ea07227459ee82b084eaa7dafe2bc506c8588bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 12:40:46 +0200 Subject: [PATCH 173/290] package/ci: build as Debug to get more precise coverage reports. --- package/ci/travis-desktop.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/ci/travis-desktop.sh b/package/ci/travis-desktop.sh index de2dd4f8c..13a4cf7d1 100755 --- a/package/ci/travis-desktop.sh +++ b/package/ci/travis-desktop.sh @@ -8,7 +8,7 @@ mkdir build && cd build cmake .. \ -DCMAKE_INSTALL_PREFIX=$HOME/deps \ -DCMAKE_INSTALL_RPATH=$HOME/deps/lib \ - -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_BUILD_TYPE=Debug \ -DWITH_INTERCONNECT=OFF make -j install cd ../.. @@ -17,7 +17,7 @@ mkdir build && cd build cmake .. \ -DCMAKE_CXX_FLAGS=$COVERAGE \ -DCMAKE_PREFIX_PATH="$HOME/deps;$HOME/sdl2;$HOME/glfw" \ - -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_BUILD_TYPE=Debug \ -DWITH_AUDIO=ON \ -DWITH_GLFWAPPLICATION=ON \ -DWITH_SDL2APPLICATION=ON \ From b0f6be40e1a772658eb5a4b5e7abff27b9578765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 16:04:14 +0200 Subject: [PATCH 174/290] Fix deprecation warnings and add more deprecation attributes. I should really at least commpile before pushing. --- src/Magnum/Buffer.cpp | 7 +++++++ src/Magnum/Buffer.h | 20 ++++++++++---------- src/Magnum/DebugOutput.cpp | 7 +++++++ src/Magnum/DebugOutput.h | 2 +- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/Magnum/Buffer.cpp b/src/Magnum/Buffer.cpp index f1f6f1d4c..edfb3b000 100644 --- a/src/Magnum/Buffer.cpp +++ b/src/Magnum/Buffer.cpp @@ -676,6 +676,10 @@ Debug& operator<<(Debug& debug, Buffer::Target value) { #endif #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif case Buffer::Target::Array: #ifndef MAGNUM_TARGET_GLES2 case Buffer::Target::CopyRead: @@ -695,6 +699,9 @@ Debug& operator<<(Debug& debug, Buffer::Target value) { #endif #ifndef MAGNUM_TARGET_GLES2 case Buffer::Target::TransformFeedback: + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif return debug << static_cast(value); #endif diff --git a/src/Magnum/Buffer.h b/src/Magnum/Buffer.h index a288276f9..72bfd3715 100644 --- a/src/Magnum/Buffer.h +++ b/src/Magnum/Buffer.h @@ -370,7 +370,7 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { * @deprecated For @ref setTargetHint() only, use * @ref TargetHint::Array instead. */ - Array = GL_ARRAY_BUFFER, + Array CORRADE_DEPRECATED_ENUM("use Buffer::TargetHint::Array instead") = GL_ARRAY_BUFFER, #endif #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) @@ -391,14 +391,14 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { * @deprecated For @ref setTargetHint() only, use * @ref TargetHint::CopyRead instead. */ - CopyRead = GL_COPY_READ_BUFFER, + CopyRead CORRADE_DEPRECATED_ENUM("use Buffer::TargetHint::CopyRead instead") = GL_COPY_READ_BUFFER, /** * @copydoc TargetHint::CopyWrite * @deprecated For @ref setTargetHint() only, use * @ref TargetHint::CopyWrite instead. */ - CopyWrite = GL_COPY_WRITE_BUFFER, + CopyWrite CORRADE_DEPRECATED_ENUM("use Buffer::TargetHint::CopyWrite instead") = GL_COPY_WRITE_BUFFER, #endif #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) @@ -407,14 +407,14 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { * @deprecated For @ref setTargetHint() only, use * @ref TargetHint::DispatchIndirect instead. */ - DispatchIndirect = GL_DISPATCH_INDIRECT_BUFFER, + DispatchIndirect CORRADE_DEPRECATED_ENUM("use Buffer::TargetHint::DispatchIndirect instead") = GL_DISPATCH_INDIRECT_BUFFER, /** * @copydoc TargetHint::DrawIndirect * @deprecated For @ref setTargetHint() only, use * @ref TargetHint::DrawIndirect instead. */ - DrawIndirect = GL_DRAW_INDIRECT_BUFFER, + DrawIndirect CORRADE_DEPRECATED_ENUM("use Buffer::TargetHint::DrawIndirect instead") = GL_DRAW_INDIRECT_BUFFER, #endif /** @@ -422,7 +422,7 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { * @deprecated For @ref setTargetHint() only, use * @ref TargetHint::ElementArray instead. */ - ElementArray = GL_ELEMENT_ARRAY_BUFFER, + ElementArray CORRADE_DEPRECATED_ENUM("use Buffer::TargetHint::ElementArray instead") = GL_ELEMENT_ARRAY_BUFFER, #ifndef MAGNUM_TARGET_GLES2 /** @@ -430,14 +430,14 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { * @deprecated For @ref setTargetHint() only, use * @ref TargetHint::PixelPack instead. */ - PixelPack = GL_PIXEL_PACK_BUFFER, + PixelPack CORRADE_DEPRECATED_ENUM("use Buffer::TargetHint::PixelPack instead") = GL_PIXEL_PACK_BUFFER, /** * @copydoc TargetHint::PixelUnpack * @deprecated For @ref setTargetHint() only, use * @ref TargetHint::PixelUnpack instead. */ - PixelUnpack = GL_PIXEL_UNPACK_BUFFER, + PixelUnpack CORRADE_DEPRECATED_ENUM("use Buffer::TargetHint::PixelUnpack instead") = GL_PIXEL_UNPACK_BUFFER, #endif #endif @@ -458,7 +458,7 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { * @deprecated For @ref setTargetHint() only, use * @ref TargetHint::Texture instead. */ - Texture = GL_TEXTURE_BUFFER, + Texture CORRADE_DEPRECATED_ENUM("use Buffer::TargetHint::Texture instead") = GL_TEXTURE_BUFFER, #endif #if defined(MAGNUM_BUILD_DEPRECATED) && !defined(MAGNUM_TARGET_GLES2) @@ -467,7 +467,7 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { * @deprecated For @ref setTargetHint() only, use * @ref TargetHint::TransformFeedback instead. */ - TransformFeedback = GL_TRANSFORM_FEEDBACK_BUFFER, + TransformFeedback CORRADE_DEPRECATED_ENUM("use Buffer::TargetHint::TransformFeedback instead") = GL_TRANSFORM_FEEDBACK_BUFFER, #endif #ifndef MAGNUM_TARGET_GLES2 diff --git a/src/Magnum/DebugOutput.cpp b/src/Magnum/DebugOutput.cpp index f3e505103..d49b6db06 100644 --- a/src/Magnum/DebugOutput.cpp +++ b/src/Magnum/DebugOutput.cpp @@ -324,11 +324,18 @@ Debug& operator<<(Debug& debug, const DebugMessage::Source value) { _c(Application) #undef _c #ifdef MAGNUM_BUILD_DEPRECATED + #ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #endif case DebugMessage::Source::Api: case DebugMessage::Source::WindowSystem: case DebugMessage::Source::ShaderCompiler: case DebugMessage::Source::Other: return debug << DebugOutput::Source(value); + #ifdef __GNUC__ + #pragma GCC diagnostic pop + #endif #endif /* LCOV_EXCL_STOP */ } diff --git a/src/Magnum/DebugOutput.h b/src/Magnum/DebugOutput.h index f4724d14f..5842c618e 100644 --- a/src/Magnum/DebugOutput.h +++ b/src/Magnum/DebugOutput.h @@ -635,7 +635,7 @@ class MAGNUM_EXPORT DebugMessage { /** @copybrief DebugOutput::setCallback() * @deprecated Use @ref DebugOutput::setCallback() instead. */ - CORRADE_DEPRECATED("use DebugOutput::setCallback() instead") static void setCallback(Callback callback, const void* userParam = nullptr) { + CORRADE_DEPRECATED("use DebugOutput::setCallback() instead") static void setCallback(DebugOutput::Callback callback, const void* userParam = nullptr) { DebugOutput::setCallback(reinterpret_cast(callback), userParam); } From ae954c70fc53a2c281f4755f27366af4e5840f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 16:04:26 +0200 Subject: [PATCH 175/290] MeshTools: update outdated documentation. --- src/Magnum/MeshTools/RemoveDuplicates.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Magnum/MeshTools/RemoveDuplicates.h b/src/Magnum/MeshTools/RemoveDuplicates.h index 51abf7e2a..062fbaa48 100644 --- a/src/Magnum/MeshTools/RemoveDuplicates.h +++ b/src/Magnum/MeshTools/RemoveDuplicates.h @@ -80,11 +80,8 @@ data accordingly: std::vector positions; std::vector texCoords; -std::vector positionIndices; -std::tie(positionIndices, positions) = MeshTools::removeDuplicates(positions); - -std::vector texCoordIndices; -std::tie(texCoordIndices, texCoords) = MeshTools::removeDuplicates(texCoords); +std::vector positionIndices = MeshTools::removeDuplicates(positions); +std::vector texCoordIndices = MeshTools::removeDuplicates(texCoords); std::vector indices = MeshTools::combineIndexedArrays( std::make_pair(std::cref(positionIndices), std::ref(positions)), From aff85ce9257dc8fe6abca11b83b533452c4b43cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 16:07:27 +0200 Subject: [PATCH 176/290] MeshTools: port the dead benchmark code to Corrade TestSuite. --- src/Magnum/MeshTools/Test/CMakeLists.txt | 2 +- .../SubdivideRemoveDuplicatesBenchmark.cpp | 83 +++++++++++-------- .../Test/SubdivideRemoveDuplicatesBenchmark.h | 50 ----------- 3 files changed, 48 insertions(+), 87 deletions(-) delete mode 100644 src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.h diff --git a/src/Magnum/MeshTools/Test/CMakeLists.txt b/src/Magnum/MeshTools/Test/CMakeLists.txt index 5a324d4b6..91c8e60e1 100644 --- a/src/Magnum/MeshTools/Test/CMakeLists.txt +++ b/src/Magnum/MeshTools/Test/CMakeLists.txt @@ -31,7 +31,7 @@ corrade_add_test(MeshToolsGenerateFlatNormalsTest GenerateFlatNormalsTest.cpp LI corrade_add_test(MeshToolsInterleaveTest InterleaveTest.cpp LIBRARIES Magnum) corrade_add_test(MeshToolsRemoveDuplicatesTest RemoveDuplicatesTest.cpp LIBRARIES Magnum) corrade_add_test(MeshToolsSubdivideTest SubdivideTest.cpp LIBRARIES Magnum) -# corrade_add_test(MeshToolsSubdivideRemoveDuplicatesBenchmark SubdivideRemoveDuplicatesBenchmark.h SubdivideRemoveDuplicatesBenchmark.cpp MagnumPrimitives) +corrade_add_test(MeshToolsSubdivideRemoveDuplicatesBenchmark SubdivideRemoveDuplicatesBenchmark.cpp LIBRARIES MagnumPrimitives) corrade_add_test(MeshToolsTipsifyTest TipsifyTest.cpp LIBRARIES MagnumMeshTools) corrade_add_test(MeshToolsTransformTest TransformTest.cpp LIBRARIES MagnumMeshTools) diff --git a/src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.cpp b/src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.cpp index 91cf0e786..af48b49b5 100644 --- a/src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.cpp +++ b/src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.cpp @@ -23,62 +23,73 @@ DEALINGS IN THE SOFTWARE. */ -#include "SubdivideRemoveDuplicatesBenchmark.h" +#include -#include - -#include "Magnum/Primitives/Icosphere.h" +#include "Magnum/Math/Vector4.h" +#include "Magnum/MeshTools/Duplicate.h" #include "Magnum/MeshTools/RemoveDuplicates.h" #include "Magnum/MeshTools/Subdivide.h" - -QTEST_APPLESS_MAIN(Magnum::MeshTools::Test::SubdivideRemoveDuplicatesBenchmark) +#include "Magnum/Primitives/Icosphere.h" +#include "Magnum/Trade/MeshData3D.h" namespace Magnum { namespace MeshTools { namespace Test { +struct SubdivideRemoveDuplicatesBenchmark: TestSuite::Tester { + explicit SubdivideRemoveDuplicatesBenchmark(); + + void subdivide(); + void subdivideAndRemoveDuplicatesAfter(); + void subdivideAndRemoveDuplicatesInBetween(); +}; + +SubdivideRemoveDuplicatesBenchmark::SubdivideRemoveDuplicatesBenchmark() { + addBenchmarks({&SubdivideRemoveDuplicatesBenchmark::subdivide, + &SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesAfter, + &SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesInBetween}, 4, BenchmarkType::WallClock); +} + +namespace { + static Vector3 interpolator(const Vector3& a, const Vector3& b) { + return (a+b).normalized(); + } +} + void SubdivideRemoveDuplicatesBenchmark::subdivide() { - QBENCHMARK { - Primitives::Icosphere<0> icosphere; + CORRADE_BENCHMARK(3) { + Trade::MeshData3D icosphere = Primitives::Icosphere::solid(0); /* Subdivide 5 times */ - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); + for(std::size_t i = 0; i != 5; ++i) + MeshTools::subdivide(icosphere.indices(), icosphere.positions(0), interpolator); } } -void SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesMeshAfter() { - QBENCHMARK { - Primitives::Icosphere<0> icosphere; +void SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesAfter() { + CORRADE_BENCHMARK(3) { + Trade::MeshData3D icosphere = Primitives::Icosphere::solid(0); /* Subdivide 5 times */ - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); + for(std::size_t i = 0; i != 5; ++i) + MeshTools::subdivide(icosphere.indices(), icosphere.positions(0), interpolator); - MeshTools::removeDuplicates(*icosphere.indices(), *icosphere.positions(0)); + /* Remove duplicates after */ + icosphere.indices() = MeshTools::duplicate(icosphere.indices(), MeshTools::removeDuplicates(icosphere.positions(0))); } } -void SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesMeshBetween() { - QBENCHMARK { - Primitives::Icosphere<0> icosphere; +void SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesInBetween() { + CORRADE_BENCHMARK(3) { + Trade::MeshData3D icosphere = Primitives::Icosphere::solid(0); - /* Subdivide 5 times */ - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::removeDuplicates(*icosphere.indices(), *icosphere.positions(0)); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::removeDuplicates(*icosphere.indices(), *icosphere.positions(0)); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::removeDuplicates(*icosphere.indices(), *icosphere.positions(0)); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::removeDuplicates(*icosphere.indices(), *icosphere.positions(0)); - MeshTools::subdivide(*icosphere.indices(), *icosphere.positions(0), interpolator); - MeshTools::removeDuplicates(*icosphere.indices(), *icosphere.positions(0)); + /* Subdivide 5 times and remove duplicates during the operation */ + for(std::size_t i = 0; i != 5; ++i) { + MeshTools::subdivide(icosphere.indices(), icosphere.positions(0), interpolator); + icosphere.indices() = MeshTools::duplicate(icosphere.indices(), MeshTools::removeDuplicates(icosphere.positions(0))); + } } } }}} + +CORRADE_TEST_MAIN(Magnum::MeshTools::Test::SubdivideRemoveDuplicatesBenchmark) + diff --git a/src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.h b/src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.h deleted file mode 100644 index 1d6fba46c..000000000 --- a/src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef Magnum_MeshTools_Test_SubdivideRemoveDuplicatesBenchmark_h -#define Magnum_MeshTools_Test_SubdivideRemoveDuplicatesBenchmark_h -/* - This file is part of Magnum. - - Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 - Vladimír Vondruš - - 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. -*/ - -#include - -#include "Magnum/Magnum.h" - -namespace Magnum { namespace MeshTools { namespace Test { - -class SubdivideRemoveDuplicatesBenchmark: public QObject { - Q_OBJECT - - private slots: - void subdivide(); - void subdivideAndRemoveDuplicatesMeshAfter(); - void subdivideAndRemoveDuplicatesMeshBetween(); - - private: - static Magnum::Vector4 interpolator(const Magnum::Vector4& a, const Magnum::Vector4& b) { - return (a+b).xyz().normalized(); - } -}; - -}}} - -#endif From 8a603c847148ccdc24fa7f770d19ce47903ece90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 23:11:17 +0200 Subject: [PATCH 177/290] modules: adopt upstream FindOpenAL.cmake. Taken from version 3.6.1, https://github.com/Kitware/CMake/blob/v3.6.1/Modules/FindOpenAL.cmake. Will be modified for Emscripten support. --- modules/FindOpenAL.cmake | 110 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 modules/FindOpenAL.cmake diff --git a/modules/FindOpenAL.cmake b/modules/FindOpenAL.cmake new file mode 100644 index 000000000..eb63cef5a --- /dev/null +++ b/modules/FindOpenAL.cmake @@ -0,0 +1,110 @@ +#.rst: +# FindOpenAL +# ---------- +# +# +# +# Locate OpenAL This module defines OPENAL_LIBRARY OPENAL_FOUND, if +# false, do not try to link to OpenAL OPENAL_INCLUDE_DIR, where to find +# the headers +# +# $OPENALDIR is an environment variable that would correspond to the +# ./configure --prefix=$OPENALDIR used in building OpenAL. +# +# Created by Eric Wing. This was influenced by the FindSDL.cmake +# module. + +#============================================================================= +# Copyright 2005-2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +# This makes the presumption that you are include al.h like +# #include "al.h" +# and not +# #include +# The reason for this is that the latter is not entirely portable. +# Windows/Creative Labs does not by default put their headers in AL/ and +# OS X uses the convention . +# +# For Windows, Creative Labs seems to have added a registry key for their +# OpenAL 1.1 installer. I have added that key to the list of search paths, +# however, the key looks like it could be a little fragile depending on +# if they decide to change the 1.00.0000 number for bug fix releases. +# Also, they seem to have laid down groundwork for multiple library platforms +# which puts the library in an extra subdirectory. Currently there is only +# Win32 and I have hardcoded that here. This may need to be adjusted as +# platforms are introduced. +# The OpenAL 1.0 installer doesn't seem to have a useful key I can use. +# I do not know if the Nvidia OpenAL SDK has a registry key. +# +# For OS X, remember that OpenAL was added by Apple in 10.4 (Tiger). +# To support the framework, I originally wrote special framework detection +# code in this module which I have now removed with CMake's introduction +# of native support for frameworks. +# In addition, OpenAL is open source, and it is possible to compile on Panther. +# Furthermore, due to bugs in the initial OpenAL release, and the +# transition to OpenAL 1.1, it is common to need to override the built-in +# framework. +# Per my request, CMake should search for frameworks first in +# the following order: +# ~/Library/Frameworks/OpenAL.framework/Headers +# /Library/Frameworks/OpenAL.framework/Headers +# /System/Library/Frameworks/OpenAL.framework/Headers +# +# On OS X, this will prefer the Framework version (if found) over others. +# People will have to manually change the cache values of +# OPENAL_LIBRARY to override this selection or set the CMake environment +# CMAKE_INCLUDE_PATH to modify the search paths. + +find_path(OPENAL_INCLUDE_DIR al.h + HINTS + ENV OPENALDIR + PATH_SUFFIXES include/AL include/OpenAL include + PATHS + ~/Library/Frameworks + /Library/Frameworks + /sw # Fink + /opt/local # DarwinPorts + /opt/csw # Blastwave + /opt + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir] +) + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_OpenAL_ARCH_DIR libs/Win64) +else() + set(_OpenAL_ARCH_DIR libs/Win32) +endif() + +find_library(OPENAL_LIBRARY + NAMES OpenAL al openal OpenAL32 + HINTS + ENV OPENALDIR + PATH_SUFFIXES lib64 lib libs64 libs ${_OpenAL_ARCH_DIR} + PATHS + ~/Library/Frameworks + /Library/Frameworks + /sw + /opt/local + /opt/csw + /opt + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir] +) + +unset(_OpenAL_ARCH_DIR) + +# handle the QUIETLY and REQUIRED arguments and set OPENAL_FOUND to TRUE if +# all listed variables are TRUE +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenAL DEFAULT_MSG OPENAL_LIBRARY OPENAL_INCLUDE_DIR) + +mark_as_advanced(OPENAL_LIBRARY OPENAL_INCLUDE_DIR) From 8586fa575db8d7ffc7c3f2a5e317e6ed1c739172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 23:54:23 +0200 Subject: [PATCH 178/290] modules: adapt FindOpenAL.cmake to Emscripten. Emscripten bundles the OpenAL library implicitly, so there's no OPENAL_LIBRARY needed. Also minor other changes required for extracting the module out of the official location. --- doc/cmake.dox | 4 +++ modules/FindOpenAL.cmake | 77 +++++++++++++++++++++++++++------------- 2 files changed, 56 insertions(+), 25 deletions(-) diff --git a/doc/cmake.dox b/doc/cmake.dox index 0dbd4ff59..8efb9ba68 100644 --- a/doc/cmake.dox +++ b/doc/cmake.dox @@ -217,6 +217,10 @@ and @ref cmake-extras "Extras repository" have also their own CMake modules. The `modules/` directory contains more useful CMake modules: +- `FindOpenAL.cmake` -- CMake module for finding OpenAL. This is a forked + version of the upstream module that works properly with + @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten". Copy this to your module + directory if you want to use the @ref Audio library on Emscripten. - `FindGLFW.cmake` -- CMake module for finding GLFW. Copy this to your module directory if you want to use @ref Platform::GlfwApplication. - `FindEGL.cmake` -- CMake module for finding EGL. Copy this to your diff --git a/modules/FindOpenAL.cmake b/modules/FindOpenAL.cmake index eb63cef5a..aac70fae7 100644 --- a/modules/FindOpenAL.cmake +++ b/modules/FindOpenAL.cmake @@ -15,17 +15,39 @@ # module. #============================================================================= -# Copyright 2005-2009 Kitware, Inc. +# CMake - Cross Platform Makefile Generator +# Copyright 2000-2016 Kitware, Inc. +# Copyright 2000-2011 Insight Software Consortium +# All rights reserved. # -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: # -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the names of Kitware, Inc., the Insight Software Consortium, +# nor the names of their 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. #============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) # This makes the presumption that you are include al.h like # #include "al.h" @@ -68,7 +90,9 @@ find_path(OPENAL_INCLUDE_DIR al.h HINTS ENV OPENALDIR - PATH_SUFFIXES include/AL include/OpenAL include + # The AL was added in order to make the module working for Emscripten on OSX. + # Not sure why include/AL wasn't enough. + PATH_SUFFIXES include/AL include/OpenAL include AL PATHS ~/Library/Frameworks /Library/Frameworks @@ -85,26 +109,29 @@ else() set(_OpenAL_ARCH_DIR libs/Win32) endif() -find_library(OPENAL_LIBRARY - NAMES OpenAL al openal OpenAL32 - HINTS - ENV OPENALDIR - PATH_SUFFIXES lib64 lib libs64 libs ${_OpenAL_ARCH_DIR} - PATHS - ~/Library/Frameworks - /Library/Frameworks - /sw - /opt/local - /opt/csw - /opt - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir] -) +if(NOT CORRADE_TARGET_EMSCRIPTEN) + find_library(OPENAL_LIBRARY + NAMES OpenAL al openal OpenAL32 + HINTS + ENV OPENALDIR + PATH_SUFFIXES lib64 lib libs64 libs ${_OpenAL_ARCH_DIR} + PATHS + ~/Library/Frameworks + /Library/Frameworks + /sw + /opt/local + /opt/csw + /opt + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir] + ) + set(OPENAL_LIBRARY_NEEDED OPENAL_LIBRARY) +endif() unset(_OpenAL_ARCH_DIR) # handle the QUIETLY and REQUIRED arguments and set OPENAL_FOUND to TRUE if # all listed variables are TRUE -include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenAL DEFAULT_MSG OPENAL_LIBRARY OPENAL_INCLUDE_DIR) +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenAL DEFAULT_MSG ${OPENAL_LIBRARY_NEEDED} OPENAL_INCLUDE_DIR) mark_as_advanced(OPENAL_LIBRARY OPENAL_INCLUDE_DIR) From e7c2833ccd59672da9c667335c2af1c0e6e74137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 23:55:48 +0200 Subject: [PATCH 179/290] package/ci: use all cores when building with MinGW. Oh, so that's why it was so slow. --- package/ci/appveyor-desktop-mingw.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/ci/appveyor-desktop-mingw.bat b/package/ci/appveyor-desktop-mingw.bat index e97ffe66a..9c7c88949 100644 --- a/package/ci/appveyor-desktop-mingw.bat +++ b/package/ci/appveyor-desktop-mingw.bat @@ -37,8 +37,8 @@ cmake .. ^ -DBUILD_TESTS=ON ^ -DBUILD_GL_TESTS=ON ^ -G "MinGW Makefiles" || exit /b -cmake --build . || exit /b -cmake --build . --target install || exit /b +cmake --build . -- -j || exit /b +cmake --build . --target install -- -j || exit /b rem Test ctest -V -E GLTest || exit /b From 0250d304dc915ea56853793bb2add43ce5032be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 23:56:24 +0200 Subject: [PATCH 180/290] package: enable Audio library in all Emscripten packages and CIs. --- package/archlinux/PKGBUILD-emscripten | 2 ++ package/archlinux/PKGBUILD-emscripten-webgl2 | 2 ++ package/ci/travis-emscripten.sh | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package/archlinux/PKGBUILD-emscripten b/package/archlinux/PKGBUILD-emscripten index 592d7b05a..c0a974447 100644 --- a/package/archlinux/PKGBUILD-emscripten +++ b/package/archlinux/PKGBUILD-emscripten @@ -27,11 +27,13 @@ build() { cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/lib/emscripten/system \ + -DWITH_AUDIO=ON \ -DWITH_SDL2APPLICATION=ON \ -DWITH_MAGNUMFONT=ON \ -DWITH_OBJIMPORTER=ON \ -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ + -DWITH_WAVAUDIOIMPORTER=ON \ -DBUILD_TESTS=ON make -j4 } diff --git a/package/archlinux/PKGBUILD-emscripten-webgl2 b/package/archlinux/PKGBUILD-emscripten-webgl2 index 9e57decd4..bda3d37ca 100644 --- a/package/archlinux/PKGBUILD-emscripten-webgl2 +++ b/package/archlinux/PKGBUILD-emscripten-webgl2 @@ -28,11 +28,13 @@ build() { -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/lib/emscripten/system \ -DTARGET_GLES2=OFF \ + -DWITH_AUDIO=ON \ -DWITH_SDL2APPLICATION=ON \ -DWITH_MAGNUMFONT=ON \ -DWITH_OBJIMPORTER=ON \ -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ + -DWITH_WAVAUDIOIMPORTER=ON \ -DBUILD_TESTS=ON make -j4 } diff --git a/package/ci/travis-emscripten.sh b/package/ci/travis-emscripten.sh index 399a03081..68fe3394d 100755 --- a/package/ci/travis-emscripten.sh +++ b/package/ci/travis-emscripten.sh @@ -46,14 +46,14 @@ cmake .. \ -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-O1" \ -DCMAKE_INSTALL_PREFIX=$HOME/deps \ -DCMAKE_FIND_ROOT_PATH=$HOME/deps \ - -DWITH_AUDIO=OFF \ + -DWITH_AUDIO=ON \ -DWITH_SDL2APPLICATION=ON \ -DWITH_MAGNUMFONT=ON \ -DWITH_MAGNUMFONTCONVERTER=ON \ -DWITH_OBJIMPORTER=ON \ -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ - -DWITH_WAVAUDIOIMPORTER=OFF \ + -DWITH_WAVAUDIOIMPORTER=ON \ -DBUILD_TESTS=ON \ -DTARGET_GLES2=$TARGET_GLES2 make -j4 From c5d377b7713fee429caef262ffddacce8765af4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Sep 2016 23:57:29 +0200 Subject: [PATCH 181/290] external: define AL_APIENTRY if not defined. Fixes compilation under Emscripten. --- src/MagnumExternal/OpenAL/extensions.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/MagnumExternal/OpenAL/extensions.h b/src/MagnumExternal/OpenAL/extensions.h index c0c60c30a..90da98455 100644 --- a/src/MagnumExternal/OpenAL/extensions.h +++ b/src/MagnumExternal/OpenAL/extensions.h @@ -33,6 +33,11 @@ extern "C" { #endif +/* For compatibility with Emscripten that does not define this macro */ +#ifndef AL_APIENTRY +#define AL_APIENTRY +#endif + /* AL_EXT_float32 */ #ifndef AL_EXT_float32 #define AL_EXT_float32 1 From 45f4e18f1efa49220c50a8d3bee07c8813a006e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 2 Sep 2016 00:07:47 +0200 Subject: [PATCH 182/290] Audio, WavAudioImporter: bundle test files for Emscripten. --- src/Magnum/Audio/Test/CMakeLists.txt | 10 ++++++++++ src/Magnum/Audio/Test/configure.h.cmake | 2 +- .../WavAudioImporter/Test/CMakeLists.txt | 14 ++++++++++++++ .../WavAudioImporter/Test/configure.h.cmake | 2 +- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Audio/Test/CMakeLists.txt b/src/Magnum/Audio/Test/CMakeLists.txt index 939cecd9c..3b3ca4791 100644 --- a/src/Magnum/Audio/Test/CMakeLists.txt +++ b/src/Magnum/Audio/Test/CMakeLists.txt @@ -24,6 +24,12 @@ # DEALINGS IN THE SOFTWARE. # +if(CORRADE_TARGET_EMSCRIPTEN) + set(AUDIO_TEST_DIR "") +else() + set(AUDIO_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +endif() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) @@ -38,3 +44,7 @@ if(WITH_SCENEGRAPH) corrade_add_test(AudioListenerTest ListenerTest.cpp LIBRARIES MagnumSceneGraph MagnumAudio) corrade_add_test(AudioPlayableTest PlayableTest.cpp LIBRARIES MagnumSceneGraph MagnumAudio) endif() + +if(CORRADE_TARGET_EMSCRIPTEN) + emscripten_embed_file(AudioAbstractImporterTest file.bin "/file.bin") +endif() diff --git a/src/Magnum/Audio/Test/configure.h.cmake b/src/Magnum/Audio/Test/configure.h.cmake index 8208c7ca8..d2025143e 100644 --- a/src/Magnum/Audio/Test/configure.h.cmake +++ b/src/Magnum/Audio/Test/configure.h.cmake @@ -23,4 +23,4 @@ DEALINGS IN THE SOFTWARE. */ -#define AUDIO_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}" +#define AUDIO_TEST_DIR "${AUDIO_TEST_DIR}" diff --git a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt index ec775d9e4..8ae4594f0 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt @@ -23,8 +23,22 @@ # DEALINGS IN THE SOFTWARE. # +if(CORRADE_TARGET_EMSCRIPTEN) + set(WAVAUDIOIMPORTER_TEST_DIR "") +else() + set(WAVAUDIOIMPORTER_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +endif() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) corrade_add_test(WavAudioImporterTest WavImporterTest.cpp LIBRARIES MagnumWavAudioImporterTestLib) target_include_directories(WavAudioImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + +if(CORRADE_TARGET_EMSCRIPTEN) + emscripten_embed_file(WavAudioImporterTest mono16.wav "/mono16.wav") + emscripten_embed_file(WavAudioImporterTest stereo8.wav "/stereo8.wav") + emscripten_embed_file(WavAudioImporterTest unsupportedChannelCount.wav "/unsupportedChannelCount.wav") + emscripten_embed_file(WavAudioImporterTest unsupportedFormat.wav "/unsupportedFormat.wav") + emscripten_embed_file(WavAudioImporterTest wrongSignature.wav "/wrongSignature.wav") +endif() diff --git a/src/MagnumPlugins/WavAudioImporter/Test/configure.h.cmake b/src/MagnumPlugins/WavAudioImporter/Test/configure.h.cmake index 8bcf9cc77..ae1369dd9 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/WavAudioImporter/Test/configure.h.cmake @@ -23,4 +23,4 @@ DEALINGS IN THE SOFTWARE. */ -#define WAVAUDIOIMPORTER_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}" +#define WAVAUDIOIMPORTER_TEST_DIR "${WAVAUDIOIMPORTER_TEST_DIR}" From 73192301c4a76c27d4db6de764721cf063741c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 18:22:40 +0200 Subject: [PATCH 183/290] doc: fix and improve outdated documentation about GL tests. --- doc/building.dox | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/doc/building.dox b/doc/building.dox index 7ffe554ee..158271a16 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -282,9 +282,15 @@ in build directory. On Windows the tests require the library to be installed with DLLs accessible through `PATH`. See @ref building-windows "above Windows documentation" for more information. -Platforms which have windowless context creation implemented (currently only -desktop Linux) can build also tests for OpenGL functionality. You can enable -them with `BUILD_GL_TESTS`. +Platforms which have windowless GL context creation implemented (currently all +platforms except @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten", +@ref CORRADE_TARGET_NACL "NaCl", @ref CORRADE_TARGET_WINDOWS_RT "Windows RT" +and @ref CORRADE_TARGET_ANDROID "Android") can build also tests for OpenGL +functionality. You can enable them with `BUILD_GL_TESTS`. All GL tests are +suffixed with `GLTest` so they can be also selectively included/excluded when +running CTest, e.g.: + + ctest -R GLTest # run only tests requiring OpenGL context @subsection building-doc Building documentation From d58d26aefffc88c29bd4cdec02dbb0498a1f0606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 18:23:23 +0200 Subject: [PATCH 184/290] Audio: ability to run tests requiring OpenAL context separately. Added a new enabled-by-default BUILD_AL_TESTS CMake option. The test cases that actually require OpenAL context were split to new tests with `*ALTest` suffix so they can be executed selectively. --- CMakeLists.txt | 1 + doc/building.dox | 10 + src/Magnum/Audio/Test/BufferALTest.cpp | 52 ++++++ src/Magnum/Audio/Test/BufferTest.cpp | 12 +- src/Magnum/Audio/Test/CMakeLists.txt | 13 +- src/Magnum/Audio/Test/ContextALTest.cpp | 60 ++++++ src/Magnum/Audio/Test/ContextTest.cpp | 21 +-- .../{ListenerTest.cpp => ListenerALTest.cpp} | 35 ++-- .../{PlayableTest.cpp => PlayableALTest.cpp} | 27 ++- src/Magnum/Audio/Test/RendererALTest.cpp | 110 +++++++++++ src/Magnum/Audio/Test/RendererTest.cpp | 71 +------ src/Magnum/Audio/Test/SourceALTest.cpp | 173 ++++++++++++++++++ src/Magnum/Audio/Test/SourceTest.cpp | 126 +------------ 13 files changed, 450 insertions(+), 261 deletions(-) create mode 100644 src/Magnum/Audio/Test/BufferALTest.cpp create mode 100644 src/Magnum/Audio/Test/ContextALTest.cpp rename src/Magnum/Audio/Test/{ListenerTest.cpp => ListenerALTest.cpp} (81%) rename src/Magnum/Audio/Test/{PlayableTest.cpp => PlayableALTest.cpp} (84%) create mode 100644 src/Magnum/Audio/Test/RendererALTest.cpp create mode 100644 src/Magnum/Audio/Test/SourceALTest.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f6433a857..e6cc02b4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -148,6 +148,7 @@ option(BUILD_STATIC_PIC "Build static libraries and plugins with position-indepe option(BUILD_PLUGINS_STATIC "Build static plugins (default are dynamic)" OFF) option(BUILD_TESTS "Build unit tests" OFF) cmake_dependent_option(BUILD_GL_TESTS "Build unit tests for OpenGL code" OFF "BUILD_TESTS" OFF) +cmake_dependent_option(BUILD_AL_TESTS "Build unit tests for OpenAL code" ON "BUILD_TESTS" OFF) if(BUILD_TESTS) find_package(Corrade REQUIRED TestSuite) if(CORRADE_TARGET_IOS) diff --git a/doc/building.dox b/doc/building.dox index 158271a16..31f576d6b 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -282,6 +282,16 @@ in build directory. On Windows the tests require the library to be installed with DLLs accessible through `PATH`. See @ref building-windows "above Windows documentation" for more information. +The @ref Audio library has tests which require OpenAL to be able to create a +context. That is the case on most platforms, so they are enabled by default. +In case it's not possible to have OpenAL context (such as when running +@ref CORRADE_TARGET_EMSCRIPTEN "Emscripten" tests under Node.js), you can +disable building of them with `BUILD_AL_TESTS`. The tests are suffixed with +`ALTest` so they can be also selectively included/excluded when running CTest, +e.g.: + + ctest -E ALTest # run everything except tests requiring OpenAL context + Platforms which have windowless GL context creation implemented (currently all platforms except @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten", @ref CORRADE_TARGET_NACL "NaCl", @ref CORRADE_TARGET_WINDOWS_RT "Windows RT" diff --git a/src/Magnum/Audio/Test/BufferALTest.cpp b/src/Magnum/Audio/Test/BufferALTest.cpp new file mode 100644 index 000000000..298ae9c18 --- /dev/null +++ b/src/Magnum/Audio/Test/BufferALTest.cpp @@ -0,0 +1,52 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include + +#include "Magnum/Audio/Buffer.h" +#include "Magnum/Audio/Context.h" + +namespace Magnum { namespace Audio { namespace Test { + +struct BufferALTest: TestSuite::Tester { + explicit BufferALTest(); + + void construct(); + + Context _context; +}; + +BufferALTest::BufferALTest() { + addTests({&BufferALTest::construct}); +} + +void BufferALTest::construct() { + Buffer buf; + CORRADE_VERIFY(buf.id() != 0); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Audio::Test::BufferALTest) diff --git a/src/Magnum/Audio/Test/BufferTest.cpp b/src/Magnum/Audio/Test/BufferTest.cpp index 1522d1558..76bb55625 100644 --- a/src/Magnum/Audio/Test/BufferTest.cpp +++ b/src/Magnum/Audio/Test/BufferTest.cpp @@ -27,27 +27,17 @@ #include #include "Magnum/Audio/Buffer.h" -#include "Magnum/Audio/Context.h" namespace Magnum { namespace Audio { namespace Test { struct BufferTest: TestSuite::Tester { explicit BufferTest(); - void construct(); void debugFormat(); - - Context _context; }; BufferTest::BufferTest() { - addTests({&BufferTest::construct, - &BufferTest::debugFormat}); -} - -void BufferTest::construct() { - Buffer buf; - CORRADE_VERIFY(buf.id() != 0); + addTests({&BufferTest::debugFormat}); } void BufferTest::debugFormat() { diff --git a/src/Magnum/Audio/Test/CMakeLists.txt b/src/Magnum/Audio/Test/CMakeLists.txt index 3b3ca4791..83a33b70f 100644 --- a/src/Magnum/Audio/Test/CMakeLists.txt +++ b/src/Magnum/Audio/Test/CMakeLists.txt @@ -40,9 +40,16 @@ corrade_add_test(AudioContextTest ContextTest.cpp LIBRARIES MagnumAudio) corrade_add_test(AudioRendererTest RendererTest.cpp LIBRARIES MagnumAudio) corrade_add_test(AudioSourceTest SourceTest.cpp LIBRARIES MagnumAudio) -if(WITH_SCENEGRAPH) - corrade_add_test(AudioListenerTest ListenerTest.cpp LIBRARIES MagnumSceneGraph MagnumAudio) - corrade_add_test(AudioPlayableTest PlayableTest.cpp LIBRARIES MagnumSceneGraph MagnumAudio) +if(BUILD_AL_TESTS) + corrade_add_test(AudioBufferALTest BufferALTest.cpp LIBRARIES MagnumAudio) + corrade_add_test(AudioContextALTest ContextALTest.cpp LIBRARIES MagnumAudio) + corrade_add_test(AudioRendererALTest RendererALTest.cpp LIBRARIES MagnumAudio) + corrade_add_test(AudioSourceALTest SourceALTest.cpp LIBRARIES MagnumAudio) + + if(WITH_SCENEGRAPH) + corrade_add_test(AudioListenerALTest ListenerALTest.cpp LIBRARIES MagnumSceneGraph MagnumAudio) + corrade_add_test(AudioPlayableALTest PlayableALTest.cpp LIBRARIES MagnumSceneGraph MagnumAudio) + endif() endif() if(CORRADE_TARGET_EMSCRIPTEN) diff --git a/src/Magnum/Audio/Test/ContextALTest.cpp b/src/Magnum/Audio/Test/ContextALTest.cpp new file mode 100644 index 000000000..095c8e3f8 --- /dev/null +++ b/src/Magnum/Audio/Test/ContextALTest.cpp @@ -0,0 +1,60 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + Copyright © 2015 Jonathan Hale + + 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. +*/ + +#include + +#include "Magnum/Audio/Extensions.h" +#include "Magnum/Audio/Context.h" + +namespace Magnum { namespace Audio { namespace Test { + +struct ContextALTest: TestSuite::Tester { + explicit ContextALTest(); + + void extensionsString(); + void isExtensionEnabled(); + + Context _context; +}; + +ContextALTest::ContextALTest() { + addTests({&ContextALTest::extensionsString, + &ContextALTest::isExtensionEnabled}); +} + +void ContextALTest::extensionsString() { + std::vector extensions = _context.extensionStrings(); + + CORRADE_VERIFY(extensions.size() > 0); +} + +void ContextALTest::isExtensionEnabled() { + CORRADE_VERIFY(Context::current().isExtensionSupported()); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Audio::Test::ContextALTest) diff --git a/src/Magnum/Audio/Test/ContextTest.cpp b/src/Magnum/Audio/Test/ContextTest.cpp index 452ac51d8..5a0b1dbf5 100644 --- a/src/Magnum/Audio/Test/ContextTest.cpp +++ b/src/Magnum/Audio/Test/ContextTest.cpp @@ -27,7 +27,6 @@ #include #include -#include "Magnum/Audio/Extensions.h" #include "Magnum/Audio/Context.h" namespace Magnum { namespace Audio { namespace Test { @@ -35,29 +34,11 @@ namespace Magnum { namespace Audio { namespace Test { struct ContextTest: TestSuite::Tester { explicit ContextTest(); - void extensionsString(); - void isExtensionEnabled(); - void debugHrtfStatus(); - - Context _context; }; ContextTest::ContextTest() { - addTests({&ContextTest::extensionsString, - &ContextTest::isExtensionEnabled, - - &ContextTest::debugHrtfStatus}); -} - -void ContextTest::extensionsString() { - std::vector extensions = _context.extensionStrings(); - - CORRADE_VERIFY(extensions.size() > 0); -} - -void ContextTest::isExtensionEnabled() { - CORRADE_VERIFY(Context::current().isExtensionSupported()); + addTests({&ContextTest::debugHrtfStatus}); } void ContextTest::debugHrtfStatus() { diff --git a/src/Magnum/Audio/Test/ListenerTest.cpp b/src/Magnum/Audio/Test/ListenerALTest.cpp similarity index 81% rename from src/Magnum/Audio/Test/ListenerTest.cpp rename to src/Magnum/Audio/Test/ListenerALTest.cpp index 2e22aa32c..dea7ce4b2 100644 --- a/src/Magnum/Audio/Test/ListenerTest.cpp +++ b/src/Magnum/Audio/Test/ListenerALTest.cpp @@ -26,15 +26,14 @@ #include -#include -#include -#include -#include - #include "Magnum/Audio/Playable.h" #include "Magnum/Audio/Context.h" #include "Magnum/Audio/Listener.h" #include "Magnum/Audio/PlayableGroup.h" +#include "Magnum/SceneGraph/Scene.h" +#include "Magnum/SceneGraph/Object.h" +#include "Magnum/SceneGraph/MatrixTransformation2D.h" +#include "Magnum/SceneGraph/MatrixTransformation3D.h" namespace Magnum { namespace Audio { namespace Test { @@ -44,23 +43,23 @@ typedef SceneGraph::Object Object2D; typedef SceneGraph::Scene Scene3D; typedef SceneGraph::Object Object3D; -struct ListenerTest: TestSuite::Tester { - explicit ListenerTest(); +struct ListenerALTest: TestSuite::Tester { + explicit ListenerALTest(); - void testFeature2D(); - void testFeature3D(); - void testUpdateGroups(); + void feature2D(); + void feature3D(); + void updateGroups(); Context _context; }; -ListenerTest::ListenerTest(): _context() { - addTests({&ListenerTest::testFeature2D, - &ListenerTest::testFeature3D, - &ListenerTest::testUpdateGroups}); +ListenerALTest::ListenerALTest() { + addTests({&ListenerALTest::feature2D, + &ListenerALTest::feature3D, + &ListenerALTest::updateGroups}); } -void ListenerTest::testFeature2D() { +void ListenerALTest::feature2D() { Scene2D scene; Object2D object{&scene}; Listener2D listener{object}; @@ -72,7 +71,7 @@ void ListenerTest::testFeature2D() { CORRADE_COMPARE(Renderer::listenerPosition(), offset); } -void ListenerTest::testFeature3D() { +void ListenerALTest::feature3D() { Scene3D scene; Object3D object{&scene}; Listener3D listener{object}; @@ -84,7 +83,7 @@ void ListenerTest::testFeature3D() { CORRADE_COMPARE(Renderer::listenerPosition(), offset); } -void ListenerTest::testUpdateGroups() { +void ListenerALTest::updateGroups() { Scene3D scene; Object3D sourceObject{&scene}; Object3D object{&scene}; @@ -108,4 +107,4 @@ void ListenerTest::testUpdateGroups() { }}} -CORRADE_TEST_MAIN(Magnum::Audio::Test::ListenerTest) +CORRADE_TEST_MAIN(Magnum::Audio::Test::ListenerALTest) diff --git a/src/Magnum/Audio/Test/PlayableTest.cpp b/src/Magnum/Audio/Test/PlayableALTest.cpp similarity index 84% rename from src/Magnum/Audio/Test/PlayableTest.cpp rename to src/Magnum/Audio/Test/PlayableALTest.cpp index 3a185d18a..567b342cc 100644 --- a/src/Magnum/Audio/Test/PlayableTest.cpp +++ b/src/Magnum/Audio/Test/PlayableALTest.cpp @@ -26,33 +26,32 @@ #include -#include -#include -#include - #include "Magnum/Audio/Context.h" #include "Magnum/Audio/Playable.h" +#include "Magnum/SceneGraph/Scene.h" +#include "Magnum/SceneGraph/Object.h" +#include "Magnum/SceneGraph/MatrixTransformation3D.h" namespace Magnum { namespace Audio { namespace Test { typedef SceneGraph::Scene Scene3D; typedef SceneGraph::Object Object3D; -struct PlayableTest: TestSuite::Tester { - explicit PlayableTest(); +struct PlayableALTest: TestSuite::Tester { + explicit PlayableALTest(); - void testFeature(); - void testGroup(); + void feature(); + void group(); Context _context; }; -PlayableTest::PlayableTest() { - addTests({&PlayableTest::testFeature, - &PlayableTest::testGroup}); +PlayableALTest::PlayableALTest() { + addTests({&PlayableALTest::feature, + &PlayableALTest::group}); } -void PlayableTest::testFeature() { +void PlayableALTest::feature() { Scene3D scene; Object3D object{&scene}; Source source; @@ -65,7 +64,7 @@ void PlayableTest::testFeature() { CORRADE_COMPARE(playable.source().position(), offset); } -void PlayableTest::testGroup() { +void PlayableALTest::group() { Scene3D scene; Object3D object{&scene}; Source source; @@ -94,4 +93,4 @@ void PlayableTest::testGroup() { }}} -CORRADE_TEST_MAIN(Magnum::Audio::Test::PlayableTest) +CORRADE_TEST_MAIN(Magnum::Audio::Test::PlayableALTest) diff --git a/src/Magnum/Audio/Test/RendererALTest.cpp b/src/Magnum/Audio/Test/RendererALTest.cpp new file mode 100644 index 000000000..04671df93 --- /dev/null +++ b/src/Magnum/Audio/Test/RendererALTest.cpp @@ -0,0 +1,110 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include + +#include "Magnum/Audio/Context.h" +#include "Magnum/Audio/Renderer.h" + +namespace Magnum { namespace Audio { namespace Test { + +struct RendererALTest: TestSuite::Tester { + explicit RendererALTest(); + + void listenerOrientation(); + void listenerPosition(); + void listenerVelocity(); + void listenerGain(); + void speedOfSound(); + void dopplerFactor(); + void distanceModel(); + + Context _context; +}; + +RendererALTest::RendererALTest() { + addTests({&RendererALTest::listenerOrientation, + &RendererALTest::listenerPosition, + &RendererALTest::listenerVelocity, + &RendererALTest::listenerGain, + &RendererALTest::speedOfSound, + &RendererALTest::dopplerFactor, + &RendererALTest::distanceModel}); +} + +void RendererALTest::listenerOrientation() { + constexpr Vector3 up{1.0f, 2.0f, 3.0f}, fwd{3.0f, 2.0f, 1.0f}; + Renderer::setListenerOrientation(fwd, up); + std::array orientation = Renderer::listenerOrientation(); + + CORRADE_COMPARE(orientation[0], fwd); + CORRADE_COMPARE(orientation[1], up); +} + +void RendererALTest::listenerPosition() { + constexpr Vector3 pos{1.0f, 3.0f, 2.0f}; + Renderer::setListenerPosition(pos); + + CORRADE_COMPARE(Renderer::listenerPosition(), pos); +} + +void RendererALTest::listenerVelocity() { + constexpr Vector3 vel{1.0f, 3.0f, 2.0f}; + Renderer::setListenerVelocity(vel); + + CORRADE_COMPARE(Renderer::listenerVelocity(), vel); +} + +void RendererALTest::listenerGain() { + constexpr Float gain = 0.512f; + Renderer::setListenerGain(gain); + + CORRADE_COMPARE(Renderer::listenerGain(), gain); +} + +void RendererALTest::speedOfSound() { + constexpr Float speed = 1.25f; + Renderer::setSpeedOfSound(speed); + + CORRADE_COMPARE(Renderer::speedOfSound(), speed); +} + +void RendererALTest::dopplerFactor() { + constexpr Float factor = 0.3335f; + Renderer::setDopplerFactor(factor); + + CORRADE_COMPARE(Renderer::dopplerFactor(), factor); +} + +void RendererALTest::distanceModel() { + constexpr Renderer::DistanceModel model = Renderer::DistanceModel::InverseClamped; + Renderer::setDistanceModel(model); + + CORRADE_COMPARE(Renderer::distanceModel(), model); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Audio::Test::RendererALTest) diff --git a/src/Magnum/Audio/Test/RendererTest.cpp b/src/Magnum/Audio/Test/RendererTest.cpp index 123e07371..ea6b7ef32 100644 --- a/src/Magnum/Audio/Test/RendererTest.cpp +++ b/src/Magnum/Audio/Test/RendererTest.cpp @@ -27,91 +27,22 @@ #include #include "Magnum/Magnum.h" -#include "Magnum/Audio/Context.h" #include "Magnum/Audio/Renderer.h" namespace Magnum { namespace Audio { namespace Test { struct RendererTest: TestSuite::Tester { explicit RendererTest(); - void listenerOrientation(); - void listenerPosition(); - void listenerVelocity(); - void listenerGain(); - void speedOfSound(); - void dopplerFactor(); - void distanceModel(); void debugError(); void debugDistanceModel(); - - Context _context; }; RendererTest::RendererTest() { - addTests({&RendererTest::listenerOrientation, - &RendererTest::listenerPosition, - &RendererTest::listenerVelocity, - &RendererTest::listenerGain, - &RendererTest::speedOfSound, - &RendererTest::dopplerFactor, - &RendererTest::distanceModel, - - &RendererTest::debugError, + addTests({&RendererTest::debugError, &RendererTest::debugDistanceModel}); } -void RendererTest::listenerOrientation() { - constexpr Vector3 up{1.0f, 2.0f, 3.0f}, fwd{3.0f, 2.0f, 1.0f}; - Renderer::setListenerOrientation(fwd, up); - std::array orientation = Renderer::listenerOrientation(); - - CORRADE_COMPARE(orientation[0], fwd); - CORRADE_COMPARE(orientation[1], up); -} - -void RendererTest::listenerPosition() { - constexpr Vector3 pos{1.0f, 3.0f, 2.0f}; - Renderer::setListenerPosition(pos); - - CORRADE_COMPARE(Renderer::listenerPosition(), pos); -} - -void RendererTest::listenerVelocity() { - constexpr Vector3 vel{1.0f, 3.0f, 2.0f}; - Renderer::setListenerVelocity(vel); - - CORRADE_COMPARE(Renderer::listenerVelocity(), vel); -} - -void RendererTest::listenerGain() { - constexpr Float gain = 0.512f; - Renderer::setListenerGain(gain); - - CORRADE_COMPARE(Renderer::listenerGain(), gain); -} - -void RendererTest::speedOfSound() { - constexpr Float speed = 1.25f; - Renderer::setSpeedOfSound(speed); - - CORRADE_COMPARE(Renderer::speedOfSound(), speed); -} - -void RendererTest::dopplerFactor() { - constexpr Float factor = 0.3335f; - Renderer::setDopplerFactor(factor); - - CORRADE_COMPARE(Renderer::dopplerFactor(), factor); -} - -void RendererTest::distanceModel() { - constexpr Renderer::DistanceModel model = Renderer::DistanceModel::InverseClamped; - Renderer::setDistanceModel(model); - - CORRADE_COMPARE(Renderer::distanceModel(), model); -} - void RendererTest::debugError() { std::ostringstream out; Debug(&out) << Renderer::Error::InvalidOperation << Renderer::Error(0xdead); diff --git a/src/Magnum/Audio/Test/SourceALTest.cpp b/src/Magnum/Audio/Test/SourceALTest.cpp new file mode 100644 index 000000000..7dfa190c8 --- /dev/null +++ b/src/Magnum/Audio/Test/SourceALTest.cpp @@ -0,0 +1,173 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include + +#include "Magnum/Audio/Context.h" +#include "Magnum/Audio/Source.h" + +namespace Magnum { namespace Audio { namespace Test { + +struct SourceALTest: TestSuite::Tester { + explicit SourceALTest(); + + void construct(); + + void position(); + void direction(); + void velocity(); + void gain(); + void looping(); + void relative(); + void maxDistance(); + void maxGain(); + void minGain(); + void coneAnglesAndGain(); + void rolloffFactor(); + + Context _context; +}; + +SourceALTest::SourceALTest() { + addTests({&SourceALTest::construct, + + &SourceALTest::position, + &SourceALTest::direction, + &SourceALTest::velocity, + &SourceALTest::gain, + &SourceALTest::looping, + &SourceALTest::relative, + &SourceALTest::maxDistance, + &SourceALTest::maxGain, + &SourceALTest::minGain, + &SourceALTest::coneAnglesAndGain, + &SourceALTest::rolloffFactor}); +} + +void SourceALTest::construct() { + Source source; + CORRADE_VERIFY(source.id() != 0); +} + +void SourceALTest::position() { + Source source; + constexpr Vector3 pos{3.0f, 5.0f, 6.0f}; + source.setPosition(pos); + + CORRADE_COMPARE(source.position(), pos); +} + +void SourceALTest::direction() { + Source source; + constexpr Vector3 dir{3.0f, 1.0f, 2.0f}; + source.setDirection(dir); + + CORRADE_COMPARE(source.direction(), dir); +} + +void SourceALTest::velocity() { + Source source; + constexpr Vector3 vel{-3.0f, 5.0f, -6.0f}; + source.setVelocity(vel); + + CORRADE_COMPARE(source.velocity(), vel); +} + +void SourceALTest::gain() { + Source source; + constexpr Float gain = 0.1234f; + source.setGain(gain); + + CORRADE_COMPARE(source.gain(), gain); +} + +void SourceALTest::looping() { + Source source; + source.setLooping(true); + CORRADE_VERIFY(source.isLooping()); + source.setLooping(false); + CORRADE_VERIFY(!source.isLooping()); +} + +void SourceALTest::relative() { + Source source; + source.setRelative(true); + CORRADE_VERIFY(source.isRelative()); + source.setRelative(false); + CORRADE_VERIFY(!source.isRelative()); +} + +void SourceALTest::maxDistance() { + Source source; + constexpr Float dist = 0.222f; + source.setMaxDistance(dist); + + CORRADE_COMPARE(source.maxDistance(), dist); +} + +void SourceALTest::maxGain() { + Source source; + constexpr Float gain = 0.3131f; + source.setMaxGain(gain); + + CORRADE_COMPARE(source.maxGain(), gain); +} + +void SourceALTest::minGain() { + Source source; + constexpr Float gain = 0.4144f; + source.setMinGain(gain); + + CORRADE_COMPARE(source.minGain(), gain); +} + +void SourceALTest::coneAnglesAndGain() { + using namespace Math::Literals; + + Source source; + constexpr auto outerAngle = 12.0_degf; + constexpr auto innerAngle = 21.0_degf; + constexpr Float outerGain = 0.05f; + + source.setInnerConeAngle(innerAngle); + source.setOuterConeAngle(outerAngle); + source.setOuterConeGain(outerGain); + + CORRADE_COMPARE(source.outerConeAngle(), outerAngle); + CORRADE_COMPARE(source.innerConeAngle(), innerAngle); + CORRADE_COMPARE(source.outerConeGain(), outerGain); +} + +void SourceALTest::rolloffFactor() { + Source source; + constexpr Float fact = 42.0f; + source.setRolloffFactor(fact); + + CORRADE_COMPARE(source.rolloffFactor(), fact); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Audio::Test::SourceALTest) diff --git a/src/Magnum/Audio/Test/SourceTest.cpp b/src/Magnum/Audio/Test/SourceTest.cpp index 7b8dbb033..521a04a3a 100644 --- a/src/Magnum/Audio/Test/SourceTest.cpp +++ b/src/Magnum/Audio/Test/SourceTest.cpp @@ -26,7 +26,6 @@ #include #include -#include "Magnum/Audio/Context.h" #include "Magnum/Audio/Source.h" namespace Magnum { namespace Audio { namespace Test { @@ -34,134 +33,11 @@ namespace Magnum { namespace Audio { namespace Test { struct SourceTest: TestSuite::Tester { explicit SourceTest(); - void position(); - void direction(); - void velocity(); - void gain(); - void looping(); - void relative(); - void maxDistance(); - void maxGain(); - void minGain(); - void coneAnglesAndGain(); - void rolloffFactor(); - void debugState(); - - Context _context; }; SourceTest::SourceTest() { - addTests({&SourceTest::position, - &SourceTest::direction, - &SourceTest::velocity, - &SourceTest::gain, - &SourceTest::looping, - &SourceTest::relative, - &SourceTest::maxDistance, - &SourceTest::maxGain, - &SourceTest::minGain, - &SourceTest::coneAnglesAndGain, - &SourceTest::rolloffFactor, - - &SourceTest::debugState}); -} - -void SourceTest::position() { - Source source; - constexpr Vector3 pos{3.0f, 5.0f, 6.0f}; - source.setPosition(pos); - - CORRADE_COMPARE(source.position(), pos); -} - -void SourceTest::direction() { - Source source; - constexpr Vector3 dir{3.0f, 1.0f, 2.0f}; - source.setDirection(dir); - - CORRADE_COMPARE(source.direction(), dir); -} - -void SourceTest::velocity() { - Source source; - constexpr Vector3 vel{-3.0f, 5.0f, -6.0f}; - source.setVelocity(vel); - - CORRADE_COMPARE(source.velocity(), vel); -} - -void SourceTest::gain() { - Source source; - constexpr Float gain = 0.1234f; - source.setGain(gain); - - CORRADE_COMPARE(source.gain(), gain); -} - -void SourceTest::looping() { - Source source; - source.setLooping(true); - CORRADE_VERIFY(source.isLooping()); - source.setLooping(false); - CORRADE_VERIFY(!source.isLooping()); -} - -void SourceTest::relative() { - Source source; - source.setRelative(true); - CORRADE_VERIFY(source.isRelative()); - source.setRelative(false); - CORRADE_VERIFY(!source.isRelative()); -} - -void SourceTest::maxDistance() { - Source source; - constexpr Float dist = 0.222f; - source.setMaxDistance(dist); - - CORRADE_COMPARE(source.maxDistance(), dist); -} - -void SourceTest::maxGain() { - Source source; - constexpr Float gain = 0.3131f; - source.setMaxGain(gain); - - CORRADE_COMPARE(source.maxGain(), gain); -} - -void SourceTest::minGain() { - Source source; - constexpr Float gain = 0.4144f; - source.setMinGain(gain); - - CORRADE_COMPARE(source.minGain(), gain); -} - -void SourceTest::coneAnglesAndGain() { - using namespace Math::Literals; - - Source source; - constexpr auto outerAngle = 12.0_degf; - constexpr auto innerAngle = 21.0_degf; - constexpr Float outerGain = 0.05f; - - source.setInnerConeAngle(innerAngle); - source.setOuterConeAngle(outerAngle); - source.setOuterConeGain(outerGain); - - CORRADE_COMPARE(source.outerConeAngle(), outerAngle); - CORRADE_COMPARE(source.innerConeAngle(), innerAngle); - CORRADE_COMPARE(source.outerConeGain(), outerGain); -} - -void SourceTest::rolloffFactor() { - Source source; - constexpr Float fact = 42.0f; - source.setRolloffFactor(fact); - - CORRADE_COMPARE(source.rolloffFactor(), fact); + addTests({&SourceTest::debugState}); } void SourceTest::debugState() { From 85979ad996c3d632c4f99da5335695d9ab636e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 18:26:33 +0200 Subject: [PATCH 185/290] package: don't run OpenAL tests on Emscripten. Node.js doesn't support WebAudio. --- package/archlinux/PKGBUILD-emscripten | 2 +- package/archlinux/PKGBUILD-emscripten-webgl2 | 2 +- package/ci/travis-emscripten.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package/archlinux/PKGBUILD-emscripten b/package/archlinux/PKGBUILD-emscripten index c0a974447..e11e05b0a 100644 --- a/package/archlinux/PKGBUILD-emscripten +++ b/package/archlinux/PKGBUILD-emscripten @@ -40,7 +40,7 @@ build() { check() { cd "$_rootdir/build-emscripten" - CORRADE_TEST_COLOR=ON ctest --output-on-failure + CORRADE_TEST_COLOR=ON ctest --output-on-failure -E ALTest } package() { diff --git a/package/archlinux/PKGBUILD-emscripten-webgl2 b/package/archlinux/PKGBUILD-emscripten-webgl2 index bda3d37ca..e8c83a6bd 100644 --- a/package/archlinux/PKGBUILD-emscripten-webgl2 +++ b/package/archlinux/PKGBUILD-emscripten-webgl2 @@ -41,7 +41,7 @@ build() { check() { cd "$_rootdir/build-emscripten" - CORRADE_TEST_COLOR=ON ctest --output-on-failure + CORRADE_TEST_COLOR=ON ctest --output-on-failure -E ALTest } package() { diff --git a/package/ci/travis-emscripten.sh b/package/ci/travis-emscripten.sh index 68fe3394d..545e02927 100755 --- a/package/ci/travis-emscripten.sh +++ b/package/ci/travis-emscripten.sh @@ -59,4 +59,4 @@ cmake .. \ make -j4 # Test -CORRADE_TEST_COLOR=ON ctest -V +CORRADE_TEST_COLOR=ON ctest -V -E ALTest From 09836c71154a449fe597e7fbc871eb45e36c4c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 4 Sep 2016 18:33:35 +0200 Subject: [PATCH 186/290] MeshTools: shorten the benchmark name to avoid too wide CTest output. --- src/Magnum/MeshTools/Test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/MeshTools/Test/CMakeLists.txt b/src/Magnum/MeshTools/Test/CMakeLists.txt index 91c8e60e1..d511e745e 100644 --- a/src/Magnum/MeshTools/Test/CMakeLists.txt +++ b/src/Magnum/MeshTools/Test/CMakeLists.txt @@ -31,7 +31,7 @@ corrade_add_test(MeshToolsGenerateFlatNormalsTest GenerateFlatNormalsTest.cpp LI corrade_add_test(MeshToolsInterleaveTest InterleaveTest.cpp LIBRARIES Magnum) corrade_add_test(MeshToolsRemoveDuplicatesTest RemoveDuplicatesTest.cpp LIBRARIES Magnum) corrade_add_test(MeshToolsSubdivideTest SubdivideTest.cpp LIBRARIES Magnum) -corrade_add_test(MeshToolsSubdivideRemoveDuplicatesBenchmark SubdivideRemoveDuplicatesBenchmark.cpp LIBRARIES MagnumPrimitives) +corrade_add_test(MeshToolsSubdivideRemov___Benchmark SubdivideRemoveDuplicatesBenchmark.cpp LIBRARIES MagnumPrimitives) corrade_add_test(MeshToolsTipsifyTest TipsifyTest.cpp LIBRARIES MagnumMeshTools) corrade_add_test(MeshToolsTransformTest TransformTest.cpp LIBRARIES MagnumMeshTools) From 782ec2413073982d5bb0aa1e93ae692df8ba8657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 11 Sep 2016 17:15:04 +0200 Subject: [PATCH 187/290] doc: show the more common case with plugins from the plugins repo. Not from the main repo. May cause confusion among users. --- doc/plugins.dox | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/plugins.dox b/doc/plugins.dox index 4a8432cd5..35c4b5e37 100644 --- a/doc/plugins.dox +++ b/doc/plugins.dox @@ -179,10 +179,10 @@ usage is basically the same as above, but you need to explicitly find the plugin and link it into the executable in your `CMakeLists.txt`. See @ref cmake and @ref cmake-plugins for additional information. @code -find_package(Magnum REQUIRED TgaImporter) +find_package(MagnumPlugins REQUIRED PngImporter) add_executable(MyApp ...) -target_link_libraries(MyApp ... Magnum::TgaImporter) +target_link_libraries(MyApp ... MagnumPlugins::PngImporter) @endcode The only user-visible behavioral change will be that From 0125d32e5e797e857c08f87c9b22a174f11cd8fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 11 Sep 2016 21:38:43 +0200 Subject: [PATCH 188/290] doc: clarify what modules are provided in the main bootstrap repo. --- doc/getting-started.dox | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/getting-started.dox b/doc/getting-started.dox index a9dc68dac..5a8aca671 100644 --- a/doc/getting-started.dox +++ b/doc/getting-started.dox @@ -110,6 +110,12 @@ standard CMake installation, these aren't part of it and thus must be distributed with the project. These files are just verbatim copied from Magnum repository. +@note These modules are just the bare minimum you need for starting. If you + plan to use additional functionality not part of the core library or target + specific platforms, you may need to copy additional modules. See @ref cmake, + @ref cmake-plugins, @ref cmake-integration and @ref cmake-extras for more + information. + Directory `src/` contains the actual project. To keep things simple, the project consists of just one source file with the most minimal code possible: @code From fb8e8f3d56342eeafcea3629ad8d24832578d51f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 12 Sep 2016 10:29:42 +0200 Subject: [PATCH 189/290] Test that passing any Array(View) to ImageView works on deprecated build. It fails to compile with ambiguous overloads. Shouldn't be this way. --- src/Magnum/Test/ImageViewTest.cpp | 52 +++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/Magnum/Test/ImageViewTest.cpp b/src/Magnum/Test/ImageViewTest.cpp index 45c8cf8df..18e300d3b 100644 --- a/src/Magnum/Test/ImageViewTest.cpp +++ b/src/Magnum/Test/ImageViewTest.cpp @@ -36,8 +36,16 @@ struct ImageViewTest: TestSuite::Tester { void construct(); void constructNullptr(); void constructCompressed(); + #ifdef MAGNUM_BUILD_DEPRECATED + void constructDeprecatedArrayView(); + void constructDeprecatedArray(); + #endif void setData(); + #ifdef MAGNUM_BUILD_DEPRECATED + void setDataDeprecatedArrayView(); + void setDataDeprecatedArray(); + #endif void setDataCompressed(); }; @@ -45,8 +53,16 @@ ImageViewTest::ImageViewTest() { addTests({&ImageViewTest::construct, &ImageViewTest::constructNullptr, &ImageViewTest::constructCompressed, + #ifdef MAGNUM_BUILD_DEPRECATED + &ImageViewTest::constructDeprecatedArrayView, + &ImageViewTest::constructDeprecatedArray, + #endif &ImageViewTest::setData, + #ifdef MAGNUM_BUILD_DEPRECATED + &ImageViewTest::setDataDeprecatedArrayView, + &ImageViewTest::setDataDeprecatedArray, + #endif &ImageViewTest::setDataCompressed}); } @@ -85,6 +101,23 @@ void ImageViewTest::constructCompressed() { CORRADE_COMPARE(a.data(), data); } +#ifdef MAGNUM_BUILD_DEPRECATED +void ImageViewTest::constructDeprecatedArrayView() { + const char data[12]{}; + Containers::ArrayView view{data}; + ImageView2D a{PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, view}; + + CORRADE_COMPARE(a.data(), data); +} + +void ImageViewTest::constructDeprecatedArray() { + Containers::Array data{12}; + ImageView2D a{PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, data}; + + CORRADE_COMPARE(a.data(), data); +} +#endif + void ImageViewTest::setData() { const char data[3*3]{}; ImageView2D a{PixelStorage{}.setAlignment(1), @@ -99,6 +132,25 @@ void ImageViewTest::setData() { CORRADE_COMPARE(a.data(), data2); } +#ifdef MAGNUM_BUILD_DEPRECATED +void ImageViewTest::setDataDeprecatedArrayView() { + ImageView2D a{PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, nullptr}; + + const char data[12]{}; + Containers::ArrayView view{data}; + a.setData(view); + CORRADE_COMPARE(a.data(), data); +} + +void ImageViewTest::setDataDeprecatedArray() { + ImageView2D a{PixelFormat::RGB, PixelType::UnsignedByte, {1, 3}, nullptr}; + + Containers::Array data{12}; + a.setData(data); + CORRADE_COMPARE(a.data(), data); +} +#endif + void ImageViewTest::setDataCompressed() { const char data[8]{}; CompressedImageView2D a{ From 8d38f1d258303f7bce3d3601b084df7d6ec81dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 12 Sep 2016 10:30:43 +0200 Subject: [PATCH 190/290] Add even more special case workarounds to deprecated build of ImageView. The test now compiles and passes again. --- src/Magnum/ImageView.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Magnum/ImageView.h b/src/Magnum/ImageView.h index 3775bbcee..bf26109ce 100644 --- a/src/Magnum/ImageView.h +++ b/src/Magnum/ImageView.h @@ -35,6 +35,10 @@ #include "Magnum/PixelStorage.h" #include "Magnum/Math/Vector4.h" +#ifdef MAGNUM_BUILD_DEPRECATED +#include +#endif + namespace Magnum { /** @@ -86,6 +90,10 @@ template class ImageView { explicit CORRADE_DEPRECATED("use ImageView(PixelFormat, PixelType, const VectorTypeFor&, Containers::ArrayView) instead") ImageView(PixelFormat format, PixelType type, const VectorTypeFor& size, const void* data) noexcept: ImageView{{}, format, type, size, {reinterpret_cast(data), Implementation::imageDataSizeFor(format, type, size)}} {} #ifndef DOXYGEN_GENERATING_OUTPUT + /* To avoid ambiguous overload when passing ArrayView to the + constructor */ + template explicit ImageView(PixelFormat format, PixelType type, const VectorTypeFor& size, Containers::ArrayView data): ImageView{{}, format, type, size, Containers::ArrayView{data}} {} + template explicit ImageView(PixelFormat format, PixelType type, const VectorTypeFor& size, const Containers::Array& data): ImageView{{}, format, type, size, Containers::ArrayView(data)} {} /* To avoid decay of sized arrays and nullptr to const void* and unwanted use of deprecated function */ template explicit ImageView(PixelFormat format, PixelType type, const VectorTypeFor& size, const T(&data)[dataSize]): ImageView{{}, format, type, size, Containers::ArrayView{data}} {} @@ -169,6 +177,14 @@ template class ImageView { } #ifndef DOXYGEN_GENERATING_OUTPUT + /* To avoid ambiguous overload when passing ArrayView to the + function */ + template void setData(Containers::ArrayView data) { + setData(Containers::ArrayView{data}); + } + template void setData(const Containers::Array& data) { + setData(Containers::ArrayView(data)); + } /* To avoid decay of sized arrays and nullptr to const void* and unwanted use of deprecated function */ template void setData(const T(&data)[size]) { From 1897e36b19ea5dc597971e3a5ff0825c49fae078 Mon Sep 17 00:00:00 2001 From: Alice Date: Sun, 18 Sep 2016 19:43:40 -0400 Subject: [PATCH 191/290] Extend WavImporter to support more formats, be more flexible, and give better errors --- src/Magnum/Audio/Buffer.cpp | 27 +++ src/Magnum/Audio/Buffer.h | 118 ++++++++++- src/Magnum/Audio/Context.cpp | 3 + src/Magnum/Audio/Extensions.h | 3 + src/MagnumExternal/OpenAL/extensions.h | 34 ++++ .../WavAudioImporter/Test/CMakeLists.txt | 18 ++ .../WavAudioImporter/Test/WavImporterTest.cpp | 123 +++++++++++- .../WavAudioImporter/Test/mono32f.wav | Bin 0 -> 4484 bytes .../WavAudioImporter/Test/mono8.wav | Bin 0 -> 2180 bytes .../WavAudioImporter/Test/mono8ALaw.wav | Bin 0 -> 23948 bytes .../WavAudioImporter/Test/mono8MuLaw.wav | Bin 0 -> 23948 bytes .../WavAudioImporter/Test/mono8junk.wav | Bin 0 -> 2204 bytes .../WavAudioImporter/Test/stereo16.wav | Bin 0 -> 4100 bytes .../WavAudioImporter/Test/stereo32f.wav | Bin 0 -> 1582 bytes .../WavAudioImporter/Test/stereo64f.wav | Bin 0 -> 376112 bytes .../WavAudioImporter/Test/stereo8ALaw.wav | Bin 0 -> 47210 bytes .../WavAudioImporter/Test/stereo8MuLaw.wav | Bin 0 -> 47210 bytes .../WavAudioImporter/Test/surround616.wav | Bin 0 -> 329980 bytes .../WavAudioImporter/WavHeader.h | 26 ++- .../WavAudioImporter/WavImporter.cpp | 183 ++++++++++++++---- 20 files changed, 484 insertions(+), 51 deletions(-) create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/mono32f.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/mono8.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/mono8ALaw.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/mono8MuLaw.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/mono8junk.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/stereo16.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/stereo32f.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/stereo64f.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/stereo8ALaw.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/stereo8MuLaw.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/surround616.wav diff --git a/src/Magnum/Audio/Buffer.cpp b/src/Magnum/Audio/Buffer.cpp index 2ca64a6d0..705e406ab 100644 --- a/src/Magnum/Audio/Buffer.cpp +++ b/src/Magnum/Audio/Buffer.cpp @@ -38,10 +38,37 @@ Debug& operator<<(Debug& debug, const Buffer::Format value) { _c(Stereo8) _c(Stereo16) + _c(MonoALaw) + _c(StereoALaw) + + _c(MonoMuLaw) + _c(StereoMuLaw) + _c(MonoFloat) _c(StereoFloat) _c(MonoDouble) _c(StereoDouble) + + _c(Quad8) + _c(Quad16) + _c(Quad32) + + _c(Rear8) + _c(Rear16) + _c(Rear32) + + _c(Surround51Channel8) + _c(Surround51Channel16) + _c(Surround51Channel32) + + _c(Surround61Channel8) + _c(Surround61Channel16) + _c(Surround61Channel32) + + _c(Surround71Channel8) + _c(Surround71Channel16) + _c(Surround71Channel32) + #undef _c /* LCOV_EXCL_STOP */ } diff --git a/src/Magnum/Audio/Buffer.h b/src/Magnum/Audio/Buffer.h index 4f521fc21..09062e18d 100644 --- a/src/Magnum/Audio/Buffer.h +++ b/src/Magnum/Audio/Buffer.h @@ -57,6 +57,34 @@ class Buffer { Stereo8 = AL_FORMAT_STEREO8, /**< 8-bit interleaved unsigned stereo */ Stereo16 = AL_FORMAT_STEREO16, /**< 16-bit interleaved signed stereo */ + /** + * @brief 8-bit unsigned mono A-Law Compressed Sound Format + * + * @requires_al_extension Extension @al_extension{EXT,ALAW} + */ + MonoALaw = AL_FORMAT_MONO_ALAW_EXT, + + /** + * @brief 16-bit signed stereo A-Law Compressed Sound Format + * + * @requires_al_extension Extension @al_extension{EXT,ALAW} + */ + StereoALaw = AL_FORMAT_STEREO_ALAW_EXT, + + /** + * @brief 8-bit unsigned mono Mu-Law Compressed Sound Format + * + * @requires_al_extension Extension @al_extension{EXT,MULAW} + */ + MonoMuLaw = AL_FORMAT_MONO_MULAW_EXT, + + /** + * @brief 16-bit signed Mu-Law Compressed Sound Format + * + * @requires_al_extension Extension @al_extension{EXT,MULAW} + */ + StereoMuLaw = AL_FORMAT_STEREO_MULAW_EXT, + /** * @brief 32-bit floating-point mono * @@ -83,7 +111,95 @@ class Buffer { * * @requires_al_extension Extension @al_extension{EXT,double} */ - StereoDouble = AL_FORMAT_STEREO_DOUBLE_EXT + StereoDouble = AL_FORMAT_STEREO_DOUBLE_EXT, + + /** + * @brief 8-bit unsigned quadrophonic + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Quad8 = AL_FORMAT_QUAD8, + + /** + * @brief 16-bit signed quadrophonic + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Quad16 = AL_FORMAT_QUAD16, + + /** + * @brief 32-bit interleaved floating-point quadrophonic + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Quad32 = AL_FORMAT_QUAD32, + + Rear8 = AL_FORMAT_REAR8, + Rear16 = AL_FORMAT_REAR16, + Rear32 = AL_FORMAT_REAR32, + + /** + * @brief 8-bit unsigned 5.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround51Channel8 = AL_FORMAT_51CHN8, + + /** + * @brief 16-bit signed 5.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround51Channel16 = AL_FORMAT_51CHN16, + + /** + * @brief 32-bit interleaved floating-point 5.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround51Channel32 = AL_FORMAT_51CHN32, + + /** + * @brief 8-bit unsigned 6.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround61Channel8 = AL_FORMAT_61CHN8, + + /** + * @brief 16-bit signed 6.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround61Channel16 = AL_FORMAT_61CHN16, + + /** + * @brief 32-bit interleaved floating-point 6.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround61Channel32 = AL_FORMAT_61CHN32, + + /** + * @brief 8-bit unsigned 7.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround71Channel8 = AL_FORMAT_71CHN8, + + /** + * @brief 16-bit signed 7.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround71Channel16 = AL_FORMAT_71CHN16, + + /** + * @brief 32-bit interleaved floating-point 7.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround71Channel32 = AL_FORMAT_71CHN32 }; /** diff --git a/src/Magnum/Audio/Context.cpp b/src/Magnum/Audio/Context.cpp index 7ccb27479..df7d58779 100644 --- a/src/Magnum/Audio/Context.cpp +++ b/src/Magnum/Audio/Context.cpp @@ -44,6 +44,9 @@ const std::vector& Extension::extensions() { static const std::vector extensions{ _extension(AL,EXT,FLOAT32), _extension(AL,EXT,DOUBLE), + _extension(AL,EXT,ALAW), + _extension(AL,EXT,MULAW), + _extension(AL,EXT,MCFORMATS), _extension(ALC,EXT,ENUMERATION), _extension(ALC,SOFTX,HRTF), _extension(ALC,SOFT,HRTF) diff --git a/src/Magnum/Audio/Extensions.h b/src/Magnum/Audio/Extensions.h index 478903e56..b9993d6d0 100644 --- a/src/Magnum/Audio/Extensions.h +++ b/src/Magnum/Audio/Extensions.h @@ -79,6 +79,9 @@ namespace AL { namespace EXT { _extension(AL,EXT,FLOAT32) // #??? _extension(AL,EXT,DOUBLE) // #??? + _extension(AL,EXT,ALAW) // #??? + _extension(AL,EXT,MULAW) // #??? + _extension(AL,EXT,MCFORMATS) // #??? } } namespace ALC { namespace EXT { diff --git a/src/MagnumExternal/OpenAL/extensions.h b/src/MagnumExternal/OpenAL/extensions.h index 90da98455..5beb8bb39 100644 --- a/src/MagnumExternal/OpenAL/extensions.h +++ b/src/MagnumExternal/OpenAL/extensions.h @@ -52,6 +52,40 @@ extern "C" { #define AL_FORMAT_STEREO_DOUBLE_EXT 0x10013 #endif +/* AL_EXT_MULAW */ +#ifndef AL_EXT_MULAW +#define AL_EXT_MULAW 1 +#define AL_FORMAT_MONO_MULAW_EXT 0x10014 +#define AL_FORMAT_STEREO_MULAW_EXT 0x10015 +#endif + +/* AL_EXT_ALAW */ +#ifndef AL_EXT_ALAW +#define AL_EXT_ALAW 1 +#define AL_FORMAT_MONO_ALAW_EXT 0x10016 +#define AL_FORMAT_STEREO_ALAW_EXT 0x10017 +#endif + +/* AL_EXT_MCFORMATS */ +#ifndef AL_EXT_MCFORMATS +#define AL_EXT_MCFORMATS 1 +#define AL_FORMAT_QUAD8 0x1204 +#define AL_FORMAT_QUAD16 0x1205 +#define AL_FORMAT_QUAD32 0x1206 +#define AL_FORMAT_REAR8 0x1207 +#define AL_FORMAT_REAR16 0x1208 +#define AL_FORMAT_REAR32 0x1209 +#define AL_FORMAT_51CHN8 0x120A +#define AL_FORMAT_51CHN16 0x120B +#define AL_FORMAT_51CHN32 0x120C +#define AL_FORMAT_61CHN8 0x120D +#define AL_FORMAT_61CHN16 0x120E +#define AL_FORMAT_61CHN32 0x120F +#define AL_FORMAT_71CHN8 0x1210 +#define AL_FORMAT_71CHN16 0x1211 +#define AL_FORMAT_71CHN32 0x1212 +#endif + /* ALC_SOFTX_HRTF */ #ifndef ALC_SOFTX_HRTF #define ALC_SOFTX_HRTF 1 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt index 8ae4594f0..75aa77178 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt @@ -36,8 +36,26 @@ corrade_add_test(WavAudioImporterTest WavImporterTest.cpp LIBRARIES MagnumWavAud target_include_directories(WavAudioImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) if(CORRADE_TARGET_EMSCRIPTEN) + + emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8.wav") + emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8junk.wav") + + emscripten_embed_file(WavAudioImporterTest mono8ALaw.wav "/mono8ALaw.wav") + emscripten_embed_file(WavAudioImporterTest mono8MuLaw.wav "/mono8MuLaw.wav") emscripten_embed_file(WavAudioImporterTest mono16.wav "/mono16.wav") + emscripten_embed_file(WavAudioImporterTest stereo8.wav "/stereo8.wav") + emscripten_embed_file(WavAudioImporterTest stereo8ALaw.wav "/stereo8ALaw.wav") + emscripten_embed_file(WavAudioImporterTest stereo8MuLaw.wav "/stereo8MuLaw.wav") + emscripten_embed_file(WavAudioImporterTest stereo16.wav "/stereo16.wav") + + emscripten_embed_file(WavAudioImporterTest mono32f.wav "/mono32f.wav") + emscripten_embed_file(WavAudioImporterTest stereo32f.wav "/stereo32f.wav") + + emscripten_embed_file(WavAudioImporterTest stereo64f.wav "/stereo64f.wav") + + emscripten_embed_file(WavAudioImporterTest surround616.wav "/surround616.wav") + emscripten_embed_file(WavAudioImporterTest unsupportedChannelCount.wav "/unsupportedChannelCount.wav") emscripten_embed_file(WavAudioImporterTest unsupportedFormat.wav "/unsupportedFormat.wav") emscripten_embed_file(WavAudioImporterTest wrongSignature.wav "/wrongSignature.wav") diff --git a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp index 3896c67e2..fde31d088 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp +++ b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp @@ -43,17 +43,45 @@ class WavImporterTest: public TestSuite::Tester { void wrongSignature(); void unsupportedFormat(); void unsupportedChannelCount(); + + void mono8(); + void mono8junk(); + void mono8ALaw(); + void mono8MuLaw(); void mono16(); + void stereo8(); + void stereo8ALaw(); + void stereo8MuLaw(); + void stereo16(); + + void mono32f(); + void stereo32f(); + void stereo64f(); + + void surround616(); }; WavImporterTest::WavImporterTest() { - addTests({&WavImporterTest::wrongSize, + addTests({ + + &WavImporterTest::wrongSize, &WavImporterTest::wrongSignature, &WavImporterTest::unsupportedFormat, &WavImporterTest::unsupportedChannelCount, + &WavImporterTest::mono8, + &WavImporterTest::mono8junk, + &WavImporterTest::mono8ALaw, + &WavImporterTest::mono8MuLaw, &WavImporterTest::mono16, - &WavImporterTest::stereo8}); + &WavImporterTest::stereo8, + &WavImporterTest::stereo8ALaw, + &WavImporterTest::stereo8MuLaw, + &WavImporterTest::stereo16, + &WavImporterTest::mono32f, + &WavImporterTest::stereo32f, + &WavImporterTest::stereo64f, + &WavImporterTest::surround616}); } void WavImporterTest::wrongSize() { @@ -92,6 +120,38 @@ void WavImporterTest::unsupportedChannelCount() { CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported channel count 6 with 8 bits per sample\n"); } +void WavImporterTest::mono8() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::Mono8); + CORRADE_COMPARE(importer.frequency(), 22050); +} + +void WavImporterTest::mono8junk() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8junk.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::Mono8); + CORRADE_COMPARE(importer.frequency(), 22050); +} + +void WavImporterTest::mono8ALaw() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8ALaw.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::MonoALaw); + CORRADE_COMPARE(importer.frequency(), 8000); +} + +void WavImporterTest::mono8MuLaw() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8MuLaw.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::MonoMuLaw); + CORRADE_COMPARE(importer.frequency(), 8000); +} + void WavImporterTest::mono16() { WavImporter importer; CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono16.wav"))); @@ -114,6 +174,65 @@ void WavImporterTest::stereo8() { TestSuite::Compare::Container); } +void WavImporterTest::stereo8ALaw() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo8ALaw.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::StereoALaw); + CORRADE_COMPARE(importer.frequency(), 8000); +} + +void WavImporterTest::stereo8MuLaw() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo8MuLaw.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::StereoMuLaw); + CORRADE_COMPARE(importer.frequency(), 8000); +} + + +void WavImporterTest::stereo16() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo16.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::Stereo16); + CORRADE_COMPARE(importer.frequency(), 44100); +} + +void WavImporterTest::mono32f() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono32f.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::MonoFloat); + CORRADE_COMPARE(importer.frequency(), 48000); +} + +void WavImporterTest::stereo32f() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo32f.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::StereoFloat); + CORRADE_COMPARE(importer.frequency(), 44100); +} + +void WavImporterTest::stereo64f() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo64f.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::StereoDouble); + CORRADE_COMPARE(importer.frequency(), 8000); +} + +void WavImporterTest::surround616() { + std::ostringstream out; + Error redirectError{&out}; + + WavImporter importer; + + CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "surround616.wav"))); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported audio format: extensible not implememented 65534\n"); +} + }}} CORRADE_TEST_MAIN(Magnum::Audio::Test::WavImporterTest) diff --git a/src/MagnumPlugins/WavAudioImporter/Test/mono32f.wav b/src/MagnumPlugins/WavAudioImporter/Test/mono32f.wav new file mode 100644 index 0000000000000000000000000000000000000000..d9f2aa0ffb2fe428351773899a3448175b1aa555 GIT binary patch literal 4484 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 literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/mono8.wav b/src/MagnumPlugins/WavAudioImporter/Test/mono8.wav new file mode 100644 index 0000000000000000000000000000000000000000..c6fb506695449bef8b0ee021fa6be76242898024 GIT binary patch literal 2180 zcmZ`(%Tn7g6b(C;{e({cq>D1sZ5OmFC=8EIArO+_#IbD2RxC#}r9fsn?M$J++HTr>DP=r^m-XzZcF#=SPQ! z2mAYbd!P4?j!qAck53?{UoQK-tKQXRZxBV-Nvg}4^EWrsSvmFd#gB)(#rON0*{z?? zy{o3y`rB_m7p}^)+$ozzWv)#gsdyL_nej94oS(b-O<5L|w);pm%<89jPoOWLr%>SvqqIz_u8}ND1lW*BtD?j@tviZDc!U}DfsM6uG1`6 zfMB}#=K>~tgK*HP0ja`=h?{{E-gOOk14PI}p3R$xZ%eYx0j1QKaE49#q!FEj%(q@l z8{Zx$h1S8s?ARxUl=86&%la;g^^IL*yE8<7Bo1}Y^kS4m z!s*3*!?U5nQ}lewnQ1fckb$UqS>6AWL2wbCcJ$|Uv=H=d0`Mehv@oqJ1BGDX{K6KT I0%Jh`1AR~_vH$=8 literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/mono8ALaw.wav b/src/MagnumPlugins/WavAudioImporter/Test/mono8ALaw.wav new file mode 100644 index 0000000000000000000000000000000000000000..bc3ff161e53a3a0f5133888a234fda7f6441d20d GIT binary patch literal 23948 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 RS0)O{B=|pD2nvY7`!9!@D-r+z literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/stereo16.wav b/src/MagnumPlugins/WavAudioImporter/Test/stereo16.wav new file mode 100644 index 0000000000000000000000000000000000000000..26b3d95de2dde4d7a9edcfa4d8408abd0b6a3710 GIT binary patch literal 4100 zcmeIuu?c`M07TIu{Xa wJ4v04(j~du$jWJs$v>@O2q1s}0tg_000IagfB*srAn-4Nz0_jcw#0RR91 literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/stereo32f.wav b/src/MagnumPlugins/WavAudioImporter/Test/stereo32f.wav new file mode 100644 index 0000000000000000000000000000000000000000..e167301a8edda162e443d26368255584c7803429 GIT binary patch literal 1582 zcmZ9MYgClw7RMi)0R}=Y3lx!}8I_B494>)5y!+vtk;`&OL`D*Ag)uOYpfChudR(R* zFA-@#%Q?thL7X&EK@Q}+&wffp>gdVa$wU%~6qOWFEC|rx46D_bv-jG2|Mq`>*x&wI zO>C^69U;l;l`)w)M!72?L_(&K=te^1X|_a0V){gC~?c^4Y;F=5(W!z zz}nKEge?Qtz?>Hf*^!qZ!hZv-DDMEpxk`AHiLlXZfd*|0c%*cK_sHjv(fkw+7#hI& zO3$fmZnOaKc<1) z!76;ORti^ZDp6GEgk(ttZrR%_9ug|>v#Sr-etk7|wJ*o{yBm<|O?cmQ5~EWXRvXXZ zneLmo{Xr)l4jRT+Js;w29|`w-@(kbav*(MZ+wxaZ9r*E`j=Vcj#!t+4=3cRO-2SNx z-!&oOFgdICpZR=~t{cT0O1`x8CKfCR;qF~M7;!+!zpKBGukZ5X(w<>_r19eM-cnw4-kukO z3qQW^9x5Wdc~^pnDOx|iTC)fHeS`R0sen&h!?@1r0`qha|HfI0V9PCTG4{k_nfNNO)azP7{`cFUm3CvN!j693e+4g# zUi55X2dYy7>ACfjq|QAper}Ngl&^SH2R})mY@x%uekq*d6|LkRy487>}X1)4QzK> z94$_$Wc_VR={D_7Mt+Q=a~*Mpz%I|7qQ55U5PVMgL3h>RWv!}cLa|9A-WeWS3P{tTMeZRjS)Zg7}pNA;=;aF)sF zn0p&AxjiNNI{52WLUV8Lfz8(*Ldk>ynw`FbA*P0|I)ogj>Clqa2owLV6Pof4LUv(B zMA_mxSbX_y=H}Y~&2JKHtN9#ix|iV4YbSxk72>x$PJwy186OJ_?u?wqcJmjIIC&i# zj~#{7ef=2dUk26M5iB}pfWlu1Z@=URwRU#=(1w$OyxfsjY}pp^T*;i3jgX z=ghTZHjnHeSYE8)Vaq%*Ll(fl2$_d*Q46@^SO6Y+7Q~J7eDUni-Yy(`Y@^yA@-2S- zq{$N8{uRQNwc@HXE!d~36{9SN@x{`;;;ph;^!Z3F4(;8G`s5v!#DEX+R=JJp<%soI zKaitZnHGy{^4>VLW|lV^1D1>9fj8KXQ4Y*oqh|#funBUmS^8O4w%V~(`@q`&2q~FzYeJT4RwPZ4PH$X4#gSIlEQ?LhM8zk~v9dNJ s-H@-((8~?E@(`6Wc%d>hI3!%2l`D_YXB8N7l|-{5HfiePA3Guc1LXX(&j0`b literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/stereo64f.wav b/src/MagnumPlugins/WavAudioImporter/Test/stereo64f.wav new file mode 100644 index 0000000000000000000000000000000000000000..ee9c65d25d6099c2ce56d39835fc11cb6afb1ae6 GIT binary patch literal 376112 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�d5;pb7_UpJqX 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 literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/stereo8ALaw.wav b/src/MagnumPlugins/WavAudioImporter/Test/stereo8ALaw.wav new file mode 100644 index 0000000000000000000000000000000000000000..9f24fc07ca8411f37f8eaddc31615fe4937b6017 GIT binary patch literal 47210 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 literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/surround616.wav b/src/MagnumPlugins/WavAudioImporter/Test/surround616.wav new file mode 100644 index 0000000000000000000000000000000000000000..0e38025966749196cb52eb630866342386de0c98 GIT binary patch literal 329980 zcmeFadH7G&`v1Sy+Aky|G*F3*jc8P5hzw>!N&*NOz>7U=NU=hbZyn`u}&?!JzBYO$9CP@x9(c`=JsvcJyH3#4&7RJY2Uh4o0i>Lmu}Rtdxut) z8{KkG>3VG*?9#H!6P0VVYu&QLzvW#k|DW)VE*;ypeyCfeuHD*qx}{#dI~y1N*B$@) z`)36H8G(OB;GYrrX9WHkfqzEepAqEy6dt8-=U5D#9-3FZaIpyZeO;xB|l6TsPrA+#kY}Kk6Qpe4$$?e4V>axS4Av zyw^9-@uDo;_x`x8NTrc4+u8VLN$#AvAh|%eVp37~ z?Bs0WqDfKVN=YT*b#9&7{MG#`e8e3Q?v?bC{;kQa!Y*;b`7-%3x&7&sbdsF?S)MGH zynE7J_^#wG;oZq@;eE+I;d_#Mgf}IdgfGlosQX@(TqXH)$#cRxk{!Z)mOPm}y0&7b zqVQkIU(!D_bEf2ROIx$)u$8J0u;1 zC%eh|U8*KkC9jZF5dOjaAf42u!ZY1W;WLsmqoC)#hpTG~wlDxpde*`!?JRmrhsHRd}^oE!@tu6Mn_KBAhi@;ijgkF#Be6 z{&N41Z_GEj&^(v(FZZvNX_X7j-8uhq|5}^YxiIHx|MR@nOf|`0HZT8A%r^PF*PH95 zU)q!we!;vTT*wp>u4<|Z+yC=e{7aC@`Iq~*F>Z{xxPR;~JTwj!?i>3GzZu^YJ};gp zJUWaHx$P8-#U#(fjPS59Ogh)a>m(l=#!6m3lowtVRtc{OYlN$XYQil-3t=C;aM#dP z_|$N!aGTIZnD?C#W=LK))D#A0oWV?-D*IoTF<$_n%9?(ytVL%0DGM%nuW0pYQSaNIuC= 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 literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/WavHeader.h b/src/MagnumPlugins/WavAudioImporter/WavHeader.h index 4948fea35..8ed8642ae 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavHeader.h +++ b/src/MagnumPlugins/WavAudioImporter/WavHeader.h @@ -33,28 +33,36 @@ namespace Magnum { namespace Audio { +#pragma pack(1) +/** @brief RIFF chunk */ +struct RiffChunk { + char chunkId[4]; /**< @brief chunk name (4 characters) */ + UnsignedInt chunkSize; /**< @brief size of chunk (does not include chunk header) */ +}; +#pragma pack() + #pragma pack(1) /** @brief WAV file header */ -struct WavHeader { - char chunkId[4]; /**< @brief `RIFF` characters */ - UnsignedInt chunkSize; /**< @brief Size of the rest of the file */ +struct WavHeaderChunk { + RiffChunk chunk; /**< @brief Starting RIFF chunk */ char format[4]; /**< @brief `WAVE` characters */ +}; +#pragma pack() - char subChunk1Id[4]; /**< @brief `fmt ` characters */ - UnsignedInt subChunk1Size; /**< @brief 16 for PCM */ +#pragma pack(1) +/** @brief WAV 'fmt' header */ +struct WavFormatChunk { + RiffChunk chunk; /**< @brief Starting RIFF chunk */ UnsignedShort audioFormat; /**< @brief 1 = PCM */ UnsignedShort numChannels; /**< @brief 1 = Mono, 2 = Stereo */ UnsignedInt sampleRate; /**< @brief Sample rate in Hz */ UnsignedInt byteRate; /**< @brief Bytes per second */ UnsignedShort blockAlign; /**< @brief Bytes per sample (all channels) */ UnsignedShort bitsPerSample; /**< @brief Bits per sample (one channel) */ - - char subChunk2Id[4]; /**< @brief `data` characters */ - UnsignedInt subChunk2Size; /**< @brief Size of the following data */ }; #pragma pack() -static_assert(sizeof(WavHeader) == 44, "WavHeader size is not 44 bytes"); +static_assert(sizeof(WavHeaderChunk) + sizeof(WavFormatChunk) + sizeof(RiffChunk) == 44, "WavHeader size is not 44 bytes"); }} diff --git a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp index aa001e105..82630c883 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp +++ b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp @@ -31,6 +31,12 @@ #include "MagnumPlugins/WavAudioImporter/WavHeader.h" +#define WAVE_FORMAT_PCM 0x0001 +#define WAVE_FORMAT_IEEE_FLOAT 0x0003 +#define WAVE_FORMAT_ALAW 0x0006 +#define WAVE_FORMAT_MULAW 0x0007 +#define WAVE_FORMAT_EXTENSIBLE 0xFFFE + namespace Magnum { namespace Audio { WavImporter::WavImporter() = default; @@ -43,74 +49,173 @@ bool WavImporter::doIsOpened() const { return _data; } void WavImporter::doOpenData(Containers::ArrayView data) { /* Check file size */ - if(data.size() < sizeof(WavHeader)) { + if(data.size() < sizeof(WavHeaderChunk) + sizeof(WavFormatChunk) + sizeof(RiffChunk)) { Error() << "Audio::WavImporter::openData(): the file is too short:" << data.size() << "bytes"; return; } - /* Get header contents and fix endianness */ - WavHeader header(*reinterpret_cast(data.begin())); - Utility::Endianness::littleEndianInPlace(header.chunkSize, - header.subChunk1Size, header.audioFormat, header.numChannels, - header.sampleRate, header.byteRate, header.blockAlign, - header.bitsPerSample, header.subChunk2Size); - - /* Check file signature */ - if(std::strncmp(header.chunkId, "RIFF", 4) != 0 || - std::strncmp(header.format, "WAVE", 4) != 0 || - std::strncmp(header.subChunk1Id, "fmt ", 4) != 0 || - std::strncmp(header.subChunk2Id, "data", 4) != 0) { + /* Get the RIFF/WAV header */ + WavHeaderChunk header(*reinterpret_cast(data.begin())); + + /* Check RIFF/WAV file signature */ + if(std::strncmp(header.chunk.chunkId, "RIFF", 4) != 0 || + std::strncmp(header.format, "WAVE", 4) != 0) { Error() << "Audio::WavImporter::openData(): the file signature is invalid"; return; } + Utility::Endianness::littleEndianInPlace(header.chunk.chunkSize); + /* Check file size */ - if(header.chunkSize + 8 != data.size()) { + if(header.chunk.chunkSize < 36 || header.chunk.chunkSize + 8 != data.size()) { Error() << "Audio::WavImporter::openData(): the file has improper size, expected" - << header.chunkSize + 8 << "but got" << data.size(); + << header.chunk.chunkSize + 8 << "but got" << data.size(); + return; + } + + const RiffChunk* dataChunk = nullptr; + const WavFormatChunk* formatChunk = nullptr; + UnsignedInt dataChunkSize = 0; + + const UnsignedInt headerSize = sizeof(WavHeaderChunk); + UnsignedInt offset = 0; + + /* Skip any chunks that aren't the format or data chunk */ + while(headerSize + offset <= header.chunk.chunkSize) { + const RiffChunk* currChunk = reinterpret_cast(data.begin() + headerSize + offset); + offset += Utility::Endianness::littleEndian(currChunk->chunkSize) + sizeof(RiffChunk); + + if(std::strncmp(currChunk->chunkId, "fmt ", 4) == 0) { + if(formatChunk != nullptr) { + Error() << "Audio::WavImporter::openData(): the file contains too many format chunks"; + return; + } + + formatChunk = reinterpret_cast(currChunk); + + } else if(std::strncmp(currChunk->chunkId, "data", 4) == 0) { + if(dataChunk != nullptr) { + Error() << "Audio::WavImporter::openData(): the file contains too many data chunks"; + return; + } + + dataChunk = currChunk; + dataChunkSize = Utility::Endianness::littleEndian(currChunk->chunkSize); + + break; + } + } + + /* Make sure we actually got a format chunk */ + if(formatChunk == nullptr) { + Error() << "Audio::WavImporter::openData(): the file contains no format chunk"; + return; + } + + /* Make sure we actually got a data chunk */ + if(dataChunk == nullptr) { + Error() << "Audio::WavImporter::openData(): the file contains no data chunk"; return; } + /* Fix endianness on Format chunk */ + Utility::Endianness::littleEndianInPlace( + formatChunk->chunk.chunkSize, formatChunk->audioFormat, formatChunk->numChannels, + formatChunk->sampleRate, formatChunk->byteRate, formatChunk->blockAlign, + formatChunk->bitsPerSample); + /* Check PCM format */ - if(header.audioFormat != 1) { - Error() << "Audio::WavImporter::openData(): unsupported audio format" << header.audioFormat; + if(formatChunk->audioFormat == WAVE_FORMAT_PCM) { + /* Decide about format */ + if(formatChunk->numChannels == 1 && formatChunk->bitsPerSample == 8) + _format = Buffer::Format::Mono8; + else if(formatChunk->numChannels == 1 && formatChunk->bitsPerSample == 16) + _format = Buffer::Format::Mono16; + else if(formatChunk->numChannels == 2 && formatChunk->bitsPerSample == 8) + _format = Buffer::Format::Stereo8; + else if(formatChunk->numChannels == 2 && formatChunk->bitsPerSample == 16) + _format = Buffer::Format::Stereo16; + else { + Error() << "Audio::WavImporter::openData(): unsupported channel count" + << formatChunk->numChannels << "with" << formatChunk->bitsPerSample + << "bits per sample"; + return; + } + /* Check IEEE Float format */ + } else if(formatChunk->audioFormat == WAVE_FORMAT_IEEE_FLOAT) { + if(formatChunk->numChannels == 1 && formatChunk->bitsPerSample == 32) + _format = Buffer::Format::MonoFloat; + else if(formatChunk->numChannels == 2 && formatChunk->bitsPerSample == 32) + _format = Buffer::Format::StereoFloat; + else if(formatChunk->numChannels == 1 && formatChunk->bitsPerSample == 64) + _format = Buffer::Format::MonoDouble; + else if(formatChunk->numChannels == 2 && formatChunk->bitsPerSample == 64) + _format = Buffer::Format::StereoDouble; + else { + Error() << "Audio::WavImporter::openData(): unsupported channel count" + << formatChunk->numChannels << "with" << formatChunk->bitsPerSample + << "bits per sample"; + return; + } + /* Check ALAW format */ + } else if(formatChunk->audioFormat == WAVE_FORMAT_ALAW) { + if(formatChunk->numChannels == 1) + _format = Buffer::Format::MonoALaw; + else if(formatChunk->numChannels == 2) + _format = Buffer::Format::StereoALaw; + else { + Error() << "Audio::WavImporter::openData(): unsupported channel count" + << formatChunk->numChannels << "with" << formatChunk->bitsPerSample + << "bits per sample"; + return; + } + /* Check MULAW format */ + } else if(formatChunk->audioFormat == WAVE_FORMAT_MULAW) { + if(formatChunk->numChannels == 1) + _format = Buffer::Format::MonoMuLaw; + else if(formatChunk->numChannels == 2) + _format = Buffer::Format::StereoMuLaw; + else { + Error() << "Audio::WavImporter::openData(): unsupported channel count" + << formatChunk->numChannels << "with" << formatChunk->bitsPerSample + << "bits per sample"; + return; + } + /* We do not currently support EXTENSIBLE formats */ + } else if(formatChunk->audioFormat == WAVE_FORMAT_EXTENSIBLE) { + Error() << "Audio::WavImporter::openData(): unsupported audio format: extensible not implememented" << formatChunk->audioFormat; + return; + /* Unknown format */ + } else { + Error() << "Audio::WavImporter::openData(): unsupported audio format" << formatChunk->audioFormat; return; } - /* Verify more things */ - if(header.subChunk1Size != 16 || - header.subChunk2Size + 44 != data.size() || - header.blockAlign != header.numChannels*header.bitsPerSample/8 || - header.byteRate != header.sampleRate*header.blockAlign) { - Error() << "Audio::WavImporter::openData(): the file is corrupted"; + /* Size sanity checks */ + if(headerSize + offset > data.size()) { + Error() << "Audio::WavImporter::openData(): file size doesn't match computed size"; return; } - /* Decide about format */ - if(header.numChannels == 1 && header.bitsPerSample == 8) - _format = Buffer::Format::Mono8; - else if(header.numChannels == 1 && header.bitsPerSample == 16) - _format = Buffer::Format::Mono16; - else if(header.numChannels == 2 && header.bitsPerSample == 8) - _format = Buffer::Format::Stereo8; - else if(header.numChannels == 2 && header.bitsPerSample == 16) - _format = Buffer::Format::Stereo16; - else { - Error() << "Audio::WavImporter::openData(): unsupported channel count" - << header.numChannels << "with" << header.bitsPerSample - << "bits per sample"; + /* Format sanity checks */ + if(formatChunk->blockAlign != formatChunk->numChannels * formatChunk->bitsPerSample / 8 || + formatChunk->byteRate != formatChunk->sampleRate * formatChunk->blockAlign) { + Error() << "Audio::WavImporter::openData(): the file is corrupted"; return; } + + /* Save frequency */ - _frequency = header.sampleRate; + _frequency = formatChunk->sampleRate; /** @todo Convert the data from little endian too */ CORRADE_INTERNAL_ASSERT(!Utility::Endianness::isBigEndian()); /* Copy the data */ - _data = Containers::Array(header.subChunk2Size); - std::copy(data.begin()+sizeof(WavHeader), data.end(), _data.begin()); + const char* dataChunkPtr = reinterpret_cast(dataChunk + 1); + _data = Containers::Array(dataChunkSize); + std::copy(dataChunkPtr, dataChunkPtr+dataChunkSize, _data.begin()); return; } From cbdad2dfe08419b01cecbe708027a3cd868ccfdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 10:52:00 +0200 Subject: [PATCH 192/290] WavAudioImporter: minor cleanup, improved static assertions. --- .../WavAudioImporter/CMakeLists.txt | 1 + .../WavAudioImporter/Test/CMakeLists.txt | 1 - .../WavAudioImporter/Test/WavImporterTest.cpp | 7 ++-- .../WavAudioImporter/WavHeader.cpp | 38 +++++++++++++++++++ .../WavAudioImporter/WavHeader.h | 4 +- .../WavAudioImporter/WavImporter.cpp | 5 ++- 6 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 src/MagnumPlugins/WavAudioImporter/WavHeader.cpp diff --git a/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt index 8e4837619..3280459d4 100644 --- a/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt @@ -24,6 +24,7 @@ # set(WavAudioImporter_SRCS + WavHeader.cpp WavImporter.cpp) set(WavAudioImporter_HEADERS diff --git a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt index 75aa77178..ccd145822 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt @@ -36,7 +36,6 @@ corrade_add_test(WavAudioImporterTest WavImporterTest.cpp LIBRARIES MagnumWavAud target_include_directories(WavAudioImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) if(CORRADE_TARGET_EMSCRIPTEN) - emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8.wav") emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8junk.wav") diff --git a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp index fde31d088..2a69319aa 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp +++ b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp @@ -63,21 +63,22 @@ class WavImporterTest: public TestSuite::Tester { }; WavImporterTest::WavImporterTest() { - addTests({ - - &WavImporterTest::wrongSize, + addTests({&WavImporterTest::wrongSize, &WavImporterTest::wrongSignature, &WavImporterTest::unsupportedFormat, &WavImporterTest::unsupportedChannelCount, + &WavImporterTest::mono8, &WavImporterTest::mono8junk, &WavImporterTest::mono8ALaw, &WavImporterTest::mono8MuLaw, &WavImporterTest::mono16, + &WavImporterTest::stereo8, &WavImporterTest::stereo8ALaw, &WavImporterTest::stereo8MuLaw, &WavImporterTest::stereo16, + &WavImporterTest::mono32f, &WavImporterTest::stereo32f, &WavImporterTest::stereo64f, diff --git a/src/MagnumPlugins/WavAudioImporter/WavHeader.cpp b/src/MagnumPlugins/WavAudioImporter/WavHeader.cpp new file mode 100644 index 000000000..3b071bbc2 --- /dev/null +++ b/src/MagnumPlugins/WavAudioImporter/WavHeader.cpp @@ -0,0 +1,38 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include "WavHeader.h" + +#include + +#include "Magnum/Magnum.h" + +namespace Magnum { namespace Audio { + +static_assert(sizeof(RiffChunk) == 8, "RiffChunk size is not 8 bytes"); +static_assert(sizeof(WavHeaderChunk) == 12, "WavHeaderChunk size is not 12 bytes"); +static_assert(sizeof(WavFormatChunk) == 24, "WavFormatChunk size is not 18 bytes"); + +}} diff --git a/src/MagnumPlugins/WavAudioImporter/WavHeader.h b/src/MagnumPlugins/WavAudioImporter/WavHeader.h index 8ed8642ae..249cc7e05 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavHeader.h +++ b/src/MagnumPlugins/WavAudioImporter/WavHeader.h @@ -26,7 +26,7 @@ */ /** @file - * @brief Struct @ref Magnum::Audio::WavHeader + * @brief Struct @ref Magnum::Audio::RiffChunk, @ref Magnum::Audio::WavHeaderChunk, @ref Magnum::Audio::WavFormatChunk, enum @ref Magnum::Audio::WavAudioFormat */ #include "Magnum/Types.h" @@ -62,8 +62,6 @@ struct WavFormatChunk { }; #pragma pack() -static_assert(sizeof(WavHeaderChunk) + sizeof(WavFormatChunk) + sizeof(RiffChunk) == 44, "WavHeader size is not 44 bytes"); - }} #endif diff --git a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp index 82630c883..7ff04275e 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp +++ b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp @@ -141,6 +141,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { << "bits per sample"; return; } + /* Check IEEE Float format */ } else if(formatChunk->audioFormat == WAVE_FORMAT_IEEE_FLOAT) { if(formatChunk->numChannels == 1 && formatChunk->bitsPerSample == 32) @@ -157,6 +158,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { << "bits per sample"; return; } + /* Check ALAW format */ } else if(formatChunk->audioFormat == WAVE_FORMAT_ALAW) { if(formatChunk->numChannels == 1) @@ -169,6 +171,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { << "bits per sample"; return; } + /* Check MULAW format */ } else if(formatChunk->audioFormat == WAVE_FORMAT_MULAW) { if(formatChunk->numChannels == 1) @@ -204,8 +207,6 @@ void WavImporter::doOpenData(Containers::ArrayView data) { return; } - - /* Save frequency */ _frequency = formatChunk->sampleRate; From a73e4475451800108bfd6db9e1d7cdbb19c7b435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 10:54:08 +0200 Subject: [PATCH 193/290] Doxygen warning cleanup. --- src/Magnum/Audio/AbstractImporter.h | 8 ++++---- src/Magnum/Math/TypeTraits.h | 4 +++- src/Magnum/Text/AbstractFontConverter.h | 8 ++++---- src/Magnum/Trade/AbstractImageConverter.h | 8 ++++---- src/Magnum/Trade/AbstractImporter.h | 8 ++++---- src/Magnum/Trade/LightData.h | 1 + 6 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/Magnum/Audio/AbstractImporter.h b/src/Magnum/Audio/AbstractImporter.h index 1e069f2e5..3d6b9ef1f 100644 --- a/src/Magnum/Audio/AbstractImporter.h +++ b/src/Magnum/Audio/AbstractImporter.h @@ -62,10 +62,10 @@ checked by the implementation: Plugin interface string is `"cz.mosra.magnum.Audio.AbstractImporter/0.1"`. -@attention @ref Containers::Array instances returned from the plugin should - *not* use anything else than the default deleter, otherwise this can cause - dangling function pointer call on array destruction if the plugin gets - unloaded before the array is destroyed. +@attention @ref Corrade::Containers::Array instances returned from the plugin + should *not* use anything else than the default deleter, otherwise this can + cause dangling function pointer call on array destruction if the plugin + gets unloaded before the array is destroyed. */ class MAGNUM_AUDIO_EXPORT AbstractImporter: public PluginManager::AbstractManagingPlugin { CORRADE_PLUGIN_INTERFACE("cz.mosra.magnum.Audio.AbstractImporter/0.1") diff --git a/src/Magnum/Math/TypeTraits.h b/src/Magnum/Math/TypeTraits.h index 645e81612..ae42fdfe0 100644 --- a/src/Magnum/Math/TypeTraits.h +++ b/src/Magnum/Math/TypeTraits.h @@ -115,7 +115,7 @@ template struct TypeTraits: Implementation::TypeTraitsDefault { * @brief Type name * * Returns a string representation of type name, such as `"UnsignedInt"` - * for @ref UnsignedInt. + * for @ref Magnum::UnsignedInt "UnsignedInt". */ constexpr static const char* name(); @@ -157,6 +157,7 @@ template struct TypeTraits: Implementation::TypeTraitsDefault { /* Integral scalar types */ namespace Implementation { template struct TypeTraitsName; + #ifndef DOXYGEN_GENERATING_OUTPUT #define _c(type) template<> struct TypeTraitsName { \ constexpr static const char* name() { return #type; } \ }; @@ -174,6 +175,7 @@ namespace Implementation { _c(Double) _c(long double) #undef _c + #endif template struct TypeTraitsIntegral: TypeTraitsDefault, TypeTraitsName { constexpr static T epsilon() { return T(1); } diff --git a/src/Magnum/Text/AbstractFontConverter.h b/src/Magnum/Text/AbstractFontConverter.h index 04ceeef0e..5d5c3810c 100644 --- a/src/Magnum/Text/AbstractFontConverter.h +++ b/src/Magnum/Text/AbstractFontConverter.h @@ -70,10 +70,10 @@ checked by the implementation: Plugin interface string is `"cz.mosra.magnum.Text.AbstractFontConverter/0.1.2"`. -@attention @ref Containers::Array instances returned from the plugin should - *not* use anything else than the default deleter, otherwise this can cause - dangling function pointer call on array destruction if the plugin gets - unloaded before the array is destroyed. +@attention @ref Corrade::Containers::Array instances returned from the plugin + should *not* use anything else than the default deleter, otherwise this can + cause dangling function pointer call on array destruction if the plugin + gets unloaded before the array is destroyed. */ class MAGNUM_TEXT_EXPORT AbstractFontConverter: public PluginManager::AbstractPlugin { CORRADE_PLUGIN_INTERFACE("cz.mosra.magnum.Text.AbstractFontConverter/0.1.2") diff --git a/src/Magnum/Trade/AbstractImageConverter.h b/src/Magnum/Trade/AbstractImageConverter.h index 9613d9932..735a4f1ec 100644 --- a/src/Magnum/Trade/AbstractImageConverter.h +++ b/src/Magnum/Trade/AbstractImageConverter.h @@ -64,10 +64,10 @@ checked by the implementation: Plugin interface string is `"cz.mosra.magnum.Trade.AbstractImageConverter/0.2.1"`. -@attention @ref Containers::Array instances returned from the plugin should - *not* use anything else than the default deleter, otherwise this can cause - dangling function pointer call on array destruction if the plugin gets - unloaded before the array is destroyed. +@attention @ref Corrade::Containers::Array instances returned from the plugin + should *not* use anything else than the default deleter, otherwise this can + cause dangling function pointer call on array destruction if the plugin + gets unloaded before the array is destroyed. */ class MAGNUM_EXPORT AbstractImageConverter: public PluginManager::AbstractManagingPlugin { CORRADE_PLUGIN_INTERFACE("cz.mosra.magnum.Trade.AbstractImageConverter/0.2.1") diff --git a/src/Magnum/Trade/AbstractImporter.h b/src/Magnum/Trade/AbstractImporter.h index 2c4ef1d9e..780da4ce3 100644 --- a/src/Magnum/Trade/AbstractImporter.h +++ b/src/Magnum/Trade/AbstractImporter.h @@ -74,10 +74,10 @@ checked by the implementation: Plugin interface string is `"cz.mosra.magnum.Trade.AbstractImporter/0.3"`. -@attention @ref Containers::Array instances returned from the plugin should - *not* use anything else than the default deleter, otherwise this can cause - dangling function pointer call on array destruction if the plugin gets - unloaded before the array is destroyed. +@attention @ref Corrade::Containers::Array instances returned from the plugin + should *not* use anything else than the default deleter, otherwise this can + cause dangling function pointer call on array destruction if the plugin + gets unloaded before the array is destroyed. @todo How to handle casting from std::unique_ptr<> in more convenient way? */ diff --git a/src/Magnum/Trade/LightData.h b/src/Magnum/Trade/LightData.h index 753430379..636491a51 100644 --- a/src/Magnum/Trade/LightData.h +++ b/src/Magnum/Trade/LightData.h @@ -64,6 +64,7 @@ class LightData { /** * @brief Constructor + * @param type Light type * @param color Light color * @param intensity Light intensity * @param importerState Importer-specific state From f270705f360230003ff137bc70bc685b322c3e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 11:28:38 +0200 Subject: [PATCH 194/290] MagnumPlugins: exporting symbols of all plugins. For consistency. Already done for the magnum-plugins repo and somehow forgotten here. --- src/MagnumPlugins/MagnumFont/CMakeLists.txt | 15 +++++- src/MagnumPlugins/MagnumFont/MagnumFont.h | 46 +++++++++++-------- .../MagnumFont/configure.h.cmake | 26 +++++++++++ .../MagnumFontConverter/CMakeLists.txt | 15 +++++- .../MagnumFontConverter/MagnumFontConverter.h | 21 +++++++-- .../MagnumFontConverter/Test/CMakeLists.txt | 1 - .../MagnumFontConverter/configure.h.cmake | 26 +++++++++++ src/MagnumPlugins/ObjImporter/CMakeLists.txt | 12 +++++ src/MagnumPlugins/ObjImporter/ObjImporter.h | 37 ++++++++++----- .../ObjImporter/Test/CMakeLists.txt | 7 +++ .../ObjImporter/configure.h.cmake | 26 +++++++++++ .../WavAudioImporter/CMakeLists.txt | 12 +++++ .../WavAudioImporter/Test/CMakeLists.txt | 7 +++ .../WavAudioImporter/WavImporter.h | 33 +++++++++---- .../WavAudioImporter/configure.h.cmake | 26 +++++++++++ 15 files changed, 265 insertions(+), 45 deletions(-) create mode 100644 src/MagnumPlugins/MagnumFont/configure.h.cmake create mode 100644 src/MagnumPlugins/MagnumFontConverter/configure.h.cmake create mode 100644 src/MagnumPlugins/ObjImporter/configure.h.cmake create mode 100644 src/MagnumPlugins/WavAudioImporter/configure.h.cmake diff --git a/src/MagnumPlugins/MagnumFont/CMakeLists.txt b/src/MagnumPlugins/MagnumFont/CMakeLists.txt index 3a0c799d3..5d3777628 100644 --- a/src/MagnumPlugins/MagnumFont/CMakeLists.txt +++ b/src/MagnumPlugins/MagnumFont/CMakeLists.txt @@ -23,6 +23,13 @@ # DEALINGS IN THE SOFTWARE. # +if(BUILD_PLUGINS_STATIC) + set(MAGNUM_MAGNUMFONT_BUILD_STATIC 1) +endif() + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) + set(MagnumFont_SRCS MagnumFont.cpp) @@ -34,6 +41,9 @@ add_library(MagnumFontObjects OBJECT ${MagnumFont_SRCS} ${MagnumFont_HEADERS}) target_include_directories(MagnumFontObjects PUBLIC $) +if(NOT BUILD_PLUGINS_STATIC) + target_compile_definitions(MagnumFontObjects PRIVATE "MagnumFontObjects_EXPORTS") +endif() if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) set_target_properties(MagnumFontObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() @@ -53,6 +63,7 @@ if(CORRADE_TARGET_WINDOWS) endif() install(FILES ${MagnumFont_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/MagnumFont) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/MagnumFont) if(BUILD_GL_TESTS) # On Win32 we need to avoid dllimporting TgaImporter symbols, because it @@ -63,7 +74,9 @@ if(BUILD_GL_TESTS) add_library(MagnumMagnumFontTestLib STATIC ${MagnumFont_SRCS} ${MagnumFont_HEADERS}) - target_compile_definitions(MagnumMagnumFontTestLib PRIVATE "MAGNUM_TGAIMPORTER_BUILD_STATIC") + target_compile_definitions(MagnumMagnumFontTestLib + PRIVATE "MAGNUM_TGAIMPORTER_BUILD_STATIC" + PUBLIC "MAGNUM_MAGNUMFONT_BUILD_STATIC") else() add_library(MagnumMagnumFontTestLib STATIC $ diff --git a/src/MagnumPlugins/MagnumFont/MagnumFont.h b/src/MagnumPlugins/MagnumFont/MagnumFont.h index 0496e64a3..5f12a7ca3 100644 --- a/src/MagnumPlugins/MagnumFont/MagnumFont.h +++ b/src/MagnumPlugins/MagnumFont/MagnumFont.h @@ -32,6 +32,21 @@ #include "Magnum/Text/AbstractFont.h" #include "Magnum/Trade/Trade.h" +#include "MagnumPlugins/MagnumFont/configure.h" + +#ifndef DOXYGEN_GENERATING_OUTPUT +#ifndef MAGNUM_MAGNUMFONT_BUILD_STATIC + #if defined(MagnumFont_EXPORTS) || defined(MagnumFontObjects_EXPORTS) + #define MAGNUM_MAGNUMFONT_EXPORT CORRADE_VISIBILITY_EXPORT + #else + #define MAGNUM_MAGNUMFONT_EXPORT CORRADE_VISIBILITY_IMPORT + #endif +#else + #define MAGNUM_MAGNUMFONT_EXPORT CORRADE_VISIBILITY_STATIC +#endif +#define MAGNUM_MAGNUMFONT_LOCAL CORRADE_VISIBILITY_LOCAL +#endif + namespace Magnum { namespace Text { /** @@ -101,9 +116,9 @@ The file syntax is as in following: # ... -@see Trade::TgaImporter +@see @ref Trade::TgaImporter */ -class MagnumFont: public AbstractFont { +class MAGNUM_MAGNUMFONT_EXPORT MagnumFont: public AbstractFont { public: /** @brief Default constructor */ explicit MagnumFont(); @@ -116,25 +131,18 @@ class MagnumFont: public AbstractFont { private: struct Data; - Features doFeatures() const override; - - bool doIsOpened() const override; - - Metrics doOpenData(const std::vector>>& data, Float) override; - - Metrics doOpenFile(const std::string& filename, Float) override; - - void doClose() override; - - UnsignedInt doGlyphId(char32_t character) override; - - Vector2 doGlyphAdvance(UnsignedInt glyph) override; - - std::unique_ptr doCreateGlyphCache() override; + MAGNUM_MAGNUMFONT_LOCAL Features doFeatures() const override; + MAGNUM_MAGNUMFONT_LOCAL bool doIsOpened() const override; + MAGNUM_MAGNUMFONT_LOCAL Metrics doOpenData(const std::vector>>& data, Float) override; + MAGNUM_MAGNUMFONT_LOCAL Metrics doOpenFile(const std::string& filename, Float) override; + MAGNUM_MAGNUMFONT_LOCAL void doClose() override; - std::unique_ptr doLayout(const GlyphCache& cache, Float size, const std::string& text) override; + MAGNUM_MAGNUMFONT_LOCAL UnsignedInt doGlyphId(char32_t character) override; + MAGNUM_MAGNUMFONT_LOCAL Vector2 doGlyphAdvance(UnsignedInt glyph) override; + MAGNUM_MAGNUMFONT_LOCAL std::unique_ptr doCreateGlyphCache() override; + MAGNUM_MAGNUMFONT_LOCAL std::unique_ptr doLayout(const GlyphCache& cache, Float size, const std::string& text) override; - Metrics openInternal(Utility::Configuration&& conf, Trade::ImageData2D&& image); + MAGNUM_MAGNUMFONT_LOCAL Metrics openInternal(Utility::Configuration&& conf, Trade::ImageData2D&& image); Data* _opened; }; diff --git a/src/MagnumPlugins/MagnumFont/configure.h.cmake b/src/MagnumPlugins/MagnumFont/configure.h.cmake new file mode 100644 index 000000000..b3d53b96a --- /dev/null +++ b/src/MagnumPlugins/MagnumFont/configure.h.cmake @@ -0,0 +1,26 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#cmakedefine MAGNUM_MAGNUMFONT_BUILD_STATIC diff --git a/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt b/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt index 0140e479e..a89ae6e88 100644 --- a/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt +++ b/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt @@ -23,6 +23,13 @@ # DEALINGS IN THE SOFTWARE. # +if(BUILD_PLUGINS_STATIC) + set(MAGNUM_MAGNUMFONTCONVERTER_BUILD_STATIC 1) +endif() + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) + set(MagnumFontConverter_SRCS MagnumFontConverter.cpp) @@ -34,6 +41,9 @@ add_library(MagnumFontConverterObjects OBJECT ${MagnumFontConverter_SRCS} ${MagnumFontConverter_HEADERS}) target_include_directories(MagnumFontConverterObjects PUBLIC $) +if(NOT BUILD_PLUGINS_STATIC) + target_compile_definitions(MagnumFontConverterObjects PRIVATE "MagnumFontConverterObjects_EXPORTS") +endif() if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) set_target_properties(MagnumFontConverterObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() @@ -53,6 +63,7 @@ if(CORRADE_TARGET_WINDOWS) endif() install(FILES ${MagnumFontConverter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/MagnumFontConverter) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/MagnumFontConverter) if(BUILD_GL_TESTS) # On Win32 we need to avoid dllimporting TgaImageConverter symbols, because @@ -63,7 +74,9 @@ if(BUILD_GL_TESTS) add_library(MagnumMagnumFontConverterTestLib STATIC ${MagnumFontConverter_SRCS} ${MagnumFontConverter_HEADERS}) - target_compile_definitions(MagnumMagnumFontConverterTestLib PRIVATE "MAGNUM_TGAIMAGECONVERTER_BUILD_STATIC") + target_compile_definitions(MagnumMagnumFontConverterTestLib + PRIVATE "MAGNUM_TGAIMAGECONVERTER_BUILD_STATIC" + PUBLIC "MAGNUM_MAGNUMFONTCONVERTER_BUILD_STATIC") else() add_library(MagnumMagnumFontConverterTestLib STATIC $ diff --git a/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.h b/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.h index 4f6595db2..8c72749c0 100644 --- a/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.h +++ b/src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.h @@ -31,6 +31,21 @@ #include "Magnum/Text/AbstractFontConverter.h" +#include "MagnumPlugins/MagnumFontConverter/configure.h" + +#ifndef DOXYGEN_GENERATING_OUTPUT +#ifndef MAGNUM_MAGNUMFONTCONVERTER_BUILD_STATIC + #if defined(MagnumFontConverter_EXPORTS) || defined(MagnumFontConverterObjects_EXPORTS) + #define MAGNUM_MAGNUMFONTCONVERTER_EXPORT CORRADE_VISIBILITY_EXPORT + #else + #define MAGNUM_MAGNUMFONTCONVERTER_EXPORT CORRADE_VISIBILITY_IMPORT + #endif +#else + #define MAGNUM_MAGNUMFONTCONVERTER_EXPORT CORRADE_VISIBILITY_STATIC +#endif +#define MAGNUM_MAGNUMFONTCONVERTER_LOCAL CORRADE_VISIBILITY_LOCAL +#endif + namespace Magnum { namespace Text { /** @@ -49,7 +64,7 @@ dependency of another plugin, you need to request `MagnumFontConverter` component of `Magnum` package in CMake and link to `Magnum::MagnumFontConverter` target. See @ref building, @ref cmake and @ref plugins for more information. */ -class MagnumFontConverter: public Text::AbstractFontConverter { +class MAGNUM_MAGNUMFONTCONVERTER_EXPORT MagnumFontConverter: public Text::AbstractFontConverter { public: /** @brief Default constructor */ explicit MagnumFontConverter(); @@ -58,8 +73,8 @@ class MagnumFontConverter: public Text::AbstractFontConverter { explicit MagnumFontConverter(PluginManager::AbstractManager& manager, std::string plugin); private: - Features doFeatures() const override; - std::vector>> doExportFontToData(AbstractFont& font, GlyphCache& cache, const std::string& filename, const std::u32string& characters) const override; + MAGNUM_MAGNUMFONTCONVERTER_LOCAL Features doFeatures() const override; + MAGNUM_MAGNUMFONTCONVERTER_LOCAL std::vector>> doExportFontToData(AbstractFont& font, GlyphCache& cache, const std::string& filename, const std::u32string& characters) const override; }; }} diff --git a/src/MagnumPlugins/MagnumFontConverter/Test/CMakeLists.txt b/src/MagnumPlugins/MagnumFontConverter/Test/CMakeLists.txt index 2e859b71b..fa42cba7a 100644 --- a/src/MagnumPlugins/MagnumFontConverter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/MagnumFontConverter/Test/CMakeLists.txt @@ -31,7 +31,6 @@ corrade_add_test(MagnumFontConverterGLTest MagnumFontConverterGLTest.cpp LIBRARI MagnumTgaImporterTestLib ${GL_TEST_LIBRARIES}) target_include_directories(MagnumFontConverterGLTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) - # On Win32 we need to avoid dllimporting TgaImporter symbols, because it would # search for the symbols in some DLL even though they were linked statically. # However it apparently doesn't matter that they were dllexported when building diff --git a/src/MagnumPlugins/MagnumFontConverter/configure.h.cmake b/src/MagnumPlugins/MagnumFontConverter/configure.h.cmake new file mode 100644 index 000000000..1eb6102a9 --- /dev/null +++ b/src/MagnumPlugins/MagnumFontConverter/configure.h.cmake @@ -0,0 +1,26 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#cmakedefine MAGNUM_MAGNUMFONTCONVERTER_BUILD_STATIC diff --git a/src/MagnumPlugins/ObjImporter/CMakeLists.txt b/src/MagnumPlugins/ObjImporter/CMakeLists.txt index 558cbfabf..7726b2e33 100644 --- a/src/MagnumPlugins/ObjImporter/CMakeLists.txt +++ b/src/MagnumPlugins/ObjImporter/CMakeLists.txt @@ -23,6 +23,13 @@ # DEALINGS IN THE SOFTWARE. # +if(BUILD_PLUGINS_STATIC) + set(MAGNUM_OBJIMPORTER_BUILD_STATIC 1) +endif() + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) + set(ObjImporter_SRCS ObjImporter.cpp) @@ -34,6 +41,9 @@ add_library(ObjImporterObjects OBJECT ${ObjImporter_SRCS} ${ObjImporter_HEADERS}) target_include_directories(ObjImporterObjects PUBLIC $) +if(NOT BUILD_PLUGINS_STATIC) + target_compile_definitions(ObjImporterObjects PRIVATE "ObjImporterObjects_EXPORTS") +endif() if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) set_target_properties(ObjImporterObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() @@ -49,12 +59,14 @@ endif() target_link_libraries(ObjImporter Magnum MagnumMeshTools) install(FILES ${ObjImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/ObjImporter) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/ObjImporter) if(BUILD_TESTS) add_library(MagnumObjImporterTestLib STATIC $ ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details target_link_libraries(MagnumObjImporterTestLib Magnum MagnumMeshTools) + add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/ObjImporter/ObjImporter.h b/src/MagnumPlugins/ObjImporter/ObjImporter.h index 29d150f16..74e6d85dd 100644 --- a/src/MagnumPlugins/ObjImporter/ObjImporter.h +++ b/src/MagnumPlugins/ObjImporter/ObjImporter.h @@ -31,6 +31,21 @@ #include "Magnum/Trade/AbstractImporter.h" +#include "MagnumPlugins/ObjImporter/configure.h" + +#ifndef DOXYGEN_GENERATING_OUTPUT +#ifndef MAGNUM_OBJIMPORTER_BUILD_STATIC + #if defined(ObjImporter_EXPORTS) || defined(ObjImporterObjects_EXPORTS) + #define MAGNUM_OBJIMPORTER_EXPORT CORRADE_VISIBILITY_EXPORT + #else + #define MAGNUM_OBJIMPORTER_EXPORT CORRADE_VISIBILITY_IMPORT + #endif +#else + #define MAGNUM_OBJIMPORTER_EXPORT CORRADE_VISIBILITY_STATIC +#endif +#define MAGNUM_OBJIMPORTER_LOCAL CORRADE_VISIBILITY_LOCAL +#endif + namespace Magnum { namespace Trade { /** @@ -51,7 +66,7 @@ of another plugin, you need to request `ObjImporter` component of `Magnum` package in CMake and link to `Magnum::ObjImporter` target. See @ref building, @ref cmake and @ref plugins for more information. */ -class ObjImporter: public AbstractImporter { +class MAGNUM_OBJIMPORTER_EXPORT ObjImporter: public AbstractImporter { public: /** @brief Default constructor */ explicit ObjImporter(); @@ -64,19 +79,19 @@ class ObjImporter: public AbstractImporter { private: struct File; - Features doFeatures() const override; + MAGNUM_OBJIMPORTER_LOCAL Features doFeatures() const override; - bool doIsOpened() const override; - void doOpenData(Containers::ArrayView data) override; - void doOpenFile(const std::string& filename) override; - void doClose() override; + MAGNUM_OBJIMPORTER_LOCAL bool doIsOpened() const override; + MAGNUM_OBJIMPORTER_LOCAL void doOpenData(Containers::ArrayView data) override; + MAGNUM_OBJIMPORTER_LOCAL void doOpenFile(const std::string& filename) override; + MAGNUM_OBJIMPORTER_LOCAL void doClose() override; - UnsignedInt doMesh3DCount() const override; - Int doMesh3DForName(const std::string& name) override; - std::string doMesh3DName(UnsignedInt id) override; - std::optional doMesh3D(UnsignedInt id) override; + MAGNUM_OBJIMPORTER_LOCAL UnsignedInt doMesh3DCount() const override; + MAGNUM_OBJIMPORTER_LOCAL Int doMesh3DForName(const std::string& name) override; + MAGNUM_OBJIMPORTER_LOCAL std::string doMesh3DName(UnsignedInt id) override; + MAGNUM_OBJIMPORTER_LOCAL std::optional doMesh3D(UnsignedInt id) override; - void parseMeshNames(); + MAGNUM_OBJIMPORTER_LOCAL void parseMeshNames(); std::unique_ptr _file; }; diff --git a/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt b/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt index e51873f87..c8bf7e8b4 100644 --- a/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt @@ -34,6 +34,13 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake corrade_add_test(ObjImporterTest Test.cpp LIBRARIES MagnumObjImporterTestLib) target_include_directories(ObjImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +# On Win32 we need to avoid dllimporting ObjImporter symbols, because it would +# search for the symbols in some DLL even though they were linked statically. +# However it apparently doesn't matter that they were dllexported when building +# the static library. EH. +if(WIN32) + target_compile_definitions(ObjImporterTest PRIVATE "MAGNUM_OBJIMPORTER_BUILD_STATIC") +endif() if(CORRADE_TARGET_EMSCRIPTEN) emscripten_embed_file(ObjImporterTest "" "/") diff --git a/src/MagnumPlugins/ObjImporter/configure.h.cmake b/src/MagnumPlugins/ObjImporter/configure.h.cmake new file mode 100644 index 000000000..e30d44ad2 --- /dev/null +++ b/src/MagnumPlugins/ObjImporter/configure.h.cmake @@ -0,0 +1,26 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#cmakedefine MAGNUM_OBJIMPORTER_BUILD_STATIC diff --git a/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt index 3280459d4..b17bcb8ea 100644 --- a/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt @@ -23,6 +23,13 @@ # DEALINGS IN THE SOFTWARE. # +if(BUILD_PLUGINS_STATIC) + set(MAGNUM_WAVAUDIOIMPORTER_BUILD_STATIC 1) +endif() + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) + set(WavAudioImporter_SRCS WavHeader.cpp WavImporter.cpp) @@ -38,6 +45,9 @@ add_library(WavAudioImporterObjects OBJECT target_include_directories(WavAudioImporterObjects PUBLIC $ $) +if(NOT BUILD_PLUGINS_STATIC) + target_compile_definitions(WavAudioImporterObjects PRIVATE "WavAudioImporterObjects_EXPORTS") +endif() if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) set_target_properties(WavAudioImporterObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() @@ -53,12 +63,14 @@ endif() target_link_libraries(WavAudioImporter Magnum MagnumAudio) install(FILES ${WavAudioImporter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/WavAudioImporter) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/configure.h DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/WavAudioImporter) if(BUILD_TESTS) add_library(MagnumWavAudioImporterTestLib STATIC $ ${PROJECT_SOURCE_DIR}/src/dummy.cpp) # XCode workaround, see file comment for details target_link_libraries(MagnumWavAudioImporterTestLib Magnum MagnumAudio) + add_subdirectory(Test) endif() diff --git a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt index ccd145822..ae3132c39 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt @@ -34,6 +34,13 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake corrade_add_test(WavAudioImporterTest WavImporterTest.cpp LIBRARIES MagnumWavAudioImporterTestLib) target_include_directories(WavAudioImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +# On Win32 we need to avoid dllimporting WavAudioImporter symbols, because it +# would search for the symbols in some DLL even though they were linked +# statically. However it apparently doesn't matter that they were dllexported +# when building the static library. EH. +if(WIN32) + target_compile_definitions(WavAudioImporterTest PRIVATE "MAGNUM_WAVAUDIOIMPORTER_BUILD_STATIC") +endif() if(CORRADE_TARGET_EMSCRIPTEN) emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8.wav") diff --git a/src/MagnumPlugins/WavAudioImporter/WavImporter.h b/src/MagnumPlugins/WavAudioImporter/WavImporter.h index 3300821e9..aecd6f726 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavImporter.h +++ b/src/MagnumPlugins/WavAudioImporter/WavImporter.h @@ -33,6 +33,21 @@ #include "Magnum/Audio/AbstractImporter.h" +#include "MagnumPlugins/WavAudioImporter/configure.h" + +#ifndef DOXYGEN_GENERATING_OUTPUT +#ifndef MAGNUM_WAVAUDIOIMPORTER_BUILD_STATIC + #if defined(WavAudioImporter_EXPORTS) || defined(WavAudioImporterObjects_EXPORTS) + #define MAGNUM_WAVAUDIOIMPORTER_EXPORT CORRADE_VISIBILITY_EXPORT + #else + #define MAGNUM_WAVAUDIOIMPORTER_EXPORT CORRADE_VISIBILITY_IMPORT + #endif +#else + #define MAGNUM_WAVAUDIOIMPORTER_EXPORT CORRADE_VISIBILITY_STATIC +#endif +#define MAGNUM_WAVAUDIOIMPORTER_LOCAL CORRADE_VISIBILITY_LOCAL +#endif + namespace Magnum { namespace Audio { /** @@ -49,7 +64,7 @@ dependency of another plugin, you need to request `WavAudioImporter` component of `Magnum` package in CMake and link to `Magnum::WavAudioImporter` target. See @ref building, @ref cmake and @ref plugins for more information. */ -class WavImporter: public AbstractImporter { +class MAGNUM_WAVAUDIOIMPORTER_EXPORT WavImporter: public AbstractImporter { public: /** @brief Default constructor */ explicit WavImporter(); @@ -58,14 +73,14 @@ class WavImporter: public AbstractImporter { explicit WavImporter(PluginManager::AbstractManager& manager, std::string plugin); private: - Features doFeatures() const override; - bool doIsOpened() const override; - void doOpenData(Containers::ArrayView data) override; - void doClose() override; - - Buffer::Format doFormat() const override; - UnsignedInt doFrequency() const override; - Containers::Array doData() override; + MAGNUM_WAVAUDIOIMPORTER_LOCAL Features doFeatures() const override; + MAGNUM_WAVAUDIOIMPORTER_LOCAL bool doIsOpened() const override; + MAGNUM_WAVAUDIOIMPORTER_LOCAL void doOpenData(Containers::ArrayView data) override; + MAGNUM_WAVAUDIOIMPORTER_LOCAL void doClose() override; + + MAGNUM_WAVAUDIOIMPORTER_LOCAL Buffer::Format doFormat() const override; + MAGNUM_WAVAUDIOIMPORTER_LOCAL UnsignedInt doFrequency() const override; + MAGNUM_WAVAUDIOIMPORTER_LOCAL Containers::Array doData() override; Containers::Array _data; Buffer::Format _format; diff --git a/src/MagnumPlugins/WavAudioImporter/configure.h.cmake b/src/MagnumPlugins/WavAudioImporter/configure.h.cmake new file mode 100644 index 000000000..511a9a0a6 --- /dev/null +++ b/src/MagnumPlugins/WavAudioImporter/configure.h.cmake @@ -0,0 +1,26 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#cmakedefine MAGNUM_WAVAUDIOIMPORTER_BUILD_STATIC From b0d6b2b14a8edfb6235dd64fabc0bd5fa8698b1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 10:52:51 +0200 Subject: [PATCH 195/290] WavAudioImporter: have an enum for WAV audio formats. Together with debug output it allowed me to reduce the amount of error branches. --- .../WavAudioImporter/Test/WavImporterTest.cpp | 18 ++++++++++++--- .../WavAudioImporter/WavHeader.cpp | 16 +++++++++++++ .../WavAudioImporter/WavHeader.h | 16 +++++++++++-- .../WavAudioImporter/WavImporter.cpp | 23 ++++++------------- 4 files changed, 52 insertions(+), 21 deletions(-) diff --git a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp index 2a69319aa..55724a1f7 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp +++ b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp @@ -30,6 +30,7 @@ #include #include "MagnumPlugins/WavAudioImporter/WavImporter.h" +#include "MagnumPlugins/WavAudioImporter/WavHeader.h" #include "configure.h" @@ -60,6 +61,8 @@ class WavImporterTest: public TestSuite::Tester { void stereo64f(); void surround616(); + + void debugAudioFormat(); }; WavImporterTest::WavImporterTest() { @@ -82,7 +85,9 @@ WavImporterTest::WavImporterTest() { &WavImporterTest::mono32f, &WavImporterTest::stereo32f, &WavImporterTest::stereo64f, - &WavImporterTest::surround616}); + &WavImporterTest::surround616, + + &WavImporterTest::debugAudioFormat}); } void WavImporterTest::wrongSize() { @@ -109,7 +114,7 @@ void WavImporterTest::unsupportedFormat() { WavImporter importer; CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "unsupportedFormat.wav"))); - CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported audio format 2\n"); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat(0x2)\n"); } void WavImporterTest::unsupportedChannelCount() { @@ -231,7 +236,14 @@ void WavImporterTest::surround616() { WavImporter importer; CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "surround616.wav"))); - CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported audio format: extensible not implememented 65534\n"); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::Extensible\n"); +} + +void WavImporterTest::debugAudioFormat() { + std::ostringstream out; + + Debug{&out} << WavAudioFormat::IeeeFloat << WavAudioFormat(0xdead); + CORRADE_COMPARE(out.str(), "Audio::WavAudioFormat::IeeeFloat Audio::WavAudioFormat(0xdead)\n"); } }}} diff --git a/src/MagnumPlugins/WavAudioImporter/WavHeader.cpp b/src/MagnumPlugins/WavAudioImporter/WavHeader.cpp index 3b071bbc2..1bfbbf990 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavHeader.cpp +++ b/src/MagnumPlugins/WavAudioImporter/WavHeader.cpp @@ -35,4 +35,20 @@ static_assert(sizeof(RiffChunk) == 8, "RiffChunk size is not 8 bytes"); static_assert(sizeof(WavHeaderChunk) == 12, "WavHeaderChunk size is not 12 bytes"); static_assert(sizeof(WavFormatChunk) == 24, "WavFormatChunk size is not 18 bytes"); +Debug& operator<<(Debug& debug, const WavAudioFormat value) { + switch(value) { + /* LCOV_EXCL_START */ + #define _c(value) case WavAudioFormat::value: return debug << "Audio::WavAudioFormat::" #value; + _c(Pcm) + _c(IeeeFloat) + _c(ALaw) + _c(MuLaw) + _c(Extensible) + #undef _c + /* LCOV_EXCL_STOP */ + } + + return debug << "Audio::WavAudioFormat(" << Debug::nospace << reinterpret_cast(UnsignedShort(value)) << Debug::nospace << ")"; +} + }} diff --git a/src/MagnumPlugins/WavAudioImporter/WavHeader.h b/src/MagnumPlugins/WavAudioImporter/WavHeader.h index 249cc7e05..95e3a8cb9 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavHeader.h +++ b/src/MagnumPlugins/WavAudioImporter/WavHeader.h @@ -29,10 +29,19 @@ * @brief Struct @ref Magnum::Audio::RiffChunk, @ref Magnum::Audio::WavHeaderChunk, @ref Magnum::Audio::WavFormatChunk, enum @ref Magnum::Audio::WavAudioFormat */ -#include "Magnum/Types.h" +#include "MagnumPlugins/WavAudioImporter/WavImporter.h" namespace Magnum { namespace Audio { +/** @brief WAV audio format */ +enum class WavAudioFormat: UnsignedShort { + Pcm = 0x0001, /**< PCM */ + IeeeFloat = 0x0003, /**< IEEE Float */ + ALaw = 0x0006, /**< A-Law */ + MuLaw = 0x0007, /**< μ-Law */ + Extensible = 0xfffe /**< Extensible */ +}; + #pragma pack(1) /** @brief RIFF chunk */ struct RiffChunk { @@ -53,7 +62,7 @@ struct WavHeaderChunk { /** @brief WAV 'fmt' header */ struct WavFormatChunk { RiffChunk chunk; /**< @brief Starting RIFF chunk */ - UnsignedShort audioFormat; /**< @brief 1 = PCM */ + WavAudioFormat audioFormat; /**< @brief Audio format */ UnsignedShort numChannels; /**< @brief 1 = Mono, 2 = Stereo */ UnsignedInt sampleRate; /**< @brief Sample rate in Hz */ UnsignedInt byteRate; /**< @brief Bytes per second */ @@ -62,6 +71,9 @@ struct WavFormatChunk { }; #pragma pack() +/** @debugoperatorenum{WavAudioFormat} */ +MAGNUM_WAVAUDIOIMPORTER_EXPORT Debug& operator<<(Debug& debug, WavAudioFormat value); + }} #endif diff --git a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp index 7ff04275e..0fd132f70 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp +++ b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp @@ -31,12 +31,6 @@ #include "MagnumPlugins/WavAudioImporter/WavHeader.h" -#define WAVE_FORMAT_PCM 0x0001 -#define WAVE_FORMAT_IEEE_FLOAT 0x0003 -#define WAVE_FORMAT_ALAW 0x0006 -#define WAVE_FORMAT_MULAW 0x0007 -#define WAVE_FORMAT_EXTENSIBLE 0xFFFE - namespace Magnum { namespace Audio { WavImporter::WavImporter() = default; @@ -125,7 +119,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { formatChunk->bitsPerSample); /* Check PCM format */ - if(formatChunk->audioFormat == WAVE_FORMAT_PCM) { + if(formatChunk->audioFormat == WavAudioFormat::Pcm) { /* Decide about format */ if(formatChunk->numChannels == 1 && formatChunk->bitsPerSample == 8) _format = Buffer::Format::Mono8; @@ -143,7 +137,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { } /* Check IEEE Float format */ - } else if(formatChunk->audioFormat == WAVE_FORMAT_IEEE_FLOAT) { + } else if(formatChunk->audioFormat == WavAudioFormat::IeeeFloat) { if(formatChunk->numChannels == 1 && formatChunk->bitsPerSample == 32) _format = Buffer::Format::MonoFloat; else if(formatChunk->numChannels == 2 && formatChunk->bitsPerSample == 32) @@ -160,7 +154,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { } /* Check ALAW format */ - } else if(formatChunk->audioFormat == WAVE_FORMAT_ALAW) { + } else if(formatChunk->audioFormat == WavAudioFormat::ALaw) { if(formatChunk->numChannels == 1) _format = Buffer::Format::MonoALaw; else if(formatChunk->numChannels == 2) @@ -173,7 +167,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { } /* Check MULAW format */ - } else if(formatChunk->audioFormat == WAVE_FORMAT_MULAW) { + } else if(formatChunk->audioFormat == WavAudioFormat::MuLaw) { if(formatChunk->numChannels == 1) _format = Buffer::Format::MonoMuLaw; else if(formatChunk->numChannels == 2) @@ -184,13 +178,10 @@ void WavImporter::doOpenData(Containers::ArrayView data) { << "bits per sample"; return; } - /* We do not currently support EXTENSIBLE formats */ - } else if(formatChunk->audioFormat == WAVE_FORMAT_EXTENSIBLE) { - Error() << "Audio::WavImporter::openData(): unsupported audio format: extensible not implememented" << formatChunk->audioFormat; - return; - /* Unknown format */ + + /* Unknown/unimplemented format */ } else { - Error() << "Audio::WavImporter::openData(): unsupported audio format" << formatChunk->audioFormat; + Error() << "Audio::WavImporter::openData(): unsupported format" << formatChunk->audioFormat; return; } From bf890411c79a47ffdf6d6f222d86328cc5b86e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 11:56:02 +0200 Subject: [PATCH 196/290] doc: update OpenAL extension support page. --- doc/openal-support.dox | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/openal-support.dox b/doc/openal-support.dox index 06278b89a..ede9afe56 100644 --- a/doc/openal-support.dox +++ b/doc/openal-support.dox @@ -38,8 +38,12 @@ functions and enum values are exposed through the API. Extension | Status ------------------------------------------- | ------ +@alc_extension{ENUMERATION,EXT} | | @al_extension{EXT,double} | done @al_extension{EXT,float32} | done +@al_extension{EXT,ALAW} | done +@al_extension{EXT,MULAW} | done +@al_extension{EXT,MCFORMATS} | done @subsection openal-extension-support-soft OpenAL Soft Extensions From 54d62303e43078d4e4ec31b6aa1c1be369fdfbf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 12:11:46 +0200 Subject: [PATCH 197/290] Audio: doc++ --- src/Magnum/Audio/Buffer.h | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/Magnum/Audio/Buffer.h b/src/Magnum/Audio/Buffer.h index 09062e18d..7adc651c6 100644 --- a/src/Magnum/Audio/Buffer.h +++ b/src/Magnum/Audio/Buffer.h @@ -58,28 +58,28 @@ class Buffer { Stereo16 = AL_FORMAT_STEREO16, /**< 16-bit interleaved signed stereo */ /** - * @brief 8-bit unsigned mono A-Law Compressed Sound Format + * @brief 8-bit unsigned mono [A-Law Compressed Sound Format](https://en.wikipedia.org/wiki/A-law_algorithm) * * @requires_al_extension Extension @al_extension{EXT,ALAW} */ MonoALaw = AL_FORMAT_MONO_ALAW_EXT, /** - * @brief 16-bit signed stereo A-Law Compressed Sound Format + * @brief 16-bit signed stereo [A-Law Compressed Sound Format](https://en.wikipedia.org/wiki/A-law_algorithm) * * @requires_al_extension Extension @al_extension{EXT,ALAW} */ StereoALaw = AL_FORMAT_STEREO_ALAW_EXT, /** - * @brief 8-bit unsigned mono Mu-Law Compressed Sound Format + * @brief 8-bit unsigned mono [μ-Law Compressed Sound Format](https://en.wikipedia.org/wiki/Μ-law_algorithm) * * @requires_al_extension Extension @al_extension{EXT,MULAW} */ MonoMuLaw = AL_FORMAT_MONO_MULAW_EXT, /** - * @brief 16-bit signed Mu-Law Compressed Sound Format + * @brief 16-bit signed [μ-Law Compressed Sound Format](https://en.wikipedia.org/wiki/Μ-law_algorithm) * * @requires_al_extension Extension @al_extension{EXT,MULAW} */ @@ -134,8 +134,25 @@ class Buffer { */ Quad32 = AL_FORMAT_QUAD32, + /** + * @brief 8-bit unsigned rear + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ Rear8 = AL_FORMAT_REAR8, + + /** + * @brief 16-bit signed rear + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ Rear16 = AL_FORMAT_REAR16, + + /** + * @brief 32-bit interleaved floating-point rear + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ Rear32 = AL_FORMAT_REAR32, /** From 4add1621fbf9145957f2eff9565b95c58d596f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 12:12:15 +0200 Subject: [PATCH 198/290] WavAudioImporter: reflect new features in plugin documentation. --- src/MagnumPlugins/WavAudioImporter/WavImporter.cpp | 4 ++-- src/MagnumPlugins/WavAudioImporter/WavImporter.h | 13 ++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp index 0fd132f70..eae5a8649 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp +++ b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp @@ -153,7 +153,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { return; } - /* Check ALAW format */ + /* Check A-Law format */ } else if(formatChunk->audioFormat == WavAudioFormat::ALaw) { if(formatChunk->numChannels == 1) _format = Buffer::Format::MonoALaw; @@ -166,7 +166,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { return; } - /* Check MULAW format */ + /* Check μ-Law format */ } else if(formatChunk->audioFormat == WavAudioFormat::MuLaw) { if(formatChunk->numChannels == 1) _format = Buffer::Format::MonoMuLaw; diff --git a/src/MagnumPlugins/WavAudioImporter/WavImporter.h b/src/MagnumPlugins/WavAudioImporter/WavImporter.h index aecd6f726..c8d145a95 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavImporter.h +++ b/src/MagnumPlugins/WavAudioImporter/WavImporter.h @@ -53,9 +53,16 @@ namespace Magnum { namespace Audio { /** @brief WAV importer plugin -Supports mono and stereo PCM files with 8 or 16 bits per channel. The files are -imported with @ref Buffer::Format::Mono8, @ref Buffer::Format::Mono16, -@ref Buffer::Format::Stereo8 or @ref Buffer::Format::Stereo16, respectively. +Supports mono and stereo files of the following formats: + +- 8 bit per channel PCM, imported as @ref Buffer::Format::Mono8 and @ref Buffer::Format::Stereo8 +- 16 bit per channel PCM, imported as @ref Buffer::Format::Mono16 and @ref Buffer::Format::Stereo16 +- 32-bit IEEE Float, imported as @ref Buffer::Format::MonoFloat / @ref Buffer::Format::StereoFloat +- 64-bit IEEE Float, imported as @ref Buffer::Format::MonoDouble / @ref Buffer::Format::StereoDouble +- A-Law, imported as @ref Buffer::Format::MonoALaw / @ref Buffer::Format::StereoALaw +- μ-Law, imported as @ref Buffer::Format::MonoMuLaw / @ref Buffer::Format::StereoMuLaw + +Multi-channel formats are not supported. This plugin is built if `WITH_WAVAUDIOIMPORTER` is enabled when building Magnum. To use dynamic plugin, you need to load `WavAudioImporter` plugin From d6a8c44a0d76bced4f3ed5c326cc2ee6c0ccc392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 12:15:51 +0200 Subject: [PATCH 199/290] Updated CREDITS.md. --- CREDITS.md | 3 +++ src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp | 1 + src/MagnumPlugins/WavAudioImporter/WavHeader.h | 1 + src/MagnumPlugins/WavAudioImporter/WavImporter.cpp | 1 + src/MagnumPlugins/WavAudioImporter/WavImporter.h | 1 + 5 files changed, 7 insertions(+) diff --git a/CREDITS.md b/CREDITS.md index 91ac5edeb..19cc2f7a4 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -37,5 +37,8 @@ Contributors to Magnum library * Gerhard de Clercq -- Windows RT (Store/Phone) port * Ashwin Ravichandran ([@](ashrko619)[https://github.com/ashrko619]) -- Bézier curve implementation +* Alice Margatroid ([@Alicemargatroid](https://github.com/Alicemargatroid)) -- + Multi-channel support in Audio library, standard conformance, float, + double, A-Law and μ-Law format support in `WavAudioImporter` plugin Big thanks to everyone involved! diff --git a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp index 55724a1f7..b7e5102b2 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp +++ b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp @@ -3,6 +3,7 @@ Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Vladimír Vondruš + Copyright © 2016 Alice Margatroid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/src/MagnumPlugins/WavAudioImporter/WavHeader.h b/src/MagnumPlugins/WavAudioImporter/WavHeader.h index 95e3a8cb9..1f2e527ae 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavHeader.h +++ b/src/MagnumPlugins/WavAudioImporter/WavHeader.h @@ -5,6 +5,7 @@ Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Vladimír Vondruš + Copyright © 2016 Alice Margatroid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp index eae5a8649..da12227c2 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp +++ b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp @@ -3,6 +3,7 @@ Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Vladimír Vondruš + Copyright © 2016 Alice Margatroid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/src/MagnumPlugins/WavAudioImporter/WavImporter.h b/src/MagnumPlugins/WavAudioImporter/WavImporter.h index c8d145a95..83dff2d04 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavImporter.h +++ b/src/MagnumPlugins/WavAudioImporter/WavImporter.h @@ -5,6 +5,7 @@ Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Vladimír Vondruš + Copyright © 2016 Alice Margatroid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), From c5eeb8c555062834f523b9a5a14db2d84793a36f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 12:51:59 +0200 Subject: [PATCH 200/290] Audio: added magnum-al-info utility. --- CMakeLists.txt | 5 +- doc/building.dox | 2 + doc/cmake.dox | 1 + modules/FindMagnum.cmake | 3 +- src/Magnum/Audio/CMakeLists.txt | 22 ++++- src/Magnum/Audio/MacOSXBundleInfo.plist.in | 18 ++++ src/Magnum/Audio/magnum-al-info.cpp | 110 +++++++++++++++++++++ 7 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 src/Magnum/Audio/MacOSXBundleInfo.plist.in create mode 100644 src/Magnum/Audio/magnum-al-info.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index e6cc02b4f..4ec90174d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,7 +59,7 @@ if(CORRADE_TARGET_UNIX OR CORRADE_TARGET_NACL OR CORRADE_TARGET_WINDOWS) option(WITH_MAGNUMINFO "Build magnum-info utility" OFF) endif() -# Utilities (currently only using GLX, CGL or WGL) +# Desktop-only utilities if(CORRADE_TARGET_UNIX OR CORRADE_TARGET_WINDOWS) cmake_dependent_option(WITH_FONTCONVERTER "Build magnum-fontconverter utility" OFF "NOT TARGET_GLES" OFF) cmake_dependent_option(WITH_DISTANCEFIELDCONVERTER "Build magnum-distancefieldconverter utility" OFF "NOT TARGET_GLES" OFF) @@ -84,6 +84,9 @@ cmake_dependent_option(WITH_SHADERS "Build Shaders library" ON "NOT WITH_DEBUGTO cmake_dependent_option(WITH_TEXT "Build Text library" ON "NOT WITH_MAGNUMFONT;NOT WITH_MAGNUMFONTCONVERTER" ON) cmake_dependent_option(WITH_TEXTURETOOLS "Build TextureTools library" ON "NOT WITH_TEXT;NOT WITH_DISTANCEFIELDCONVERTER" ON) +# Magnum AL Info +cmake_dependent_option(WITH_AL_INFO "Build magnum-al-info utility" OFF "WITH_AUDIO" OFF) + # EGL context and windowless EGL application, available everywhere except on # platforms which don't support extension loading if(NOT CORRADE_TARGET_EMSCRIPTEN AND NOT CORRADE_TARGET_NACL) diff --git a/doc/building.dox b/doc/building.dox index 31f576d6b..c1813fb13 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -239,6 +239,8 @@ on Linux, Mac OS X and Windows, also disabled by default: - `WITH_MAGNUMINFO` - @ref magnum-info "magnum-info" executable, provides information about the engine and OpenGL capabilities. +- `WITH_AL_INFO` -- @ref magnum-al-info "magnum-al-info" executable, provides + information about OpenAL capabilities. - `WITH_DISTANCEFIELDCONVERTER` - @ref magnum-distancefieldconverter "magnum-distancefieldconverter" executable for converting black&white images to distance field textures. Enables also building of TextureTools library. diff --git a/doc/cmake.dox b/doc/cmake.dox index 8efb9ba68..d491fc795 100644 --- a/doc/cmake.dox +++ b/doc/cmake.dox @@ -143,6 +143,7 @@ Lastly, a few utility executables are available: - `distancefieldconverter` -- @ref magnum-distancefieldconverter executable - `fontconverter` -- @ref magnum-fontconverter executable - `info` -- @ref magnum-info executable +- `al-info` -- @ref magnum-al-info executable Note that [each namespace](namespaces.html), all @ref Platform libraries and each plugin class contain more detailed information about dependencies, diff --git a/modules/FindMagnum.cmake b/modules/FindMagnum.cmake index 949d54a28..846ed9da0 100644 --- a/modules/FindMagnum.cmake +++ b/modules/FindMagnum.cmake @@ -73,6 +73,7 @@ # distancefieldconverter - magnum-distancefieldconverter executable # fontconverter - magnum-fontconverter executable # info - magnum-info executable +# al-info - magnum-al-info executable # # Example usage with specifying additional components is:: # @@ -344,7 +345,7 @@ endif() # components from other repositories) set(_MAGNUM_LIBRARY_COMPONENTS "^(Audio|DebugTools|MeshTools|Primitives|SceneGraph|Shaders|Shapes|Text|TextureTools|AndroidApplication|GlfwApplication|GlutApplication|GlxApplication|NaClApplication|Sdl2Application|XEglApplication|WindowlessCglApplication|WindowlessEglApplication|WindowlessGlxApplication|WindowlessIosApplication|WindowlessNaClApplication|WindowlessWglApplication|WindowlessWindowsEglApplication|CglContext|EglContext|GlxContext|WglContext)$") set(_MAGNUM_PLUGIN_COMPONENTS "^(MagnumFont|MagnumFontConverter|ObjImporter|TgaImageConverter|TgaImporter|WavAudioImporter)$") -set(_MAGNUM_EXECUTABLE_COMPONENTS "^(distancefieldconverter|fontconverter|info)$") +set(_MAGNUM_EXECUTABLE_COMPONENTS "^(distancefieldconverter|fontconverter|info|al-info)$") # Find all components foreach(_component ${Magnum_FIND_COMPONENTS}) diff --git a/src/Magnum/Audio/CMakeLists.txt b/src/Magnum/Audio/CMakeLists.txt index 1a156e3ff..0607c8d2b 100644 --- a/src/Magnum/Audio/CMakeLists.txt +++ b/src/Magnum/Audio/CMakeLists.txt @@ -74,9 +74,25 @@ install(TARGETS MagnumAudio ARCHIVE DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR}) install(FILES ${MagnumAudio_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Audio) +# Magnum Audio target alias for superprojects +add_library(Magnum::Audio ALIAS MagnumAudio) + +if(WITH_AL_INFO) + add_executable(magnum-al-info magnum-al-info.cpp) + target_link_libraries(magnum-al-info MagnumAudio) + install(TARGETS magnum-al-info DESTINATION ${MAGNUM_BINARY_INSTALL_DIR}) + + if(CORRADE_TARGET_IOS) + set_target_properties(magnum-al-info PROPERTIES + MACOSX_BUNDLE ON + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/MacOSXBundleInfo.plist.in + XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "YES") + endif() + + # Magnum AL info target alias for superprojects + add_executable(Magnum::al-info ALIAS magnum-al-info) +endif() + if(BUILD_TESTS) add_subdirectory(Test) endif() - -# Magnum Audio target alias for superprojects -add_library(Magnum::Audio ALIAS MagnumAudio) diff --git a/src/Magnum/Audio/MacOSXBundleInfo.plist.in b/src/Magnum/Audio/MacOSXBundleInfo.plist.in new file mode 100644 index 000000000..ee4083277 --- /dev/null +++ b/src/Magnum/Audio/MacOSXBundleInfo.plist.in @@ -0,0 +1,18 @@ + + + + + CFBundleDevelopmentRegion + en-US + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleIdentifier + cz.mosra.magnum.magnum-al-info + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + magnum-al-info + CFBundlePackageType + APPL + + diff --git a/src/Magnum/Audio/magnum-al-info.cpp b/src/Magnum/Audio/magnum-al-info.cpp new file mode 100644 index 000000000..50a3b8f6e --- /dev/null +++ b/src/Magnum/Audio/magnum-al-info.cpp @@ -0,0 +1,110 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include + +#include "Magnum/Magnum.h" +#include "Magnum/Audio/Context.h" + +namespace Magnum { + +/** @page magnum-al-info Magnum OpenAL Info +@brief Displays information about Magnum OpenAL capabilities + +@section magnum-al-info-usage Usage + + magnum-al-info [-h|--help] [-s|--short] [--extension-strings] + +Arguments: +- `-h`,` --help` -- display this help message and exit +- `-s`, `--short` -- display just essential info and exit +- `--extension-strings` -- list all extension strings provided by the driver + (implies `--short`) + +@section magnum-al-info-example Example output + +``` + +---------------------------------------------------------+ + | Information about Magnum engine and OpenAL capabilities | + +---------------------------------------------------------+ + +connect(2) call to /dev/shm/jack-1000/default/jack_0 failed (err=No such file or directory) +attempt to connect to server failed +Audio Renderer: OpenAL Soft by OpenAL Community +OpenAL version: 1.1 ALSOFT 1.17.2 +Available devices: + OpenAL Soft +Current device: OpenAL Soft +Vendor extension support: + AL_EXT_FLOAT32 SUPPORTED + AL_EXT_DOUBLE SUPPORTED + AL_EXT_ALAW SUPPORTED + AL_EXT_MULAW SUPPORTED + AL_EXT_MCFORMATS SUPPORTED + ALC_ENUMERATION_EXT SUPPORTED + ALC_SOFTX_HRTF - + ALC_SOFT_HRTF SUPPORTED + +``` + +*/ + +} + +using namespace Magnum; + +int main(const int argc, const char** const argv) { + Utility::Arguments args; + args.addBooleanOption('s', "short").setHelp("short", "display just essential info and exit") + .addBooleanOption("extension-strings").setHelp("extension-strings", "list all extension strings provided by the driver (implies --short)") + .parse(argc, argv); + + Debug() << ""; + Debug() << " +---------------------------------------------------------+"; + Debug() << " | Information about Magnum engine and OpenAL capabilities |"; + Debug() << " +---------------------------------------------------------+"; + Debug() << ""; + + Audio::Context c; + + if(args.isSet("extension-strings")) { + Debug() << "Extension strings:" << Debug::newline + << c.extensionStrings(); + return 0; + } + + if(args.isSet("short")) return 0; + + Debug() << "Vendor extension support:"; + for(const auto& extension: Audio::Extension::extensions()) { + std::string extensionName = extension.string(); + Debug d; + d << " " << extensionName << std::string(60-extensionName.size(), ' '); + if(c.isExtensionSupported(extension)) + d << "SUPPORTED"; + else + d << " -"; + } +} From dbfcbb62e60656813c648673055bb58f641cf9bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 12:52:21 +0200 Subject: [PATCH 201/290] package: enable magnum-al-info in all packages and CIs. --- package/archlinux/PKGBUILD | 1 + package/archlinux/PKGBUILD-clang | 1 + package/archlinux/PKGBUILD-clang-libc++ | 1 + package/archlinux/PKGBUILD-es2 | 1 + package/archlinux/PKGBUILD-es2desktop | 1 + package/archlinux/PKGBUILD-es3 | 1 + package/archlinux/PKGBUILD-es3desktop | 1 + package/archlinux/PKGBUILD-gcc47 | 1 + package/archlinux/PKGBUILD-mingw-w64 | 2 ++ package/archlinux/PKGBUILD-release | 2 ++ package/archlinux/magnum-git/PKGBUILD | 3 ++- package/ci/appveyor-desktop-mingw.bat | 1 + package/ci/appveyor-desktop.bat | 1 + package/ci/travis-desktop.sh | 1 + package/debian/rules | 3 ++- package/gentoo/dev-libs/magnum/magnum-9999.ebuild | 1 + package/homebrew/magnum.rb | 2 +- 17 files changed, 21 insertions(+), 3 deletions(-) diff --git a/package/archlinux/PKGBUILD b/package/archlinux/PKGBUILD index 428e6bb08..37e52624f 100644 --- a/package/archlinux/PKGBUILD +++ b/package/archlinux/PKGBUILD @@ -42,6 +42,7 @@ build() { -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -G Ninja diff --git a/package/archlinux/PKGBUILD-clang b/package/archlinux/PKGBUILD-clang index 29a127c45..210432cb0 100644 --- a/package/archlinux/PKGBUILD-clang +++ b/package/archlinux/PKGBUILD-clang @@ -45,6 +45,7 @@ build() { -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON ninja diff --git a/package/archlinux/PKGBUILD-clang-libc++ b/package/archlinux/PKGBUILD-clang-libc++ index bcbef4df6..709bf1906 100644 --- a/package/archlinux/PKGBUILD-clang-libc++ +++ b/package/archlinux/PKGBUILD-clang-libc++ @@ -48,6 +48,7 @@ build() { -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON ninja diff --git a/package/archlinux/PKGBUILD-es2 b/package/archlinux/PKGBUILD-es2 index 3f06adf86..f7cc98005 100644 --- a/package/archlinux/PKGBUILD-es2 +++ b/package/archlinux/PKGBUILD-es2 @@ -32,6 +32,7 @@ build() { -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -G Ninja diff --git a/package/archlinux/PKGBUILD-es2desktop b/package/archlinux/PKGBUILD-es2desktop index 6642f10a1..155e00821 100644 --- a/package/archlinux/PKGBUILD-es2desktop +++ b/package/archlinux/PKGBUILD-es2desktop @@ -37,6 +37,7 @@ build() { -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -G Ninja diff --git a/package/archlinux/PKGBUILD-es3 b/package/archlinux/PKGBUILD-es3 index eaefcb0aa..70d571031 100644 --- a/package/archlinux/PKGBUILD-es3 +++ b/package/archlinux/PKGBUILD-es3 @@ -32,6 +32,7 @@ build() { -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -G Ninja diff --git a/package/archlinux/PKGBUILD-es3desktop b/package/archlinux/PKGBUILD-es3desktop index 31e7254ff..7bc5ec800 100644 --- a/package/archlinux/PKGBUILD-es3desktop +++ b/package/archlinux/PKGBUILD-es3desktop @@ -37,6 +37,7 @@ build() { -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -G Ninja diff --git a/package/archlinux/PKGBUILD-gcc47 b/package/archlinux/PKGBUILD-gcc47 index cdb125d4c..49725c087 100644 --- a/package/archlinux/PKGBUILD-gcc47 +++ b/package/archlinux/PKGBUILD-gcc47 @@ -50,6 +50,7 @@ build() { -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON ninja diff --git a/package/archlinux/PKGBUILD-mingw-w64 b/package/archlinux/PKGBUILD-mingw-w64 index 7f57334d2..f423d9c6c 100644 --- a/package/archlinux/PKGBUILD-mingw-w64 +++ b/package/archlinux/PKGBUILD-mingw-w64 @@ -34,6 +34,7 @@ build() { -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -G Ninja @@ -60,6 +61,7 @@ build() { -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -G Ninja diff --git a/package/archlinux/PKGBUILD-release b/package/archlinux/PKGBUILD-release index 6886a63fe..d3c5a2dba 100644 --- a/package/archlinux/PKGBUILD-release +++ b/package/archlinux/PKGBUILD-release @@ -38,6 +38,7 @@ build() { -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -G Ninja @@ -64,6 +65,7 @@ build() { -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -G Ninja diff --git a/package/archlinux/magnum-git/PKGBUILD b/package/archlinux/magnum-git/PKGBUILD index bd7852a71..d46afdf97 100644 --- a/package/archlinux/magnum-git/PKGBUILD +++ b/package/archlinux/magnum-git/PKGBUILD @@ -38,7 +38,8 @@ build() { -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ - -DWITH_MAGNUMINFO=ON + -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON make } diff --git a/package/ci/appveyor-desktop-mingw.bat b/package/ci/appveyor-desktop-mingw.bat index 9c7c88949..38d69e027 100644 --- a/package/ci/appveyor-desktop-mingw.bat +++ b/package/ci/appveyor-desktop-mingw.bat @@ -34,6 +34,7 @@ cmake .. ^ -DWITH_DISTANCEFIELDCONVERTER=ON ^ -DWITH_FONTCONVERTER=ON ^ -DWITH_MAGNUMINFO=ON ^ + -DWITH_AL_INFO=ON ^ -DBUILD_TESTS=ON ^ -DBUILD_GL_TESTS=ON ^ -G "MinGW Makefiles" || exit /b diff --git a/package/ci/appveyor-desktop.bat b/package/ci/appveyor-desktop.bat index fb262784d..09a1918d1 100644 --- a/package/ci/appveyor-desktop.bat +++ b/package/ci/appveyor-desktop.bat @@ -33,6 +33,7 @@ cmake .. ^ -DWITH_DISTANCEFIELDCONVERTER=ON ^ -DWITH_FONTCONVERTER=ON ^ -DWITH_MAGNUMINFO=ON ^ + -DWITH_AL_INFO=ON ^ -DBUILD_TESTS=ON ^ -DBUILD_GL_TESTS=ON ^ -G Ninja || exit /b diff --git a/package/ci/travis-desktop.sh b/package/ci/travis-desktop.sh index 13a4cf7d1..ba64b12de 100755 --- a/package/ci/travis-desktop.sh +++ b/package/ci/travis-desktop.sh @@ -32,6 +32,7 @@ cmake .. \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON make -j${JOBS_LIMIT} diff --git a/package/debian/rules b/package/debian/rules index c20a60cdc..35c5855f9 100755 --- a/package/debian/rules +++ b/package/debian/rules @@ -18,7 +18,8 @@ override_dh_auto_configure: -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ - -DWITH_MAGNUMINFO=ON + -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON # Extraordinarily coarse way to suppress error about libGL not being in # dependencies when the user has installed NVidia binary drivers which are not diff --git a/package/gentoo/dev-libs/magnum/magnum-9999.ebuild b/package/gentoo/dev-libs/magnum/magnum-9999.ebuild index d163545c0..11801e1b7 100644 --- a/package/gentoo/dev-libs/magnum/magnum-9999.ebuild +++ b/package/gentoo/dev-libs/magnum/magnum-9999.ebuild @@ -42,6 +42,7 @@ src_configure() { -DWITH_DISTANCEFIELDCONVERTER=ON -DWITH_FONTCONVERTER=ON -DWITH_MAGNUMINFO=ON + -DWITH_AL_INFO=ON ) cmake-utils_src_configure } diff --git a/package/homebrew/magnum.rb b/package/homebrew/magnum.rb index e9e0095bc..1dfdbcc92 100644 --- a/package/homebrew/magnum.rb +++ b/package/homebrew/magnum.rb @@ -12,7 +12,7 @@ class Magnum < Formula def install system "mkdir build" cd "build" do - system "cmake", "-DCMAKE_BUILD_TYPE=Release", "-DCMAKE_INSTALL_PREFIX=#{prefix}", "-DWITH_AUDIO=ON", "-DWITH_SDL2APPLICATION=ON", "-DWITH_WINDOWLESSCGLAPPLICATION=ON", "-DWITH_CGLCONTEXT=ON", "-DWITH_MAGNUMFONT=ON", "-DWITH_MAGNUMFONTCONVERTER=ON", "-DWITH_OBJIMPORTER=ON", "-DWITH_TGAIMAGECONVERTER=ON", "-DWITH_TGAIMPORTER=ON", "-DWITH_WAVAUDIOIMPORTER=ON", "-DWITH_DISTANCEFIELDCONVERTER=ON", "-DWITH_FONTCONVERTER=ON", "-DWITH_MAGNUMINFO=ON", ".." + system "cmake", "-DCMAKE_BUILD_TYPE=Release", "-DCMAKE_INSTALL_PREFIX=#{prefix}", "-DWITH_AUDIO=ON", "-DWITH_SDL2APPLICATION=ON", "-DWITH_WINDOWLESSCGLAPPLICATION=ON", "-DWITH_CGLCONTEXT=ON", "-DWITH_MAGNUMFONT=ON", "-DWITH_MAGNUMFONTCONVERTER=ON", "-DWITH_OBJIMPORTER=ON", "-DWITH_TGAIMAGECONVERTER=ON", "-DWITH_TGAIMPORTER=ON", "-DWITH_WAVAUDIOIMPORTER=ON", "-DWITH_DISTANCEFIELDCONVERTER=ON", "-DWITH_FONTCONVERTER=ON", "-DWITH_MAGNUMINFO=ON", "-DWITH_AL_INFO=ON", ".." system "cmake", "--build", "." system "cmake", "--build", ".", "--target", "install" end From 53036b2c2c002550492d9672dce9f3ab03368372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 12:53:39 +0200 Subject: [PATCH 202/290] Platform: magnum-info is console app, so it's not Retina capable. --- src/Magnum/Platform/MacOSXBundleInfo.plist.in | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Magnum/Platform/MacOSXBundleInfo.plist.in b/src/Magnum/Platform/MacOSXBundleInfo.plist.in index eaac87c6a..52216bc47 100644 --- a/src/Magnum/Platform/MacOSXBundleInfo.plist.in +++ b/src/Magnum/Platform/MacOSXBundleInfo.plist.in @@ -19,7 +19,5 @@ opengles-2 - NSHighResolutionCapable - From 32b757f0360e1cf444fda4feebfc3acc355cf009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 13:12:45 +0200 Subject: [PATCH 203/290] Audio: properly initialize HRTF member of Audio::Context::Configuration. --- src/Magnum/Audio/Context.h | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/Magnum/Audio/Context.h b/src/Magnum/Audio/Context.h index 29156c348..6b45cc4a7 100644 --- a/src/Magnum/Audio/Context.h +++ b/src/Magnum/Audio/Context.h @@ -315,12 +315,7 @@ class MAGNUM_AUDIO_EXPORT Context::Configuration { }; /** @brief Constructor */ - explicit Configuration(): - _frequency(-1), - _monoSources(-1), - _stereoSources(-1), - _refreshRate(-1) - {} + explicit Configuration() {} /** @brief Sampling rate in Hz */ Int frequency() const { return _frequency; } @@ -397,13 +392,13 @@ class MAGNUM_AUDIO_EXPORT Context::Configuration { } private: - Int _frequency; - Hrtf _hrtf; + Int _frequency{-1}; + Hrtf _hrtf{}; - Int _monoSources; - Int _stereoSources; + Int _monoSources{-1}; + Int _stereoSources{-1}; - Int _refreshRate; + Int _refreshRate{-1}; }; From 238d2db591e228e7a3efdeb3e2361d2bbc86e108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Sep 2016 13:53:30 +0200 Subject: [PATCH 204/290] Audio: implemented ALC_ENUMERATION_EXT. --- doc/openal-support.dox | 2 +- src/Magnum/Audio/Context.cpp | 32 +++++++++++++++++---- src/Magnum/Audio/Context.h | 43 +++++++++++++++++++++++++---- src/Magnum/Audio/magnum-al-info.cpp | 4 +++ 4 files changed, 70 insertions(+), 11 deletions(-) diff --git a/doc/openal-support.dox b/doc/openal-support.dox index ede9afe56..6f9d1b58d 100644 --- a/doc/openal-support.dox +++ b/doc/openal-support.dox @@ -38,7 +38,7 @@ functions and enum values are exposed through the API. Extension | Status ------------------------------------------- | ------ -@alc_extension{ENUMERATION,EXT} | | +@alc_extension{ENUMERATION,EXT} | done @al_extension{EXT,double} | done @al_extension{EXT,float32} | done @al_extension{EXT,ALAW} | done diff --git a/src/Magnum/Audio/Context.cpp b/src/Magnum/Audio/Context.cpp index df7d58779..a1aa20d2d 100644 --- a/src/Magnum/Audio/Context.cpp +++ b/src/Magnum/Audio/Context.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -75,6 +76,15 @@ Debug& operator<<(Debug& debug, const Context::HrtfStatus value) { Context* Context::_current = nullptr; +std::vector Context::deviceSpecifierStrings() { + std::vector list; + const char* const devices = alcGetString(nullptr, ALC_DEVICE_SPECIFIER); + for(const char* device = devices; *device; device += std::strlen(device) + 1) + list.push_back(device); + + return list; +} + bool Context::hasCurrent() { return _current; } Context& Context::current() { @@ -87,11 +97,10 @@ Context::Context(): Context{Configuration{}} {} Context::Context(const Configuration& config) { CORRADE_ASSERT(!_current, "Audio::Context: context already created", ); - /* Open default device */ - const ALCchar* const defaultDevice = alcGetString(nullptr, ALC_DEFAULT_DEVICE_SPECIFIER); - _device = alcOpenDevice(defaultDevice); - if(!_device) { - Error() << "Audio::Context: cannot open sound device" << defaultDevice; + /* Open the device */ + const ALCchar* const deviceSpecifier = config.deviceSpecifier().empty() ? alcGetString(nullptr, ALC_DEFAULT_DEVICE_SPECIFIER) : config.deviceSpecifier().data(); + if(!(_device = alcOpenDevice(deviceSpecifier))) { + Error() << "Audio::Context: cannot open sound device" << deviceSpecifier; std::exit(1); } @@ -189,4 +198,17 @@ bool Context::tryCreateContext(const Configuration& config) { return !!_context; } +Context::Configuration::Configuration() = default; +Context::Configuration::~Configuration() = default; + +Context::Configuration& Context::Configuration::setDeviceSpecifier(const std::string& specifier) { + _deviceSpecifier = specifier; + return *this; +} + +Context::Configuration& Context::Configuration::setDeviceSpecifier(std::string&& specifier) { + _deviceSpecifier = std::move(specifier); + return *this; +} + }} diff --git a/src/Magnum/Audio/Context.h b/src/Magnum/Audio/Context.h index 6b45cc4a7..dc68741ed 100644 --- a/src/Magnum/Audio/Context.h +++ b/src/Magnum/Audio/Context.h @@ -83,7 +83,6 @@ class MAGNUM_AUDIO_EXPORT Extension { */ class MAGNUM_AUDIO_EXPORT Context { public: - /** * @brief HRTF status * @@ -127,6 +126,14 @@ class MAGNUM_AUDIO_EXPORT Context { UnsupportedFormat = ALC_HRTF_UNSUPPORTED_FORMAT_SOFT }; + /** + * @brief All device specifier strings + * + * @see @ref deviceSpecifierString(), @ref Configuration::setDeviceSpecifier() + * @fn_al{GetString} with @def_alc{DEVICE_SPECIFIER} + */ + static std::vector deviceSpecifierStrings(); + /** * @brief Whether there is any current context * @@ -202,17 +209,27 @@ class MAGNUM_AUDIO_EXPORT Context { return alcGetString(_device, ALC_HRTF_SPECIFIER_SOFT); } + /** + * @brief Device specifier string + * + * @see @ref deviceSpecifierStrings(), @ref vendorString(), @ref rendererString(), + * @fn_al{GetString} with @def_alc{DEVICE_SPECIFIER} + */ + std::string deviceSpecifierString() const { return alcGetString(_device, ALC_DEVICE_SPECIFIER); } + /** * @brief Vendor string * - * @see @ref rendererString(), @fn_al{GetString} with @def_al{VENDOR} + * @see @ref deviceSpecifierString(), @ref rendererString(), + * @fn_al{GetString} with @def_al{VENDOR} */ std::string vendorString() const { return alGetString(AL_VENDOR); } /** * @brief Renderer string * - * @see @ref vendorString(), @fn_al{GetString} with @def_al{RENDERER} + * @see @ref deviceSpecifierString(), @ref vendorString(), + * @fn_al{GetString} with @def_al{RENDERER} */ std::string rendererString() const { return alGetString(AL_RENDERER); } @@ -314,8 +331,22 @@ class MAGNUM_AUDIO_EXPORT Context::Configuration { Disabled = 2 /**< Disabled */ }; - /** @brief Constructor */ - explicit Configuration() {} + explicit Configuration(); + ~Configuration(); + + /** @brief Device specifier */ + const std::string& deviceSpecifier() const { return _deviceSpecifier; } + + /** + * @brief Set device specifier + * @return Reference to self (for method chaining) + * + * If set to empty string (the default), default device specifier is + * used. + * @see @ref Context::deviceSpecifierStrings() + */ + Configuration& setDeviceSpecifier(const std::string& specifier); + Configuration& setDeviceSpecifier(std::string&& specifier); /**< @overload */ /** @brief Sampling rate in Hz */ Int frequency() const { return _frequency; } @@ -392,6 +423,8 @@ class MAGNUM_AUDIO_EXPORT Context::Configuration { } private: + std::string _deviceSpecifier; + Int _frequency{-1}; Hrtf _hrtf{}; diff --git a/src/Magnum/Audio/magnum-al-info.cpp b/src/Magnum/Audio/magnum-al-info.cpp index 50a3b8f6e..e3c3c41b2 100644 --- a/src/Magnum/Audio/magnum-al-info.cpp +++ b/src/Magnum/Audio/magnum-al-info.cpp @@ -88,6 +88,10 @@ int main(const int argc, const char** const argv) { Debug() << ""; Audio::Context c; + Debug() << "Available devices:"; + for(const auto& device: Audio::Context::deviceSpecifierStrings()) + Debug() << " " << device; + Debug() << "Current device:" << c.deviceSpecifierString(); if(args.isSet("extension-strings")) { Debug() << "Extension strings:" << Debug::newline From 048a1b2b90109c333a7e05a26a26c75342ce33a0 Mon Sep 17 00:00:00 2001 From: Alice Date: Sun, 25 Sep 2016 17:54:08 -0400 Subject: [PATCH 205/290] Add tests to improve coverage --- .../WavAudioImporter/Test/CMakeLists.txt | 15 ++-- .../WavAudioImporter/Test/WavImporterTest.cpp | 66 ++++++++++++++++++ .../Test/invalidDataChunk.wav | Bin 0 -> 66 bytes .../Test/invalidFactChunk.wav | Bin 0 -> 5824 bytes .../WavAudioImporter/Test/invalidLength.wav | Bin 0 -> 80444 bytes .../WavAudioImporter/Test/invalidPadding.wav | Bin 0 -> 73 bytes .../WavAudioImporter/Test/stereo12.wav | Bin 0 -> 94204 bytes .../WavAudioImporter/Test/stereo24.wav | Bin 0 -> 141168 bytes 8 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/invalidDataChunk.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/invalidFactChunk.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/invalidLength.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/invalidPadding.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/stereo12.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/stereo24.wav diff --git a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt index ae3132c39..c82d8b765 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt @@ -43,6 +43,15 @@ if(WIN32) endif() if(CORRADE_TARGET_EMSCRIPTEN) + emscripten_embed_file(WavAudioImporterTest unsupportedChannelCount.wav "/unsupportedChannelCount.wav") + emscripten_embed_file(WavAudioImporterTest unsupportedFormat.wav "/unsupportedFormat.wav") + emscripten_embed_file(WavAudioImporterTest wrongSignature.wav "/wrongSignature.wav") + + emscripten_embed_file(WavAudioImporterTest invalidPadding.wav "/invalidPadding.wav") + emscripten_embed_file(WavAudioImporterTest invalidLength.wav "/invalidLength.wav") + emscripten_embed_file(WavAudioImporterTest invalidDataChunk.wav "/invalidDataChunk.wav") + emscripten_embed_file(WavAudioImporterTest invalidFactChunk.wav "/invalidFactChunk.wav") + emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8.wav") emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8junk.wav") @@ -53,7 +62,9 @@ if(CORRADE_TARGET_EMSCRIPTEN) emscripten_embed_file(WavAudioImporterTest stereo8.wav "/stereo8.wav") emscripten_embed_file(WavAudioImporterTest stereo8ALaw.wav "/stereo8ALaw.wav") emscripten_embed_file(WavAudioImporterTest stereo8MuLaw.wav "/stereo8MuLaw.wav") + emscripten_embed_file(WavAudioImporterTest stereo12.wav "/stereo12.wav") emscripten_embed_file(WavAudioImporterTest stereo16.wav "/stereo16.wav") + emscripten_embed_file(WavAudioImporterTest stereo24.wav "/stereo24.wav") emscripten_embed_file(WavAudioImporterTest mono32f.wav "/mono32f.wav") emscripten_embed_file(WavAudioImporterTest stereo32f.wav "/stereo32f.wav") @@ -61,8 +72,4 @@ if(CORRADE_TARGET_EMSCRIPTEN) emscripten_embed_file(WavAudioImporterTest stereo64f.wav "/stereo64f.wav") emscripten_embed_file(WavAudioImporterTest surround616.wav "/surround616.wav") - - emscripten_embed_file(WavAudioImporterTest unsupportedChannelCount.wav "/unsupportedChannelCount.wav") - emscripten_embed_file(WavAudioImporterTest unsupportedFormat.wav "/unsupportedFormat.wav") - emscripten_embed_file(WavAudioImporterTest wrongSignature.wav "/wrongSignature.wav") endif() diff --git a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp index b7e5102b2..c230ea135 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp +++ b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp @@ -45,6 +45,10 @@ class WavImporterTest: public TestSuite::Tester { void wrongSignature(); void unsupportedFormat(); void unsupportedChannelCount(); + void invalidPadding(); + void invalidLength(); + void invalidDataChunk(); + void invalidFactChunk(); void mono8(); void mono8junk(); @@ -55,7 +59,9 @@ class WavImporterTest: public TestSuite::Tester { void stereo8(); void stereo8ALaw(); void stereo8MuLaw(); + void stereo12(); void stereo16(); + void stereo24(); void mono32f(); void stereo32f(); @@ -71,6 +77,10 @@ WavImporterTest::WavImporterTest() { &WavImporterTest::wrongSignature, &WavImporterTest::unsupportedFormat, &WavImporterTest::unsupportedChannelCount, + &WavImporterTest::invalidPadding, + &WavImporterTest::invalidLength, + &WavImporterTest::invalidDataChunk, + &WavImporterTest::invalidFactChunk, &WavImporterTest::mono8, &WavImporterTest::mono8junk, @@ -81,7 +91,9 @@ WavImporterTest::WavImporterTest() { &WavImporterTest::stereo8, &WavImporterTest::stereo8ALaw, &WavImporterTest::stereo8MuLaw, + &WavImporterTest::stereo12, &WavImporterTest::stereo16, + &WavImporterTest::stereo24, &WavImporterTest::mono32f, &WavImporterTest::stereo32f, @@ -127,6 +139,41 @@ void WavImporterTest::unsupportedChannelCount() { CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported channel count 6 with 8 bits per sample\n"); } +void WavImporterTest::invalidPadding() { + std::ostringstream out; + Error redirectError{&out}; + + WavImporter importer; + CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidPadding.wav"))); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): the file has improper size, expected 66 but got 73\n"); +} + +void WavImporterTest::invalidLength() { + std::ostringstream out; + Error redirectError{&out}; + + WavImporter importer; + CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidLength.wav"))); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): the file has improper size, expected 160844 but got 80444\n"); +} + +void WavImporterTest::invalidDataChunk() { + std::ostringstream out; + Error redirectError{&out}; + + WavImporter importer; + CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidDataChunk.wav"))); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): the file contains no data chunk\n"); +} + +void WavImporterTest::invalidFactChunk() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "invalidFactChunk.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::Mono16); + CORRADE_COMPARE(importer.frequency(), 22050); +} + void WavImporterTest::mono8() { WavImporter importer; CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8.wav"))); @@ -197,6 +244,15 @@ void WavImporterTest::stereo8MuLaw() { CORRADE_COMPARE(importer.frequency(), 8000); } +void WavImporterTest::stereo12() { + std::ostringstream out; + Error redirectError{&out}; + + WavImporter importer; + + CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo12.wav"))); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported channel count 2 with 12 bits per sample\n"); +} void WavImporterTest::stereo16() { WavImporter importer; @@ -206,6 +262,16 @@ void WavImporterTest::stereo16() { CORRADE_COMPARE(importer.frequency(), 44100); } +void WavImporterTest::stereo24() { + std::ostringstream out; + Error redirectError{&out}; + + WavImporter importer; + + CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo24.wav"))); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported channel count 2 with 24 bits per sample\n"); +} + void WavImporterTest::mono32f() { WavImporter importer; CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono32f.wav"))); diff --git a/src/MagnumPlugins/WavAudioImporter/Test/invalidDataChunk.wav b/src/MagnumPlugins/WavAudioImporter/Test/invalidDataChunk.wav new file mode 100644 index 0000000000000000000000000000000000000000..13c98ead3594b04e96b5d96da6488ccfc5cc4e6b GIT binary patch literal 66 zcmWIYbaS&}U|#OOQTHQasj{yLD6Aa`4 literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/invalidFactChunk.wav b/src/MagnumPlugins/WavAudioImporter/Test/invalidFactChunk.wav new file mode 100644 index 0000000000000000000000000000000000000000..1b2f7bf1a06ef1abdbb29729f9128a6f98abd86f GIT binary patch literal 5824 zcmeHLd2kfhnSb3gx<({OOZ4n`l-~HHqo42+HXA?p=9A%FYa_??Jcru%4 zE$uC@+(L*q0Z}n-Oq)rd0w?*Dj7X-PZRguX;W3kzFBF zyOmnGR7;!m#z=!8>y6qnrBs`%=Y;(hSl6s`Fsu&Cy-tU5-0KuO)T5z8#$M+`@sEb{ zp|MvyY<&b>YM(l+j(At(31iykglr}|JkKtUlu4D5rFM0=PN|PH(0W?$*6KC1N~)x# zcCjQXg^^i8w#^yS@`QO+9kI@d{l+QtMCh38SO>j*H>DbT&HbT6o+EZZmw8$qG|n3z z8#m;H>kH?)1(GP0NR@gGTC_5JyK)Ep!eKXuSI~N)+OE(S>4H96&yjpyLXE;$=(2I% z9CG@hPwowMqdi^F73xM!PKVBVgQAzV&53Iyl1cNFLS?>NqA!jt4c7^>(j+v8Z)Z~3 zkZ!Y^74&SlF0xdpK&?c#zzw)4$4glV!=bZIkJo8^Bs-x)>H%+`u~**b?XwOVHXJpM zhq~21bI7|Or+lgNESf@*P)tkRN}*b*7v%5?r75zKHYrWga(t^3s`bU;pfW#ltCAP? ztJI3AW8MXG2>L?Z4o1(gKb6Bg=p0V_(Cak@L@#t1;~fJ^GiV-*7_&;iXxS)5Xtta6 z)poPcOq<;0X}?J&%x^-rMj&cll`j|rPLJ5(9F}K9DxD|he&?{*5$YEE9nbh!p70V% zMmRS-M-uf#kun#vLa&i(!*y=0TWeQGmP(kD`XXk9kZ)(}yqqv6y(``YZxCb9EqB6E z=digy&0F3F2k`BP+-aQh24N(0-HA(>2eeRIsFgGQ1zB3Ipof$uTUP3|W%^>bM469q z%TqE`3Q^oKDqnzMr(f-JdZ5eeG>(fMXi10MiP_gJ_lo^k1taEFb5f;|Od($vT+A@3 zR+E$_ZI!-SXvRB6IlM$EMZXo;*%qi#rm;C>opE}sljaFFSRTo}&}R(5uyNkH7#Vv^3Dv6N=QVFZP@RG<3nT&WL6~8OE}}| zh|`ZYAAtjDe(C|kHjc}^);Y8|9?8^aGfTruv}G*f;W`PU&TxS75sJg}5TOca9wG z8k#b0cvl#rIQ??3+Qllta|~NOic#({1~3v67=wH|->pP!TB)z5ceq%)wyf7^<#fJO zz_Q$mu}twUSm)4RXU)@24|?sSbu!fL^@h$`=d4S{4WMp77ig(e>n=}Yk9!-|jf^;3 zqRo{87MPP*0hkvIU(C~9FB{M&_Tv|#KXmOzCPRaLDU +gwL z<2mLLr^7l4h}tk>T@yd4p2z~NT&Z$vvDUF_P?Ji`Bg`0;iWpyGz&IsiKd?SBj;n~l z-k^$=XH19v7`GzqEsM2fv|f|2pGZnQ=1Hk8L}uBXH-TOn5PQ;yhgjhl#}NSstxNKR z1yTSj9`|CF;?D32TaGkf&Q^ry3Hcbus5pvNo?>0dussKks@Q8p&%7$el?)+2JP(nt zO0P-x7VI-i^hKnSqTZ)I% z*oW~Q72}vkb0cM_8zQQ5hrU`{h1ynW3$g$3Y?q2!BKBh?h7OrWu*wIqvrS`f60tVw z+~pF>rc_?KCA5%cKonzk#_LSuA;Vcjth1rZp(!C-7ch70X;ZrYMOI>WU+jufz?ep! z1JETqaKPBB9uN;BqV^%aO)439N+_|b1(_il4oRq%N)(i1#SjSwG2@S!N3aS%@;a?E z#(8nv0wvECBW2jf5wirDVyxNuK?;~j>za&S5PPs%J3`0QF3j^`2W!^#AvTF_2}7iG z-Q!6lg>Gup_}KBpeypc%%!*#t+0Cn=Dal9kSY{}t*w+`c4yP@|4wcLBkaZr0vSvPyeheNJ9!n(1SI%`M;b`e^?0MTq-%;u*rc zh`sJS=GZ89;1nwBIod5)*SG`worovn}-B4*)wElcMy5;5b3 zbq!BsILxaUmx<7nnY1}21J8NbDcC?+xZ3quU`(q~XB@_`o8W*kaon5~<0{p8np%&& zAdli|I~(`&Ds|!*w;PDlW7ajqfE#SJnG}$_knIMPJhooRL+g>dM!W>do^-}qJY6Pu%};yKAz$k%*z znGa;Q2DSy3FZ^hn^|6|gGzu~w08?(-2 zt;(s(DbM+jtUEJB|2Ve*qKOmnC#U{Bb}`x?eJOTs>iRTK3rHEi-2ZyU&$Hgl+K_!I zvnjLK|1SR~d5yl1XpQGiwZyi>o{7m*Z^Y*$R?x@Dw|LLz&-`6xd)B_p1DQ`|yyO2N z{{ne}#uBeim&dnEg{BJP@5kpQo=qO7{iK;+=l|IMgN&ClUdZ^JAAGOzLGC}{etI_1 zKK=Xn@8ciDpPQ~roKI|^d!Uy4H~ueug1^i^=wIo7&DY4k%r%f6`t9V&L|tNaVqM~q z#H{4EX%qZ}G2>GzU@iB*ZU2|oEjawokD-XUALYW^bs7Own_FVmOj z`)htTcRvZkIfRzKOFonQW^xe~=!f(vI7GH{B0r1&Fa8(&kNH9FBsY(n&3%RZ2-nuo zXOkZ!+LKju86Bi1JWR5=XL+0JM7xnYd(# zyvBWxTfx`z75vw^uW`G`56LMw3i*(Mp1TtvZit?yFTr;}B6Vbt4B#9l=gB29M(!mK zkT+mA_}~_p2Nh5U&2TRel0)_phkTd&C+_>)D>!;c7g zkm7qc@>&5BT3>^s78>yFHn<0pkbxG@CyPlvX-@I}3F@^Q-a-8$c;Aioyn#Glhku49 z^lc?sl=4wFa!ta0a5vluwY^&##z4Pf=4VX6Sp99-E$y;Tyr{ z3>h=&u{8hK7t+}_#ys`7$>6j7{|9<{dy2(p8qVC0rZMxFh(D$S6YvTBCV57DkpAiQ zg>=Rsea#@x*bfj(t%$`w6OKPV(=YWghSyB$AJRWhV{f0||NlZ~J+mD3V6E`+)@@qb zb594GR|LP(-nPB9CAgvOnQdBd!=`V9wuT6KVEu-Tuj9J)53PH6{n`gNuEXCCwmcuK z463b9eZ6f*XjVXOSQUJ{F4)-6{*7Sy$_8mx;GxiS!LPRM*isXG=&M1gp@Dtd+VcF4 zwkOwYZ`s!Rt-4KZTgm#h4?nU1xk=3^`@z;tJKCOZ+uR;p+qPqS+m4p@*0yaZb;CUh Z{)3u)qT1RWt?jLwTAm7SKvjd}e*pn|YEA$E literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/invalidLength.wav b/src/MagnumPlugins/WavAudioImporter/Test/invalidLength.wav new file mode 100644 index 0000000000000000000000000000000000000000..5c864de6972b5d143599abaa03d5b10955cce6cc GIT binary patch literal 80444 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

Hm?OW$9IB~A?C2zhTBVKQftQOeb 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 Mi#OOQTHQaskD&?z0PhD7ssI20 literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/stereo12.wav b/src/MagnumPlugins/WavAudioImporter/Test/stereo12.wav new file mode 100644 index 0000000000000000000000000000000000000000..755f6db2737cc1f1c2dd7dc2fa7cd7f7297efc9d GIT binary patch literal 94204 zcmYIQ1(*~^)2<%d-E-XC-5r7kcY*~1!AXL^7`h zdffBBf6jHAolh1UxI?nQ%lTarQtK-Nd@0%&O>#WpGru*71dh>SsPX<2&!1*&P~upvk%JQ2D>7ooAfg z(7;U^79_YS2FXC0n7 zJL5>Dvs!0V+J| zR^{;9kx)l>9o=w7Qz#POJN)}%g%r#gg%!Cl#}{rm{14*w#lB(LpQ&-i4T1v!yn>+F z(GG``U-s8oiLG3e9sPCQJL?a9mThOP zf->OcSlmxoofl6eK}sAcb@tz(AObW;;zpZ$){AEE@8ZXY?Y2!3a#|2 z)B?QvDx^^Qw)|hg|P8>XHDOK4~=ER%lGLO8FI)7J%mV9_I4_i?<|N+%!4B zy+g^|DZ=6!ZiU`JjvGmX+S`I&fZvBhf_4TJ8Uo=P>k9L9mqy>YV(A`a_KoG^GIoG_ zNu3tr`e`k|yEKz?V9muuh}*zS9F-ZUTqq6M;LUK%z1T?MvRW!{x5GR&e@dEbq zE0Kk=Q3}5Z6Kya}UTP=v79}l3=#jLO64@i)a=^5?4P>^r>g6cSLwgLJM(U4vk79F6 znVo8eaV-=}hr=#Nb)|8roqsJhjxf>*ac}VXQRvXfjfX#MHLr~(R8Y-q(EOD zb6TuF;s1!r7@y<|Hl%dD)j>@sN~6p7AM?x~A5qUo98Kh>QFSG$B@v zq}F;I{cB~WmZ@H@?R~`sIfh;sZhEVyp;2}W%{Ki!hVqdGjeBc8=MQEgUj^O8T^UI; z9&lJW$1Px+_FH8kk3^&N1l|@w)Z0^=maA!KzWAHx+I8rhzXBahF?m($OYUpM^F}o* z{idh#3~f6PhvjK2YtlZt%O&X&$5AW#Qzr9O^D)mp#Ir(mX;=6?XQtcyRctiP z$&VKpt9mE7Z5qArTL0~wUap73UC*hm2$Z=l9KHnpD*-*o5a+l|9t7FTf#w} znvlSglJZgO)U>oT{DAW)dFX<$xU*vqe80WJ+OT# z);9i|^3xuXfwn{5Z`$d|uauz`u2R%dKg|7%7>af!^J{pEmS%4H+FHlksU`JLZm@2> z;B~=R+Ut*^e$d}8{EDxt&1i)2ANHpRB`7QTv6_Ke!gFlJUJBWSj+jTd3S>TWTATA1 zHhEc&L>8Q#o+gx}3m;vSF7Y0hN`B4v{FUjXJjrv#d#)?m(=XZso(U^g0CxBee8w+f zH=R-b;%h6uc7{ zD4M2nJlBQ%e8j#?4o6VA;8NZlXhJ#Q>f5W2d9qfJZfGeSp_ib}>RW!HUgY;yO=@aA z;CRfLRmnirGKBeF{z5c6>orz62i?S8w znxAvL-=NLDT=XD(nB$b1ltE44SN3bpYSpJge2v#CIcTy-WF5Zk7s^6DBO{%Uc*oNs zfi(0aJ{nF-(jQ>m48x|Sqwyjy&6gT^!zcJL9pq277Yk_Yy=sJAxN`EY=beXKx(KfUA$UXvS!us8gk z8>=npg7SnT6@`}CZaVHY=%n8RA9aaOinKI9c&Hov+g|G-mlIX!g)n&|^gfz$kW`Ow z)2KSsB*w=Z^mtxuW~NiVPy9akiSNjCln;6}9KO4(m5cI+&a*F6fOcVyC{c{kYqz

*pAJ~I@Rjjl&W(?|U_2doHs2*R1 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

l7p<~&XtxOGYNv95@tsu9Yd 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 CP*6Dl literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/stereo24.wav b/src/MagnumPlugins/WavAudioImporter/Test/stereo24.wav new file mode 100644 index 0000000000000000000000000000000000000000..d3493cb4e88c0924449389ae476e5bb954303ad0 GIT binary patch literal 141168 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 z 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 Date: Mon, 3 Oct 2016 11:27:57 +0200 Subject: [PATCH 206/290] package/debian: update copyright year. --- package/debian/copyright | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/debian/copyright b/package/debian/copyright index e96081e1a..6abe3e562 100644 --- a/package/debian/copyright +++ b/package/debian/copyright @@ -4,7 +4,7 @@ Upstream-Contact: Vladimír Vondruš Source: https://github.com/mosra/magnum Files: * -Copyright: 2010-2015 Vladimír Vondruš +Copyright: 2010-2016 Vladimír Vondruš License: Expat Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), From 7c38cee802a70e4c4b4671f9cf19060c2ef2a790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 3 Oct 2016 11:28:23 +0200 Subject: [PATCH 207/290] package/ci: update Emscripten Travis CI config to use newer OSX image. Otherwise Homebrew doesn't have precompiled packages and compiling all of Node.js and Emscripten takes eternity. --- package/ci/travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package/ci/travis.yml b/package/ci/travis.yml index 4bddc287e..3086360e6 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -24,10 +24,12 @@ matrix: - TARGET=ios-simulator - TARGET_GLES2=OFF - os: osx + osx_image: xcode7.3 env: - TARGET=emscripten - TARGET_GLES2=ON - os: osx + osx_image: xcode7.3 env: - TARGET=emscripten - TARGET_GLES2=OFF From b033af3b593f536397628c44c9ff3c6ce6ed3628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 3 Oct 2016 16:41:42 +0200 Subject: [PATCH 208/290] Math: ability to convert Color from/to external representation. --- src/Magnum/Math/Color.h | 20 +++++++++ src/Magnum/Math/Test/ColorTest.cpp | 69 +++++++++++++++++++++++++++++- 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Math/Color.h b/src/Magnum/Math/Color.h index 2d7094cec..6269587d0 100644 --- a/src/Magnum/Math/Color.h +++ b/src/Magnum/Math/Color.h @@ -294,6 +294,16 @@ template class Color3: public Vector3 { */ template constexpr explicit Color3(const Vector<3, U>& other) noexcept: Vector3(other) {} + /** @brief Construct color from external representation */ + template::from(std::declval())) + #else + decltype(Implementation::VectorConverter<3, T, U>()) + #endif + > + constexpr explicit Color3(const U& other): Vector3(Implementation::VectorConverter<3, T, U>::from(other)) {} + /** @brief Copy constructor */ constexpr /*implicit*/ Color3(const Vector<3, T>& other) noexcept: Vector3(other) {} @@ -504,6 +514,16 @@ class Color4: public Vector4 { */ template constexpr explicit Color4(const Vector<4, U>& other) noexcept: Vector4(other) {} + /** @brief Construct color from external representation */ + template::from(std::declval())) + #else + decltype(Implementation::VectorConverter<4, T, U>()) + #endif + > + constexpr explicit Color4(const U& other): Vector4(Implementation::VectorConverter<4, T, U>::from(other)) {} + /** @brief Copy constructor */ constexpr /*implicit*/ Color4(const Vector<4, T>& other) noexcept: Vector4(other) {} diff --git a/src/Magnum/Math/Test/ColorTest.cpp b/src/Magnum/Math/Test/ColorTest.cpp index 85fef7b08..105d32daa 100644 --- a/src/Magnum/Math/Test/ColorTest.cpp +++ b/src/Magnum/Math/Test/ColorTest.cpp @@ -29,7 +29,41 @@ #include "Magnum/Math/Color.h" -namespace Magnum { namespace Math { namespace Test { +struct Vec3 { + float x, y, z; +}; + +struct Vec4 { + float x, y, z, w; +}; + +namespace Magnum { namespace Math { + +namespace Implementation { + +template<> struct VectorConverter<3, float, Vec3> { + constexpr static Vector<3, Float> from(const Vec3& other) { + return {other.x, other.y, other.z}; + } + + constexpr static Vec3 to(const Vector<3, Float>& other) { + return {other[0], other[1], other[2]}; + } +}; + +template<> struct VectorConverter<4, float, Vec4> { + constexpr static Vector<4, Float> from(const Vec4& other) { + return {other.x, other.y, other.z, other.w}; + } + + constexpr static Vec4 to(const Vector<4, Float>& other) { + return {other[0], other[1], other[2], other[3]}; + } +}; + +} + +namespace Test { struct ColorTest: Corrade::TestSuite::Tester { explicit ColorTest(); @@ -42,6 +76,7 @@ struct ColorTest: Corrade::TestSuite::Tester { void constructConversion(); void constructNormalization(); void constructCopy(); + void convert(); void literals(); @@ -85,6 +120,7 @@ ColorTest::ColorTest() { &ColorTest::constructConversion, &ColorTest::constructNormalization, &ColorTest::constructCopy, + &ColorTest::convert, &ColorTest::literals, @@ -241,6 +277,37 @@ void ColorTest::constructCopy() { CORRADE_VERIFY(std::is_nothrow_copy_assignable::value); } +void ColorTest::convert() { + constexpr Vec3 a3{1.5f, 2.0f, -3.5f}; + constexpr Color3 b3{1.5f, 2.0f, -3.5f}; + + constexpr Color3 c3(a3); + CORRADE_COMPARE(c3, b3); + + constexpr Vec3 d3(b3); + CORRADE_COMPARE(d3.x, a3.x); + CORRADE_COMPARE(d3.y, a3.y); + CORRADE_COMPARE(d3.z, a3.z); + + constexpr Vec4 a4{1.5f, 2.0f, -3.5f, -0.5f}; + constexpr Color4 b4{1.5f, 2.0f, -3.5f, -0.5f}; + + constexpr Vector4 c4(a4); + CORRADE_COMPARE(c4, b4); + + constexpr Vec4 d4(b4); + CORRADE_COMPARE(d4.x, a4.x); + CORRADE_COMPARE(d4.y, a4.y); + CORRADE_COMPARE(d4.z, a4.z); + CORRADE_COMPARE(d4.w, a4.w); + + /* Implicit conversion is not allowed */ + CORRADE_VERIFY(!(std::is_convertible::value)); + CORRADE_VERIFY(!(std::is_convertible::value)); + CORRADE_VERIFY(!(std::is_convertible::value)); + CORRADE_VERIFY(!(std::is_convertible::value)); +} + void ColorTest::literals() { using namespace Literals; From 921a11564d59699948d9c1f42ea8e95a31277fde Mon Sep 17 00:00:00 2001 From: Alice Date: Thu, 29 Sep 2016 19:19:57 -0400 Subject: [PATCH 209/290] WavAudioImporter: improve tests. --- .../WavAudioImporter/Test/CMakeLists.txt | 11 +- .../WavAudioImporter/Test/WavImporterTest.cpp | 116 ++++++++++++++++-- .../WavAudioImporter/Test/mono24.wav | Bin 0 -> 2816 bytes .../WavAudioImporter/Test/mono4.wav | Bin 0 -> 702 bytes .../WavAudioImporter/Test/stereo32.wav | Bin 0 -> 188154 bytes .../WavAudioImporter/Test/stereo4.wav | Bin 0 -> 2900 bytes ...urround616.wav => surround51Channel16.wav} | Bin .../Test/surround71Channel24.wav | Bin 0 -> 9273320 bytes .../WavAudioImporter/WavHeader.h | 2 + .../WavAudioImporter/WavImporter.cpp | 8 +- 10 files changed, 122 insertions(+), 15 deletions(-) create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/mono24.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/mono4.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/stereo32.wav create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/stereo4.wav rename src/MagnumPlugins/WavAudioImporter/Test/{surround616.wav => surround51Channel16.wav} (100%) create mode 100644 src/MagnumPlugins/WavAudioImporter/Test/surround71Channel24.wav diff --git a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt index c82d8b765..120c07dae 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt @@ -53,23 +53,26 @@ if(CORRADE_TARGET_EMSCRIPTEN) emscripten_embed_file(WavAudioImporterTest invalidFactChunk.wav "/invalidFactChunk.wav") emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8.wav") - emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8junk.wav") - + emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8.wav") + emscripten_embed_file(WavAudioImporterTest mono8junk.wav "/mono8junk.wav") emscripten_embed_file(WavAudioImporterTest mono8ALaw.wav "/mono8ALaw.wav") emscripten_embed_file(WavAudioImporterTest mono8MuLaw.wav "/mono8MuLaw.wav") emscripten_embed_file(WavAudioImporterTest mono16.wav "/mono16.wav") + emscripten_embed_file(WavAudioImporterTest mono24.wav "/mono24.wav") + emscripten_embed_file(WavAudioImporterTest stereo4.wav "/stereo4.wav") emscripten_embed_file(WavAudioImporterTest stereo8.wav "/stereo8.wav") emscripten_embed_file(WavAudioImporterTest stereo8ALaw.wav "/stereo8ALaw.wav") emscripten_embed_file(WavAudioImporterTest stereo8MuLaw.wav "/stereo8MuLaw.wav") emscripten_embed_file(WavAudioImporterTest stereo12.wav "/stereo12.wav") emscripten_embed_file(WavAudioImporterTest stereo16.wav "/stereo16.wav") emscripten_embed_file(WavAudioImporterTest stereo24.wav "/stereo24.wav") + emscripten_embed_file(WavAudioImporterTest stereo32.wav "/stereo32.wav") emscripten_embed_file(WavAudioImporterTest mono32f.wav "/mono32f.wav") emscripten_embed_file(WavAudioImporterTest stereo32f.wav "/stereo32f.wav") - emscripten_embed_file(WavAudioImporterTest stereo64f.wav "/stereo64f.wav") - emscripten_embed_file(WavAudioImporterTest surround616.wav "/surround616.wav") + emscripten_embed_file(WavAudioImporterTest surround51Channel16.wav "/surround51Channel16.wav") + emscripten_embed_file(WavAudioImporterTest surround71Channel24.wav "/surround71Channel24.wav") endif() diff --git a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp index c230ea135..12fc34f8c 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp +++ b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp @@ -45,29 +45,34 @@ class WavImporterTest: public TestSuite::Tester { void wrongSignature(); void unsupportedFormat(); void unsupportedChannelCount(); + void invalidPadding(); void invalidLength(); void invalidDataChunk(); void invalidFactChunk(); + void mono4(); void mono8(); void mono8junk(); void mono8ALaw(); void mono8MuLaw(); void mono16(); + void stereo4(); void stereo8(); void stereo8ALaw(); void stereo8MuLaw(); void stereo12(); void stereo16(); void stereo24(); + void stereo32(); void mono32f(); void stereo32f(); void stereo64f(); - void surround616(); + void surround51Channel16(); + void surround71Channel24(); void debugAudioFormat(); }; @@ -77,28 +82,34 @@ WavImporterTest::WavImporterTest() { &WavImporterTest::wrongSignature, &WavImporterTest::unsupportedFormat, &WavImporterTest::unsupportedChannelCount, + &WavImporterTest::invalidPadding, &WavImporterTest::invalidLength, &WavImporterTest::invalidDataChunk, &WavImporterTest::invalidFactChunk, + &WavImporterTest::mono4, &WavImporterTest::mono8, &WavImporterTest::mono8junk, &WavImporterTest::mono8ALaw, &WavImporterTest::mono8MuLaw, &WavImporterTest::mono16, + &WavImporterTest::stereo4, &WavImporterTest::stereo8, &WavImporterTest::stereo8ALaw, &WavImporterTest::stereo8MuLaw, &WavImporterTest::stereo12, &WavImporterTest::stereo16, &WavImporterTest::stereo24, + &WavImporterTest::stereo32, &WavImporterTest::mono32f, &WavImporterTest::stereo32f, &WavImporterTest::stereo64f, - &WavImporterTest::surround616, + + &WavImporterTest::surround51Channel16, + &WavImporterTest::surround71Channel24, &WavImporterTest::debugAudioFormat}); } @@ -136,7 +147,7 @@ void WavImporterTest::unsupportedChannelCount() { WavImporter importer; CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "unsupportedChannelCount.wav"))); - CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported channel count 6 with 8 bits per sample\n"); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): PCM with unsupported channel count 6 with 8 bits per sample\n"); } void WavImporterTest::invalidPadding() { @@ -172,6 +183,19 @@ void WavImporterTest::invalidFactChunk() { CORRADE_COMPARE(importer.format(), Buffer::Format::Mono16); CORRADE_COMPARE(importer.frequency(), 22050); + + CORRADE_COMPARE_AS(importer.data().prefix(8), + Containers::Array::from(-27, -11, -1, -9, 24, -6, 127, -5).prefix(8), + TestSuite::Compare::Container); +} + +void WavImporterTest::mono4() { + std::ostringstream out; + Error redirectError{&out}; + + WavImporter importer; + CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono4.wav"))); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat(0x2)\n"); } void WavImporterTest::mono8() { @@ -180,6 +204,10 @@ void WavImporterTest::mono8() { CORRADE_COMPARE(importer.format(), Buffer::Format::Mono8); CORRADE_COMPARE(importer.frequency(), 22050); + + CORRADE_COMPARE_AS(importer.data().prefix(4), + Containers::Array::from(127, 127, 127, 127).prefix(4), + TestSuite::Compare::Container); } void WavImporterTest::mono8junk() { @@ -188,6 +216,10 @@ void WavImporterTest::mono8junk() { CORRADE_COMPARE(importer.format(), Buffer::Format::Mono8); CORRADE_COMPARE(importer.frequency(), 22050); + + CORRADE_COMPARE_AS(importer.data().prefix(4), + Containers::Array::from(127, 127, 127, 127).prefix(4), + TestSuite::Compare::Container); } void WavImporterTest::mono8ALaw() { @@ -196,6 +228,10 @@ void WavImporterTest::mono8ALaw() { CORRADE_COMPARE(importer.format(), Buffer::Format::MonoALaw); CORRADE_COMPARE(importer.frequency(), 8000); + + CORRADE_COMPARE_AS(importer.data().prefix(8), + Containers::Array::from(87, 84, 85, 85, 85, -43, -43, -43).prefix(8), + TestSuite::Compare::Container); } void WavImporterTest::mono8MuLaw() { @@ -204,6 +240,10 @@ void WavImporterTest::mono8MuLaw() { CORRADE_COMPARE(importer.format(), Buffer::Format::MonoMuLaw); CORRADE_COMPARE(importer.frequency(), 8000); + + CORRADE_COMPARE_AS(importer.data().prefix(8), + Containers::Array::from(-5, -3, -1, -2, -1, 127, 127, 126).prefix(8), + TestSuite::Compare::Container); } void WavImporterTest::mono16() { @@ -212,17 +252,28 @@ void WavImporterTest::mono16() { CORRADE_COMPARE(importer.format(), Buffer::Format::Mono16); CORRADE_COMPARE(importer.frequency(), 44000); + CORRADE_COMPARE_AS(importer.data(), Containers::Array::from('\x1d', '\x10', '\x71', '\xc5'), TestSuite::Compare::Container); } +void WavImporterTest::stereo4() { + std::ostringstream out; + Error redirectError{&out}; + + WavImporter importer; + CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo4.wav"))); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat(0x2)\n"); +} + void WavImporterTest::stereo8() { WavImporter importer; CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo8.wav"))); CORRADE_COMPARE(importer.format(), Buffer::Format::Stereo8); CORRADE_COMPARE(importer.frequency(), 96000); + CORRADE_COMPARE_AS(importer.data(), Containers::Array::from('\xde', '\xfe', '\xca', '\x7e'), TestSuite::Compare::Container); @@ -234,6 +285,10 @@ void WavImporterTest::stereo8ALaw() { CORRADE_COMPARE(importer.format(), Buffer::Format::StereoALaw); CORRADE_COMPARE(importer.frequency(), 8000); + + CORRADE_COMPARE_AS(importer.data().prefix(8), + Containers::Array::from(-43, -43, -43, -43, -43, -43, 85, -43).prefix(8), + TestSuite::Compare::Container); } void WavImporterTest::stereo8MuLaw() { @@ -242,6 +297,10 @@ void WavImporterTest::stereo8MuLaw() { CORRADE_COMPARE(importer.format(), Buffer::Format::StereoMuLaw); CORRADE_COMPARE(importer.frequency(), 8000); + + CORRADE_COMPARE_AS(importer.data().prefix(8), + Containers::Array::from(-1, -1, -1, -1, -1, -1, 127, -1).prefix(8), + TestSuite::Compare::Container); } void WavImporterTest::stereo12() { @@ -251,7 +310,7 @@ void WavImporterTest::stereo12() { WavImporter importer; CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo12.wav"))); - CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported channel count 2 with 12 bits per sample\n"); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): PCM with unsupported channel count 2 with 12 bits per sample\n"); } void WavImporterTest::stereo16() { @@ -260,6 +319,10 @@ void WavImporterTest::stereo16() { CORRADE_COMPARE(importer.format(), Buffer::Format::Stereo16); CORRADE_COMPARE(importer.frequency(), 44100); + + CORRADE_COMPARE_AS(importer.data(), + Containers::Array::from(39, 79, 39, 79), + TestSuite::Compare::Container); } void WavImporterTest::stereo24() { @@ -269,7 +332,17 @@ void WavImporterTest::stereo24() { WavImporter importer; CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo24.wav"))); - CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported channel count 2 with 24 bits per sample\n"); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): PCM with unsupported channel count 2 with 24 bits per sample\n"); +} + +void WavImporterTest::stereo32() { + std::ostringstream out; + Error redirectError{&out}; + + WavImporter importer; + + CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo32.wav"))); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): PCM with unsupported channel count 2 with 32 bits per sample\n"); } void WavImporterTest::mono32f() { @@ -278,6 +351,10 @@ void WavImporterTest::mono32f() { CORRADE_COMPARE(importer.format(), Buffer::Format::MonoFloat); CORRADE_COMPARE(importer.frequency(), 48000); + + CORRADE_COMPARE_AS(importer.data().prefix(16), + Containers::Array::from(0, 0, 0, 0, 108, 57, -103, 59, 3, 63, 42, 60, -33, -81, -120, 60).prefix(16), + TestSuite::Compare::Container); } void WavImporterTest::stereo32f() { @@ -286,6 +363,10 @@ void WavImporterTest::stereo32f() { CORRADE_COMPARE(importer.format(), Buffer::Format::StereoFloat); CORRADE_COMPARE(importer.frequency(), 44100); + + CORRADE_COMPARE_AS(importer.data().prefix(8), + Containers::Array::from(17, -77, -103, 56, 5, 50, 72, 56).prefix(8), + TestSuite::Compare::Container); } void WavImporterTest::stereo64f() { @@ -294,15 +375,36 @@ void WavImporterTest::stereo64f() { CORRADE_COMPARE(importer.format(), Buffer::Format::StereoDouble); CORRADE_COMPARE(importer.frequency(), 8000); + + CORRADE_COMPARE_AS(importer.data().prefix(64), + Containers::Array::from(0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0, 16, 63, + 0, 0, 0, 0, 0, 0, 24, -65, + 0, 0, 0, 0, 0, 0, 0, 0).prefix(64), + TestSuite::Compare::Container); +} + +void WavImporterTest::surround51Channel16() { + std::ostringstream out; + Error redirectError{&out}; + + WavImporter importer; + + CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "surround51Channel16.wav"))); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::Extensible\n"); } -void WavImporterTest::surround616() { +void WavImporterTest::surround71Channel24() { std::ostringstream out; Error redirectError{&out}; WavImporter importer; - CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "surround616.wav"))); + CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "surround71Channel24.wav"))); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::Extensible\n"); } diff --git a/src/MagnumPlugins/WavAudioImporter/Test/mono24.wav b/src/MagnumPlugins/WavAudioImporter/Test/mono24.wav new file mode 100644 index 0000000000000000000000000000000000000000..5d733ec46954aaf87046fec9f885943a3a26e847 GIT binary patch literal 2816 zcmWlbc{r8%8;76o`<^9xB)hbz%(O63Bcim}vJ}FpM3iKvEK_Mp+6$p6(ndpNom4Xk zO{196VnmXXL_bA06z!c6`|X9Odbya!T1INyIOZDZ(>^xi$==2RP+-D9OY-9$dc#DXbtS z8R!!NzZ3FvCrMP$4YhQQJEok*v@3XEm``xTEuCm!gEk_jsF!h00uLz&KElWVzdo3I z8^9|yP%RTUeTJ?0qOjr>vo)~V-Jb5ht_oA%lsx0`Dyt#{TG0f?7eL2Ikak@V8Ne#Lk`_nBByVX|l(clFw6s`i<05~(RQ{lI zG_hsu`=?_oBD(eubc9=eaklIa34yA6(j{F3qgN-eZ!CJ8v~pi{Tdt;mSQsuzm>pPa z;Coo_vcRd-%r5DswtT)iF@=~dZKjzGkDj)uylRJCU8n6n26vF-Yc-a5N?kwoT@rI5 zM}2wY%(`Yg658t4A#iTeF1p_4=5l}Ky!Q?6YK}$1jLL!56rGh7b_?9UO$}Asw?o^; zLpkH@=rRi`p`Yij>`Y4-v0pXhKSU=kCqLwYsPxFcJFN;S-ntjekn;;5!L6bmX&Jc-Pg^p)0TxP9honVR~D8k5u-=) zt)IUf7xmoE9G>>P=i+zWT_y7MmO_u|yys5-^mOH&yVd_{6nO83JVR0A|F~IIL#O7l zJ;vkK9)Zi*76P0s4BZx@?wed93EgW9-(&qZ4DKlM5C8_qb|z zenu9XuPw~zR#;jL*);XfxH{S?5KS#qt#MVc_E8&4Q@WSTyfop;Ol8g1^5Wi+pNj{A zevoR{E8cYQQJG-z4f`fjNvx+F48rAfoKCJ%*e*2NGj=jX>LHZgYM0u-ldiIp7i)75 z8W3KKU9O1h^w^Eo!p>~rYCq_p{Qbpv@+^&;%OCCK)Am8JlHh5C=unB6e>E;ATzoV` z@HP(2UMNfo6t-#n$s^o0F*mcEfAKvSE+HqA!94?}T0-7hI`JsoHOj9OaPfQT+b}Y+ z2u?U+i4=UZSuJm2SD5h7pkRXz+o(@sI`NSub<^jLZ&s`_=DNN3)!t}&g^7M9kmRzQ z35i+)NBkgTgs%}RJeP2(3DjJhR$7R`#>T-t3ffOyhQ98VUh-ae){0Z{>}x z>E=Rin>P)aPuA`sDL;{e_N43p(^Aha$|f>Hh|U2s8?dUSvybvtx2S9xiA^E@m_k`L zI;3F#?^G?Hx0u8C@8xO}xU0wbE&5bDfNqyiTR9)LlLl?V>VBN#1X0a+CyyGX^RX#> z$yBQTimL0vg;#Lio~#RG40kf&&xvy{`MHH~E+kQpybC0$56JCOk}M{hD&Y7{&WSlW3j~ zHC;s;s`>aHp7p1Ck#zG-YF0*l{n7qM5FG=@5U{-sxAuYBHaNW*lEvWG`}L0Xw@}j- zs%C@27vrVWWChx7!*oYDzVm_;p%PiZ|}y301sNj!Bu276HLk z=vRP>X`tx_*%P2`0;Cr~kOfgSBEOVE@Hx1lLktrMKb3sRgRw!_B_#F>K&v04tUAi)t$&cpeW7&EV+DbGXN&QX8-2gGY zc+DOC+UcWa8vK#&m(o4%xK#yCmcy|>z;7w6HGv1Sp?N-Ra|X#YIPnlW0t;~C?tdf*h6m@ z-cG@V5=@zol`K|&gSwHpED^uDIpPZ9^PrUirTze3z;A+-#bELp?c;F739Uw{cM*MD zOPT5DwgJtm@EXQ58v&^opaH^5}zAlZv)-; zoW74l$y9LJ24#V8(+2uAz`hctS*V|j>Lr-13?3ZHafr5yKaz@%AFCjsq1SZWK8 z33TP7WHV~n;Xgj8RfIVPaIY2O{YkM2ng0nyfBr|lTnI0%pw|%wH$cKN=#$}s9K0Qd iG2s}Mh;3Q_C2I|jP391z1u9wCFTtWfWG`V?8~z^(a+P)f literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/mono4.wav b/src/MagnumPlugins/WavAudioImporter/Test/mono4.wav new file mode 100644 index 0000000000000000000000000000000000000000..c7577a9e78c24c981f383f3f0f42080926ffec46 GIT binary patch literal 702 zcmX|8-%C?r7=F)pjvKP=oNsf>pxnOg)GR8`+%D>>ZLAiH%xy~E#imXj80s8>7li~t z1f_pLKL~h-dFc3D|&{rY4L{jl{G^Y2UgmxFMauN z3Fk@vgqdfgZ`Soo$iVO$wjVv5dV5E;R+3&zrEt?B$c+Du94)WJs9*wVHk=iA>>X8O zd9%0T5-8>yZC&$>=^QfYMd9#Cx-1Xsso0QRm`9@i=`kT=Bt_PJz(DT{R?4ts8Ts_G zQ^<*AmG$k=IG;alE$+qYG{Wbdux7zE#$A@99a*!q%(;qkC*(M+G_Sxj(ffAKbpRrt zF?p9aB09m07m=$*J%(Hh`Ils|Rn{X0rPHP`F$1+g0mbx!hcB>GYND{nk*pl$3#ttf zJ+)XXY60kMR?K(}1-3vVG)%7CuHPVQZAH$wgB*s8*_K8AH4y7Xr}VWnsn9T$?IgoW ztj_3~17m}k0y&_$4{h3qt@GZT;eiAH;=aR;P+$Lb^+}Z2kgURs(8A>JM u>BKM@oFUgH#)k*ucN1OYKP5vGlQXI0=vbPZ37jQ?u~c%J1XA(jDEtLTcKNda literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/stereo32.wav b/src/MagnumPlugins/WavAudioImporter/Test/stereo32.wav new file mode 100644 index 0000000000000000000000000000000000000000..009dc66fb532a0f7ef1307cc38553c114b690328 GIT binary patch literal 188154 zcmZUc1=!Tp^S76f5)|p~20^-{Q$gvHZUY1)q)WO(y1S7M=|)LKT9AxkjB<^MsV?IdN$Ti14$D^}b%5YU*_MUdTSqznE8jkpXB}nwv7LFg^yK8(sxFZ&C(7sLH)+e^s$Vf`(S0m;V({ltXSQyao|gzZ#U zZB*BAxib7HUw!@9hiTFJ)=_4-+`8ubG0*)CghSB7I^f41>sxqbSvy?uu9fAhk&n`inN?etT)eON}gFYATv zHXWWD)^i-}Lw&3t_K|6IQ@&-^vA+HIG5>%4Yub}C;TxlEXzD?Hcy$REz=+2 zenj)tRkTbS!u{CRw4}~{%u{bawz0nL!uer+!n}2@qfPb~)=zo1*Z#1*^6DztKKwC1 z+*eo^=cBTmr(vDNaDQRh%Cax}wykn)XWg)_+OG}P^`i{i`w9ETy2`MfALWE)Sl=?o zBm4=EaX9v@udeDK%G<`a_N#m;Y-bp)AJ*IctgB4h+lTGNuq|PkqB6qcEg!BE_L;nG z{U}#ilI^rR?2oW6mMJe>k7UpXmaC((UPMq>59L_jk2;4@IeskDF3aps8I~zCoM)Y| zAIw*8<%h?{_%Y9zu>5~zhjq1mIBgy0P`E$anitkZ*_MYt>S15{-8Q0pSY{ZlAC{#K zrqxZ^evFUs*lDxI`J#I27eC?pVI6G~ zmK7cY{cqYjVIA$;dio@cj-v`_o+qwcnO4q8vUB+J9Tw2l2MS3Q;MN3@Qp?qRf^GX0oV zu4G#&EK5Di|6lvelgtxsFDcu)#*q1xTQWTzO%Cs*81%qfbToupce=BZkTLew3ko%KTrutY@Ad^X=P@b#0@M zP5TM!74}oOj_tyE$_o2R9hIRDwiPAo>o0u~jz`P2-Uxv=Qa;LHo6x^{awGS!9@>fllNP{2StTz}xo$NL@~m zuO6G;gk(&68se+a#&InEDulUU^wZf0c~7_kls^Y4uQ{l^(=gie2lB-6$X8AZ+R1-H zxxN^RA@$Y3=TT5bb$DJLRN-v}^8j5_}%gpZ%wR#NiS4 zbVGmpxgDWL)(AURAYZv{A@x6wP{+P#gx(dfPrpZh9SA%Idr;pP*hU@g9uKe2&qv?{ z(!udUzH;-^sj>3#MM&>LFGF*uC3>jeZAdIZJ@xBI|N1Evs6NGzYyM00u-;(E{E{%r zosu#XgUWPq{1u@Qc* zLu2jSi~icR7`bBQN1^^(;aBHCeVk@~F$Pt6H%L48K0$x=u0ucSb(MVOZKR$23glY< zJ3HmmgK>2&83gKwhT!|)N%E9`gK;q~awAXsTOwb7jEiW$lSbyR1dWT7p#5d1Gsm%p zo$}dCJJ*Q3=lm1pUOmddYp*(< zhqTRpR}$Zq!R+W^eyRkaST33+q-Ucfp?))AukF{|3;FZA$02_VVV>%r#*9NLa0KIQ zzwhDa{nQ@}xhK4jvDT}OGRDuJ)I)TjD(%#%6zlmlFcb71`B(9u_TQww@!u7D%^!{) zj$?Py=^?}f$Ll8fSIEBuI!=co{G9`3-0Pwu?+p3>kiQ3X-*6tTML-_PT_62)rN4XR zFLjaS(~7~=t|{oR9>&%0l#fE6((rp&*Yktx@rQn&jy=woFOho*TtK^Il>dla=jjl} zV;R_)JmaJm{gwdNK!1>LtRDdNQ8j2Q<;LS7>~egDBCmjDpm8vaaVrDAlK8m|uTOsi zi!->!&B(N&e&?nL`DIFk9+4ge0y!vudn*(RQ{aE5T~fvY69d12CBQln{a=glr|Y18 zoR1yGPju48;Z)+txb1^Kv||$bDnBaqGJ=iicL({|5MCVKeG`=eg+M>YDBA$Vf#@Po z3jZ|*cf+rSsv*bm>WiF|zd3#~KKsLe1Yd^w>a`F(JR5#Tc}4P_ zKaTZc#=Ru`4oLr{2AvNT$xj0|$6p7?uLc%}ABf)9;Y)xi;GG-J{A|&r`0xRY~LWz!LOL4MxIl{jdo=Hc?iXwDu># zsqUW{vV_*z$tgqgI}&**D8I-!8O;oO7BU^rUFaveA2?4gQD1*9dKQY4GuUe!$EAJ=@)M%B^Y9vRdCje_SUv)1UMDEqb_KyhD6y ze_QgLXT6Y{4jhAAR1Z9*{x-_bGY;Buh;gx9X~;Ofiay3cMJgMICFq|n12aL_ukrM& zeie{s`DFTYzLmv3<*X&03yMRKY=S?WJhaZVN*mHM<_DpDCmZowih8B*u!m6ZXT~Ex ze24p?b4qW@Uz1;v_zKP&()RZ${&e2&L(dEF?}Gdbo{yaeTWE)>f$jK1JG_o^z21%= z^wYPX`AyN+cB>hWvy|s0zcBn&(0&&{bQO#d$LB4K_EaV)O2fPEx)06AAIALz{NQ}r zK^!=LZsS++1pPY>>5=O^>P%YsdFVGa=?vJn7ycQT5q>3lX-918X9p874z}~UU-^AN z{e1_gsL#*P=kQ(V{}IhiNR$zS#)B)=Z^=zp&paY0}>@{PYO=;^q%Z5N!Sg%%yWW>0&v~Uh{m~rC3Td~nrpW`6uZ`9AbY4gWj!oiBSC zf9*{}CG%t8Bz5Wr<^-oe=O{0XJoWj4cG}gCcBjD;7@ms!y2QVFEQZ-h{?jy}@fyka z7bO2n#^ELTZy5*YFQyCI6}4W9mC@ z6-vz=FW zm{i(5mHyRpFMd$3I`}m;`SXZ_^57Tft$nHJw-Z=}yb{ot)K3f!#1HB{hI)t$+U2^l zg!+!F`-J-V(uC)qD)8Dj4NOFN1;}`Ni5{+7F+lB}1G(R&Tzj;e1Sif8-0|EaUkP z>?%V3^?RZ5bbUBMekI6#Ar^Y6&)1Oq=Vj`i8a@}%nq#?Z)eG-6PM<^#Besnw!(%v}uoc!HjeDE{!M?iiWp}*(16a?dU z@NF1}Mewia$9=QkgOI+Ct=)^?llYf17q;Xm~*Nq_o3 zCXJn6zv2(auRZOZpT`+T$L|*QYF};iHNHLs3y{AMKe=Y@rk(oNXB^}g@SpSOC*sI) zEsFh~OK&n>hrmxk=Su_Hr3M|dlF$w0ZKQk{;~?*SVD;(?EhK*^e)GKg0cd>J2Awzi z@Q3km4SUv;KNrk(S5KI5{L{JBsD_<`g*UW?IJyEej?0lVUF z^%w-|$4mIjeLe@g^D_r}9R!ELXQX@t<;K5#FC~8zWLh8Sm$a0--+sWjxc*zR-2Art&S#`_yE1^5^FGqK|&_!Y_=0Bcdt{Ai4a>+UxEW;{AajHk&^ zYN#o^<8+(y{5=lFNeHd(Ffi~9ZLQU^ziy5FGf4w;}eF)r2_l>cJkX| zM=J7bF%O)-&+mr(Uyu1?e?1wWH00-F+>M*<*joX96658%nG4>}E99eEpdtOb?$oA! zWqAEG8vY*Wx$<}NTateVy(Yl7qMdO)8@+G94+PzBMpCYy9QStcS-_F-C9&5y9E2R( zJp!k~8ym)DJ?J3$&B-r2_Onn{yS?wM-6Qd5F3|hj`XvqZ^w($b z<-ys=8A1Mb;=ps(D9CfduhcWnH(|Hq;r-H!;1=4ro_PIt8NLbWL{I}rzve|B=Y4+q zXUYUx(a(?M&tiRWK7T-E{dJ%9dllFf{}~q-9)zwxvNArwIAOgr{;IJ)BnFc*9@=~M zWoR5vFs{y%BDB|T^(;>LQ}lNIX@H-c_m3!dtxg61Gx`6ZcWrd~8WdiSl*+6}*{UyO(P<_%vp`*0l1=flfkND`vzd&E| z?a%ukmTx4}b;0Lp_BVqxE(*>$R12gc&+}GaXc2Ugyxvegg18?jkdKKEgcQbBm5rLbO|3v;Tk3-kJ*=b*d{HN%h9<-0_P;c_xpK5@{ z)#HCd_w-zE3d7eVe(dKQLVLm|z)tmW9s3A8jsEUe&#)&S{CD6u_zuYX3O)<=JC_cD z#_JBqwPgmF4r+-!<7^muc|9|adTHRjALKk}LAmXFqL2GXPOur}o?Cv0cl=Q?xX*b` z^IqiNP+7{?fzGFNf!ymGobg&U2oT;&zImO z>>W#ffO$|7sLQ@%ob<^Qg&5$2XFg`R1 zv|;?*UvnYf^{_Sg0XP`B+Or&9Ke;cd-(QRep%U26JTlJ4kcWxEc-Ee~bmslRkvOLc z`CjMGhrdjmrH7x0{?50{N&2FO>xIOw^b{N-S4__eg#4xbft{dx!gx&GJ3Kgr=+ zp^xkKGAK8^apQjRA81@=i-@;BX{R5al6M$7L;R>$J;*rsxt;6u1=_iOl%>CfU`+Cj zEARifZbb%5z)zz5U-<2j7?cTj=3>ISKzMvkLy!$EC>Ej_cHOoSxxN*KOCsxbRy*<2y6u&%oI5#zPG1 zHKM#N`HqikT1WWm$ZJX3>&!avUWe0FaIrF8Pcy!*FZ-#t5L`sPsuZ_@NCqw-*Y&9j z==^<&{LjhniC@%nNQC{rlUB|n8g(Om3R(%D5p=z6L%#9WAi}=B5%?)sg#2TaJI)8d z>ELF@r8)VTDL)54gM6|ApTIkgu6604D&)I98#mKH&-ZD_uOCtF{Z927OMXuBN`l5& z4`>VdzhFlS(hIS}_%2DF>wZTtEm(na_40ibiO5_@~$86fUYa9 zcjLjxP+RI9CqE77eQ)n8HHqN!!`puv^wKV`!}XcxSLdzQ>Do6K^m<_!_$Rm;bU&z1 zJIC6!!L{iq@{E^+;1}e%M!Sx>*7k!2)9*L%O-Xxxxddg0_x+1@pwB5slJ_y>y7)c$ z*73SaKR72Ouc6aW|9!AASPwlMr>>y$Z4#uP--TaGdOvs;Tua_3&|uQqy9Yb6!WU(n z?C&S)x!$}BZ~RQByf6F#(#E;(4=FzZ`ObsyD06;#?$IyJNIReBLhYgAWWbN-K%^?=-;7QvSwzZ_}f z-SPbcj0+i0(Lv|iEZQ3<9U#~J#gO}NV^BL9kZuUtmp&|n-j2^z+HHmZgY+vf3-|`? z1L2C`ym7r~1EjdoUIPkhSpPW8>k)2LH7ao zGIj0`b%wtUeGIt{I$k9q<76+i05VTMm!aJL7Lli(`r2_CL)toJNEt>=pOuicx_e2B=YQcJMbN=DxIkTK+Zt3y5K{3hC| zXA<~|pmV_Zhys6w&gA?vA7aq+ zxrZxXzdV9(2I=bs$csUKPV%);f4OfNyT(upXd>yHkg+c659jeyh|7@Rev}nC#)NfT z8#Y2a;6DRPLOV(8H+4kypudc>yrgqLA4Zf9Bh8W(xPZJhn`q@VwQZw;xtaW)5X98*9Ip%MtU zo$rHq-YObV*I3bi$>CQ*o)KLyjGgmPM`!?iA;`EJ31)&26ZD^X#?znZ)r35+hv&dc zec|sxuSgdKUxNB>JhTMfb;KCDMA}$)EcYTO8tH|kwORY#f`=gMyg+_8(z&6D@cQ~7 z=_j<)Z}Z__gZk6)?L_`i@}AP}OL(7)Xm5M?kHB5Q7@7L6--D2&o{u0xDtNu<+S(I(0kwiW&jt51 zP=C3<4}<1IaglQeoD4Z{CxLGu=bhtUnY8DbTF@r=<r-;_w8QnvHm*zF zm$lv~$oaAox=OkW@jea>hkS3<`5%Y$ zddM@CYsTlKpFob6^Ut+m73BHlA^0D1vXFn5w6U-sa{m88erC{hH!73_a-5A7+oyt0 z2VEqsU-eyn_)d`X-~DD5d8xrKA@>pEMOlfUEu`NC%Yy2Zl=N?)_N9Sb-_%Q8g8IYz zu}{w*HNkVBefTlnQ-hAX@mVS&JsxyDE(bYB)mOjk*E7&u@+w2duUC4n3xV_W-sffNO= zY2ty-Lv?XY-UtmK?67tSI3IY!zz zoB&f1><51uszuuUX%`qD`iOa}oEFscyx{ZbmGG|Fy`it5{O}7v$7(wi1M>M`Z}P8@ zo&Y5v?YLxtTEf49Mw3nlxqiAPse5+%$qVoLmj)_@oL=M?AwMU)^&B^!!x~dj!8l+F z@?8Iahm5m(v~xZ@f%Ka)%+Ex9_ZjVVo{y)VG4EV(-I)qCgWS)mK)!F~xE?nRUIUHc z=aBPEpSfoD2c0jULi0%9gj`4UO+j!2vx18#D-B&F?O4PjeyPa4#!@P18f1P9@|Hp|>Cg6gp$E_o z%JgS%=svvnv-Qg!(r=-Cq|-p1p@dL1@@7JQT({bgejn6sEC^*Af#SbBFd7&w(qYmequw;A>+%~)~`Q+#*;FQ4g2T_)gtY@ z_Wk8S@C!)0emhUK)j73`bZRgo)Q5C#&^5vFRR7uJ8MnsEw~%&Bg+C0rez`vX1F6@~ zP+I5){W-ozNb3{(Xa}AL$3vyD$NBghr2Z`+?aTyqq@HoI5Sl`I5LAh@>&F_X2WiLC zxzZ0B1I>es*La}1R7Sq~EGKO}&r8m~Gw7x7j1}Y5HCP=FK(70?*#{c)B}p6S&cSF< z0@Aaf&ZOHx?uY85-(167cO1))AlC=?`kmk?a3HjRbVWPr|z&e2tt-@UAPy|4#Uy;g^usFSc0$l_&itIGK9JiSe%g z9qS6S4&H)#!#iIcN7wnOpticdspAO97&m6(L!ZDq9*>}JNneN5 zDITORKZJ&nS08eYwSgSBV^AE@&Z(-P*MsVq4065dOn>^cE9n#9Vkjl)C^J+TJ{8oM^aDuW zs;m1}TJ%%Cd(|DV1eAw#G{`w@f7h_g}^09Ul=pafmWoGLDq4fTSnTo zMjyTdB`0qRl$x|UWQ6p0H~58+=NIQsG{$Wmm<@6s4k2G1`a{+=PC8OH8&vl+q}M{m zkZY0guKln64V}?jllHvuJ9L6_=SEc0?wk70IlU7aPCx&Fm&yMQOb34jTn(=sb0gYM zCNB%=A0gxVA^0=YpL(uG_emSau0`s<7aRqZL*5{G+vukp;B3e-_mhiq*LCl!TmC-$ z0m|NkoIB|uZF7tUk^TmJ3rhONxs{M~BXAPbnRGiS+^;fSAJTw1!G9pf)wRaCYxz%* zvEY1mj_PN9kqlkDk28t1-wVr1xqC}o$az!<8c+HLR36F$Z#-rvy%CBGc^_;wdAp!G z@ZP_eLE1T;4mwO)d8wgoq>ocSH|d|DoRI!d=O~czV%@(<_W{p<`Jt7NvE@9}_ftt% zhm7|)(C6gELXP9m8}e-a6};=#M#?_}^`-tE0&OAP8LCNoA~c(HF|Z;u0r~>|J18?` z9pk$slo#HZ(O*p?()w`?RG0qrOG!xli@bNib&!7D0I$Brp*Hq{9>JFa)#(8F>feU6 zV=x?2pYf3E;op#bB?8^AOOtj!8T0Q!9?9wBLQx_2VG86kGy*PujKS1nDH;Cdl-xBlb;^^4Klu5TTg=P$p6?h zv>smj4w81>=72tdMw6EsG!~7~?oeFPj)8lQa!WwvAY*G8RGM^I$aTcAi4HX&?S4|7 zbO}hEon!i?HR$@efb`d3BgmNP3*P|JH|`zkdI~I$T|a=1>rHSos4nv%{oe{|4BdmA zI~S;Ceg;}`pLtk*(S;GcoMyYo5io`ESqpA8iO^Hb&; z)rR~T;Ck=|xEgY8bB}%pDnZ@Slo>mF;Juby1ilwJbk>*;@0=L~?;KwS{tCY{N+@Q0 zH_ZL}D*1)M-SFqYZBRp~FVqbB0g43WLq<=~xN(f%qVIID=bO+vR}kz;+2PlreSbBW z7yd(VH+m+ZJTbTn-sc!6!SeFR@%tFQW2+CH>&Am?)Hu++&-J_uea{55qObAfGd<_} zebBf$$YgZBC5;w}UB3%pyd;ki!q3TnNPFLX-2(b9%vR8L`rCJn^>-!unGYJ*FTuv> zotE^Ve?n)gIj=(JE*484s}U zH`+$QzE5epg8HMtgVae2o~F)X$``|b1=hj7ZeSnud<~9z$#_%G?^bz#>BwUcolC)g zNu7_MvR2>&zq2`%y2(lB!q$$a@xd(Y%t>A6dqMKuOH+-t$RIS?SyRuOFj}@BKza-|`}M8~__&*C{Xsy8FG`1do`@@CC5p8`{MO|3Xd= z@C9-&LsOvdpq5Z(?A<^gqiE9%oB{g&TV-UmfZvSn8>p90o4{#|-$>-OLI0TOodA9H zM+Y{9y~x^$y_t|PiS{Sx--#Xzeii&Uc;C@X3BEwyG>YFvW<@YBGDm?!8JAkf+sv34 z_d^)Rl(gN6y}l>Y0RB0#Q|KY{pFZEiuB0r=gDGFb7)--I>KX&NN0IjmzwN`0b@W-7 zbSE$$zVcl*zu#OM`y$`LC*ULaY_zR~>?_FHhi{X|p$>hdq3`SHmJfU8qH84VUxFTf zhv8SownRMqMqYOK{9s4wcR|LxP$sAiI=sPmiD)~OzJ}uCUf356UHm?Cf9#rp?j7K# z(@)w5tUu^Gm+|zyi=p_#_i9$7+eB>3L)zzZk3q*EIhX z9z9N=UsCjrMw>U3U8l}STUH@a2(J1DSEK=Q{Ntf%&oLEArjn z4q*Q>_ZWS*1lJJH zS*RNs-73)bIb*YzxG9ZJ1L@~DeO^RHdF(areBWn1{YIkh8TkF+LF!z`M}DWN8RfN* zbr+eJk=zD8r(Kiy<02>Y>>koAP z7i@>UvB{4H?|Rq?Tc6X;?_w`Tj%!qPWM8DcbLIf{&H@>tz&BtaXaaN_+vZTOH8xzO z>^JmIPX2!E_508H7}tL2(iD3~;_GMFn;IeS;+J#uH4bczKhJ`Fu%R-#l|YZ~_~Ja2 zf^;Fq?LK{cK%FV{(VV%^lDaF2yE0(@``87}L-u^^%!)5#VNV=%+C$&%(D7&b@;#nW z^i__$GuT~{y2UP;l- z@26(LzFFW~?DqSa!_jpBI2D}^f~U~wQ{tiy{`rq~AHokuP7cy%kb8nU+vu|ed=mWR zyR^;0c-ViI{8{wx9#LL}xIU~>ALi|zf8QwZ7%C8Qs1?@j-;aZgOz_NKom$lMPO!oE}FpJ#k4 zQKu(%4WNEK?Ee`Yhd+G2Ul>1C0#m`K1P{_@V{jijcs`2;@ApvNfp$S#(8crVE9hTn z40<=hPx|}@R1W(lfh+ON``|U~|D1ZBF%TPAhrQjvc9aiBzVB>$4l6~>9U(tIZH7=k z8ulJ0?QbhwrjHGjwIH1wa-PpYuUORaJK^6W`zZSMqh2iR{t9_V7{848q78O8q0V6J z?v9Tu0D}0`y!Qi#op3ogW$Q1O85pXW?wLD+cfPqMFc0QS{3K`MvRE z@P&xO57FTh#&jom0sWRiesB5~d@agPpsVi-&w_6RwII*;IBU}8CmiE zJZz6me_O#1K+oa+zDOj}%|X}3b=2#EZjWE$Q!PeN~?_x9uH{!eW zlp9kCX!j5KXTY||K8wsl$k~G2*XUCj^7_Z?ryk&C%Bqu|NFQUV<6itVI1!n9XnPr( zet>U*%?r>g0PpvTMq&4P@(W}89{5dQUF5jV*GKLsbRgt|J}d_BcLuyB{g!^b?kz>R z=kqAEtw%lIHJ$=41Ji+@Vb3;j7wGe^Ip9ffGx3}T9Wye94ZxJ-`#$An@CLY&_Qvmg z>^I(OBmW@iwNnMq-v*kGTxGEY1@BL!2d5!x8~PkTPp@}#;L8i3WA1f_ac~wa%=o6J zzP|xc5?oEa9pL-e-2s`eXs;eGsh<%Whl76qVgh+Ppme0yQ{V3hbU|J&e3+JW3UC#= zWkm0jq|0MZc5GRSoqlh%DdX<`S%dsbU_$culYg4=??JuN&>zq_%FfU}Ipn&V1M>RT zGsGbJzeC^auoX83K17!oq%VO3&|6v!9fsb)Zs$RC#&xYcc$9kCh~u1Kd&(BjHYI+D z0(PLh7xEWS_W-hE(BAtVEhy^@ZUjrK2XzvIOVQ6boClsm$Hmw(7F>vZv%&M&=b7dN z_B{j(fQhJohWvD(>tF)#ecF8q`r8*?7q$mafUb33I~_p&8}K^hJ&%U;@3{I*{u1~B z`g)%v88`wQ$9S~^BcXo{a0_;R4|?4=5Uh%woxoVsv)>NnHv`+!zA?Cf{9)h-+Ii2x z^Ptzq|6>1tpy#I#@sHOy4Z!i>Qg8xx9R(+Xm%zH9Yx6IRdmPZSu-_Y>j(@ygco5`Y zASYvf3|z{%uK|xDZyb1-@ooj4084?BXcG^ldhlNUG4%NjeZE6)&&XaUPXq5`pZ9|N z&Pq2hGQ8uL4LjYFyw3CGS#{sq4Sk_Yr1>BgYvrJmpo^cw`G zLofLQj8}W`9>z2P{mq(!;7rEX`v+}7??;U%U%!`x&jBW;o$J|I?Djcie|Vo4eFQCr z-qOz^@HVo%2jsr)`&lv3$Gtrdc9a3np||t!8cDv6$2OEK7@TcqSx1jeTtI{SZm>zqRfyKc1px4pf zzb}dXalvHR;XHf{{)>(UvEvb#7Q1~PvMu~m@C|rHq@MSI2O&p4{!V^Y(CfK+U_bg9 z4{pbnQ(!OZrbL%>*xelTJ2Z>IFR|k~SPt|I-wC@tPt?Tj)?fni^-}`uZUy>XbN%JD zZ)xxwFex|$d;dmGJ#ZzM3>pf#_caDRLq9?fulHTwH-nSGjMy<2)b5VvV@EY`7;)|W zB!jrH<>c1}7s5NwQ_|jf@hSN|LHF7jU`n*z8xlo9$MXxY z8Q2}Xf_*=NgRpxnxD!8&01w0W1eZ{+4cG{KD}WEd4?yj{NI%0s?`yhtv;>o)htE>H zMu`PBLSNqtJ_&kn-F4099(}RL=NY}gTVQwcjRW_q{9qUI+kjUq*e$@(bF#-oM4}OyEz*F9x2Z zZ8fkc{nrK`fzBJ(vqE5AguVw}!j2oriI1Jzz@_j*z&r5O!4Ke*fS%iKBeN3d{O~+8 z0rdWp>;4n$Z3ynBpX#7vQW-3VtzvZa`T~r~IJW>BpnrF;193bWoPxdcz?jHFN~ zCs-N&HTar(#`90Kb6>oNoQmK@{MZCEb~}Kx>DT$v3O%}l-!sm}!Cmxi4R%HU8sGrz zD+D%%=h7qa5$l+7`wRSDuo*ZFtV_M%yr+FFc&}qV2KOV^@%KACuAjH*H#t}Uay%rk z^4(V)GtVebAlJDC=;M6yey-2CUKu>#I_$Vb@+Ed12M@z90WX2QLG5h_)`8Cp-k_c5 z-W1?{^z%1qoj0YCzaIPy|4s*=LY`wLppSl9hrLa~#KdKB(DO$Muo&a`A7kXWUIH6{ z2f_G`H@FUT|1E&M+rSaDcOUr#d9F7zke?6i02yyLv1vQ_5Is;W_#M5^!Tsnv1^f~_ zPJ?a1cd6@lemz@!!#Mjslk2o+y!GU}-ZX{xd2>bD=LG9$KiCI*-8WX!&suN+)DJ3! zJ|)1#j0d3*IF8=O(B~5N&H@vIJ-~?^pj~fgW1sO81G}9MH{q**HE8F&9|L+$T!Xz` z!C}aCUR=NjOF{R^U0@ybI1Bn)C(pq?=;`&-GxW~{?!%rE;2O~R+ZB78gP+5<0#|}x zfu7sH1ic=u1^Sznu8hxG^l#-4WIL+o|@ zJ7H%Xa3lB`==$|JSPMIAf?GlT;ymsHUPkT+uzrNSWwF=(_MpdI(DgbAx;Vb2!QANo zHP{0j4Hm)9bznE}BzS;)uVJFYBRcRQd}L+PJ_>jYL~I}xavy+C>E|>!6WRi8#@=aQ zej0xVy6#j4U5C)5+iddojVL$n~(Caq&p6PZI z5ADGk;81Wba-0{_iDzT@D*dbm_5Cstd*_1QBOe2%#olh<3+ym{iesPiYZdl=44wwl zff>oC>p*+zxfa~VUe6n)vG)&fAn|+{jEVeTLFcaP>(AJ`8*Ga{zkqIXzk&Xihw*(4 zp;tlglPGr+cH)xYZ=S{ny+524oDUWNd(*BA=x={i0Nv+Gfs>Ih9}jyAfzk1`@jVy+ z#{-+A=QHFVMSss@13}00_a`AgFUHOv;WvQ#O1r-W{jJJI;6~8%U#wg1+-X*Jb0pEOtBu4`8SEwE*?=Zt|Og3EvHkqt{c8m-m*A zgIDm|bLJ$50ub*y%XRz-g_y*ho#>XDx!sk`rgXiFlbMODB z0WVNby}U2F4}3~oc#gfnxVql^+*bP?<9v|&ujiu*=;OMd8#@z$-=VM9^RckUebe6t zDG8RwF4u|Q$nOT;g?Hcm7~XU8UfSIRw}KP}663!N;3BXXSOBUEeS?u-fj$rK3T8&% zAHdq^FCK9Gz@Hw6;<^{S^Li$BHUg{Qyt3dS+9`7rm=)}UycA$1?0gTLg>&Dc&mQbF zE{8C#_dw6X#*e@8<-BzLJp-P`PUl0O*dagm!!G0P1pI&CJ$R}HmhfLv(D|GVjEsHx zL4V6fy}Y*n1U!NsrNGW$NiZ&Y<^wmNe{ygDNRvSCN9^~=UxuCD@9?)jmxJEt9|N{! z9KB!RZ%;M=S7B#G(BBksTzsZm9P~Q42zZtLi-GyE(|X0w+jYJadb`i%VQ^-G8?ejy z(}?m1;0g{`3DKttb`=G8QNI-!iTcC9!^Fv2upLT!o^@}&3VJ>^Zl{6X-xz|Pu95k% zPizFbj^BM4THkA8*Inw@$Ic_*b#Mtd6FYl>dui`F;BS2BXYcp8zD%Z*g;x78 zOMyRNXI$_Wc6goZ_3Rn&2ki4*pT6K>a2@5Y;jah|-&4;3|1Rx5#@_s(_x&4zK3~@F z-VZwnx_7^T^m}^r@x6_z;9KnI4?YDKfXBeC;3_t$Lttm@J`2Vnj{g+l^_#yXwgX&? zolDKfu7RM>8omK%pxYov(vCnrUCOaJ|BV2(Z3Wp5PP)0 zKI8cXIE4Jh;9%mo4w#NOuL!ol&b(kjFcJ6!`Oc>`*m(j}miOuWji!;{Ui4@K=E9B& zU^DD10Pew_oZu~#$^tr$*}(Ddhsq06-{&UF!RFvvuqWtmpt(N9ix|g+^k(q;5Eka64;S^ss`GCF^J=Bpw~?CUUBaL9E!c3>mMN3^L%gY zv|cyH5z_;e7{}Y7zqxW4yoX&=K%bAd1b;+d{kx6vGSvHuhBAM#^@ zj-&B?9C>TOOW5aH=e4)rui1`&z3-Y7eZ24b0Q!MeB?}G{5}O6GoFJ% z_t8UOQtd<^=cE2Pj(xqs)W};7`i{qG(7!Q(=-_)Zu6c79NA2%Lu{ETsq3;u_F#^nL*Gfw>u?<&yqz;y5(gz6uEd%iEY z5j*;WW3cZBFgfu!7Ayq14|?7+-YQei^Z8utI}LiD*8L$jgUnC_n&Ttq`8MoRAIG)| z=zZ0OmSa~_@GGzpc#THY!K;j4Sui1XWC6Qi1WQx!`N>V>pC;dVR~q|_%Om)!ANUoO zz63v_pU*|?b3NLNJ~_aBIQc_x9eP&;8)3(2@CD8vL!R@`d-J$H@CN(pfL^bR1Kq#&f~C>(GB_(b`ct-#@ks!_L~nJxh27r&x$pt= z5Bw262lx$fYCV6e5z&D~jMo{kF!t>Rv(ooG(D%N&g2~Y5W3VB5yT6t~?;YSX>~kFN zJqXQf=U)u?_SAD7-wi(p^!`x~Fg13z1Bc+Z4qy}Nb_IWiCPH7L$0l$&_IO{+{ae3! ze?-46WSm?d|0Dk;=zC+O(d%#Whk$Px_kCb)oQ4X)=LBi6GZN$XF_;m*c|E!aeJX+- zu&Xp!552ta<=;4Pek?}sOSJEUeQUwz_e1vseZQeR{0qvHfIl*h=*#Z_q&Kxia zGz9t*Y7e<)egoB_|F+;O#?5?xtEW475<9H(9(vCP50S6DmhnU9eXlF;!~X#ix`E}4 zZwk=Z&j)RzekJe@b*h59iKDvUK$%(gdkFsW-0l03o=b5{@cqc2NGF3zF>bE^wU}S|K!3xgGPnYCoi7$IbpLH2 zdTxWSff3H<_8_JN#xg$nLHEIyU@7?i;627-J$MEA7r~YI_a=A>Jw2!N1ie4wZ&alR zyP#NV@H&_l9E*J^z|GWiolk__hzLxDzYP{8#twjMv8w~9jpe|vsf+7_v2lvLZ}Izj za027j8?1vJ+LwuW<#{{_<=$7xg#F%U$%1o@`?c8N`d)+a9S!;(l5wss%R!%2?gEF= z|2^~3D--f^fcoteC(HHnJM40uYm8pvYV_>^`Ww`Jz|7b;5c~zZCV?xlb2)f`ddmHk zc7KC8G3pH%A3IPXxUb~|vyfLDbnUAQI?ulV(=i?mz$57Y8JHL>3Z}-cY+!BdBpK*| z{>Fa;#>exu*Fm1g`jD?)8}O6kFc&uDQwGZ^2zVqN58r=m` z!}~p%s5r&@alUipyeNV_=1*YU=sM6FyN-f);8%bJu*>mvyjp@@QxyR{Pf{h&0X@%= zcNqQEdkyP{`}Q{oYY5IIzZ_T&dmV#8@QJ}$_~l*DXXJ4}p93cXSA!YB3DCz-fPVGY zIP7vgY{U4B1`}bI^DHv_W$=6KaNJ$rlGAJ`ajKpf7@yjpzxCA*Ttxn0(C2}jKyCjX z)F;Ei+pJ?lz#Zt-9`yNEXRr!-cLA$mM>EiO^(uhQt3u#K_@ZES{E`Lq`58-DAR*&K zm%;Bg{EL3ipj*&h^3H<$=~tf)M<03L19iRgw+mfQT4CoO;419A0D6D$8h8=j{r@=S z+U;-t+Rq7i$E7elq61g>kF4N3Duh7bZ~V)U2LDFUYuZg<9PWXMK>IC^-R{@Tz(rtZ z@~48!!EvC!$@U}YJ27Lx)8GK}vD0yhgnY+tKR5?03$1|?(5Lg}6nGx&j$ZClrBO!x zy#JR1youee?>ErD5?C95=y`H-n|2WsvVC zSpPJ74g$SCb6l&Ve_habGKz!#R%m)KE$DdpKCtV`9dJJwlYG~mI-q{=eHhpI3CL*& z`ku7wz+n1o0qQ%?E{l*UzZ<wL)!lX{)61>U<}A{cHA$4*{Q4_v!f?dmBlCY z40tw(Nr6JxBOU@%f^R_QgTMV}oXP(HE(80489~oM&1mm_@FQ|P4{f0z*Pp}4(Dzp$ z%in=^LZz`^eSSbs*VSLq+jTz+sNO$f*IFfHwm(Dozp z(jd$CAG?G84HV-kJ9V1SZ)WN^wmHdjt#<0O4QM@BJtpS8J87_;f24$6Xlq|R>0 zcLB$NZ_wZS2xY)W;706wjJ_iTWZie-dw-BsAUK20} z^cYG^->yY$kHKf9N6{-S>5=H$2273q&W$PHEqK2#vj_BiRgZk<#UEf6&}&ck#X-;_ z$ltRs0;Xb(@V5<*f$xF4n7B1)Q}A7EM%H~cM%UQalx;@8`{?ZZr4QKS{7t^*jIFDl-?cHL!<_nqJ>oH3h&u^*xten(`mC89gMHZ)UQTA?sEg78<5v(z7u~8{oGpupwHk+(&h~QnuBcL z3G@3ymB>Gio&GNG3eew|+yvI9*OtYs6>h zdlLMXwv*9oA$5H(!};SpaBlcpj(&%r7nlT^1Nq%B$GH|X74kjCZ^2&F{|I#5R5#B_ ztwHzYtCYFF`rR?-srGxFwTtvi(08S#lgH}nBhRZ|Lt5xZoMF4|ZYR-2g8z4}D^$%azL=gtc#s|k*Rj|Y|mJ>OKN&KYbT9He366>!w;(Ec|RqlY4|7xU7+^ILQ| zPk+Bsr!(jo;$QT+gkD3zjPxH1yoz4lYmNi@KJq&B{S~_kQhy-07gr}=JTd#Drr9K+wPX=53O4#=9vINSyMgSF_xcY@r* zD-%brz-^%4ecVmH-%sd?TanAq20CHqhv@Jve(D20 zWgqeS;R5sNCfJ*CdIS1*lV5`c8OLYf9NHfTn=t;1LDymZ5E*+5gKeMC4*4nWpbMD& zZ}bDR5JySCuQBLXbn@>_eh<3mr2?HFC(yqhdikBs;^sp(hv8Dr?}vI#M4bgMJJxtgWh8v0D6sC13Zi$Qi9I&+vuG1MJegFN-$PQG#O-@o;JIscw(9Bg?*|2rvj zFZcm!PaYzJ-&33i--)=%jSR1`oj2Vn|AF$`;0yHn#eDdS)XN5TCch-@o_&WdV8ve*kJ=YK18+>Qmz3CBr zRcI+>9C>ftXOPJt=MGCo@V!QT{V#laus!~01?Itt$B-Qr1@ePci6_rw_lPI&S#Kqt z)`Da3*L?6e3ReNE6Hkf3T-fh-s#X(Et|L{5r+?v}5l5fESGqwggFmvr{Rg&U9e3^Y zj9LeD@6Lc8#-#eq#>N?7B=q}`^dCh!R`JOvmOHRQ*qrK-VpE2cv z_wQ(oBJJ~m-yzS255Nrc+Z_47(C>cQ%p$!3y{b~*_hCF&JfN=kcp`)EfXiv)+T?Ha zE3*pxJLu=%Ch?uAs?_tmq8}1d?+ln0xtEdan%oT91|=iUXZr)Ga|%DY9{xcb9YN-L z(BH84o?Q`Sc}=$u*|U+I1Z;vV-^ca+&$ZxI^&lP6OJ{1gC(?K94QF zOPZfN?|GIZZyfVqKl{w}8f7&T(;j_SCkWXwB_?M|>be*C+@(By-lBX1edJ=T_a?v^ z@b?G!1be#PV$M;%{~Gt_@lU0D*p1vr?1!HDexSZFR1KYWK;F}bU zKATEL?Db`n%0_u!;(a~&+2BW0uPEi-H(WxyddRCpAFc(v>2o~&ybF3C#MteL%<1^h z>zHcP^$h5Gwi{eT*{A4lEWXChOYmjkTfq+lOTzaAdxJiY@m`W=DBu0?w-1U#bE(@8 zGEOF;&n{#$eS+7mZ%F&yH0RE{=~d(q$p@=~Gi z4AP$QB9ZO|dfk5z8c!d6!M^l+gme~k*aUjLKal(Y_!amYx_Yn7_h)O8?ekmD-F}~? z1lXK09sovTeCL5a7rP6trJiv%2)-@oT)hc;J>j{H&co1O$y(Vx|#9MB`7g=PI!#1$g7J2>(P1Mb=FSWbZ1dK zPJcy+quAKxZ={R_y?59Yef)m*CUj|!j~1bKCF;gOr%cqjiT-b~(dQMpi6ei<7xq%@T?yPibR{=LGKwiMAmuAy^pyKnugB*fDP!=YaG8zJBB)6v8L9g z&7at{6FxO|o&(!aZan-#yFbBkv>S+C-V^&3`K6H&lm6TTVvzqebxx4y?^YZo{SR1~ zvfRk_9$zZjcn0$OXP1##0{ypu<*`NGe4gfYUPf&6UHSy@jo|lC-*bF#>bC%mkErxx zpP6CvAiF7e9oa=m`|?RQ$}1r=0JZ`>Go54%P$hT`l8}0vuL&Xxc!4-`E|g`As$*|+ zl=AtE-#ICZEZ6xw&`ip%Vz2x3LS&9Z@hqV6yok2t@v-kwxWDe8p!Y4tF<$qO^%r;zx?o?(@*VrQ=E+n# zzMB>PbMOv!4yW9+fWN^sl{!PQ)xUk?J*`amd@2+T`Q6Z~IkL}#t`Ye``#eqA9`uY# z-+#gz^WI~uPx(Rc8aN3Xegg|*uji;Q;9r7Kus0L3zGL2Q1ifGDI+74Oecs{sbAACk zA-5Clmr-_|G}QyikmY-xUor19qxX`8%p0&mBIICST*faEaa$Q3(!n3arqtN^2)j;z zZP0fs_5J;jsgw=8#~B8BM{hEg^m!HDwcj?8!Q}YrCfE>JOVD!{{C)U3$f!df3D9W= z==X+8U|&6yT#S9q&|?XFHT3Oxj?ij0Sp=ftn=u=hRkU60Dp z*BkIL@$?YeJfryA60S3+sQ(pu`#r9f@bl>>0a%f~nt~4@<7g{wyzcXNKpg+8%-c+0 zI`A;%SFzXUSRJv?^|Jwf@Lon~a3#EFnfBEG9Nm1T=6&nMU>~S75QL=0R`d6{9>OveuK=4LR4b%d?vAtN6P{xv_Wh9nOA~ zUj*&L-^zMLxogV+qD?|Dt5+-u&wq+N$%gT=sm;79Z^hVqK^={1o${Rr$lp)f*64o&J`z|H z^q#(Pc!xMY0WK!rJuWr*1HeuA!)I~QBi8T^^(~21a_t%o*skIK);vfeem71e@dSF+t2VdkZ~SV7k?i_`z|4K z9riFZfxPfVNN)q3lYL41UBPUi--ULssR;j&vKyf1s?lIHFgjQn@|lpEdmYf<(%DAa z43sCM?G|`_yO}bd38tg!FQC`sdm*pM^ON@%I(h$QI+zGP2{w3*?Dq&=*Bir^1pWSw zF<2jaDGHRNz4s;FN7i)mk792w^3O=5E1|>hl*I>Yg05Qwh^yA{MTwhT@WsJQ;CN)! z1O0pI_0iw!z_R$jYnE-;QJ?nn;ol;64EFjQJ_hyNX9rS#oAUJVUe7H@PB(P8O!^*_ z8p^It$a21wK>rb-XX4M$e=7DFHxDr?5&V9}J0_Tc@=4_Tn_zRnx#*gX{8{Msn!au! zcN6EMK9uFeamVR5IlT4_r929l1@gRSnP&t8yBq1w$Ub6U#Lq7B9y}oSv9BfZ;%{L1 z8#51(F@m_6gS}lIvNyqBf{#M^Kj`Xv6{WFhHgf+&m)FpD$aYUEfUI%oY3xKr?{o0m zk?HTl`Tf9|$n<+VrzwAntTVLxl>9m1PuN?5`on3r1lc}|h>xyh1@EEn1vemjEqOgj zyT7`Q*8nHd_ZnnOgLfZZNO>R7HF^&9{Z2$F(q8A)N1)fqrO;tH^?WblN6Jg0TVb$0 zk?;PZ)~ET z&xQRip7*uCA&uDJyy=VX-cwCTUpdiX1p2h4fA7QiyIzh_6XMCUNnP^0f>)^LS=Twd zl=Kf^M(nBujUc_5vX`Lu2x^cwk-qYQ(ed*Yp;I(m5qGI^9uEDflQ~s5$yFjhu;hL8q;Uu)yO}FjVq|v26^85@&2CI9Z{*{ zb31=y%6COxf;B+zrMh?ThkpuI2Y;un?{s*s(+}=(E2!ta@qF0l^?yz9BzOh%UboLI zsTzFWYX+DNz6dgA(avY6|Hsr>KxeNxYzs?&d5hH6Va zSHc6Zi|N7bumv1KM$U8Y@qeY>n^@llQ1-vLkD5psefKp6Y5CjL=!DHrxUDcd@rO|k z=h0@c9cj3CzE7IotGj=U2N%({-Y?kT}`CFSQa6Yu2zQbAq`t0!` z@w!olvCy+i-+^#UJtWUKxcQu6I%%z?yf4r_&zXWgoxCDaUia0XN$Wgx?^6eQ&)o|D z8HD>lUR{ZIpGLY(`ksI7p-}`&}tv7Tnn*a+F_8#<`jB%j%jM~RK{4>Mf2=B8H zf7ekB|Ka#EOhYv%uiN$%{z>L2I_K?cs>vEJqOPUy_ffX z`VZnPB;22f@35Ss+_{NggL=1sA=E1m%nUuNA4h%b634xU^P>C9OO}W5SKw6A%um|G z2|Ez(!|glhSzlMg`PsR+ALVckb)DA!d>)+vCWjk|15 zHMy{(@zm3AZ#mvQ>xhURguDCGGxUqk5-4I|pED3zwpY~CHQ8?mS?@=b-FuZz)UhGg zev2j|*FQj?`JH2)>ce$8sQXlS73RV2#uC0XvX}T9kPOuOG?I>dIwJ)s^IDjKa`>FA z7P6SKxxab}3&4$(vpnGjQtqvUb#JvC?vnUV#eWJsLHOU{4&+zr`H?Vwf64Lr5q5;y z!)ogGk}%qZ@x32+tomM(_Z2hY7ux`arpzhu_je{f2gysl5<-8!ug(5V9eoyaiTYn9 z&M&mt26&I~O^ACNNrJeKJq0UKhCR^!n@2d;r!4qQrW~%3?!&smwCLU8aP-~qcj8Sa zAI}@(QbyN5XZmEVRCR;4SF+?R8iXUM3BnLpXL^cDzRj zfz2r6Bv_kzIA6P7?Bw#QsTR|6ed0GyDs8* zEKd3R;ueZDLKF5K`a0MgMj#FC{UdGabD{F&kpyO8p2~uMXza@N@i&uCU?al$?Bf~n z_EPT;t94zjK1whQ0MGtq;1#To->Onvar27S)Ho-})1P3m(VW~6@F%Q@O%92`Qu-Fr+$ z_kM3U{*$5KuJo*_GU;f4K0oaVwf7Jt3gUjNH|4%Wx>I2?=w2Zo^c>Q61>8q{kK{mV zP-gFeGhkQVEBV`L&x-xcL}ci?5{r7SCtPcE?^_qbvC#K+OH!7E=vOJ@G}w_kogqDc ztCt==!G1hbTLwMX@odEXw9jWc6Sf<6x7GSl=N#}4+&s@+Kv>U{+(&G{&HeX9;{6Rh zo79Hm;AbB!hqqxB>gYbwwn#^P%0R!FnVEX6gyW#!%(DOIQ1;*9GScyR)I|JzUbC0$ zuLUv){jgo|88uUOB=gC2l-ej<``_Ys7g? z8}eDAXHuT=H==$Qpl6|PaC=4leV@@YVeQLz(A=v{#H}akC+6C9F%jbYIf^uWwmh4B zw!%KJC2rbKH?HSVo-HsFbUk>FEJo;pz__^e+eX3E(|Ea9d-6wZrcgtdy4(x7U;R%Y3!{JEDIA- z2G`3d(C75=ac@VO8`1wFt!C(@iCYp~zXh-a;(G1#?Vd;z%IDrH8|8Jcl^?s>itcZ` zTfsHx|H4^tA@SA_ZVCK_ursN@`v!sr_IzzQ}ZXe(hBq`z9;s)lO_|W^i^>7wp+EN#Pt4PxYzVYNaeSY+h za33rJPZ4ed;g-TN=mm)X2u_AMDSJAoJ*oR#+A){}_d3vbz`B$6w=gVmyyvk0wHfP~ z2U&)6B#iT#Yr1(qH!bM%aofT7@YX^9&O#OFd&_mj=%8&{-pD`APooM`~@NfFXy>JHHJ)8XneoLGchkgcPy`_a2nBQDSv*Uk}{61oLT?n6(GVeu?Ng2Io z^Lgz6qyc_saH~oj_i&eJ%T3g49_91w%JqI0Y=V7_#61r6`3K$iLL0!*U)_Bs_YLWF z#_mQDZVTynU$KvLJ==RnKHhIg?U7;z=7Zh1t->ue9Ee+3;!xzkyY-F__m(}N_b)L? zYc=eJ?mfA7J{ac5-FH76cTLE<1AIW)X29Oi_VW486POqO!=&%M{1xau_*2*py4JLU zBcSh5>E^o_zK7(zdW>t|Eps2)gE;Q-qLF4q=zc32JP)Jbe+O1UzYJ?a?a{Um*c)lw zMYj(Y!SztP^ZCXPFa>F!McN<(kgZ5*#4`=UW+u!wt>eJa z^owJB81xy2XVsIS_eg1BEyBB(vt9$C=f+h@)BB_erjOmd!)-fEjDDBS8HZjU`-%bo z_uDnk;@xBW&Eh|xdkWtXiNxS{Z|FNJN1^B436Yw_eFNRkb%B;U0dC%-_DA=u&GZvf zZf#^ATnlGoZ=;B_1a3w5-G=4plkq3Zz}}%LbZ%G!og2QPUXi}G%V@3##pIC!yD+!p>x_GxCs`3KO>=#3P2khi%dnb}kC z=W7vwYjq$&QEJhy=n<0a_z5{*lE)&;|g_7vLE9}`rFuL)bODf_1 z5cfvtWzj9K@A>VAk8mFiSHRc$L$=z1`_!E1+GRBK%(!QSV_+}b3lqNqoDOfp%g}z* z_U0qna3R8XhkFs*@E@cMZnM0G>hr1JFs|ME`~q9SI?%n&d;DF8-A5mTk&yvNe*B%o zOe-a959#JWzutmtkz+_&;*E#(k>rTu@lV_wfA)16hy0cd$R(*R$`7)VUq*%g}#-?(e1$<|X19Ukkc6IRE(0o$Ys*f-XY$TxB!# z_bQfaGj`Vp-DlK}*@xJt>t7n&n?S#5?7ZKfc((5v8t@^EjU>fCFVX^WfAJ%9FE|hS z8zxLHaQ5?zu*enSgd^jIN#9FTNu`2>PDnQrvy!G6DT}m<~M=k`3`3H3JM!J>tPT zi2ZRD-FUI6X9x6ba5ZcSSKyutUPE`CE{g8_6%CGsPjP?FbsXdYvIKn*tcJ8kR-t!? zy^&1F8+2{a`8x*ej6_AgM{fW-Ad8Wi=&ogSMc}!DX=Nlo=YWH7KKek))fe3}g+l1< zU@{mCwG;OO_u+Aluruc&pEWflTr23iSUwkYej5q3 z+X2vVd;#7<_czYLa0KbOPb!LhKpx}f-obl(Oe<6v?8#>b`KXj<@q?kd=YHDFNq7Pd zfZA<(co0T_>!9zQ- znGxqvk_*hUu0i#*6!&D1;51+n^7} z-LdIQrbz9Am|_E!~{9s1n8HmpeeMlcrXIo}5pb|$pkvIONg z23?P4K<_DSuZ^%1^b95^%ns{82dQzV;vWP(n|DmtgjY%1`x@=IAshp({~Xwc%SljM zod+Fz(-8aY2(+ww;0UOlEP;ohY1@vr#XIBy^>7`p1#d#{IUL`+sOKv<2|C|pg+IY3 zw1e}&5%j9i`|&~0eS+h_ci zfR)f2!ry5J?TO_qu+IoVw{M9OSnnni&VN^tACSq2WB45sjMzTTC-j;%+VXW+ z8L^(@(f@^x742;svhV-Nbgs2K>*ly@f}BAp&VTPpbKMN_-ph5Z3ep3~fXqU!&>pTA zTj+D)Z1g{&dzNc3J+cm|h|EJ=d&VNUk$H&YWEHec*TR`_8tet@!qzYmv<#MQ zIJAGQkNrCy*@2i}7vvaH9NC3rLy{9G3#<%NLfbMbv|X)>dDex!p?P^$I{;Fhz?|6t z=0Kdk8zT*o6-aC3EwUc5zV_7xjl@Q5gK)@7Bn*-SNsnk>hX0Fr3t(ULb?^tZ@tp|)&VDbcmRxkxo65u%MI#NEFB9{CH=Rx%+Kxo!wIA|Z%z zhr*@E4#fVtj&w)7kB|A4mh&9fe^Z}PFamlL*q->>pM9Sev5d|mwx#`KJ>3_zLfRp1 z31h!3Mp7fAku=Cm+|`#M+MD}!!#m&|gEzTc0ed1_5a%)XE2ftPNyv3I*Z}E*Xh*}K z{k{aYL}nwW(MQ62i1lzSbd4#D3_`{u*2gwW0guCvh<$hf8s0MZMDGrrJBA@65XYF~ zV0c20R9mrM;vxr;w$#(PxgPCW2+l(P8Ty>DKXeRfTh8_MpmtzgMxi%? z4Uw8iNu&W12Y2TX*YyI>`>yEFIMyX1bna<@v_*;%t}IM~)I%oVZyP%%tk)gHIv2rR zI!8$7)eSHeV*6x9FNK`#kY!@O`UQVCguZawV->tBlW?Ym8g zZF~U#$I$a=>o6LzPPTm+#Q7><@5HlwKM<}nT!5}U_4@o@oZxT&yXV=Cu1)!lhGQxP z@tp_ueNAUR*ZK4(odhrk;r_(W_fo8%=Y5W!E9jkIAM||C{>zS3BF>M{aoYiAgO)Kg zvKYyYz5_ZpIvy>fZ9N#VZyF&T5a)&}NM6J~aGkWAg$UOddcHLewxOI-`|AOz}y30LMXXLfg>J%)2%8HubHdf0_^DAeN;Wel6feSRJ~~Xm{7qJ3{aOZKJE`ZD1r= z4mzfEPk?MiV&EPI@n05X9c~4nZCV35uCzz($~mzQV*fe+4TUEW$DiZDxy-ho2$N7= z=PdIn4dWyBpZyXCv5hTDB*gY@L-_O1`O!2?cQ~{z&eyhgBSaf)g@nbwFKkIYwMWaO zJ*Od^%`gda2HAvuALc}iVI`F0>4m>gs>$3ZxHR#aaJ1Hj<|Nac07TuJI@g3sPEASz?sncj799PF6h=`|~*dx-Ua|A!CuA zNDdmUFWi8%LMjo@vN*5VMm5ksBX_tq|AELQWF@+`=>5rLXnL*{?%#St+p!D$5gNz) zq46*Wy6g2|#6EO zSQgWBUeOM%=VR!&)dpk`VmRBqIua9comfe@crZKS9RCpAu~CR?$7fP_9Xi+9zxK@z zL|a^d48YwqY-`8gKKLti{xghY_zcn+am=Q}U)zcfoqx1h=WoZ1c3YS0)KHtZpG_k( z>p6|p?_jpes571OoPo0C=n zmYf^>{G8*%(KLlPq&3HKe`2`#g0mTfT^(SGtFw!3w(t+Ekz9kk!&D`XaO z@hiK+g~%w{!F6T|Vn1s0+Nbuk8?k*4LEGLn-ah#kmW0}o^-PPj#w`bojaU!uzYwhV zmD-YRe4qRpL+zjev>x?!N2(&OcNGxJp)HSr1>p&p8)|RbNdwv`KJ%fRn=jMJWL z`_uZJM)D&2kh6$sxPEF2tD)}B{npQO1a0bXeRJCZD1PV9qYDDF6eyhc$wTK>T?ZY1+PCFfk7##= zkoTnV2s*BE5&kcD0$ql{tI+edJg0Sh+Ln$(=VS7K<+;rpQTQ8$uV5FydTm znOx5gB2y9X$Lycqzq&b3oI+OMZoZClx-jsrLojTM?l=q$9gB_`$AmW532B9HS&JZ( zkhqWB% z&W0vK?acCN+bhv$LCau09V1KOCL#pvj{Kbew!l|#2Q=T$T${G#vfnGB+rLX-c4(g# zL|URdKCdF$iEXBR+TKxMZNz@CMBavp*YbMlAS3u{l`A~Zr0t+Ly%_bxS zIfv9l{z6>WT&IHI8-=`X!87m`oC_x*!;t6b&UNNj4m!W*h8v)3{O|bZfwom<7!DSO z&I!hgh&~P;LY5&vBi4H+LJ$?WXf- z72G~TeHU9bz18gUF4hp7nT-0wRuMd5kGI?O;e zBHk;#K^i0XkfF#e+?^wAt4zp9%2JT@u2P2Hi05Ga(3|4!TIKo{r~}kKn-a(JIM*cQ zx(Q+IH{Y3aF7tf>>-H2LfzG>*73c5Q=rOo5ks_q!+H9M5Meb9!>M#?m z3d13m(RU?&hU;J<;sxREdGcr&1bxrz5dQYHV>Arc-v7GpNyl9luC=dduqCVmt3b#5 zW!MY0gUMkbm;hdcRf*pMYJZMH?aF$`LiQn}k+q0+@+UF}|1;3B;+j64c&lMvI2U@} z?K-Djr-sfY|00edL4V8j3NN*nD;=pT^VIFQL;akev9Nwdx|H5$8 z&-Jg|$N%PJziXf!_;*HQ!at#Q>hH&263*YVxIX*66YE_W{SNwh(k+L+n)D_^&*mL> zi^;>j=u4R6uphD;X+oj9L4Su6AJ&J4@%twAiQ{i0ozGHGFW*}Vp`O)Y3o2Ow|Lqa} zJOAF%my$>Uk)di(%uQ%?};4)xqf zm}>7BQ-o;%b3lKir>ztwTxa~#63=zu7wYf$h(Y~Jkbv(_6otOeJrwtIgnduATF7nW zN8ExD@5yJtDbVw?4AkFuKvzQNeBXh4g8v`Twa<5W{wDqd>h%uhpgk_brqthYM=|8K#f!zGnn(;UL8h zHHEOwIR`1zX4)V+?vbJM%UbAsAA|DyKFe-s{{CjRHts)DPv=R$9dU;E{=MSZq_>5H zeJ>?He1Lx{+-*KG5zSo{|Ux|`$_K}>5qZFOFbWkr#!{+uZeCMN>G=&#NS2zZ^75- zYv4xOMfXFv&nDatguhSxi|9k(2lPU?7o+a(SAEB5I(hj!hqL7EZ_ty&6S&tToVMZp zUKrx~H)#B(kH49%NL;_!;`mOA`z9EUxJ`)b9PBp)T=Pz&mw-RfE`@RTJ6JPF!|$f} z+X?^fj{BV^Fac?d!rk{4kJB#YiR*V82GP$i$S)l9_ujAZpG_R+aMzRN#7h7};AP4( z3i@{lLKChu^$5J*O8xJW-nY>2Mi!u~{YfuBy1xt9N4WdM^If+~$Zq0~z%4h|o4Jli z_~y`Wu{vh`&6sUfk9@x%zaWi>Z{JKq%1}1vH_KK8@pqm*Xb1QF+K=sYl{kKH#dXx* zd%l7GuHAjD-{x&d{Did2G8lsHZ+=oS&K{zFvAy7E#5{Wv&-tSjdJ*UttP4lt*9_VY zX}AtenQuaWn^lLf{_O_8J$0MD^gY|?xI3;|;GUm6U2mSiC8Xy!+N$7Q2>*GcW8Hjb zH9X?CSlcsKc_tA5E%OzO`WIt~I_`m$340iSoCCj2Tmv0@zLVgjLj=fJhNrJ)^m!v5%K;eFaCF8;ls`;fuNIMO|izxVMuxt;;r zA@14SLpuJNP;Y<3;ch)$gO)N2)tN;~*{r6IWgjej?Ee|K;Pf5)l6b$E%m zoGAp5xXcTtn!3iL08 zi$mUfVFv0NguCDI$O~grHuti&TQ$PYM|U20K|Az4l{2H{G4XS`uy!afj1B{>>bJ>+z238ib!seZL`mSajdDolcyL`1{R8|ISK7;(4F- z$#URt-*x2r8gxxjo?^BTN+9o-48rQ79jg5^HewhUVts&OIV6J+=DaGA3(nu zKL`3fB=;8w(3g?dA==?b=-*3@3J2o%9UOR5+1zYMDqwm9LE(iU}SgM|zV+o%-wQ5UxYe^7qH9fqzQ#jzLv&d4;v zC4-Y`JKw3FjQCEo>tQ9zW;up)?Kk?Iht9+G=p!k!bN?846?f-5e}}pT|GF?P@p8gN zgiV5*{qOHkS5ub5(D%jtmXY62JcGZ#oxDOEf4`D~x?Up9_oV-du!c8m3&K^TzJmyx zgEm})e;f3=#Ce8)aneps8vf>>AMrDi_EX%RQ13}dG~%VgPWI70DcKV)#qB)YNSOV& zIWLVOjC-+_q~Z4~aSoN3bo!B33fzJz%X{26qSr-FVi~BT^M>~xV-d$!9_XHm%fS1c z&#C`s^w{WSNFz7Aj&8WP)T=05hkGHo1SW!xx%ANQ@fiLBb&CU2QRk-6Z(-O^^%2{< zH~J;QdM}%tHoQxo{w>l7_`k?7!0~Ly5CnH zO63Q`2!v^Ydl~%Ou^ze3xhI-PyStBbzvMlxXN7-KX77C}Q&mrzrcvl+$$JTP>qg%3q2G1&KEtwjpELn~@3&SF{tNW? z+4W#g((i$d?4rK;a4SN4_-&E6uqLdHyT4uZZ@eYI-?J>|5x;q|0%>AhX-DrVMv~_m z+Q)BL`CWjI=zc%IZ>ein?k5Akfu~)(Uvj?sjkOM1I4_ zcMow|(>5W9{~Tvoar1Y(DWGSU)!=Mc6Z&10htNHJ9>RV^p8}6kuk&yOx`yX(<~#=| z4)^2ax9lFnVbF7yBeYRy!v0KK#N_%3ZV$L#%k?1a#j~<7*w6Q{25s3Jf4^Pld~uLE zl)-%>?Jym^7W0hXOXz^T^rF6L;BML{74wbrb$ZsNu!KuQ7{}#c+BOdQEb>o7TFuB) z_p8{+59t04Nxv=J3cWPCWlc=}hbg=Fe&L|cbZ!&B9_{ca*U=Em?7UHrIIE%Gi?Vpx=9&E&?bw}vlFH~*BwYB2zQz*R43ey zQg+uc_e-va*3;iE*j|3iVhaAgvtORFRKUG4@oZDeah>Z+Tzgi!9kwQ{=TIvN+Z4B2 za4t+lT7?N)8UGz{4SH1k=2P$1a4>oj=>Gb9SP7l11AiB)A^K0${}gWF@qf@{*bLbr9{^%BQdlGLW{WY0z@5tNxk|^YJ18URmul(I*N%E~h8JggpmGG9s zdvNc=yti;4u#@Wxw1fM&eO!M>+m?j>P1QPt@mquLK}x_a=zc_{18KNtcQ50bSPFdt z>HGbn-sE2#&ZRwW;`RZiz~AqZcBL%&D3=Ea_U91d_9oxGxX&luWO&u5j!ALLguQt0 z(j5EAfZuD_9QV!G*E{s;l+SN}b*3EJR}tbiBChLI8~81G+P)2-`vl8y6y5KX z^41R567K~1K+<;aww^Y+i(UijR~mXIxEuzNc0#US64z&7o>5LB%mduD7w6Lbh->97 zSb{vK!$#;sVIK5&&@$|Re&3`SZtoHQ9*^IZ97%i4h6}Kt+qBbS<|EVhp6(&;?rDp{ zqtwZDXBhk8=A<`~d1oBuZ-E`1!@WLsj}2!M&OVw&e81P|clzR>k0SpY=!0mF5rlIdvQOtyzA%LG zEYJGo|izLkS~-IG|qVO%>dO~<{}Hs~{z?~zMfpGRhp=Ro)?^!;V&9>ee5j3(Sw z#C!T^xc8v_p1{1=PdofmU{CH5L(`6nX_qF1+m2p`ayS+*(JmKo%ffmV3b&=$&koXi zj6H>*U&Fr6Qjd%5pFMl12_na~~KW!&Zb@!D=$R|DGy~|D9LMYmO((pTo&XE@NAnbr%iL?el z@5dY?p5sIzZNHJ9inIq&9?uaIQh$H5)&W)`Oa#goANQt|%XzCTk`Dip3Hk!sX*6N{-suU_PJ!+_4|Axq_my8L&o=aBl-F~i$)r;Sc~6t9=Gygd9Q3R-3(|%%Y$8Za=-z%E^uFD8^d4>@;oH+* zPhkjlbp`%RJNg}C?_>QAT?^vvr(OKrY;WTDEqTvsGqRrbL;nsticcN|VG6@CKP7|x zXwNvbnP&!`Rdm2@D`|M^gUa7Oa4o254e)B^Kt(kJq>C5x9(hX7OIo?@6a_~o5@X@4N2!H>Gq-BqR?J> zNYAsp5wJVub&efJ*j9w`+mPN9zr}qJb+RmH;drl++oYe7G^>*TZuB*j=QTV9onJg_ zIu1Wlo1xF@l0gsV-SlZdBX zWu|ObNjm}8iMaMm%z5=NVXmRe>xBIW_j>5z;49LoOkO`xw;w6TI&{xHJd1M=+8n(q zbYAnBL^#4NgJo!=UWD61dO^gyfS!tUTI04B1`#GZdGE$AGwcHI;ZBzZ-W%M2TXC*~ zadXbAg1!T~4|9Ll4w*`M-9Oc&J!`-q>?#Lk_8DX?Se5qdj{7UF=Ro(h3y8O#vU`u} z`J&Gb1~GsA4Lf09-oyTYePyTp_AtNMUp_;5KpH+LbKR)K^%1W9?oJ=ByONLZdNhW` zaeq&Fe7-p!|G-%UWu^bU~F{P49|h;5qB|eX^Hy>=^aO3OMXST-cLEgp*N*m?a}{2Z-PFFaxH?P zDUWvNzQZ+jGiiEu8isVQqJKkvo`?CZ?on_GW%fR6Ib04G;(i%-?cecwhj^YL4W~SQ zbK?YI;-I^x`n|f=xORSlc#0_c_Q7(%TC|D3fK#Lm1~t_kcHW|A)A~4>T7UMZ6w}&oxh? z$Avu!>;A-b%=cWJ1J_g5QC!!f{c6G#tOvHsYWNtv7VZ2J{S@^(0e#k79B!s;gWxsn zsW{>CvAJXAu&0q+w5i`v^9*)AX%`^B ztb{KPw^RNKxF@IH4JhBQ_}3)tBif@OX*GrJ0s6rV#PJ)Ddx+ybpwD%4;vPiYwdezB z>n>c6#_cs__zgZoe~5cW;^ZUzSR^uK>Wf?>-BPe9`4T-;2g;ERw_l*`HywAs;qZlW z{E5DU>kWjfi&W>jCTaD@{Tb=oNA<|hbu$c!`TRL6c4m9FhFj1R;(m*`PY9=fB+8Z> zx<~Rn@&MQNM?KP*gA^d&d(h`W?!#S6=5pQ5yh%r!ZjY4Wx(@U_yDMovrCh%IG8ew2 zZ1bRJbnY#*Gv~6RlqnPOvQnle@F?!i_0EUR?Vk7eZT1DE=XY3o!iKO7VP_!P;}c{6 z*S@z@g0Su}r=!0_zldHDiGp~Kn4GwKX;;_Je%M_f!X<|DaX(KxhsE9R4+3OH*d|hMREjKzR4s-t)Tm=th{x==t&Ueylfnho@bqlaJp3^1F!7D64be z4)iWac4R){p6VO?zmQG=!hZupQ3jvi`3^#A)NAC&)-_ZN%CQVT_x5X{e{;n(V<6>d zN8Z07F_77W_1^s`>Ai)X9oR%g$-gPO`~Cg!9)0XwQ4`i7-UaAh=mGxPUuw$r0(vjS z5*$dwbnX*YKBs)8@vlh!K7Vm8yp4NCSP`*rmg61|p29sC@jIWsPvN@@kr4Ot^GUxK z^t~9LK|O-|@bj!E6=l#4Jy)VTLtUp1>j=A;vbw+ehq4Bdhi!WZ-E}<&^qrbPg!lQ8 zbIKu@5YEEQb)G1p?jpw#?;VEVu#Wc3OWb_)zwb*uhpw+zXzy6K`#0&@qNgKHTy)p3 z(_H&pCIarkG>ZCN?9g^hzi@R-HA4xg!rtX2>N5(zoq?rPa!gH{fS=}w-2P35Iqk0eI}gwdtTEC-h{pz){d|f zD92CmFyYTa=h2p2|3IFHxt>heAJM-jjq}j4;J(Fs?nvl4;BV+Y(>O%@X!tKi_slv! z^qFHx=yTk^;T)tn@`Sj%;8E&79v+1DLpx|W_Tyg#Ucj#w{1&?Q1aqAh&LBPWiwXUH z`vuxd8y5y$S0x zk&}d3qB~qc-PXWV(6L>DbbKZdfxMs5u8xTd^!pFQJqKN1TGH<3?|$Arz&*lfSLaE) zJ{*cY_JyOcJMCmAc6gESdl^78;A;wA7A|5=^4aQr^7dTQ^LXb!+s(FJO8(9RrO9_B z91Me@??7SVp+du^&~@2+{>g;LWCQ!byl@xk+=V$QgKg$m>xP`ByxN2BLJ{P@XYAoZ=)(y28QpWIw8ZtC%QJGH0ffdcEBWT7eJ!v1BHx|qP26Yrd$!iY z{9z*EeS*=*Gb-`JlAib1nUT9(|4dqO@k>US3DCdY)P^`|DNl5GiuU!KCM&vh9BF^f zS*u_s(y$#1Alr~W3{n*Jrps#I?^5>Jle0*N>pjS8I^w9oQ3k2HX_-?8`d6fJ+J27D<70 zM$BU`^c-jb1cCL~y|Z)5P{uj8BB55$?}zcsjvY8IJeMs3-H#-NruCM5>(HLh;3+Eh z2JT}$z6#r6pY~%y=y~T(>{2~F^W;q!iFSSof1`b)lU^Oln+txT{W`&0^z(N3lzbzR zS31hk9Qy9iYUp>9AH%fJeS_y3RpDaF*8}<-)HY8+y?%wZ_eMCLJROUdD0d&&hJJS5 zIYW7Tw(_r*}U^^r-*S1k**dI2A`C(C*7{-EC$=CbanUr%LJVkkGz$`EwYz4K0u=xA_%~-;F zZ=wA>higeg8*=|!yaY=;)GA8j%d_M)E;LeB)8 z-%et;MM=9ScG?5xK<^2!Gv79cd)brdACLBq3cDHysYHQni;m>e1o|FLAvlfv-IH8~ z?u8aX-$(Lq(0PtAlW-}Z-_1=4KU0s4@F?l!hAk&#${}nJJ;UB_ONKDdlFPR7N8Jg{0lza<9&-~KE8@Ss??lYMR1Ahbk0!)c) zMBKNHhd;vRFfuF%OTqZCJais&Kj}P_7cPSRu*<%%2=u;WIpu2vuR`BlYlFLX*O2h` z&l1GBX#i;+hutXCd$Xb_^&pyfpjeEQ1}_K z9L_EIzPdX;oRb}2v!VCWH(_cRiuCO#$3vZWul?lt3r9bJ?-u?BeZD>x zR>e-6!9>in1z-Z~*Ks=mJ|)i>*t`AX*~4;4KUm(ui2ak8Le_>^$-g2TNxnb9a$(tj zz%H;G^gW!x4aX{&++1!Z6-Jn+Mm<$PYQ<+J~_1Q^|x;w zrL4_6fHz1>JGCvFLC4D=I1)~V zy`gq#`#27q&+otZw}HNk)DN~M z{{`?ZTm!!g%iab0w~P)!_n*#(me0Q0MEPgH^ zlQppGtI%gmN1)Gr++!5P-*wk>__5HrZ#>ePbRBQn^Hk`wof)tPbe@R~e}e__KMk`H z-oA=Xp4Q)up7VguYm&iTf^vIwzUj#bMWk2n)y0r(4a>{!1%a0QG4w?J*~0J0Hr9+{7vLY!Ny$2sJ0Bm&`$ zW8Wo5rXVGdJ4j8$J%?ka0_+bPL&s7TI03qUpADG?1MiS-heHs@Q(r_|)gHc(S9N$C z7J~MX^O^Pg9?pbsks*k7)(ts{I7jY6iXo2q?1=qU1eu29B(C*$zq=H=9~%U}(0@DO za_q{s@b7_aht+Y9O&s5aeF*=dU)Y+2N{+qc;rj63DEvD>g|z<{*!>RN{d*G&asLVX zF9;ib{BQhv-fcg)2DG`bK&ma>&%3EA~*o|-h?X- zy$?Kv|7X%lgMVb`yd9e~=ivVw@qW{Ddi%v^Ts`3-%3F`aAp!W^GO*M^?Ly$D?s_`a2Ccut!IH{biQJl?N3|9Msr6?u##L)XsYA&xVjwKpWLYt#d1 zyA&t?XmC2r487;sg`fKV?bKM?ZgpM`W)^pG~qAP3%^TUsXq!I3S=*I+HPx|!VzRhQ)4{4vAAFx9h0UjgFFcEU93+ZOWy#;&)+rTo!?F&Pr zYmc?i9TyScU(kJ148(Em9?LN|4Jn47w(eeP5^2AoV3ws9^q##QeKZsL4B9+rLC1vm zx=G*+>e_<%4d4ROsEYW0z-av3w>fT{SN=giUIRqid4PDf-I2Wf{aQ4nEM@u)hCt6u zeCD4Py_h=mdA?(3HgbmeQJ{U7jWitR*6$;Exi9d!-xRK2BR&JWfb66^J{uVc-Lv~# z@)q2Ln`Z!LkrKppZApdLruNGv=sM=ut;hAhNE!5za5g-F%;MU3-I4ahi3Y!gG)W-c z&iG#@{pRT3;O-e+ROsJ<%?f@0AqaZz5gPjLM>zNdJ)!Q%FvLBwYnSWm0n&2pFUIYd zbt4VmN4^hz4muF}`|I2IXTyC3;eW>6wZUf@o2hps(yEJJYur4icMp>f_9kw4{KM16 z?hjMIPWage{Yb|>c`DK^ioOF{er?qEWWsUnyN(VUm<+eB@F8WjUs97uDae0;@%I4tL0miM&m)dw*=L0AJ#*pa z{7@e{FAc*z2W^>9T zhR?t933QHk%(!I#QPN%MX!l`q%9NS)*ad}H)!Lha5BtC+|Tq&2WZ=C&jSf}k?=m#cb}qN zc19B5=6g8a7vzDdiBlZf_m^Q1ZL3YYHz`0opVeQ7_CX=y93kzFFdaMvZy;}xrNn85 zTUPixbkF$$Iv=|?cYJ(AFN6D3Sb;RT44j*nfFvK7v*P1d4L{eU46r`B>#%dLZ7~2= zg1*Z;0Op0>tGy%qVt5aEi`+!q%gsT;A_b5-i2GUBj4Q-T4Yi@9(D&#ZTXk@EUD|=W z_cl}UTMc6(QMk^BtVEVjANK~16Q7IBp`Eo^e;a6D`}aOS=?{+(egWZ}54zbewh7Xd z>#X?s+s)UoDx6825ikS!m%!iO%EcvY75E-{59L1P2%JKCN61UN>xCpHu6s@A+I;x! z#P1j4Odzbb9+@;8Cnexg=$vT(WPi#yZ84?5{N;M&{Ng0yeUIn+NnknX{O)@| z=b-y5`^|7`K^eFcwt$tO_l)xp+w~C=9yg}pz#2Xm9zr4!-!V~-GGvD-DPsb-9NCJ$ zYeYWiZ=Ia$%OS1-j@cFDzYghw*v^(~3T?O%o}~T55oQ>=`;;W;x8X;q9s4}=DD>L{ zKarR3jvt045$`+Phowdik^gbx%_9HZgz@(*FNov&r2e*Y3;y+?`vLF2w6FPu^B$-# z@zNkc1a&U#0vA(G&t5_Zdlk9|dda4n~~+zL0iR=v;G%>t=8pG6wPfyx zg!=Y_Q^2o~{CWel=rbqiLfbbkAtwsPJ~PW!ijXNVjZ z7R23spYN-Auj4a2%T*oGHh&~c733Ca$3f=^8IqD8+)`ae9w;^9B-#F+ymfGlOt|JouK5PixlUN`3rC*?HU46torO)WJ zlUqnG@^+tH8QF%|r$u20=zZlZ;v9z$N#iQl&Ml{5GFStqg{~=G5bx0oA%zk5&S9YG zx>p|o9am$hr{gIn_1ptX;rz|N&mYQs?GN7rbpAa? z`>%w)r*#JU`|E@7cj8@!mcf7S^MjDg46uqdpH*cUHhap?Ns zTvv~Jx)1i=$9tvW@F29WJ#z?!pJ_Jb+CK3&<#8VN{{0776*h!Eb6o%{6GwY?kDQz9 zv83A@4y7%3!LD#W+ztD}M)*4qT!F5IwwG~k;Py9RoKu%U+xGz+LOzx8_q{OduAQuh zEAY3?D?;b~UdUWzIDY15TgJrCdkfd%u&NHD)e0882lM7fOVku;93}sh>oiQ#CHy`ex`Mg^j+^4Lig{sB~b$R zeaWEbA=axtev_bX+Y$Fa`;Y}BG8PUZlJ|!bVc`A%dQVvlo`vp(M?m8SL({xL+RkYs zpnDeY2YN#Ld_4Z`U_0Wu@7WKd;O9H>tzkRTbzYf`dojY=zYE|F+}y`FUI)WQ)W>l& zfOdZf6T?;TChcro-*NZeKNrjlv*NE!{Yt#er02a!Q|KDxy!HvdYvi$%{N3-hp*)>n z0oWaSf72d1{%rR%#Ib)KAg+0yVN8S-pzYz!!6Nt%`5l1nIS)b43B8|Li`+n(5cCwx zLAvhu}Ll;BGqWgqY_~nH+;1qa|a<~t3UQdjhb~gik5wslIxA9zq z?N{%k=fG|F9frTdcknOx1JV=!a_}FR5PD{r5w=E;3Ev05%+$MwY}u)c(NSM8@|)s3r>K8 z;X?fFle>hsow`EpbSOfQzw>^h|0R^d9>FbZ$Ba3nJ>TkVlAn;a$-A zdKp{^yF=F%_a&pC>ASaaKk=OKat-{GG#zL5zwLh&TK;X&IeRG_McB!34s_q~%4;M6 zgf9QvNOF7=cnNa(9 z2meK{OL=mjpG5b*;UU+y*Ky=0#B!B_>7nzE=ZB78@AZB~Zwb9eDgv{?F!)V{uHBB0 zptVt5e!Iql?lEd!I{ev$ch1NsTtvkN$x4@=E;d&IeUC%X3rEz!flMd-t5AN$>Xf&CMj_VaAVcgk#M z_i?YG^FdnNM^T^E=(b}?^nu6|u5Uu?S%z|0fA1G;$Lf?LJ^F9(61wwLQY0Os9hXO} z-&N8rh}#*s1Ksv3jP7}x^QwD1{Wn6A3asxk5C60M+z;FS4PYX4?e8}FVA{uj-rs6p z^P%~B&p89#XATL_7Zd&kdOp%~oViw4!#ye2_MPLnJi6m@FM2K7<8SEi;T{`?_LHm8 zixbXvv;RF)ckEOoUTyT-)(73Z#vskOcK^Gd{A`CBl*2ut`#{_M6bwdpe-jnHM(*J5 zTw96jSkU?M57Nzq-U7z?O6wm9NsMltv^Q-i4RQ*(g8qecZ7;{Kb3{to=LDPtod-NG zn~0v4MeR5A!|1MMKD*RTMiXy7`cBe01Y025ZxqU*du8f94*e4CVPE@OtO4kY;W+dZ zxYtGZy?OWE{m^5fMp{lXIwRlkFP=E~^;NCSN=?>?526P$23>`lZ2MKB7Aw?W^`M9`su$ zj$eO2)F0h<(TkxwelMZ>?oLVc`=qD8w(|?poccRXlalXq^t{l1{TaG%@Sa0^c3<%` z?oE--==Q~Iu3gKt>%cQ3^zXRVZYt}B>_@`lUJr3hdoQW2xgKd(f5N}e{T-0=fxj7e z25qmD`1_kD`}rCC9{m;Z|3M$gwfm=xNHMO{Q?I*RN2I=y&`;0~+;^S)=ONucY6 z=}d-o5&O}0UWKGUp9CG-Ik`RyU6UOrdl1{-c`ymrp6!^Q??hUklC(!r=(uxT^EpCN zbf2d=F1`PA-{2lMKkl}T?UWP=LhnTV?sFZF`tF84f3-iH&q*TiPH-aVx0P%U!`Y9q zh?fv|pDVboeUG@#y6!JU&T(zIwGY?9Nw7F>H=ylcf9FSc-8qA9`Rvc@xFtXiA*MS3 z8ty6*9eIfy#{C<@e}bdnTxk1O&>!mVeP28DJNWNG-;Hj%tI@Tq^w9K%AY2CgY(H&H z@jgp`&%3l~--$1bzJ~hS{}Z8cQ^S+!|7(x?=>%U2?xrnClye_G9~|LfrQ( zMx5`hPf4yfA*0a~qu1s-8yt#W4mLnf18t{wTx&P&bw>|^nb8x%l+g2P+hI5?h<+W` zMIQn0p!bC<(Lcj{=yP;O4-YNR65Ns@j;FAQ<+lIcQy<&uU+CO89S%dkL4A{>XMwKc zuV@GV^+tCd?FJ_j&hMmY=M#wcC-lCvF8-0YHs8$1J>*x!{xaW zco#SST|u0$#=*`=Qe+!x2~(EVY}JJOVBsM+(=41^c%?kT<;D* z=ePgOqwdpP_u{~UgbN3?UmNEod`o!O8_&0Y!1*#v3YWsmxNDd8r_cHm<9-U!4r(CQ z$GS3g1>XI1JpDyIv}^CnwA*i>_P7&!G2C#dUDtyQ3jvK_gJ?tadC?tr7<_avSNzj81Jbl+|J_lM4d zU7+pt6Lg>LKEnEY9+DS5G;}^YOnQdz1DzjpLFcDOxLH5<+{@4(BU`xc3Dv_Qjt9@4 zwC@kp&+tB1w7&_8D{w{h)_?j{~jz^$BMYs(7KG1Ns=}vU#mefc}WHkC3;`HIVFtmRDEhgu& zL(qQoodnm7C9oK}?PGcWfN{{n5U)RU+zrOv=jP@+1v*Y{LTx6PYwflRk`Db4)E-U4 z^`k4|Ja7ZXMJkZUVsy_1E22Mzj`z5<#~SE4S!LXV;eGTNurRv&de;%}+b7^IkHUk{ zK5?J#xN?503L``NZ8_JrvvcwoboZDSxvmeZAsTMbX|@@dzfA-SP1v@(EYgW)ehZ#w&nd6y3f$Q91ou7IDfkjDU4nP zI=-Vo?QR(ouxDt0S=J<6H-(n$9cgY)}lxC`!u-Ecnz z52HVY*I-WK+nxiUYsNvSeZ=J2dbfm*i+xB$bl1PZT=#;G`)9}ubo<-%SHb@1kKjmj z-<`6Y>ELUa0yf3n`N;7Q0oop+;Qz*7Y1Hk+Z;pFEco^Mr=lu7OYxj43kk9DOafa7s zDR)>#qL^*bLqKK*vd4==w4P zCWYsq^IT@capPFf-droR@sh|^t~bMUi2FSC0g$Q&-k-UNu6?*~({5ZxGQ;>#eKYR< z9)AG3eDO7WRCMnjT}S4@AoQlNIrMD)d#D|mZZ4Puxx}^oYn$5Mw;=Zd^yb??{X;%|9))UELqp=3fY39=Z?Mjk{;(wukMb z{n|dRcWbzI{i}*hL4S+bp5B{B!7Vz}e!Q=4{C_;12i#BP`+#4Pt&o+ySN4d=NcP^z zCVLh6MfRrbm6@5nWs^--LXo{!_9iO->pJi0e?D&4dG`I>&phLMUg-L*z2d^32s=Uj z`#|>v=41bHef2$2REhW*TJLDYUk!`HRQUVMAn32qdFx-ehVWX5V|_lN{nfQ2(i?G| zc!6k_s_1WjodaJ$pTX57%ze?9(04?7K(DvdOWLoTzb*GA@khhoVOQw9W?9YPZSwP( zL{8lMk>W@fMElw2_7Uz_sE1@mS|hgeQ0Tlp2Bw3KH^*5+=riM*a69Y?owpZ4$CrK5 z>skAw_BjgOPu_>_lQL7LYp&z2Bz}&Ii6J=+_W6!smfx+R1vlk9Y;0 zr?f*CsGaPS-q#-jozI=0+(-5$z3| z%!k|OvR!dI&YUaVH#?6%qyC#Yw;wrn)yCZ6e<&#_{~G7sODT;sK)hacZ+sA`kGNl|gSc*a&)9d_W|GEn zW&er>y{`I$FvrCbsJ*-{xem)f+b*8v-5w3-fuLrO$X%nHFW7liT z9QeuaptgC8xX-ABpL3J;sYBdt&}+oounTnmY}-YL3*Za<9rMmN?)g_j*JRhN#nADZ zoqTKq$G2s*K^7s`krqfx!W?7T^atXMg|1`n%}=2@b^As2{<3x|NexZl21O)H^FaV7RqssX$T#2wc&7B5#EE^s|e!y z+6`)N>+5x#Y(*v_(eZl^x^Hxz`x>@`(_lqt8*86sFc`1! zC1nkR1@LbT?V}$;*RdpU3cQM(LslX2@f!s5LH9zoOHz0XIZIk~aURgFRbU<%6S}tf z+|0FR6tr&6x88?s49h@mSvvH0tPaJUnDqAL8Sp4{Pw%*LUUUCb1=`lmBbKY(+y|W{ zes-i7@;{^lew*PE(msV*p*FlgySNYbn$h*YD)f45JhZm^A-3(0xS<*dAUaycjGG6TrQQbBuG6b+j+FMP^Y>9_U!}zS0Qf2r?I0ihPgQ zPfj8}*Kxlv4fZCVwb1#+_}0aDi=1y$5$7FP38sSX8Fs-{@Bnm9yG{D^h;ve7#C^^L zI0?GW6olFK0IS{ zYz+=n=qI_IoMnj@o;{zy|~8RFXa z3o@8A&bMix^H(YO5cY!3H?yF2v0omC-QYHu7*U6rh~sQK(hB(&DUH~-G9$ks(U676 zWzuSwy>J9{&N~E0!?mz4G_Cz?Gva#G7^#UgLdqf6sIdE-F|aJ$2er#3=p5e?`5*Ef z;+|_BG8c(MzT06%cmXbj>a`q6j_g6+N6sLw!fz;hkSz=-+u8wWIECmnTfPS zW+9Cc>#iLJAg1Yp#6ub(!ztT3s%I`}{gS}@=&wG`Ezb;t>e(Fr3eUn_urlJf7>8K5 z+@zTawWssSWoW<1O#4rTw!dR!6tpd!i(Nm1y2GuAww{RmjJS53M{KJZlLy916kWz^EaLd6pQJMST$FLf7?^6l3Kn(Y~sW?>EVsJS1EDCcm z4zj_NFb(ut%RX0(@aS+P{EIa1VQ#{25Ouyz*lFl`eG=Y)$6+VR{T(_^-0Sv7pFiN4 z(BJkygWEMpyStCjeG9pY3<}SqK(7I{@lzx=@uXv3JGo!@7doe?X9vW-mljEg#7DH> zKH{W+4WR3i^X0p+Ahe#Y(Z-ty?VmlNd#+Q^JRAp>?b;>(hB4s>$eYMkME_#w5d*qL z{zII*vtE?piTFbkBl@JBJuahV{f!mO{oKJzaLoq~qwSuppeP8{$LF<1W zI(`>JkB6Ka9v3nG$B6l#qaN1JdzPpWJZmw&_1B#ef7{V@)?<1Y{}@z%*Dv!mFIgHt zx!K4Zu5sFN6V%^56;%)J0c!{6cXg9E$)Q+ujiaBf@h%WKM_%{El_=P5vbj~=V$m~-0GV;jAwbqOB1pQ`Ks6bzav=! zntwlNJ=$X*^S=w#CkpY^SAER?E`I90f^);2xAjj?CgyXH|19q#JWW>$s?P%a)zdwc z>5_->4id&`Fcv`YeuL?sAm&?8PmZm)E!Q>7@SgZt56kyBjA*xO(EM&89yby5vA?KC zb;R@+5szX}eXfLdah#amcR(%Ay}F0ja>nZyy4`ykFAsj!a~m{Y%Th1rG40t0(a(9n z_}dWshcv%=Pfv6@ z^1B%q{y;s=*Y$^_!94^Jks)+Pg&x*xGs_zr0K|3LlU z#CTFW@Gp4BzWJvCJ+*5_MEkoxGW{N?`!}c_+Ryln5s#IK^%?`s z*ZI$Q+DpA$hdj(red{B}+fF^rw<)w;;zIL@0o7l(`NV^!8xe*(&h3NE5dF_0)*~}w ze*g8i(qVl+h1R1K{~6DDNnS;?dmBXebi{bO5bM_fQJ?;Zdb}T&W1WnD0UBR1p7pbQ z`-8L`k6zI9`=S2cgVxU8L$iO-{DD0lK#w$tN$(qm3`Mku*Ep7)gE0NeLDNq|%>S3r zPFV69`fBUQbZX06yG+}(N|J2vts~KJjTECJ|J@Z13tfAZev-ABv zsD9T%eoj6fSHt}3k%#4cgrE6GK^e!7_r281cdg}gXu0-R<1K>58w^d~7HW^Lq3u-? zdRz$eSq`nA_iT;7k#pmp6zD5*3kZ+9Gc%>)WiII24K1= z(4q&2{=J~~?;X%eI4iO<8_z* zHxZ9FaA@~TdUAMQ(|GQ0%=bKEkozUs7qPw{K+9W?sP_Rx{p^qWCxhyt+jPHk?%}@0 zc)g+FUf1g$20gAKrvK0G&u|+agG}VyFnnF;zdLmIg4**{$fg#`F&?oV&J)&aHhI|J zyl)YV3;LVwGX#2!V*a!~eWCr<-*&l<)eil?gX-aL5ab5v(TVh?GhgkK9r19VZGApQ zA644Uf0j28Wlf(1<NF4E}*s=lm3M1@Rfd55#Rs`R+HrBHa7x zD(`P<`*S)QUMKFKusH5mRLX1k%ecGa-U3U(K5#9J0uRA4#L+%v8SK3VLF%BCbPZAI#~?Iq!{B!|gScagXDE7rI7i zWA~a~KhD7I`nMB0KIbC?kh-|lYbP=rQMWEIJB66{7n~P>GpI~A#5kR?-8uX|fp5ag z*uNA06`}onCbYb*un%sZM?b*bjrhxP`5}&)BB2@ka?V|_il73gS$3% zwg35BjjFIY?GP1zf17Lm_EYO{1Kz~nZ_nhy{S|BvdqCIrC!{}1cp0dTeD;_ZIxjVY zbrJRQx+)$rfb-fg1~lG7^v%b)@4)oNZNIYrZ-5zar{vsr^*)w!z-;I>{}T8i{@I{w zpYNo3%`ptxCtat^?*(?Mjk^-=__+H)+tm2Q@GngIX}IUX63}O{@$t9J3%JuFwK$&& zofmw*)`#S8e=iZM|O5)CfY(l)2 zcTA|y=ZJdWhb62Nv<=3=CCD*kJK=4i_cC1w?DfnKczfJLdhA*J`tcJTu|1M$9Uq|8h_9>T}f&qgT9kH2Cjm>2jcwgJ@=c?=f1aL6a2mJ zk_FLjEy>4sqx+Js1#z)#p}C_ z%6Vhh3wkZFow96)!RX+8(HEY@{Q*1(>(PJv;y>E{4A;Zr_z#37ar=C!Dm)4M;qQHB z+xkcHHJ=AaD#AMC*vLp zZMQ5iJM`Nl%kUpgK5cOyAnkD6)nNzR&PnET3sD!>nuSOq#J%KX%5*$7gO8xk4fm49 z_XX6`@#m{bnf%o z)$543a1eG{iNDViYv8tjpTWHp)-fGSgWLP*4RN1>br9z+_aOEW?d^QE8hINTfb_uc z7j$z^Z~<|QSI6JIRZ8f6l!W*_h0mdR`E2PI=vW;}9Q*zRm=Ce-v||foH~y>OJ@_2j zPGl2YOM3kp*c947oXgG2G2#By`N!}KByhacr~QiIZ~t}=?0t!`_#b~on?nD#(#?eqtkgN7KM#h5VJDakny>Ty2pAt~cgI6A*bI8m+`)6$Bd{X= zC7|=7b#ZUue%p1Z2sB9^_$M3yZ5PY#3*B?9ftIx$9)*u#VdDBMcPZ?E4#!}6xE0pJ ze$6Xz7?vFX^v`fIE0ur=HTD`3Ou(C?h4BN8l^y{9s?7hK^T|AF0Di=(X`i=yzpKLI3`x`|=6U`2L-|4sav19sT~;D7cFF z)8HWLJ`Uza^iNLNt}W##w;lA_E&}F5zhUHi3%B#O*MLq?*6m;NP+#YZpGmg?7J~1S z&U20_19I1e_&J}aQ#hZqT~<8QogaA$(v zgO7%cC9gZk0Ls1qZ(x^s@C5aA48KjioktqKh}@q)hD&h!&Elo7DE4tq&qTZ=#LrE- zoUj;mOAqZg`C)UU84?RUo4_vU(HpvF-46ZU=XqEj_f2@5c(>q>@GbP*g-}%R9c|~1 zp2#uszK0}02oBzRJ~j%Lq1@EO_xII44=;ef zd#*Q#R|lJT&GIIBXp>@))&!yaDem52YpH=+F{9;^jR zVyAwvHFlZ}{eJmcSc&}hLHm;Zq7nMWLJCs8{o^|HKHy;V%L_k;8DJg!or620-&4}X zgnMA%2NNL~5p5VBZl@e=_YSfFsg4{(CLj-xmc-cy+mVm`&pl`X{QTZ@Z8#l%2%A%W zHyDBYSKxObcEPyBe*ib2lg}M`lZS1dpFZ~^{)w=cd$jJ<|1e=cVV6DVGzj|Js@Kn% zE8$Vx=ZTw)c%5Jg?9>^059Jo3{_hdbxuPlThQ9tr&2i^?e+_!QdT85~g08_spkwwl^nPs)Lc&|Wv z1HL5vdH4eQ`=V_4mxObndtmn;w$nh^7CN8V7k!>(-?Z@yA}=`g{t`nh*#G)me+}pE z4ecxWU^VzLOb_$JnD8Cwe)cry?j?G`6|f+5?A=FdA`6h_$PmQqn0`n-WH9m(G6?bd zU_9bI&G~RETm~KAC*fwuloQ-9N(ay4ZUk?_)$lK8E?3&oX|1ZQ*3-oZAN`hvxMI@tpIV z&t3n#F7@8jNb+p~y@qj)s|*J~^R)jpLB=53N?T8b<6t>xIWeJoWXGlc-luo%KLWpp zZ-nW*$Ef=`TnmRA2T4hJf5NZfYq$_5MusAp5ciqx1B_oDUL(C@ycz5ObHYBb6&wN` zOYYeg6W{S%9C3VaK=gM#Ht#p6x9Nx$TsJ#kG(oN)+T6A*g}C2v{8xafpzj~VhhM=L zB=*|pB6JQr1am^yGS`5ONCm_>HYTzfiH$>dzG&*T-5kD@hg18SFj-9N}AN0d?ups?1 zJ&eVGb`Ds;8Y=t4?9gvCXM?{Io&_EuzWl}h4t=jEBg{;h=4;&Ki1)DHh5gYZA)J9; zZ^PmA%eSE4fQk*HqojI9<3FMXe;3g;C>`O_J*xFtLm*iO*Vy)#rkuZo?r~os%cz%h z4z_)KzvQX@Q1>`!x=zq^-rLo`7u5EvLbtyoaeTSgaW6Opv7i2r^6o&_>wEAlH2iVM znb7bv#54VG$TP(2J?Z=R>Q^Xa-jEZadQ~T$EQ(;FK*u<+7ZMLSgxLQchqON=;M{BN zccA^!cJ`Xl`8FQ*GQPj{*6#k+(spqD(*Ev0oFnb?+J7+RTHZzU(7!j-Ebsv*{Zm>gOKA{!xTX zbng!J`hd!te;JHoK1E_g+NTe+ytt5m5g%(bj-%AWe7#0DzV~vppKF`(y&jXFQ@->* zjC%TQM&mz#rZ0`Z?QT5N{}{&09H!p}J(>{L^u-b5d+#k4^ml3Iw-Z`URvfm|a~-;& z<=o+1Rz|dcf69^Z(8KutUEH9Zu%G$)%~a7=p?>aV%;zCuxJo^TUh{a=p*&C5 zh2?v1M7yOSQ}uSgWl#zW;n<5qyW1Y-*MYNA#b z>*3rg=aI&I&Cht=7c|~7XnqaI-0{*HrEJm|7+*c_;5K|EG<`ziski-IfA0-hzaH4h z@NM)%^*Q}C(%k|Yek$b6XOZq?^iPkH*ww@Spq}*+(|ey?UZoJ*;lJ{Gp`7`hRymG& zD6L(h()h-&hueG>gz+|@tnRWZ%i+4@srwE4*Z*iwIUhar_iu_=KfldvzTPL4?TIg& zU{{%ve5|k6L6-XnKlQwUa*p$#$jo@l{Es7AXungq)!+TLdReIL;J#URkFec*uf_bH zV^`bb4E9p5DbVy+L;Ia0-1590HoeaY)yut$^)Z_C_bMJfxAxS(k!AdIQ1>RN9VS5a z@w(Q0%7^K^ZnfVGC6490*HRz%&&Kn*nk2!uUySEI#red2ljS5q%*s8M>E1^yPrEr^ z|4ybhsn;du@B0bHUtwg92SnEY&yeY%dY-mWjzx%eC`(ME6FQ7lFe^2I37-%T5yf%5D}{_Q%C#vxxo?dbgv_3^%l`7Xq+#s`CCJKc7T>&iOBY^U8FPU5^2=uSIY6&N%@xJwCLM%GzvZkRpE?jZQq$ior#Jo3dcOxf+Rz_u zhxfwud^+*fyDRCfkMF@4e=z4Bqshd45)nx~T!*#aK_aWiDUHYR5}Hq9s2-(=XFla{ zSfB5W#POK+HrCp5)@t^&A2DH3tdUE(|R=4w%^}C9w*L7%q*Fx@xCYcn{>lTmN zi0PYztOt$P9Pt=}s7EKnd>29MzY2Qni9}GY>5d|jD8bPlhi>o9dBmYG?Ku{j-+E|$ zeg5jPAQHjfb}?R7#;xVG2>abd`k`5EfF?Okf0eVCAFY4B(C)sYVmo+`!hZBAN?6WP z5*t53SbifCIqvJzNz~^d2HVhUZTe~+}6K4M1|n`zCI;(LQrt8Mm@a; z>@kmWb)Q8K(_cd`5C2}Qhx4XI_;-oT$M>vtdmq4~7ik=~O*uE8c%i<|Z~P1Hh3J2o zbM3qwntn2(KHEa~U1L@F?X*fzCN=3HLriAJVOZ?~zY*!uunIaDRiI z6-fUD<@!#Fe`7Ww?gaQ>g$DH4TyOE8^ zCgd3MF8-J?xG$r=w(q}`quurp&;!2&v~LUC%i$o{3uY%yTf*z&?ns=w)GL+tKW?9gI6eoH?hxF7tj2#X za)xu~bN8n9Y5QSj$iLtnRPPrq;d~fr2S8L0oLN zb(j6N9V`VG5U&CLl}XnV_Z;$zi`#zr9`1K2!!|rdxntp5@H6}?!(6!C7klr{e&U*9 zpUws2;-?xErOr#-KWF73%dsW55~fM9oB_^6Yf2~(#TZY(@C=&*~NKHqzPr#hu&{g)pgME z?|9Dxy-%&4j+>;gG;|J64|C&=0eu$r6X(^Ckw{vkDe@!!&bRh|`_LNP_JM7vBFcL~#;7vW6k96T0&2WhI{xl(6nzpa6s<9q=0dTbhW|5ytaqn+04-J(SH0yHl?H$NS*kOP&Lr^E0EsUD7PM zohysOw$OF45#oG25y^qSIy~gO2znUzUF`c8tUs)|!6#8O#nXe>DD^VQb=P5Bq_AF$(R`0^Y{Y{x^|AbK>^* zOZKyi=oJh1G|JxxtD(;+{9i%)(cAP-+rxokzsQe&6Zn91C-KiuKJKgX;kOqyqP$?Q zfZmRG|DI|E!e+r)xC`Ka7k);2&xSthb^iDOnUAx3(GwBF- zP1a5yLfi5@GKKJ8q4U&FNFrn~V!I_r>_3eW`-A&n=L_$DFDA_U6WZ1BZ2QcHe-IuY z|9H5c!)mY^>8N_}yZ+K}J>opp13heqJ5Yb0&)8?Y@8WoM-;p2xLvShXHPHED0xSmY zw;5qdm<}F99uTh&v@W*UH@I&i_G8yN>*p9>hIB`IB96J!$WWvf;d9^!WIIv?w|SO= zF%ZX}?dCr9I@FGh(f0uEu~hOs+)L;ej`Jxrif-4-6}V#(o*lNt?|Y;$cC`MbSf|zX zIsMUo^o;(Q0{0SF7RGuJxj)-PKi!3UGj=we&zJ3^u1n4bzJFl}!4AhhM=G&_3h)6Td^R`|LBme`EV^A)S5j1L*p? zgRoMF{mFRN$^KssX^A@{yokI)pChmy@)#M3n0`58+UwBvxP#=uZC`$YI3Kpcof5I% zYm1-oJ4X5Qq3?=n?_#vK^Wdkn{{{F4G@jQ3tx4m101IJE^l-k-kKN+ozCyor?tVeP zErEMJRKFScQ{{*%^lQie3gZ8be=Y25{e7OA8~=|vPX=wXyom1;T*0ptiM8K+$}fa} z4fNT7yCg<;oScES<6`&$Zu_%!_c_KG+^%n~Yuau<;{0mASxoue;ioVK@qB*ecuPh2 z$GCk?>HO$(J^kG;I-jkBPoVG9X_u0Sd0W@m#6N&I4v$c7InH~bzvZ8V_N$*^3Fv(6 z(VuvhHxx1baN=fwzMpFS=AxJ5=o0-h6RZH8!(u_#(pT8?Jgkd*BlP*%IT)MtGhkjs z`_w0G6{Hg7$rrE}?1~=83HMz)?SCBFKI(Z04uS6b-8cLO*ON}Wi(z=06%Ci{Skl+uS-it_@2KUHk4M?vJJ+`YX1v`mTfazu9C$ z(+7X+&Ni4ryT`-*9P0iZro-)i?JDlBoTo>=Kp)Hb61$~@aj;`CSet&D7}kR7-v>I+ z`L~}bCY!QUXx0vD1#33MJjLAdW}I#;*`Y(>0ovw!$byt>a|d=-V>cW_;Q4AVm2 zp)CxL6CMlhBtBljdmblAf0le)&t0#Vz?FpApEJWf(0RaiKScT3BPzU$+vk=h)4JyDxH|z7&=uANyB*WF2yg^4q}J zNK>RHQVB6_BShObLoCaDS|j$$_(&=8dO~`yhmzyo4Znt%KB$xTXiIWl0yc#{i!jaq zpku|oW>4rG-2py@j+8#!wN7dRF|UgFx&?12VWx2k7+4y2V4Vfmy9T| z5LSl?@bkG!16UjGfxZ*?2I6>e58(B)ZFvc?4_!xG`*$HxqcV2k4S15YK0~taEN1LD z78BADuTfS<=(=|gf9Iz3#J7(hr~bddDD<@+u;5?pEnsSRih4YN)~6d|{~r8~c%=#V zH=ow|1?l&}1&Dod40%t7_0dV&G=*=&KkEKoTA4A7QXX-x;eoA5e;XX2%44cCZ z&}TD_MX&iBn>ndxWtf}#Yp=N2V=;^h`$BJ=4~J7wJhmX^iDP+- z;A@zdd`;IK#)n6tbBN>UJX{4GU*n;3nD<^@!M#vhmqX8w;OZEWYxOf0X6K~s*o)JM zY=qw>zV*BeefE759)YeEHz83Y(qcdRdY{n!H+v$}`FktN|C)O3g=r}FH+Y?Vt!F9P z!)u!;Favx+__QMwC7aH(GF*E^Dkl}<dVYbO2#OdT`bW{hk(2yP*PcwR{~!3N$9IVITP2qF5%sej4nT`8Lzw=b@t^g{ zPCnLKC2jXEp&h(et^WI==}Ls{a@M#Uz7wY^zN2FOGNQD+Nn@LD8jP+T3$P(Gp6_%S z9*_36en)Ra`ft92LpS|Oz5E@Z<+;Z)T@oDXx0gy#R759eJnzMNbfMo^UZaPRyz?Y7 z-74y#U6znOD4%rZyPm|RcYmiI-Xr#K&uBR<(8G4fjlbzzqO|#|zvZ7Ik@fnCbN&5| zwfVdLnD0FD@o=05;RITa&#+_>GST1PZpgIcYkp1XSN5mZEQYqj66~n|b?T$t9$t@3 z-;DlcyG)`S_32 zh3dB#fBV@o66;=pT`jjM{agRbVfv)lOI2Eg^*f8bJzU={cMl@{Eu-m|VK39)BOi~} z_-nrvVR^}@hw**Js=s>>IgbBKUz5qr@axGU+o=?jh3)k=`C0Fu7?0Yc1@LF?t-)BG}FFUL__^3lHgNw41BREER-ji-(u z*^2)RuLn(EiA3i2FYBU3eS_U(cLtw2J`e4)lK!QC73!;hjc^|D?-W}P_r&HK7yIk( z<>Jrr1D@LH6Z8zqp`O;udxzGiHu>0IpVQ9Lc9pLwU$zL_(|6WPH=pu|5|KabU&pb# z`t+dvJW?WtkD^@lX^Fj^M|=lP_W;VV9=9mp;}m+SUmDs?y?;ea-wlWMiAUy^o5(;8 z?}_RECYh;U9Og3_HF2aK1IXO)5n;QgWIWj}t3tQ?QuSRxy)D;wn$>4G{Y?GFLd(C( ze{wDLGrvtxdz}s2`yOuFJqGpGuKu<}ei8Pw^;BAwFNAt~Jz#l1lg{JEaK6n=evV)F z{)YDr+xOCIiWIw{xb02zJPFd2)uDG?2dFZ|u+G|-@?i4CvI`=WwyF3xC*M7#O z?mX{=?l7J2FnA=TpIGl#*v))n;IDo~Xn&9TC>7L){$adj=&gG_U;oc>tLJ1y{kbHnN8$7?;^-a9w{H*uKHG4wS3LI(xM8Rm2KA4Y#M{si$U!92&nHYfFU745ehT&J3Uy~CAM^9ulQI!*)A@T<`3K^-J4BfI zdJo!q`Ye+w2H!k(TqVSz9=F2v(EA&v_qQ*mdz<_%FHY!g46T>yu8V4*RXw;o9B% zVo#8qgxOx+w^9Gq=%s!Waa;Zz^3~nvKT@9Vn8ejCB@p%TU0_+3MD~~S#zBUe3CCwd z_WEEY{Z75VAd*3QIF|*<-*g$F^2!MB0UZv*i(srL`% z(lEX69vR<#sCLOknCq+W(wd*YWw$=sOFjw9|BHTRzEN>&ua3l1|89sZh(6YT8p@ik zE`{ozgjkQI#J4=>Rq1;f+PM*;yAyFdd{$~XGs(|%UqSP0Nq#H|5x-$X?f6z`w;9B@ zpLZrd_41pP+HXOqx9=1=v>y>}x~k}>J-jcb9bSfd_?t`fi50qgRFb!+QIRz zUYVi#_@1lzrXh~?T1-8>k1{v3Q&ng=hsftTtc(%8FH?ZX-p^@++k6d6L^|u07*;0V zq%aq5m)dI3e&;h*%Y8_GwsT7S-JLP6dVozB)-p8Tu(;e_BV%Y#e;8bc#ZcdQjEL?5$6D5C9#*bT!)h0Giy%V zK1glO{q{-^!n{Vm39muRzf2v>Q(e8kb%H)U6sBWt9|PCozDe9&gioQdzr}Apjp2LJ zUZ?u473asnoO@p-HF;T%W6Ezt)Ib*DE)QE#)<()aK^~`&=$!Y&uRM7_gU0jzx&75O zsSWi`M}C`dSB3vWT&)_*KHa5auUdR_JeAhrwRBol6{h<&cVq_lJ*@)_YCf$4m=-R^YX; z@2a}zj!%MC#I@1OfFjuHJ?OLAnS}ccateGOX@Cqt@2c<~{FHd!AKVGAkpC9wI7$zH zC43U+memLGImwsEdfF-l?wy3&=4^9^axz$qK+TcU%v>mktTkD{0X2QA+BlW;j@;} z_&d&0!D}!pX)AM{gZkuzcW~?926qYLU_{&K7|*Jd~i zalPw=oI`q}x6cK;qAytn@4c_Zy#)Ps;dYMum;iq(mmc>Y#Iv8SCEdp`3;8<7|3mn| z(EpAk?rfw0;d|gd;va`+aI629(7e-;)_NWy+w)>m?ijs1=~RD=sVrxU|x6;ehD1|7qOT7hg{gF7u*1CpNrVd^6XP3 zkt*m{3R;HigYWb@SE~C2q!IPdrke;`0mqWR^V=Kv--7;as^)~bwz9MY&n=!A5C4PE z{#F$K@|5!dbgpRvqY*wF)`yM{`(riOgmBBN0ku;fXnF24U9US}r>FR>g6iY*Bj+Xe zRgOjH4egMXyk^7I(0R5d{zaho)fYj3!?+OIDJFnV=nwXny4WcV?qyK@dtk59xCc^R zd03IM+d}=?BksrSzZvlV3_4C1kuD`-zwst3ndx)bw)!|3D1L?#0E?5fsJBX2RJhWdfgx3s*+_DUQv*y}Rhx$4e{N|r? zz0bw-!@BT0;&y`OUmH3$uVcRfxO3qCkaRL890-@<@AIgV(7yNr=|NZuBtB*R4|16l^tOdQF^8hY}vEUx)*fz>+g3= zFX4X#d!2;S2v3K9K^TlRA}_%0yD|G^Hv4roH^;*(2zFq&OT1=fV__f5A6e9Q!{1Q_rZ_ z$?;Mjx?bpSyY;7>h0t%!*ng^^M+)ei?Y!dHNy7Od>Y*N9f2+6S&voS-^>tqS8~b=& z-V3^483A2yUxfZg;RW2jccopH!RfF%c5CV8 zz@~76B>ZpaxK2ZS=L7Sphc0Rwzc??Q!M`~5v|m)D-kI>9jy+1kuc7-j3xuzkdu@LF2WgJnd_ny07@2bNjFNu`JhjwdXl^qjdRKsRsK+4adN&F#pq^);?|@&0P2qkR7jA>mpz-6tkD=f4$OxCf zv*g`_^uu5!^4kiZL-(6LCvjXhLs}puN%IeWuJhijdk4Lb6892x@8NGocfhxzVN>Hl zuOm`H=ls73FHT(hQ$OhZbr}Dgum*YmfZqwy<%K_y&o07>z~<1slj}zo!jnVS=rg3L zO#a%aC%l9>UW+2D5brx@Cu}uoU9WxaoQ=HwEnPdx90ePpoA=7Hzsa1BJ^sS&w@uo^ zzhP10Io>Lg{s`A5V`}-01DPF6OA?yf!@fExc+fnxK_(vhF&l22E`krh{ zbeKq-CvXaJ{DzSB@i*t!VN+O`Fuzsc*mb|O3GRZvFKhp~O1j+eTX+b+4A8JG?e+b_c+}thd`A+Wq^|z1!hL4S81!d2 z0uF~K@%O%9MdD9}naF1ud`*2#*Y*YT0{LWp8rdh-u}~$Uocypa{1@6svJmcEe&l)N z-oP<_3HM9#$VZ-wIQRaX&-8wQX(=}@y4GM~O$U3&Vr;|Tp#5?V{@#!9_w!yq`8%u; zu&DKg^T{_h>`eRY!|wp)jf6g1ECMg%?;4hxc#aA0&5VY12&)6#+qu^qL%wn0@6`V} zaeNogeb;!n8m7ihGvEx|?qmNYp4^Cz_F?n%UE_?{D+=d@{))UeR}DL~#693y+L1~-Oy)k=iwLd3iSIr?zPGjej0iWv>M_J zu2ug=mj;~MPpd%hf%Jn_;V)1-oQGdh-U;ZuHXb>J6hK;&A59Sa-btNylCk5#XZ5Zv z&9H<0@G|W)4Q7Z-+rdQfs0Z8~JF>6ZZVhld-?WDXsDDq`>|td56?Y@;GZvP?|1}qa zMc^AxBKN4Lh~E(R1nlJ8_6_;CcT-RIPS3G}Yf}X6lL;iUT=)_Cbb___W z^E7OUJ{Msd>~j@%fd^o7{FgxQZ8~=hB#)tRJpE=Q^c{j3a25KvC;J3?Z9g4<^Ln1*uPb5=s0A{j_;eNih|d%Om6?Ys;1e@=OrCU}R+4T^ z=Zoe@NyOiY7KQDwV;OjYPUs%HDi^3t;a|90!3^Z1e|zSFuC z&ZW$Ca1DCcPRr;&WF66l{+j|`q#wzLuOjt45Z13S{h<{8zT;+n6T{-LKly(QlTyC+ za@{BgojX5*2NCUM-!6^hqfFCzt!MaO^w%PA6?_ktq}*iCJpfq*?`AzCO+M@^8$yp> zl;?c3mUH)N9m($yd@HQiH1hKr^8s$@y&>DXEn@$!OFHNO9?*W09eQn`4ehsHAGpW# zaLvjL9Ut|f@v1=k4Q37e8MeV*t}isdKj34SjY?p`;5QTR!YsJ$*WL>%1mA^);d`OG zUC8fYKK#9gaIUjo*)JzkP$n1?CWimR{~yY+4C_;X_LF^?m;Q#^Zbx1NWTc;AvWQ8K zBjfrGq5bS3qMjoObbj*tfY;z?+_zvE++GWf2zddT<{?D2;BP?C)q`vO1kiV3Q^H;J zt4weTmvEE)|egqxg)_V+e{JQV5{tFrJ#_tbv!%^79`o$pLJMcDkAt+)V_IOSC{poM^ zr;X75zX5;iyN-Ug305Gk^j$;O!$sJC2P{Q-`=Re1ABA=*+dm8C{0_fGZ|A}9EE9Tf zlPD2)$TuO(gdVA2!xxeLZ2|t-aW5inRv4B1ZSPKu6Wgr_{i^`nin}OmPPpUnI%2x) z^pmvEb(Ss>F%@dxJM=5pufmk?yptKx{*w@|;p~gf8`}E_Oooyt;9>H&9?3A)Z}2Jg zHom`SzXPXJo^~t7_^`j^q@P*dMW|h0QZGyq{C!4Lk2pa(`*T_HNehROe+HNof5+Dz z(qxAIt~ed^*+^=*1a~sH9{shOeaQUm8)OmqIgdEUIDQ5~$N2^5Jm9^C>+oafIGcsP z^Wb1;d(VfqkJmfW>jv#pALSk2H*i0PiJBm8S;Jlnf}RX_xR9j9!wK_rKI8%aFt=QvWo za?ts218J;pcEtJJdqfXl0s5Kx@1i}t#$HBw?xRd2cWOkALUbDIR~zH%m74n4j}lP6 z`i#W>jvK$%rv0Ok4^e{a0mpCbuzkvKu6;6~m+940_xaHOW=QXydtAq!9!V(lZ_4+3 zT`!^cz}5FS`C9)PlxIEM*V~^jF;BZc+Csfv!RGW6(|bLrdl^cb&$nTItH@9P1(apc zy~vlS5%*~)>vsXF@9*Se{VEaHwb3z67Quaf{l_4-Q)9&A2x5AgIXI%5DF@SRFy1df zy&59gw+~d0h0ylh0&RykiDbL3!EHT9L+jredL#|=-9tUB*K8WY^o>wj6XwKilo~j! zpYNuqXG;{b9?Kp?#>@REa^0c6?PQQ2p!SXL(mc z+RnyvE-;~3B!Fy)pm{r4X=rq?@aoG z`3$98v%XG!)Z-J}jz{m`sCS((zWaX5NgI}5F?6pXj_IpYf5ZPFo%U#r+oK5Qx(je_ z{>$Kh^P2t#5cOz`m`@L=e{#;v?--)K-s>^mVa~1JS;T&D8!?>iR4{JmhVCv<{nJ6y zO+s`#H<|zHFuVo%s+a4q@eW}u<6WlR^v??Imr*H9xBbMUH{(-%6Efd9zPde(v~%Zh zz&s#a{fd*uV=zk6^b!5|&vfrX`;qOUJ(e4ZV;tv(o7Tg%*u&?0>en6n8t!*>tj9H| zzJKAb9rjQk-TkPC@ps$k94{e3!QTecJsUCJzw|ftdW(GI>oDJTlxMi_IyjCKk-6!I zhxKTH5{8?P>DVp?<+~@+-4U_h4MI$3xO(R$T&@cH$7i^;Z*)Zax(8El#e51u>*epR zb*F{8GeYCs3;SCM&P|_|Fzqr78t+d;J>6?)Z`Xd~Jt4jRbrJJ1y?XV8>TR1!<5+G( z#Qd5e#=D4EFZ-wQV&bsPSeAluX8$tXuZZpITIgYOSYAq~9vMPThL+|0Xn0ie)9v+% z>0gHK;uK^dMC!ua(|{hJoeMCOz%51rpr&5$EOr(dcUV? z{bGjt``s?){?)J5+||{|PkTGMww)h-m*+(D~l<>eG#UjTbBIkA6qQdgcn< zz6)-=1H`x9)>B@F>i--5>Zcv0{oMTg?S=HcEB)Q`smE@_!|PPbv7hTd9&ENS)J#2UL^FF2V>Lcc>{VcyN)IBT=zk?pe_ql`mmLp7h-^u*0YAlW?(Dd{0 z=U;HmX3+bjOAOy6pQW$}?*GBm$TH4dx2KWM?<7iupX<$UxEr8E3f!qUw;y_4P#XGe zgVXq3Bdu+D39?E%JrQb^L;=%_eDo=yVe~>+&}y7mHYo3l=q8^nD;Y5Y#WYRG4Xk!Mc)YI5$oB>nKe#(62kaheW4*A3rmEezj5 zCL-^ngY#)@&gnkEdz3xkc-+}xefS+>ULPR8AWe`jk>=znecod^uWfJq&cngDy?!bI zkCMI~EQ`Ggz%1;as>7=+0P6@#&%9L&YS+EccP=)=v54(C6D~mP6P~-ySH|CY)qZsZ zsg2A-ye=IIwRd+U6X)(nH*xN}3Rj^0=LXW3uog%{^z06OrsVbSzqr>z@2~y>UAKC| zA&7HbNn{D)b%ECdGZD*spZFhfUI&(i?!&ZMJLFB|9ppX4Hh1pOzQqvh;oNASX$?oh zoY3nY_3=LZe0UPt_T3QsoB7&bF=tR8-|N|mdlzo|%TDB7WIO)mu>XuJCE zT5SA%=1tUylN74m{Vk%`p4;%W-*@KR`umP)4Ok9ZN8jhOAG)7khyO41tKrahIc&#j zoEvWi<*a~y!y^rTzN?=NI(D?OYAu|4TCK<)ey^m@Sd z^82U@N%v-q$auwZr^LS!Vn6lo_Belc#cs|k_pzh)xQtzImLgQ7&e>rg$BaX!b zlzRaGbI|@}+kb;h!!JED2^oOw#*Zw5zvJoNH3jio;_eDHfriJ_LO&%io18gE^3|kTJxa1uIk7uW%go9te&9IC$GQD$H0`bZ>XL2?bRTBD`%o$8 zq;fQ3Z@2@}Wg^m{hjZ>h^mpy?9Z&aa_M02HE0gD0IGcJbg#S>U{nh(&72zdBJNa&z zbJKCs#fLY@=K(hAi^Rn3J7K;fH<Fvk$NVgaI9CsGzZe##@`d0+*cJLb z_bA+q+(V9&$hFV*Dhd5agsy5>7Yqjk+* z^?0T8{^TLb|Dcd}hPn&q3NI0MS3c~?Z#Ouj;GMREgiFP%D+=F@o-Tf!uBVZ%e)~$- z^M5biqg5ATlf9IgGmSfxwo1Bvqj|D}@HpYuO5?XUynoBuLi{k*(^bg3BK&TpER7+f z+I>$rLit(ykCy}DKisFBtt`Ei_LOkG^4}-CR`rY*;QD89VfepYyf>SeEpjigfHT?pzrU&OPl_9{F{$UC&h3)$zB#+<`hY!lHe zm0K_RM8rAq=fa6fXFPu{{7gJD(XUk$cZ-mBEFV-F@3y?GI$J42ZQlRb8yb^nDFow^lvuTi6$}PBTxjFF>v{g^UC4 z^Y_+uOVJ0qZl}DgA&iwl!rr2mqK@K!7VfC@4!TCqx~l(qVIARFv?=^f{NcLBhsP=Z z1G?sZ=wu=L8Qyzl?&2&{(`@1QLhtH&fv!IiUMFPy-Xvmff%aB;)~{}&XG8-c^E$YNbL)ipA34=`QyjpFEs z`-H4n_`+AhpM>}jc0&KRL@PzC$K1nSAbL|gzRKJ>QGWBjuB+*Ky~=W)@Q`?(ProMI zOZc?#LB%UeVK4KW^6?FlHsX0+!G4qzr^s(~pAY|WokJ7#t z4j0cmd-UTVA#*up@rScj&(*qar+M%q;Rf~735w^N18s$0$ZkV~*j7~)ew(pa_=}jP ziko1Wrz!4S@r^`ZsLt0!59qp%sE245QCsCXO*BHp8bkXx==uO*Qz2srTQCm$s@_G4 zFC)Y!Su4g0vH!Uu)}1-RGD75iNW|U^T_*_lP=2m?zhs=St@t{^FGR@txbm>(HWO0k zUcyI3bw$UC|3X+n_?)ncki7+dNq^ywtc6DjcNg8F>+^(9h#nL%2i6w;B18w|E+=ZN zxW8qW3ndHhN8vAnM6*S^DGk5C$2AlR>mu_(4P76sblMpyV*YC;B>os(A1h=oJyf_t zNMJw6x}dHs+&7=EYkYxzVXj@I_@<&JBIXVH>@p$a6C1IHBYQnv&k-IcqQ98W2{)-8 z^utGKS3{(*C#azGO`@{mzZZTb+)hNEiX!IExFUVQdfQD3Dq4u^{vi`bBTAjrIRq2g{AF+b7oRYjEVsI-qn*!gS`zSv6fuLwH| z@vG}Zy>xwu@Jq@0ovs-#mx^cJqpx4mHS;+4Wevq|CwtNU`-*QPI#O}W(=RE{DdOh| z?-f5<#JqpG;^qshsLX}Bt|?q8#9xjV?jdX}9E`FsD8DA12&($LA zL4L+O_p#*PBp#op%)7!R!oI@gLhOUz?W}8jmHi0gBHFMeLm())>!uL$idjS zM)hN-6XZuv3i)kNN8$TQqrYxc{)*zSSNZ(NC=C@@V6^9?~FS=QA*NM0f93$kufiZyX z?^pWgBK&|kQBj3G2YgG>Q02ug*zp)qRmD9atSoFMnyqX4@i0*<(MclaXJlhe8zUZF z83*|E3ej!EiI$0Gif$K8Q#@lD8!$dJbPIFcYF*zi!sl5Fkh|cUlC_)onxdZ+$L|{N z5i)PxA!JOjUT&>?C+d22rt|ohrgc)fCS>I7`$}*Uze6e1NgkRd}3; zu~njaUr-$5l{IUf=u;8zZXBdI zEWc&(euw8Ay~NZ1jG-$;@9O$eA#)t|I7u`}v_W+=SN^HGo~Jyoi16`FqRT|>#WUwz zBHBvypJ;{%Js8)QiJlX!5DgNYtayB`j)?KuL^xWAe3OOvUo%}ZC!Qd>NrVp~8+N%s zgq=PX&s=f35MOU1njm6)+%Loq^@LZ7cGWfh&`-L&sOyCy=D+bu8zf`ht6V+8-ktE?TAhjIA?;=s7?{e%2)PW1r16bJ}{*RZ4qW z_>uA}sW7I9qfZwpj(a%9@8jZ`mym%mzO}B=ZMpKW2SUFZqUoXziXSLK?~UT|Ir1zJ z(no)Z$aj?ZW}-MG#Mt{u#N5MJJKuSk^KKS> zq_oDu$As8}F^`}8AjC&@)%76Zxx#ZqSBcccg|!8nqgzGcJRx&7b98sn9*SdbxIoxU z#N5F6-JrNXMThG8Y2nqv4@J~bSyWGP^fmp6?a7P(_7@$g>)VC2KSZQ1E{y-VifSMi12gz1YI5x zVK;R6R>*pcEagPlh<H2ozEkgRUi>~((GDk3u=r`>Dyy7N{7%Rt%XoGQjq>z4Ftn0&s$ck;b z#@_Tj_f@xuuqpmEQ$+t&65+$-yHr?Jf>CF|rxe#p*IO!%b&;|DmhcTxLtURDEHCUY zH9Lm>xGoeuJL)*H|HQLQ~O0x^5)=P1r*Crieb|-3Mf0?n0jvRWH6+ zLCE^VyjKrY8tr|keAvE*cyz%RSx@m3>`oqVmJpd(pV^;ahl@q*=^s=4TwQ-6yhup@ zasP{KN2*=M`~xEVd8CN`;a&e2qg_LFd&==^jv#!So8M6-y%L-o*o+E0j>s7+Dg{O+(krP}k`cY|(MSqDpif62& zQ%4~-M7CRn*!z3wK^;{@e=GhNA+}`S)j{|_+2uPS@2>r+vJQI9qXBDeh z>w0$){`Ze)g$TQBBP#TPu!m@z=tiYgHc!6|)HVLjJT+fLA5>HvzH)}}S0VoLg@`uE zgWe65wnmte=q&gZZ z{L7*p6gNP)Q6yI>$h%h8=vYlWd%}x_^fT+)pQ760$=gXp`9nnb33{UMdqUFbJ8+&5 zImt(#&~M;M#iQqELgsbmaO^}o@Pute$U!~=*i?l4{e*-@BHDRZaro055xz28ggwv` zzoHCwX{o%(iVWmmA|gLJ5|}>;tXIxvErkt4^m|Pq`QFhra?=j+%*)iv zHAMe{%$Kx}eAx2?5pwi#J$neLXK(X@LjBlYDx~pg;2kHlrNpSAijuv*oAcFPh>brL_IA;q|>joM<2msF9Lo=JoA3q z1+gRX=u3T7MCgIfU>68I38W)C{9++(pg%|*1j(Ut`QrH$IQvj2p^*Dk48~5&e;V!4B}XM94)Q1m-^a4|z$aF63m)l5al| zJoOUrp9JKoECxB~Cy@T2ef$F((T~)F9@I@=lHOiC<&hiA7{ouY6@EjYKI%O{*We2C z_#<*d*Z}#EpZSY+mK*86_z8#{^cDU>edUGdhh0JDZV*Ba#u4&kfAnE4rJZUbcY|DeAJq|t6YA^nB^_1ME))=*HehS=oi8>x+ee2 zM&@KwL_EAz{UyaXDAGX4eXbXMOYrcs3=pXC=5zm^8JO_#=u&1Hk8H&Tkj2HA_ zKS-Hwx~3j{jebNg(svgkdlM1*uQoFc;R z*cqh%LDqQW!*2=HL4Q;gQ4jLKHxrScc=E8e6X22WMj?98?^}p!>6&)m6d^bLhhFp# zxWJhCtghmy2RkAUeMPy{pY`ny#Ulsn1(@}l`Gml}l|b9H(@uz;Ckn|=e`0@Rgzgcc z&ox3q1?TH4qg`3Thcj1WCphv6R-fgQ!u4(mGk87JgBRM*tgR79BSczlz-@1{7? zsSi1-3W;ARqMi;y(pi7N)*{-u+B|xr4|c$2j34@od5icHjq!(};<5AjLhOv5*!flw zVWjb4BjYRmLcVe0(Th11{yh=;Gk;-U)@#B6BJ%YUqE|T~>C2tY84dC5e+kV+q_fVT z_dUkjg@jLpq-T7z)HUUw5+Wb#Ir`vd@a(~{6Ml*vn7^?Lb|?NdA?>^*q@HPx$A0it zjm#0`!>`ekd6@Eti)fEIg8bNl{^=>AedaInKO>?)**jAYaS-bc7{6YnYwAT-=BQW9 zXZ~XipkDk0yN?#pK6b<|XNxG0p2UyPHTEYS{ujsNugFVY=w=c1VK4I0ugLknuHk7P zIopY_AM++MJ}!d4R75?@&G7w|jy#NKkp3XxU-;(=^USH}!@iR1QM#tRl}7AC`bZ(| zUm`@GJ%rd3ebD1=5$#kKA@^AEl#3r+sW|i_op|hsyyPQ4a~%3mAIQFud<5E~ACZfB zjP@#vr%Y=R{Y`%2@6_iGM}$*n{zeJd1?L5qsCvHS(~Qq0dJm zp*zfme&L3-$$>53otb^FUowjh{(r%FZHs2CooT=_jMxV zMo-GcPuPdi4-<{;bd8*~gp_+hgniBxPr%-^(^N!0`WyW|6Ja0bQR=TDqTXFZ$j!K? z9QFg}2?>mU>S4Yjo_w_Tl!*8S;t9mj4&wv4*sIW9b@Ak5tP{^XLts3?qaVm#hVs}S zn_(ZyP!H{nb9@tBBmZOKsh{yjKMxneUo9e?@dh$)(O=jTIc7MXK7hYSMEm$T?avia zF7y1M&RBPS(+)CI>M0xxbqz>eyZ{gX`rC!P*KX#)Z@hSQR zdDe-jpYcq+>`Q5vaYjAY39&Q%iC(*lr+h0B`Pc_CFW)1=UgV`d)*0GmoFG@mE&W9v z`jPZ8LfWODsF(dMaM3%_Cpr>8Gl+XWFPaq@NUr((e5JVXxc=UokW#ItaHqP zv@=$8pVH41vX0jf9jNOvLTo}i+!sA7q)biqM_VCn4OINa{}g52U;V;-!JN$aeofaC zMT`aX>!P?XMO{Vx#Ixp}BKlR=#GR*lkJL5K`a28JZKL8@`}fy1a~w9jN{Bp92wREh zWBeT3^08ty!3dIrV zPwas&P?j|oAH;_kH;lutM9hgF3eOgDeXWRo9xlR`n}lnGJIK!Kg6g_{%8KYUM-s&qOziR*D*luzdp|Bl~N&ELg2hi~WML%h4GstVsJrjIA61FDMW@Ae_zcjA%zZskLV8LFp+;`h`weSf}a znTR>PnTU6c83&VvHjN4 z3w8au5MMq(^-dO|AL9=t&J^&Q4aQO(=}*6%ymisYvT&W^S#QdV z7+=jq4~g*YW0d};=yhG6ExX{WHEb8;K@PrM)KyqTsDFibYq9fJVi=!%yKKvlxLP)2gpRC;+K?NyTf_80OEf~LaNqQ8`HsgQAsEcEL| zlIt5?uTeiW5r3}gNB+H3KkbheJ*arz`DfnXol)k`kHwc)Jnzae|E-W5QoW?15IOie z0}`R6tMGfJza>0J{0QO6!mX8$aeKAoeNo8Y{XRhPEmR49$+%#?s;&00M_paB-{ALL z1B89l{`0~UelPX|3lZ}P-)y0O`1>#w#D6WlsPA{hHwMKsAK?p(_s$Zsm*QXCy7-;~ z8>l{t=Nqbw|9+AeyR{I`5k98&e-iE|LLR#zQyBd!XWLNWbCY zFOr>45x?D^#eQV|X6^h?jp0B1ospVKzg6uv6aKAsu+vxKnUDAlFFwa_*3s(-^`E-F z;BS=sP3^F@9;f&tg?vu|8Rtq4*7ReAjQzJ2KSnr8`qMuT3GvJIiep?Kp!!z}o2otf zpKoNM-&@K@Kir{fnW!*6nZNi(59{fE>cl~cpRPpu<0|P>R{R#aW`0_%cH4-*Li(@| zp`Y;k%Vm!<6#wXk;+|oe?8lz9qw>EctS`OZ7tWM@@snRPzH12?)Bh;`CAE*e&sTle z;d0SIq8HQ-Z=Bt# z^ebe)r-g4TT}4Z7kp1YNi$&Pu7qwqc@s)JVcsxhfv~!x|KU>%T3eod^<*O*9P2|S@ zKafwvdQ?|(tP=A3MDEAxh*~O7YoSCfJnNXM>jAnxR@B7EzG#Nx>1*c8FC^p$rOg#G zUXZnqh(2p4p1(KAJcr-1o->b^7ypuoFhTZvL-9Lm5~rW|dq?AiMFEvs;_GO-_FT6x;o*?Y0yf29^RQ&^m z+slX_3zx`Gb`y40JokqymG??W@z)9YI|RE3mx}NB@%TeC*@$tA&lBJzw;M?AKiUk+R>O!h1!m<117j^T)li2mQIXm1jNbBxL<=pzGs=yyt|!@OK4j37PlVyF4nyANYnScHy^m6~*(u z6Z7R)y2hRx#j~FCjl9#vmlHiK;@btxrv!9qqkKJ-uZHsB`&G6r+TmOc-p)!dCqJZo zZRJyzl7D4C`t>X!`;k^!|0*kflkCTQz_)U03R$-qGr!4x_}m4uAN_ZosFCxUgszen$OFk7Sf^t@xXizL)5BQA^2t zuHyd`o+sQ|^&TPQU2OIXe5(<=^Nl0=uf6hJE__)${ZmEh!o ze%3$yqqVS%u$}NKrJXGLM)Zp4edW7e$XbfMxc|cb=uZ4$Dz~4IZO>l-B=f9%P)6VKJL3{ca!{#eFuNPfc3qD2syWt{VFQo3fT|4^j3cI-7UnA)+?R9 zWgIfDnY&IB|BHzAo4aW3j0gS-=ubsmEXL6q_dK%A7a0SO8Z4POnU6A>s@3A#?f!mhk5a8#mkjT_7c)=CB>u1E5a9q{HB`wjmL!8 z>uM2x&O7Y%Blm;UQ$u{AeqE#AwTiDGJVWIePwWG!=RW1bo_q_G{Me9w;l5&(uJ4!p z%)iW!n(7O7Lyta6$Nv^7p7p4?@{vAYC{;_U3$c^37VbmZ3E78TAi7vIMG4h~=LuC+ z;T`o~iId&vPyV*Z*Fyf52>#7C)9x46kaLmmI}zh?l=M1Ah#vb0UzQ%M6OU-TJu7UY zbmU_n)>6o~`z2b*@v;N+C*L?@Jn|kh`}p}vuc7pZ70)k%ekDqO+cX$C!TqgZ@F+k$$cdL&wPalGZcrM^Tabh@b}<|ds_N&AF_+$*9uRy zzW5dL50)K}i@)D3Q44=BSXCF^i^tASGiik=HeM2?Bn1k z36ZbAXpQnWQ|0&$-^`K836bM5A>*BI=40=x#Mf0k=Qpi|{AQVT zX{3mH83Xf$w}`MSV-UHp-C@F>%8!p;C8a(QvN$r{={Mr}yWKl0dXVxlFKv?C_)%5y z$ip|^$-hDN#Lrnb7>}PTo_YU4#iI{@e~9||h7|JfHvt$|{JkRl<#3g&sC@Vx^9JJ< zdvLD6I(>o4eI*>Obo4z?@m+-1*NWW4RxvQyN{P0WH-(85m zZ4hFgRx$?mdt5}l<3$BO6)H=~aOp|EJubbdr-k&atoSVzUscF_Nx7qy&c3R-?1*0v zQM^PhxlZvQ^Ct7sTJg-+tVfIsKIBkEFhq!NEELud@;71d=bw}h`_Wbm?W{!lf1&Cjp63GCv5FA6-Vo6~-%ny3V{7_@{WI$vdu;YCoa>@z4e86c ze^Wej;n%Vw^Wl!@3T}7{?SkA)r9;VSOVv-==r_!p~v>(@ssu< z=CQ$|Wujh^4|{U|(p<=Rr61UL7xYj(>mcKOp^)bu)XO)?kbg@deQ}p2* zL`AHA?L*SC-;XSe}8jV#UCoW zF&;SQCLAkdKD}M>wDYo%`3oPSpN2`!AC%6z%y{W+eOPbk=aE9{YarpULv!J8LcS#` zl}knnvF}{v!+-uzJ?J@9Nct5b_F=S5o2m`p@>Ucw{woU~ z6f&+3kWlEem5}~mpTvB?^9@vF9z{picl>Uo>Z5;NP#k)nBO;wS7-Wp2_h};Ry+VYo z_fUEA^KD`5!#MzQ9VbLC<`c@_Awus*M9dQnM64e?2T|6NU!*tv&UfKRXJ5m(`9k)? zPp1f}f3y&PJy&sy_PS1I00p*&}dYgFUe?>oNYZvyk{I(jR}? zMRuYeE|L9^gTI}?zPr2-xt|s?UXE5ikbM{Bw^w<_CH7U*B~69szoqKO9$&j1=4RyM zeF*fJFJ#;vE4igg$!H<@`IZXfcz;FGkJyiXnj^$N7YdmtFB9UA?<+s{r(ckt^H2P4 zp@=rm5HZfMX<>W|vDZf;`hoj}`a;g14iR$hhraZ${uRbO{WDNhQ}mMRqHnmL#vjiW zGH&PD4vSJTuc?>=l2Sk4{8gm32#+?`hB75 zqaP0tV*l|Xge#lCF*n;{#6`|jjDo?*m6jJ_rA@;+b3hA|k z)O)drtWQWk`gL2OL@B8$y^)V^7LxBW*^7SV?*b!lSs~@F6=E;GU5frZw_x0Fq4I>- z@e1+e<31Ms`CYU`D%hkTsuNS4M8eIq}Pdw2xoX{y9SYYpjs+4+*KSuMj)@ zrby&zE=2FUm54s;l!tmQ7Eyl%BkKtM@PUZ*r<5P;s`9jRl@L4B7E%w-+Xyd+XpcDj ztdR))@E79QZ^EyTT`0oe38vk)Lh9Q?NI%v!&+~umhuz8du#md{5mH}s)klAGeu6)= zQac5I)iwN)Ducd!uYh`&3u&i=xn|_$~>gY!Z+e5*H_nyDx9TK zj`uvl#zN-X-qIVsuk2CiC)tazuW<|8k^4^MohHP7JYPhfDMIYKNr)ZKvK{9L3;wHi zu;a}l%8gcD#uM)cpdaVwwXl0ERRD`hYA;hW#!k;bk<p%44xg}M9<IpxQXu_yeSLfWmY`e=uG3EkBWp^M^(zeLy6(^2x# zuX|em$A#GGPyI)|$J;*Rg{bnmko5g2tgxpLz1~$k$op2<Px7bRRKBtG~3XR2QGI7sb)m6b;SR1*^cky6U>OOG zT>Q-lWae)-5?@0?(ce9U$a|I$dG|tC1Dq=SGwpu6n8e82e*6m7yK#0=JZ$*ma}vRTZLKXB7gO2SL7t&bYWt zh+e~m`0)V8AMN}Qg zk5JzBd*0YzWe81*Q23j}Ty9Sz3ZENqL}-PdjSUf2fxp2;IM!Ish`k9zjQp)Z0`LD3 zev=y`E7NKAZF1g1bR478>K9S4Y&7WzU>3qD`M%c;N)%tE{{K$5gXl!r%!S=ex zc)gK%lrY-)y1SlwuAk>GgjQ~Up0Rr|x^SPtCHocvx(Qp_PJ0;FJN|7W&y5H} zji(t|_X(_DgqgPA@*-Q<%X2x}@|+a8jO;H6la0w&+5E%Si}{MM*m^&0IoIdLJ=Xbi3CY-!!tHBTOqoNi*xY+StkZ&o#17Cj=LppKW}> z_@Hr+@kryVu9tC5c(4eCcQ?44ZMm*Co^5PtY-Z%XmvDlyj*;(Z5qKYqzu8_OEY82@!WwanKuW_-6d-`zOMIL`Qvk$Y_dXFmk?(**WS1okZi?)M1U zm+o)-@SYceZ&wpeH=bN7{Xp|P&m-(&tjTai@#|_P= zKVrYV9ACv)*Lb?Ihq0USQsZFb7~>PhjC-E(5MD2ZADd@SL167B)GR{b9VRYYm_OSX zyK}Bb=u?EkJB3`{U_R^0B=Zj&A2O!jt~TG<*vxo{v4N3&0D-d=0%vsu_7H?0t;hSu z=Z%jTUo*}(zG$3k%zPPpa-T)We9rkF;WH!qHNqRl)RX?7F{wFrfGaJfu>#g927C9JhP zbB)uC@uQ6A368(XIKnv0*wxt4n0ewF^A8xO8#5oI{rDaCaD*y_|8;I#$Zo!$$b8K?HX(k0WsxoXHjm5PPeh;0 zNAb6bZvQM}C1dstydOgN%lMCR2j|<>Si{)KnDG;RIv1-cyhF|9ujb2nJahj}*v07W zVDV;M@oNjI#rsY!Gyg@unof^>gRZXd4i#C(TE4T5hZ}b@ZfC4u%s!!+`3}ax#>^L- z9TGC{WZiwU7`=J^%04FXGn{^vv5PVOS>62Z#*B-lZa?E_x%twV@s@c$>+99dpLsg_ z>GWSWrw=g3ZeN(+!}1(&%z70+yTtLmj9IrhS0KDtgu?k3m*dP|V611%{_ZgICm7Ri zUGteYp0RwHA2MIx>-eF@UdEG+2ODb|;}_X~WIV^dk*kl}kNo4!XP@OnJ-RpJ?WR3<{KJ$enhx=QxU6rA-&D@4&1UB|3Bm8 zB3t;oPF!aGf5!vt1Lr%%_>S{uy^CM(?DX%PzS!+n|En1Bg^}M85@xu5-uocLF7e;q zj{m7lG5uZ-eBKKp++}@cy1w}NzQyFi@4va^e2T#HU&1%W%y0dR(S_eBa>?@n!uLfe zyfe>b`r}Wx8~yJy-`&{A7{9yQeD0HmTmC(azgqrZ-Cq~kZan8FM2=G|*RI9rk}*!t zefYVKzt{D4vfY}RkH5BezE-YpnbBevez!puo);4?Hr8>5r;WE5vwlo>zTF+4@f1I8 zQmn4<4k(uy&zaA!ar$cGO5+p8jJu4pR~?`EcBJ{V+tPB>H%9)W&1apPWw|5&&Q8z# zxXOG@*Ps1W9rGQGlZ~$#rx>p@K4)}uh2M!0mH9OLn>lW8lkq^8%l>4x;|Cez_wSpJ ze2rZ$^X-o2bKjG7{AHK>$(a0YoIm@@j5nTB5q>o0yyFa)&;0wa`OIh8f4*2OUeelr z$Ma^wQ^xC!Cm6pfCYNMiRKqufUx9H0H=LFO~wa$lJK&VDZAVWis|X3ToxX?gSC zXuQ+u|CW*?et(MNgH6o0HRe9|O7qz#WIle=@fk0fe==Ni`PUf@TB|h`&WTy`@ zrrzA&9Om{izf?0{!I*K>*nIkZlKIRFHC+D;W5&s;_PZ*^jZR-_%sR5feD-a}nU7y( zT;J&N!|xjiIj8-`e9j>w_XNwiZ83XE>dk(xljGYPuQ$GB{KHsc`R_O1%9wd5`@-BW zS8)1YZa@BdocYL`@%5bJk94`rudg^h{vSX4#qndE|3l+5#$${>J73o4iyc47*v**r zDeDoxk0R{i^4A()G^XF@n}5Ujt#RvO@xnW_Ts~@^=Zl1#$2K?rSuwise3{GGGwVY| zr|)N+=XSE6Sz>uVHm*1B=X@s^FEO?;UTs`yyv_CRYPon{gW&24zX^el9Pxvjh*bEs z2%9nX%{gpGx6{~|`7`U@rH-#|Y+%fN|7ET}`;vXkXWmY~{N{35pT2OuWybVJ{2~64 z`R56j&w4q_{7c64_pRnL&+TM>YvW+!`s8!_8Rxf}&$v6!eEj-r^ZXu&aJ2FB0$2P! z7njev{^O0A*D??EbA0SG&3xv;%xhB|A3wj}{JX}*#_W4CUdLFTtaI7#Tin8LYsfO# z`Cc`ab%u53V~32}_{CVa8+o%1_I3P3V{c(e6V%Rb_E^M4zkcYA*spEYKDXB?d5{24EiFXv2|$Io@XH#{(>825GjX|A8& zpA)t)#^1X*-w!Sqf60CQnqsk%{ah~o_>s%SPRE+h{FHvo^Z590=Ht=MU*5Qb@j7GH zq2+FWrZMYQ`g?`t-pb{&el&OftV2!AA8q`>`5!ahVO(JB;e4}<@srpsew}$g_V~c% z|1#$MJL4nw6U|)jm(KU3G5&gl`TrT8F&^S_@q-TLs~Q(O-wVc%jqbj}J0WC^|3t2) zE`NqG_B+V@KE~7&y;?f{AGee9=!NEkIlo%w_{_6u|4+wHH$Gs@eEyR8>~A-jujcj} z8E-aDG-h5+JL%s6E`PBxa&PBydm3vRv%mSt`Bxg#@2kxxJ?Dn8<4LY3=V{qzjCZ;0 zBi}Ngb*qZYooO6v9B%AxEN{#{da~=;%JI?XcgM#L!_5yf#=a-I+(={AsT0g^bp8j8 z@!K;>)%UCUl*>HU(e>%GIi^!9CGxO^#=gWTWQS-4=eb?X57{AE= zJpTK=%Vl2s*?jbhAEZAsZ)6;1ob2LuS{pO&BS-YeI+}5kbt~!nxcpAW%wzGd*DYVh zRmN-P?_*u=U}MJhXQk}(i}}n0u}Azd^<|yN_|3eXahY}aJJ%P#O8b>8N8&T@#lO<8 z(SM!miT+hf=@U6qU;H!kTGs2PE_c51Y-2rR=F_wn{nohs_+$Jcn0#3mv!1@{a@m(X zW&UB~IO7Ck=9#Sf*+0a;;)hvh<7abR{%&LD{p`nLhpZn@Ti*|ibBvE0Z#HH;W*?FH zc%job8gnl4qxpA@Q;nA!Ya274-DY`DHSTI$`)@Jho5tD3myL6bIY-U;>f@!-a}KbT z>uqYh#+dmc<0<>vT9)%D<1piA#+;|#;R)b%<0rbr&clno%9~*hUoRE2|i|xSgW(nv0T||B#Lg2l6!XL)#oo}_Vy36-4=KW^A15*gL z-%9g&PVu7o-JHJ2_>POcXF2oU=)q-*3EhnR&Vi8kd-;7mp||l+<2SD7He;R_?QH(V zVzI(^Pq@6>{FzR_#r5!eeFDD|Agm}tNqg%tYEvIiBwl5e_!KV7v3XdBR`DZJd96F}mc`$Z5IxE;8W{<0ZztCw`^#^Lso3 zzcV4^+>PHW5%NCpPUhb)MsI$fuc7(O3p=@9zH303W_;W6=NF?(PO%=tY^Nt}zZS;3 zY{!AN^Ht7Y!+K|(YUBF$HD+F|>3n>*jlg$w2>IP&3-g_wo^hS$#eCP4@PjcgLUuGi z$a+n+UO(DCeT}t^tBTbWzGcW|_MICn-#^CVobPtye3#Gr>kqo!t&Qin-Igw&-^EO| z-5S}BLySk;&isys@SpV`-f&LC*N@)WWC6H*iGCnzaJ*lwO)fP=bbJ$%=L_M zKfP}}*K&MlKh3)GgXQgN`73Nwtp82(@!Kn$Z$G#HWieafw}V{fKEI*mX=3bX%=t_F z^-7noWIgyjIf3ua68LT<;SKZ8xP50YImG&GY5O&{J#RC%bNq9*#~GOii`5pstIg#R zuJ>!V|Fj#p&T@b0b_Uvxhq&Gm#@eobZ`Ysq6!>lzVXftV+xkp4KJWN_ov)4Cf2vrl z@Vy-_N4s8r_eOZYc&O#eKBrGHxnz~GiS@YE^=@!GW8MDc#@UWfe!jm#7-jtqwmpCM zKpyLP;4j-F=pzN%5NSV;rx^O5!3#r8eR*xq`7V!z7sro1n(#Qpi4_2PRqg!+!ped@n%XBXSI zr`tQu_`2Jf=6p>Hwdnf~uJ2vzQ{Q&I*to!Y9qsgEoS*M35e~QAmfN1~jl+y}ZTB|L zcWkj($#yP3(3tn5_&qw|Zu{wpZvP15QpfZC4?=&p^M&=}yWWIO#{C?BmF;`B<;nT| zG`Ba)dfjQ{yUK(M3jb>yx}Ax(?`>#SeSQCe8;{GO|`<>9-Lh5Sz6ckajQM?EOWQN;&#@dQJARex zspxh-usx&q7O{ilPq2UOZ#kyBy*;hho5otkFPuKa`QLZ>vbOWtuD`kQKDX1=`QCIn zzUM^9K4GEl%=bSD_nJ>Szau9Mb^AFd8EiXde)!UQXFfjK?b%EvbBom!zSGHN?!RLH z8BVWkKj>+@9_I?ynt$EtXS)6p>(|Hn4z&IQ%s*s5<9kMgPl`}-kL$^}ZfZTZb$p&b zOtW76zL!wm^?wot)y!t_x+urSGpP7By5l%lQ^}D@Jma~H8c`WvK`nPU(mi6pxy*V1Pzn5Qwc}4Nf1vGtgxhIvJkRlmT8`VS*MF`r_o;hW{_e(itw+}B9+o5LG*gOV z7rtl3<#pyK8D|>%8xJ-var@UBPc-gh{LFfdFy3P9;`ALYM;XhRaXHgG-+3Zz;r#K( z*ggB;`nF5%TXNnx$L0BsAR)i|Z(87V?q+$OvfX>Tp8IU?c1FIhO!(OOs#%`Fw)-8f z|9RW_PvZ?nzH>o{-TSy)S);qN@LhiL)pER>DSU^4_)7ezkmu1AoME~3$nUO8pZ~q% z^lhF0*kUy$dt0vYw)c5ne{$~fjOF0F7lh5{8J^#tvEM&xyS(iBcd^}bKk=sd=v&eG zTD#u)w(r))p|<-<)QJl@^993=SNyambU94Y!w?E7JbTVFRe9^eTc(XC` zp62%MvD`ZtV{g7oMTmbtW`2S(=de{>?y6$;l3OfaZQK1m;~LA)_eltRw}p^%&)oN| zwf*@%5TU&D*K@r;8sD}4R~NGtzPrq2bJsi1cJ65$YvlVx1imXsXm9!Bzl~i#e>aBk zhWU!ddTw`;<$BDR{dpIsKV=Mmzw^CXs8!$Hce{Vvo;Mp$HePIu-4~e8`-Z!_eAa;% z&G&UXXIcK7=e*`b z^4z4F^~}6n+5MaEY7BMzcf`IfU(vY4$amohQ|E|=%*t8BlVyWD2}OJnXEWB*SbpWiv;_dmBgKJRJwv^~x# zHe0f*+iz~WO?N+BXpHssEw$bFJ{+N*+i7Gy{&l@&t>=!8KhXKEak(n4r@Qez z$LHMkJ?DSSa_7GN=wh>*|F*K1sggXGieFE+97kG?e2-?fdA>76c+2@dwVV$YqYHnV zp36KB&A52oa{Xw`e)BH#M;OZ(4=`r^ILP|EWGv_Q%x?bvOC9$^?iah5&-1ACH{X#Y zylgx6c0c8Oxv%xh_jfi}&ph9~)#cyvIQz#q!|^LUF7lpFFAJLcqx-Dij*g#PkVb!x z$L-Fvoj){Yz0UV+dOF{I#%-PNG4op(b53xk+Zp0^Pc!B_Z+*`5!^SQ}TS3&gB=_ew%F1e0MGTv^;0(YJERoi>!YQ*Lzbjd&x7FzmfBw?|$LCnS@GC zKf(31HRd_%woadJeAIgF?{>bkefwM9jpnlt%eubG`7d&M=CgMkf2ZZ|P!y~1_sO_? z!SZBX&;0$o<>_Q>Ys`1A7MZW?^1Y1D8mm~3$;NtacfB#sUDsH?H?3be_fLNxoUHc# zIOp7ahnz3k=I^v# z!!7?D%U|36_NV(H=P$=NU)~Gg@5>RcGydfC%xfFmep%xs#{8akOSfOg@qAy8@Vw>Z z@9hyrIKI5|U1iMv?Hlu#y1rJ$VkJ4pc*A!5(^%JX9&P+1Rj z*xu89{=cL9ZL;OO)cNurPuBMvoIc9sE4aU^TCZ0v{~}|)=k|;9<-37XoPM+AKf`jb zGG5_+$n(I>Gwr}<^t1N%=ud$x_PU(J@w}CO^ zEPi>R>&tqS^Ml-XWgj})@_k_Z%=)};`TuY~UF7~7?(vs%f_(Sxa&N4*H!gO6{ANA! z{%hVlJk)aYy9--yzuNh}xBR0lcb)@0Vn1wdz0NZ}=J;98 zf3Y$1VH4Mv^VuV9&j;OJJ7b<_w6fd>8S|c2&RufI<35g0J3|Vo`uj$f zBfrOc&+#=KAH5&4UJa~Q-lLdcy*{^Je&GHbZa(iBE_8og=J7Y&{m9?-Bm8XnjxMsB zzhC#W<3V#=x%f9Aw zo}G2>A5FIb?p=LjjZR}?!Uv_pSfTE%5txF|2^XVoZ$YgWcjl1>|uRc zIzIcsisnyudhFQG@p*q_to?((^GcXkgp!LtmUj_`LYkV&vIqopZ)uX&X;vF`cHNIVXp5=<6vW+tL8m{JKX-I z)+^t`SZF@yEO(jz#W>9R?_quO9n@=VhdkHJ`=hn2N1k6E;Pvq^`|Cu@eYNGBWBwN7 zTgHY??`M3+@iSe2o;UM7V?xf^r&{jx%YWvx@6G*4&gXOAmh+>0ucW=p#s7~rpZTqK zvDwYf(enH8gDvOZmh*h`j~c%%s*#&v%YqBf91J#&Pj4E_J!rnd0pPGtKf3I zU0?36TRDGQV>#mw##1aef8T>p*O+wG^sKKAHW%)a^W%sp?pXBoe;UO5Nd+ws|Fj5PnV>-o#=>}38i<9^1hFW*_- z=9Xt0m&^0LCmi3&IK!B8>dTzJfidU%bx=gWIWYywdq!aQ@cjGj8{>K6g64 zu5pd+G2Hd!IrcE~Q;dzQ$3kPyQFESuzVpp?J0BU>88;g9e#NP7H|Jg(+}}C3&bplb z&G~BP>&y>%-zC2%%DP?F^(Wu=<||l^8;l!_c^;Z^p64zTt=Bx`Q^w1T&5YL?2iZP( z&uf7BYHt5o_fN)S{2=E>|9L!*F*b8Q<^C<>-Z}6*Ph0q)+2uMjPqqYG&bMO^?l;@Uou{9%=pYcvzzrh%Q(*Xu`%;O=J8(~ z-`n-wZoJl*=SCJ|^L^8BM~pJgH+Hey4;Y6Svk%X{dw}D!o@ai~dpA4VPLo{kFYcGV z#;nhIZkF@(JZ~K7d@Wr5E9;Z{`i4$F*YSDJ_kQ#1oIc+6`PB6cwA}8#l3SfW>sH>o z&wbWM&Y$~?UM`q(_dIW_<@&1|^LwG6UH{vb<7{L0*LhE5y5lc0jy9HY`Ru3vbA0yQ zc}~6F`LYk$!*WzLX5ISOeBMjk-uh*qIm-M)#-oh+T~zk#t!;;u#_UgXAD8`gb<36a zQL}Cz>2ZIm`zia+(ayir@p&I2=RA3Ta*p%mImHLIOHb=(cJueq8#({=PS10sJon1_ zmGPYCd$(G@*KCK`F8``=3&-bvb)?(L{ogtZvZv#7|8RlhhZr-D=XXdyI{tHG=8N?6 zpRRAAG5fPqEY|?z`NrJ;{c66evmJI@z>a=ufIS^w9#{;I}3EJyY$4_lA?4rqJxImc^m zfB3}swK3~)4d>7NmiNDMU((I(y>GnNa_nn4PczOkR&e9c`xZu%iGYH z^ON4@=NkVoX5YHI_0GB-e~(?W-qyApk@rT+z0v)b?;7X#S$jCXn(=&N`a9HeFy=gClI7TBY;HOG8nf@}Z$9T_8_nl;;ul%p z`o>S4e!B50*B?L2x|92?29}$@Z%jDa$lp&U1b;JsqSNzyE&JCmTu=IWsP)bIHKmJ=We+liCuqn`(2D#kA_>$V~jsppLxa?jjtMa zaK7`5bBzbO-t2>xo6o-GPV1Xzk%MrOISl(leKU&{MjgyRz8S|X6p7Uqk z&U20nT>sm~L*0IU|M7?U+#d|Kyjgd1K9cq7U8iRpmsrod$GFMqnb$35NzOA~upCv5 zS6c2o7ai*Yjg9Nv&r6LtzwY7m*eCnz>{~K_J?wUBThE+Z)wi6l8ne!vZ+-fg>esR6 zuQT>G?q$sWYfsnL*X@1j_K!Da|CDosjL$rG8*067G3LFWZEdH%#_YGxalNr?O}9JB z__eW(<;po%&aa<${L{uKOY!r~r~j9mpJCj=nEQ&4OX-_&e4ypddNkVlH8uX{{>}MH zN5?;6%(++Y$Ftr~aC_ewdsyG>i*mk|^WEG}rJsAa{{|cLd@K9y++W47Gaf9~=D*uC z*X`$b z)9;U)f5rHMG3(nf^I6{?aeLYSMBjTX=b^^8t;co7A;yf`bIo63%>KHw%jf>{B-=I5 z=jyrr+l(uXCtA+<>2~hVLyTE(v!CA5@$rj0Tt54^?ajx&71FNdsbGvhX8t+M@|QK{ zy{d-hdl+XM_jNrZjGr4bUuFL@%kAgBxVq)b--YO8zKgMy@et!-#siGeZyWRFjSJjP zCu7cMa=+Tl@-4Ldxu3}XB6??D&U+u(cV@oJ`ZnJ6d~0my`m^uM{Mp9xJZap;@<#9M zFF$hp8sj?SD&zacXN=j0e$9M|%eOM- z9O+&2+q>PIC#L_S_q$GCXUw<{|CQs{8sjhDnE%lDj`4NlXk&Y0dE=XwE9VA>oB!VW ztTawH<{ac^^En^P{mC51r~E#yFXtlpedYs>|It{<@|mNM>&sK;C5~@UTkb(+}^m_{g(66C(XzIUoxL@oc(Nb zm+x%M`Oq@+)hyTljFXM=-|R1PK9qgi>F&3V#*>Zpj5`}YbA6MHX(x8r&+$30dc$(% zIm}S=Irr#fzK`*;Qv5LU!;SYEXB$@-|1suV@^H&>g7JJ~Cu5$2bTOaxVK4JvxW1Xj zfyUfl#LvR#zMzfsoo8%mJkfZvG5hG(%|B<%dDCk1A7#}x2Z=7VDZv52v zzVSWdtH!K@*I@Jgj29YHU+T|zJ<93Tjk_Bo=YQ7wS7Xix zv#-jz?2As1oo1NN_x&;9WF?;7bv)xe{ho1` zbu!~DnE2Q)@fqJ4pXtYp$JjId5VNfu!=;)F8H0}Q5dgC9vx?tpup9T}3`^U`FJG)%`D(iFdm9|6r z{r~3=6r$_f5uY5#%boo^iTXE^L@sD`Ze*Hm(#!T zue2MxTFuRW=RESn4dE+1P)6#lI?(|dSi~gCPk{)@}fAQyF^pD=rBkh!)Pm{0oe3$mqZpKsm zF?y$5@~2;8pTwu1qF*rMD(g|kSLUzM^~aB6hhXZ7f2Y5rcj^h2wrk{zzR@pwr(F2x z7e0O({nO8>r}Q{Y{>T@5Bwy-{{nAg#7fgT0Pt)JgBlX9wu}}Ob7(1q(v>Q1iSL~Mf z_<8IT|B4-wFBo}Jf7(mENsk_>H}T0IKZspYUoiDWp4cnpVu#dQI)Ca(dgMsH#0Qfe zy~C&7P`EpKYkGZPQB^3v>SO-PwG#(^hfMpy56K` z+=Y*PnO95miI2R|KmHQG3m zw3B**rR@|sQ$BjeZ&NPyr5{SS8+)am=$G<|kG^R)_DlVx%cXquO1tUT*d-YKvJZ>@ zmQIfzv19a&{;5CpMgHuUvMy!4EuEhAId%y~-{@1i{rG$2N&C?wa>afrAN!T&qi4#+ ze#sw9xwM~h!SqY&NqojnFmfe5nDX)S$Ps^tePWlCi#)Mg>PdX$PX8u8a+a1S<&&QB z;nV+VKjnj2CxekI82O`L>>EDqr``Bz8;wMYgpK#jO7?8 zGE6Se&v8&A>#CCqU0~cGO2k|$fw_b(-7$(C)EC&e%|WiwaOYNUN2|4;OOq)(hRMZ& z#D{l8Rr}b$N?|Y>>Brih&+)r9szvS0V^pWDXg!@BxumafYITu2D-jpQ6mBfb%|yJG zdb5MM*Pq6ic=0GkCDAU8JF@9h)HB)XYrOj3+zjAH3*1idZ8Jqaz~NhnE=Csj*39&5 zuC^kyW+(@7GdA}NoXWThk;Mu=DzP|-2LfkKl?w9{De|a!(L}r4vZ3q-nB5XWd$-#a z)zMs~J?-l86^eW9X1^hf@|D+JOebbo!k!~9lXugm*Y5~F#@Zhu*>Xbk3yi;WFzVtA z#zB5@Wz*6hHgTUaUc2=iwsGx`*Y?zG5r0bmi-8u9;ylUv~u3V^e|oMVTMIT zf2TMRc|CIIw5$CQDCzUs=M0ZS58@m&=xS6Wmk!`2E-B$gC{mmvkF<0i#ogrfNbk|x zW=CCKxy~mU&M99nZjNF4L}2s)eo2%FYFlI4Or`1T`oJMA-1%!+az9#_p=Hf|<6n66 z6E|SQ6h@-q^0=Z!FvSF*i{s;b=f zy8oPf+DaZ{y)zrjj8Wwmao?o&SPu+pkM>j3jF9axDUkKFKXX3cMm-X_iCbLVjb%M? z#ZzS~^wyX(l>&fLhS`%W1xFTC1R?nK;+MYF(t9b+*~_cSb!W(JMf6F}WdM(~9=> z?t&FiCsC)6uVC(K=35m%64$n9|MP3L1Gk_n#D<^PoCOZqBL*w%GXtfg8(C~a6Xn(j8vPxX5JOtP5czkhD6WIum?ZCe6wtoO4w-+DWJ)_Bwts0=Sh zwM(_zC%VD(>hfWqwFBLULWbp~(PW~B?UYUx#-ve!Wi9Bku3@UoT!six1EIS2GIjCQ zoA~J+H*WNLXMVsX1rG|R@@T=}%tdqJMJW`}#y7K#!X4|LXStE>p_o_&Sz$$9Gv7|W zp(fQ=i#W%{cQci`FPYO#Q#%Igk-fIw`s)il?8+I>jQHV)%>4OaHx6e>7IW7@X`;@K z+0ZK+>l=}Bi^qGZV5Zhg6E0AgrF$lvV%i@x(J=FqbBElGW(|xuIj+Es$CK)~W>{(a z+NGsGj7ty3O`^hZipG* zwPMG$;MomERU504B_nPDlCc2XnlrW>YXtZ6_+G?}>1G~NJ{JshBG7%etW2>^T|=IR z6j~q*zZx`J{4x=#Cb)-41d^~I3~JJts#wKP+&FkZW0fNwN^lu1*0gU)0trcS4k?9( zq*4j(4H^F)iEtDxp~F-VisxaN&f!(gkn<&xd5eO+BfKDO-h&txGQ4qa=wSz8s5+Vb z2>f1!0JfAoA*fW$hcGwvEbk$0!XNEZEsiDRslb-zLs84{6sv(0r$G}ga9=KGA5G!4 zy2KO`4T-2gnxar&?qSsrG|M@53R=LXp!X?%7<^A9w1PUUB$SbnM8#KWViI~Kx5uw& zau852S*XypY_Ezyl8ge!(A%Q?oJjGOm}DVc6eOZhj5Ny;szskW;2pL5o<#ZG$Im;* z{9q&p7c4y!B4ha)w028OPT{q@C4^5nFC|;@q)!b4ArRwFEm^J-O|8CP@Z-V|9|2=| Y1?73YM_q~ zzW49<`|o}||M=eb<9k2u`{mrP>s;qL*SXF)*Y$bVyK{#QFTGb92DIt#@>l<8{_-H7 z{7cK9hH)!{{xz~RPc-n{g>jRC=LO7bAmB#;Ukl?N|EcwFl&SH*z;6!o4FmaDkgpE7 z74S5Ld7THI<{+N}@@)aH4)!SoczBw&XBOyV`$Nmu%Fy^uzh}Jq;kg z1o#gCz69nq1LSYQxYI!XB=~1dkS_`P>;oQ>&xZX-`NJiMpDy5^cA$SG=)WXe@2^@A zmnwsN7RbK^eGesn|9=2H3+7uB{JaFne}Q!j1^GajS5eS24&-V7?uK#O0M7&1zv-Y) zC$N7mtYdA^XD9I71^FT1SJ|L{7VuL%>Ygoh*#O5XBNn3zfgU(tFk2K#h``A!FYz5&lIm{-OB*F5@PJsrve@58v| z^ZYN0{|mGQKTL;l^8x=ouxD?O_Xqi9AfEy9l+XLax*P@jr@_9c4R)9b@)n?HI~dm= z@CLy125=`>$19*`Zy5Ip*li@p+XFrd^hpBw?=Wsrm~S-ri52uYr-Hl<@IM9lqNKmx zUWR8duihYk2;^VGye#VLz?_`D37GyS$p{9@x1O@F(TdJk?=d`3q?Iroex^ zpqBTCaespT(?I^PvF0}dJP`Q%Xd1&#{{uupB!^BUNv7TBR3>?2R$X$9ks z20gce{3RH-8}QTso@%fzu3-N@U|vzrg-)K>z#TKMpXjC6Fh-0(&-tc~L%`2i7q!)SDYX&u-vv2{7LkAb$pyi|pJS z^w|mcTp0Hztm9hHrw+(dzO)0z?GO7s3FJ3|UsVPFj066yur7mPTw9p05A1g<@T+3r zpW}dkJLpO4SP{$S5epno{{;V)RnD=@ENfM0?6R)P6`2l*l}Ut1WrIK-3t z5QlAHTyyZBZeX9{VCUuFw{9R$_tErjVL9ky40fP>^c3ts=jkZ$H@dG`PV)sl*Mr@@ zf}Z<9p6;Xjfj;z3xB=^@k_Jw%93Euafgmr%p^NIjHok4y9=uiBiz_SZ@y1=@-fu7HRzaPl=g?Qo$ z_OAqaZ+;k;>`CwEBfzhAf}S=o?o!b6DaiZ4xYuD_R>QudcdbdlV*}$lgZxUc!$QEz z13m=C?FjKR4fate_!Y&~ys$21U|+8SJxTw0Anyz7l?eJ51|IsoPeqv5PQat#JbeS> zz5x5T1Ka_|EeUp}J`deTmxgiaUMv>$p?;<{*oW>B3W7d&VSQ(Td?3hog}NgU){FWW zMPb}FV4rQUUS2TnBB;xZU|;`+d36H$)*v4Pai%WxRpx{K-N6oLfoCV|>snB+&4GEf zg#K7}Sg*Yxe+cyK4)Xrc$EJ6B8L+Nx>*M;@<20Ltm{azXH z1eos*&_5CIK;Sor`Q`vV9_)|{{#FCz`-46a;D@JSUM)e-X28D=c<5ap-J9$Jo|6#A zo`E0UgE+hp>=p_9)xb|)!?-g*|6(w1F_8BJyfWw$5AqJ6XLX1h)Q6<^Cq00FDCoHw z^mGTmItTK7LH;nrheTN4g}{>scvixEhrqos-8(#kc`br*Ux7XSU>%Rce2ItR-hHso z2N<^i#Epe8ub&_v33v<8XDXZ*mLR_$;^9G%cZc<&cL?Wz=QfP%1b)>88D_j5`P9 z={+H>%Wyb%9)X@&Am0!Cb1UF$0ly9Y(+KQI@8_F<-Sn?L4Tc1`kEY+s~phi2dpjeuth=-CGJ zd<%ZK7xe!PdTs^zc(DIx7&ip)(+~&lg8VPQo58wMz2FV{7Xmxjg8gTJ{v+UAqdKTA z@b3rvcZK-o1oB6K{}R}<1Nb5JA80>P-)SA#e+SsD0qFlfpQ%#+wE*m}6xMf@BKZ%t z1@yE9`1U)2YmVSrBt|5*V1^MEHA{IewZj}6$<67-n~L zGy*%=!?;~w+;1@MDe%J>$gAmm?*e)CKhS?5*nbi1uSYQ7J0O1@_~(KhDuCTO08bT= z_W(VAfE}#i+{q929|wN2AJ(xD*rzMRlSObI4TN|y4(4?j?BfRdcYt-Fd}%w(cRuh? zUhxLxXT!WK!4BzApS}fo6Bsuf{B0)i_yJEzuunADzZJ-z20Rq>@ddm*@MOY%*#>wu z*e@Ny&(lHv4cM9bx|4v%1?*oH>cq7$FZvzIS+Ls$SjUB+XKj$*TtrVGKg5T^p#K_} z?-dx=xUe4gJ?Q_9>;U6_1^Ia}Zdve$w_peQy=^$?(*^V~g>geb{;)Qi;SKD&Vi1S( zf}Zao?pXlO3(%kHCQq2x1mJlO^QFFeRnY$-@Pq*V8}b?Yjz=Q!P`~Rn$UA@?G9e#W z06d%F9H)CF`knh8=)*ULb?gA+((i5W!g|ex`Hlm9KEk+vfyWZ?N?^~!Fz$9ZcdEd= za)GBW@YIKQ6qzvJWO)BD7vyJy9n68JCGd;@J#T`1Fyu=Hu+MwID*}Hq$kV-f0_bxM zcy@w(0a(YD5KoN3{@LJ%k72&lho}2l>K~qgeSHP=d;#;KetUV4r~7y66E1`E=m6lk zFz!dN^BmZ})Iav^pK z`G=r?Ik4wb*pGdHCkpEH`QV3MFs>`utt{||03HaqFX)p6^GX4G<^jJd2Gjj&BLD?#qCGGw7cT{?G>Y z^-37`6^#2G@B=XJK$!0b@Shmab1s|-!4q@Cx`ZR@Cd24m=)!w*@=A z1pW5`UIO%~595+Pmtekqz;Dlh{7umF3+OWh_!GcBrsmrIlR>@+{E(wC_`_GQ=X98F z5s(iBeVzaw4fARY@+D#1k}$6aVCQh)c>&{2hxKg@4f<4&?_#Fcu{qemsI-=M1^GCT zr}L-^*uen$mjXLmgPmi+|Gj}f8sskme^Hq4Z_x7>jOzjXW}r`X7`F(>7ld(}0#6$_ zcgg_2BjhdPfoD6+w<+W&FM+2dq^D+dm+$ z_JI234&+fzz`q#m{{_ZP2fPB{uR)*FfIowI-2nN%AnyrvM>CM8_XhRAPp;}PX@~+l zw1#yr{$H*Oy?5OW_M!KyPGE|;TV876PRu<^F5_lef{?w<<3+rMA z>oO1YSpxdxhjp0&Jk7v=d;z}-Jinnn>In1of%&!q{vt5n>7eH?@RKUAPY-~eD`8&I zaDR~r@w_?k4}x>Y3-r$fyX^)&Z9u*b_zAtgiU$4+Sg$OQuMPIk`Y-c@4G<^if&FKJ zKJ#JR1X!21fd7GfV+5Sb^KVua+SH9Pl|XF4f(%k4{0o@EgXx3F~M9_0%oU zvjvRXAM9fS>zEAt;swYL1N{rYetZq`?Lp5Y;3xgTo^F6U!n_uOJ@WyN9r*cF;GYii zb-|t;zz+R@hw5~9kRJl}FAsLG|1b4)gmrfZ{%Iip6YOse=h0}GZ)M=m1NbG-lls!( z5GSo6Uy6b};n#mDUjoke{E*MIf;_|mjC>_GnvkY5S&>H_*N0v@V!!@(bXfuHV$ ze}kT;z&`@`OM`qA;4@&{1`r3T1J4FnN4nRh-$xjO{fmJAR0X^n=+g!EOKGs@N3cT$ z7jQA0qA=I z@4ya^0KWls-&A-~_Qd5r~}>{A-%YY99TAU@lI{1VWA zCG3lTV25GA69f7<1KtPLr5N!41s$ME_V^J8F>X)0~hf@L1 z2L0)N$_C`?0zMt`lSL3W3IKiu@)kF++Xv96Iq;7I`%u1D66Bx3dL0FSh=Bd|33$H4 zzHkA2Kg^eYf3XPWwFhu|=T-{j=^guT&~r8HYj>~@-6!4y`&@x_X$AX~z9%pR=DP;Q zEdcYn32`X}@+)uPw}*UkGRSv>JgN!cOTcgG?-kN}@=@?RofzOxfZxG=1U=nBejeDf zA?QQD%dQRf42QZS9M+e9*H3?EIRW&izY}^8^z;QknF#)W59}NTcB9|*bbxW)0jIyi z`yPH@W(_zji=i_7uG18LXSxsmZiO}c&e0xz&+7r>ZUDcn48Mmx3=``L-@C31cBb!G zZUX*4fDZvXw1RaB0y|p(KYf3Oem5En@x%-KIS+%}pLttIng8vi&edzlSGhkf$-tTho&-E~```{;g01t$DwShd)2JCYM`a%@1 z=)1T*;k*j~JBNcl_u*Wizjq%7`)&f@rto)*`oZ6^Is*ID1nr@#M2-%0om zez*kexefF$5Bu~NtXC<(=fQd{1p8M4JHLa!=T!=LR>I$L%Y^ma2YMcabV_Yfq=Jy zebF4|wGsTs5B8A>@O*(dKu zKT&W#-iCO13hKCz(68`>^E5B?)2;vy{SLZ0$Y;U0oghy>2Kh!B3dwi zz|Nb&Kk2(eiQu1?V1Ipt{W}|QW6%e`e+BaPfYaYCbpic%!rucu4|sLhNBO?!zeung z_RFJGEpPT+nJIlTgo^!8%eunZC=q0_ODs=4Ax(S7Bez0eSikWHy{@@xWsS=e{lIKM42( zVO?^8{|}s}cVNBVf<7MLC-nD^4g!BI*pIQ0Upc|J7h%5)0{he7&7{BoQUcDACg49S zAV04H=WGv<&w%ZUv)k+9P)>JAV2c6=D7zvejl`a67Z}7{21U( zKu?QzdfW`q=i3`C-}0r#KfKns;|q;nf2;A&A2pr_@T^Z-eh|nLbLm+O~26;=6e-8LoI7jF`B>i2U5|DSrLVn^0aozy>%z<-r70CAoeJ;TI z_6Hv7hf}@30`h?-P=|Jfb8rTnBO?Ld3_RAbA3K5lOT)gH1oGZ+{*Hxx_Z8~FNQiH* zAuf4CJdc5MCl$_xD2UIIaPCxtxV`zkj?d%ZoEi>1FW?-k0P_DpJ_gQ_0uYBYLC-f} z&x+6Vd>z4Vwd1w?$R`@V3AoE+Ex#*S<7NpOe-HXwC2ILHFt3MTw~v7LNCJMaa{%C{ zz#qI|-Ft$67K3=Q8{)=4IA>=;KKu~&*B;=>g7f_m#DQ#>ZyA{HB;ctA@#h`bXC}lq z7l@NtaDEw}t~>>O2{+)0hx3cRH){gtV{ZlH$yys{YuB-uOM#%`NMLE^A{k_uY+^yCE!*t-_d|Sg!6*x&`ppJ z{DF9w0Ow9aSjVCe|2qQDd(i&@;MNfTyTf@D33X*{(6cA#c?{Nl4d5F<|8&s*D8zF= zICnNfe5eQV?I4~O7y7%&%|N~+)U#K>p2MJC`v&{V3*vKAh{NlF zXA$W03eK;y;8$(HAC7=O1VTJ44CAhc{DJke@*3;fmq z@pc#BrNFN$fM3yjOK;#YK%LbR&P}@4r~!630e1KY<5mGXCqq0u4R$yM`@In4;q<=Z z66jw9=6eM4kTl3MA3oFh@D|83Bcboq^||J8fw=t@^lS$CJoUR~Lp^C6Iz zmWJ&ApV)#viE!?uLLJc;{Qn~Cmwb>HEr7iA zEu8NKq3)*Na~*}eVj=VoO9S2)^4mgC$GL+)tOftv2j|6UI2Q&0o(uN>195%mkcS+DI85gV)e(Ns_udD7au5742;$xhh^xsE zx8oqL+QQ$bFamrf@SKD1Pwt2Bqqc?bHx`3)Y94$KvmAVP)D6xTI;ZIGE-ivOk>0h& zK|YfM`_2{i=`N@X8pHW=2=GU+uPcF{PX&FVK>iuTCHgz*^&zi&4sqKP&V_Ga&x?>R zr2$Vm@HjzUkqGgY&cuoa25^^tr$JuEsCJx!(}-ijt2s&%{`b zJ6+WHuv;2$3i=<0^JplXBb9)s#{)fXv-=vK4?MY$7cGGE@xo)x-zq`lRbai^fZYnh zxoHA<#TPhFi@|(vL0q~I{%-_z**fa)!Fg8<cFfP8o?eBUn$@N;0dz7U6R z!`~zL0{OEE$kX3Z9SQengTUWv!+vQF=b9s&r-vaP(s_LX@~FWuZe!Sw&7p5|0?y5g z@jAYF!1=ov&i(Y$nrG=rjXUkvc=f{?e|t#dArPPcT+s5?5Vr@wxw94Wv2_nL|00n0 z1^YjNczyi3j8@oj{+lkiU(9dSNl-&od!^o(BAH;aso;JC}H- z*J~cEmn-N~9_rlUfQP_2o&)=O2gGxCI5)!}zRiGqG79{`6xRJ8oR6*HTssQC=bZuP zLM4b-Pa%J>fWBD|;C}%9uBtGvJzyXDz0w*O*9gYl4)ZdG{Zb$Nd=BgjU&xE--Hs{9 zFN1Y40eu!jUXcgxWqcryDhB6T1&DiR;k(42tLlw04Dy^3u!H!`1crTG!I} zEw~r{3+Gw^(BBOFq%*8b3wXbJ74n(=kPn-IeU`=Ob@YUMxb-D1-~6e@_d^}g^`4d= z1AUL8kUvk^r+L~z9v&B^<(J*oco)z!GEvKC+|~G%YZ~tc^Zg1ut0Au|1o3I-%-Kt6v7>eEwj9$kE)^^AhNy)xw0H6hM8L!G`K;@%*b?`iP2E->E{FkfrXCl%_o zT$tBe=zq?I_*oM00Z=#5-`9IzN5|EZ?KJLGL*pN!$%9aT4T5;v6ZVli__-~_$$#J{6(GKKf&FC)aq@Vw-lxUEZ!4G8ozs1<33k4egynyKGb*q(3ha!xgQ0)-3LD`1p8tb z#Q#MMy9tLN6!`b-1=nFr@r2GmDcaK0NJ z>wWqL`X^tZ4*dc6709FN0{=&-i*KFKdj5kv(+uPn-qbwxpdPFP`A;OAQxzdz<%2pm z3C@vvur5K+ADDJd&ucu?^`ik#27EZI*W)XC+%V|FjD&p8>6hlogm<=SP=C?)ubRVt zsReifKUF8B4mo&xdzYP^;&2l>fT@ShZ@Bi_LIk_qQ{ zI`DUb`8EYTQ(+(3gP#XM{y^WoZv*T85bCm$VE+Y?+Wt>ZYrIyt#uE-`ya(iI8-S-Y z=(894hdmPYxJJ<53x>SK2lyi(Zn#4Koc>Pkc{sn?15anblXdtpWJ2B;4DtU7)Vcl; zKQjOig}6k2SI!IW2c1CA1`t2LLtn@e?2ruSrVGTwNXRn-zz#p5ZXF2nU!YFE26@_t zrh4IXnrl4ULgOXtYupj|w?hALB;<89!T$7j)9ypRcQe!xvtsmqzYOxdq3>i2_+dDY zDnoqeaZBs72hO84(OSOzIgNLOdxsxz?yLa6?F{GpV>oyI!21M0xS#ceJfR!#w}X4w ze9+&U1NqFPo7!$M&`$`4cOav{4{hNbX?#PE+ZOm+KGO27o@qP>>>mN={s1@!>H8kJ zu#WV1dHkSXaT4B;*qefc{A$^#AigJ}?E&sr7Ka zoB{hEgmLK|(R|>s1^gxKFS?Jb3iiwo=Tr}DP zUK)QeLE{5pUw?u++9gY`*IZb452!;+L7&_T*3lXK{C0%arzh-}#enCBeK!}*$CfZ| z@x5A~&rs)fhWcnM;5*>F>kQ}S2soz-!@iyfb?cz&+JD}FpVQynn+*Nf`Vd#ARMF%9 zvDEk;c<<5KUdwldKFp?CTHYS|fuA9sWPv|BK^${~^CAQ8Sq{U!WH{s%zHkq_3;fON zxc2ARV;a8-eg5ZA*XKe$M!(PP`CX5@8SM7{gqDALQsWIE&X~dex(RrGxWCvB{i5gK z4|ZR)o_ioa2?l>~veEuL6ZY38kpBey`|LD-e@Bgfh4)K^AP&SsJ!KE^Y9shVf5 zk$O;f41jyy?Z362%OFlR0zcUXzZ-o9{*Vv)eqW*QF$m(-5a6)}`=mwZbb-D^9kBmdc#km_&T9+csR4D?SFmRa_1~aR9s+iDh2IsXH_-8|Fzk!I z!2c4?-<5DrdJyWPEkE?WSPFUjpd>9%e|M%j)Yl$xk9i0BkW(Q36ozx*2iPs&X{~?V z%^EMZOygtxG#<4?<1avdo0pbfFhJv0?KR%CtH%2d(RiPc8s9rl<3U?AUL5M625=uY z1M=Im7J6S;!oHXe`_}~SHKuBMgE{24d*R+c7|zGqP@fJ2o+$ADc~BQWg1*x)I5(d| zzV{LO)%&6U77g-|aE_!y{&@!Sjjxc$?t{E*AH=b@r?h`Y9MZV^RgIqpp64sIe639y z&w{+}57ax;*J~c9r5ewIy2A?mCk^E9!#;I|c)JYh@vhLvwuAmy=2pESuddd3{@xlN z+*sr0aL$gh(((skzU85>l>z%=9rQ^SK)y%6%g77)OfK|eAHsclVaR`mMrglETA}f{ zM;fmT{n9G;w0w&@8qW*&ydNNMkB7L|8S2nQP`9RlKi`8qHVSy`;U0Mm)Df$oKH3j; zT(=|IZp~sfo&@JhfjZj%$H2MSI$ZOAhxMi3*MEilxiI9D>mg3ogS@vN_*Jtgt^abs zTbvG{3;jx zb2*$}PoNJ!^R^y$1^DM)=&L_~{Qo}W3G*P{hV0Y&jNY&Dg)r`Q=p)g48xJ@aGGp|( z9U$+j{8P)*_m_s9 zc`SYRco+0ZQqOCBfzBv0`+cN<4j{~0TpEXZssG}=@ z-F8Er`w9F!7yR6Mx7H^E-Zl9^UQqz@w|b{Ee?Q1`_JZH`f;`alnC7>KzU#JiTK?=f zjR*J9c!I0O-@|zk9iZj!4%hf^PmSmG*7#4*pZe#Xa4xKAqxX?1#CZ$2&kBL~d~mAf z?>kB3{ab0g;6RO68n5v=T{OP4r^d(lYkbB~jb}oC>@ei9HX}7pDx9-Tvh}*(gFeqR zxZiL6R`cw+qj784r*&hs{K8ur?*#W9$C9-C0l@3P`4|oPSZ$C$4{^W%b>&USZ(||u zy@h<$8TOrHg0@5OeT^sm(D(-Ev)zYt+!_3*2%PWqcOm_rYkj^!AN3>jE%!kF&=m6O zl5pM)1o>`|r};tL{&_&pYZCNB4o7JD{$U!g5w3A#*k6w!Z#0EGv(iz`UmMQZa&X^a z3w6_|7n;9Cy2fijUUUHBWSxmRPHtpP6K-;<1?bPd%SN3g$*sV{5E(G{{rG?ITy{-9O{?QLR!8P^a1GaFW-fJ%Z&n> zzb%|QH{NSMafkD6I^@IKAwTH?`OkNVw|BC%K80UvJRS14(U7od$*;~n69UjzB%-$k0I#$t^hg+9aR z8Cw2QYmLuK)pi>N^~*Sj!?&SMNdP<+>ejE@wLXQXYP|XyjhF7J@fnphex$d??Wbt` z^JtCRHPLu24~-Yk*0>Y&NxJsa@&jx&ei`}(`Jlg=c1rVnhCJ;Oyfch}yyzFi)vFK> zPxR4#+XnKY*6^+^ApbW&o|XvredmDR5AxxLKlMIp z1pV^?u)i_@U-3}$(>wN-&?AZwXBoD-;`S82ZT(D;+M?Ei((HegX@h1lSCky&B z#&tFSUD!v3;Cws
0LSD(dbKcPN$WjObrZqPgf7HIrX8;u`qukjTdHC|@E#&-?V zco^8>?OH8g81DPZyw&o3qBR}?{ozNjj*Z~FSYJZ>NiWDxp1s%lG=cs2%t`Z4U#W4r zk1(>-@;#tmaXDG*X_2k*XowFdAxqCHLNxM1?u8_a9*5z zpzYia&g*&5Kluaw9O{FWjnLyRysGhSpyxNpqdvg7a}n~E(c|^FCE&d9ve5SL0s6Ov zd@>#OV{!0vXSk=R4f%%gNj|7I)OR5%_=5YAyd}y~giA9We{) zuN})Zk9B8_cZ9sI9K`d&owPkmz0r6+h!4l0-kk5JdE6{D{>eq-9fLIf0rI7nH?({z zl`Y zT+#RmH*Npsk2K!TLgU@GYks2zT0SI2G1p_qxeVo?kLMM$Uz_~LT;{Vu& znkR0k#@Bdh{7X@-|L)&fKEH#;D?wlAvxVlr4tmaMp!tVi)ObIrn|k!u@|Ecx8NO@b z5B>kT@O#w?OZ0sAoYc4_+?)8rdzi)*HP3uF*P^#*`7%&<6#k^`Hu0y%cY^=_{i4Tp zOw&014%);`k6Uz#<{1t7UT?^YV&L7yB&bK8f*%%xzM{3Q*7G&U&jtTCwbOQ}0{6D& zhqe6krdl71X8IhzbWqFxb=Ca)pdMN1sdgof_lw6SKFsO z=synX*+S6wqwge7I-@lSAmy)e`EkAVBHbBUUt>ehYm zPU#oi8)jV4{A1u;_`XNW7l-(14Ey3qCvAt49W`!0O5-!fYrLk7#^=L5X5cg}-xl^o zEc`CR80vyNq1tZFk2U_Vpw{OR=>HMk-PMJA3L1Ber5?99)WwgpwEh-PHQq+k8@|od z{{ZEVVLRL-EIFjdZNE|DC!l}$va#0Z#AnSDb5P^w7HOWtn>BtL_UWNm&EL3-=5e*s zcu(L-g}N`nN%Qmof4lQl>p2Vdh3N{-ziETUPs2GL1?S7r!e;mnm-)!oL^HkkFk;FDGl%H zSAm_YpVj=UlYqae9@r(XmM;kTUSU5iKfS)jhr>Q91$kFv$lsR3dzhQx|I45*m~5i; zYzp^}d7=I-0QW~`ke_d{)Z-f4>2=v3r{z=Neq@M`_J;{jr#H{m@^c30aZAJRF&nyQ z`G}qxFA=84ZCpvqFU+Iu6R}*&e;%gs`_M1?r|AtFpx+V+{lgJ|^tju<>G>u@-*3PX z%`@+p=9%70*p`UXV`n`qVT#khEXwqsuFDs~b==U;JJ7}KF zX&MjSq3uu+`ZF#|wY*(>jaQka$DIUr8#P?>baB>r1k@=NzUy&AcWa(SH8k$^So73{ z{O8^eEkF3K#$B7~ac@Dt^bXXy!G$$XI`mt%L46u^QS)E}s4t3r)#KWA*LKKjr}0pT54B()E!nSm zYOdFKXUM}FLI1NG^oOs(Jxh|c9@ng`#(VVE_{PB+r+(D!Vp{$*)L+i9uS-B*j=r-! z2kQ3`V21{9FEbj}Wf|<#QhD`!oB!2*I4z%+?+QFnrWi_8);vpUYJ3sI;Xx3W`a<45 z1kT4Ur}ccl!MJB3ey)bNVSYmM=ca0W^6_8s7l% zAsFJ`D(I6J3Dx{>VgFt&py%}->b0>juVHXMUK#XHHP+*XL4S2v9W6hvkjBfvemn(z zp@ow)&tfl)8(V0+1o-C`$V-dX(mcgGYuvVt#s|UsD6e1O4^uVI0qBo;!hW%UIQ9zg z&PTOAt;i3jX+1wI(Ri;p8h;7*5f4+eKJDRL_^Rm*u9q~=MR+&(1@g&zCpFIs=wopik=yea`%lKb(Vl=N#lq(;<${nWg7d z)iRLiGWXgnL@=OXBv`9lBU4&*IeARo5*uKm0+$WI1-+SikIY5tL*|I{+t zK968u>|LPcmq6WAVU?C2dsgG=V>I3q^16aOwEP0-OROBBg0i+78vgZeEb5 zy`G?X4#7S66F4u{fd9{N*Zg(i{gQuvy)JE_-mx5^<;|gfZvp$aAJm}@A^&XlNYBd@ z>c^97wS3}4jXMWv{Ms^&_noWpyb$-2A>KCh)I7)5X}l7w<7{6oKLF~)TNZj9tH8a+ zYN*HQJ6B8KzM~PGQ=!wfK3$-%m_2YqY+RmFhX*>k-?c-Oq9R}9cJf&d2&jA07DW`c#!+U^EbG7{DgBmZkL*rFr zG=A!;#{X>8cpUU?w!wMytgg1_cN>k@+^X>_u)g;qw4O6vG=2f{qCR!BeC%Vb&!Dwh z{xjs~P48%)G&mop!iB*(=s&at{|pP)<9_khcmm`hu0!>Fw{_Ea^@$q)1%1Mb@3lVt zAm52y}xZ9l~MxDHx= zCB%Ot$OA0~>iN>|yf#2z;_4c$Pi;7VH(l1_=0KdZg8h{V_ez(bUOrYykLv*ISRr1| z>*pzrS8Szm6R58}M`?ZhY&1Rr;`XqvTD}7Gdw-AD^79~Xtlw16tIVGqNz^bv%cn!# z9WzMM7{1ikcn3IV4?rCe3;TT_oa3{;X#E{qX?;8_G;VcQENPnOBh z<1U82{avbCp)a}v-oFhgto4t8JnaGGy*)~5p8BAF_h>!ec~B1yh5V!r#OHH}oBdtu*}+-!7hSFKj(IiS82G<}Klg<^!5#YQsSqFbK|gblwbpYfoL>P@=jK5F zf9NA^Pg5&BZdjO>FW{!}5nD8V;ep0?K;K|_sMe?6UComV`{fVx{XW1uuJ_<4rJ+u| z`%LSz0rKRv&^Oxx`*G<}ZHE%jpNVaz^?42b2g*wu!hC;2J@Ra=9``Ef84dHD40en7 z3H-ow819vlz@Kk`-&#W7%m?z2=_T}ft#708-r%>94tl<|qBQ;<^5OAN_w8w_^(o@0 z@dn@zk+Zcv-65Zkhd$4sM9tF}&g*S8wVpMqYdpW1#;--_aWDMUc$u@BXZlV8eNkuledRN_H@pbv_$M!Ihht#R-`BJqJPvA}F=I8p z4D>G!e)R?X3Idb)VSG2jW>h+G9C6;c{q1gAJqIez^`hx)pl-C zOXF*yj&OlEQw!p7Hw(=_2>NoVP)7$s|0?e$ZHJR^pP1KD>yxlu<7Gx_d=$KYZU}kB zeW()`z*_J;QHm`CxO6UxU2YZ;9qNK)!SY`Zjg)Yo2#b z8ovs4VoT^7`0dg>eqf)pKy8O}_ciX+SMxvHt?{354-(W{%f~F#_(ZVV{DxY-w};mM z&^?Wxf_~0|P%S?g^0YKxtM~FB_@!vv z1^UMH9(!(e?GI}%YMkQ0ztvhFcgWvD;P)@jL7!JpU(@$^gP@=326q15S?k}vt;Rde z*7jMnMdKf5X`b%z-lq3B%~Pa^#%qt&{0|yxd>x$olOe7aE33!-40YxDx>`O@6OC7c z{#chQT7S0znrA=6)gEBCIk11{jMn^*W@@|*tb5CNE#IJ##?L~3-V5|RlBVs``+>&8 z{Pei~u^LZs)p%S5jW2*a>J#)QBcLv@Td(=2?bCQEsGGcNYx!wVmqqN+c02h`GIUM@x>-Xq!9d2tp65i?2ea*Q(n&%_bj~kAF{zjUoR#lCk=%slIKtAv`Rr5T3 zrg1m$xBct&xbv(v&(e_^H-r1TJP^nJw9q`Qdux4~P0;u|u=Dkcn!kag#y9rV{LP^L zqTeH|fV%iQoOhR-=m|`-(0C%8gRXEMMO@PJwGY?x-8)p{IX)U6FkR!bAYK`VXnm$Y z{n*Mz%lr1%_)mz>ZAWT(d#F=R!TpZkNf8dMO^FHj0V2Cr_$7{PeOxJi5 z$Tu2~(elZVA9ja(v=UIChQqyH%u+q>KNpSXR@L@=ep%xe(=^WxILE&>(ekr5YJS_V z8c&6H1=ZmG#lu05YxYy~yU*A72FNoHmDKxgKHQII!M#`x+<%?Dq4{mfY1|Fo{mu;3 zcGwK>qF>g~b{Mo%;~v{Izj=PG=TO)e%b+is0CCkB`nvB%X?==7U*b+nEuR4O>Dam2 z4lAQ|{Hbw8<33O?M2yt>+=Tu~bGQ$xXQu7{GeGk{*r(@3_lBlW|2kaN{GC!X?hW<+ z=P6o#kCVm^K%B{}ujOYzJ=kxRmM;tIHSwNa-$5_5J?p_b=7l^hV5in6dV~5u^qLZHNijW`=SpaZnuTM zS021V&#T`8J+DdYG=2~2$I!)Ep1x!D67*jReY_aBU*7mgkNdZU#_68%Z9Z+E+~bzOo5>$7FMmiKZWS`oQ7JTzA*0QOIn|o z(HhTzdSrbMtyjpvWyLZ+6H*e{E zQ2_ee8HY5_6%&o$nxgU9;BS4xwEi2Q&$$5bTcrHh`|A9xouWx1a35V-d|19?cTFPbL^&dpo7TF)X7-%iig{73$2y!8T& z``p#z8pHkFghY-wn{X z?F_BY>I)jT7_RZoa6ec%LC@<0*ELgu`Q6-{T;7) za%O6MoZYnkt_QXJdB|g{LEhUH?%xl=xzG>tx($#&l+Mz6o?fW&ZcrEBhP>!L^!Fyg zKKgE{?SFW?#vk}=J$;<@x;%q;9@$Ov%mn^%aBsMBv)+$3P#^V!cVaC(^?Z$9YyPni z_hv#Lud1J(uP^is=0n`BP(<@=DXi@uSxBFo-bb|j8}O4QaL?}UpzStrpSIf{h;MP{ z^t`%%)coZkZ(P<>^HhQRtnv`wPJ8KbCqdlqdqa;~da}kRx@p`U>ZYD)S|9q3dI{KH zwP0TtI-&UoebVcACq&C}dtN`d$Bcq=WQdg>*M6$jvl`r^O@=;<eT- z$Y&D2YWdiCTAy%OFUQ}SXLCQz^Aq}tt-fn{Z|M8w8Lj1uTk7?l3HkgP$hVj6)ceu? zkj8W1JpB&+`CTit-7+_6y#0EOzX$!7LLbs-khWW$N*Z4e`Ml8stxo{FKYSCW`Deg; zZ!d_eE8sq^YXz-O;~v@{4sO%Mt6kLj#&qiuTJk?9(*1%JoE0`mDYyY#+Gd7}B(Ez^2lD53HC^)%1- zi5j=up?MYz)9br!t(K32{j~tv`k6<_Uvy;l(1&lMelaA!9Xv&RxA9AJ^A- z&k`E{WTf>8eyZ22Fy!rr;Jn*5S&!S~ou1d7vKnu>N9!{^RpSAdHIKt4txvZ$T7Hj( z#$88hd=~WKe-+a5{~#auvslaD%&YacI;Q2rpzbRS`*aG_Bh$}oJC7Qr^+}tq8SSfACAq9}W4^wrp*OAyf3YqahCG4$%JN0ClwWP|fcG{n)S{n!g6btLkw6=D)4y zyXu{`+xPNXKJc~1+pX3-2~d|g!~IDdR{mBXr5kE zwfro29~CrQJDfe_$tON){>T`u|0`H8A2&VjcsuP^mCoq-20(q<7Wx}yAkT4uKI-1m zdcH=hG+two#yt*e{bvN~`M&L^argV0C)7^c|9X_xC!~w!i9fCJZWlFAet0MRF-q(6 z1M0ZEuwN==YJCR3*7(W_T2IeFjW-*p^^EY){QWvzY+9Fwg7$*^5N_Nt^emi+Wrf&G~N;Nz@fMF zy4ykj>hWOB|9Q5?uR?#m1e}`{Beg!$!}PlNcF^*hDrkL{z1MiUtG0822t95%eCKUR zN3BmYE6wjyTI=%*?z7yX?!GiYk6Q}*Fx6XXeJVZB^UVc6xn-sGcl6Z!-5~CnLtni; z)Kk+SU-cQK$Ia@ip69T#s}ro_^;+#pO-(h-&T64dF-GbuenRhH-$c- zW0=-w-6V~Fgnin^TkoSG2Q{7t{LpTjwnOn*TA$TEdcHMBY56_am$G%Jl)YpTb!hVwB`U2T7l5t=`zujXIhM&rRdHGhFq8h0(D@f%|_ z|FL!2o(+d<{oUaY=+^kH`90uV*m7LU=Y{$=ZJm}s3H|WUky`&1+B^pDSZ#;pd-S+w zhcy2z=#N!`zDFL28#}>nli;4cXk|UIbxX9K|NiKC<+-Qj&yUvUVAWO{zZj!=Wl{HVFt6KjrUA27GQ5xT~O7m2ns&TW4+D|Iw*SPO^jbDOyAd4)uo;Gm5f9-x@tf4hxd3Bp|7>3h33iIQv2I0s29%d)%tINd;dH2 zwS0H@9Yk^~ZMQgxSHrV3|5WIQJcoGbw?>Z}0Q-8yB`sfjuf|KleXbMy5dBfQ<|z;F zc~Zw|J6wglv^V^|CbgmF8D3QTPY!&KZauu~81qx_uc}EJKl)4C;SSt`R63~j_ejzB zX>X0E1!?>Yc0UtfK!`D0x5eEUXdJUv$P#0BW}GO3~ElLl%2wUC!~hWBh= zUugcI-ddkNaQ<2X{x?@Tf@0<4DOe+nrr^KcQyX0x?aaawKN_DdH&}| zTK`hN^|(Q8H6D3H@Auug8gEit^H>ej>vAE#mal21@wi5srzU*2vn=#mzBz0A%&e~Q zN7uDJ2jRZy=>%;b{~;QW>8!^s0)>Y=^q=FQzwv0c*1xui#-}dVcHRZ~;f5<(|A_Y5 zZvzhKaT|`+_>K7*Ph6<=%<|Is*)keG&`ht(lwd7iJ5b|Ba6j11LF@m*S>wwVXuPL~ z9``onUHfwMyso#^JcCE*ar47H+T@Lzzs^#PN2KU+Kf-xY+gbC3ebzkXA>P_N(f4%C zvNiuW$fFjv)Aq@MyuH9ft>?GVn&;&@jnBTQ@#zr9F4WZfF3?u*(<6{?|IlVLIN#Ac zrbYF*Rp1?|7o7Vh5C^`)do!1d+RmR}YkXyr#?#>YiebOCA%^$XJl=~merK1)yW&!c;~Ye?q52A!;L7U$31>Uk6RMz zjsu?BK9}KKu!HxarQuu)JEi^5v%SV&_R;gY_($U{ZMFUl4{QFk5!ybx{55~U{#yP9 z)E7&kA63Ru^F+XRjm+Wx=q0@WIrc=`!5;eaL9p*;p4EDOhWq-h&`($zt?k)=o96!z zukoL2bU?YjRpZ6r{vsak_qU$VcJn%=^%(%~b4t(F@|lx0ZXcw_y>>?9dEoC1He0Rz z{P!b0t_9Ss?w2)>labaZuC9Tw(E2Qa_oa!I zjirHX;XZD$jppC>Led!Kz`1M>ef3d8HGj9Y8n=LTpP|(;q{4l4L_cl+pc9&Crmfyz zm9A<0+jOn}6mN}>?W6H8-!#ATAuVqK{jRJ4Eq@pKHpM$=`Jl5J&)BH(bCBN}ifTK1 zb$gvM{1YJNkQ#+Mh+`d3)0<*UQHvIiryd_nWqUC)rYkbsWt^Za}EuR7X=Yx&4 z{AZ}s&%^Ix7J|R6gx}pnTIq3@KhXX;AL@nc(C2&&_n|Ez4)=lhnf_DjQyadQHGZ;| z|Mgen>ml!&1O4+a(2rW(OxyFO-bMzaQCfZlyzhGbM$5m0@6`32tNnB2eT@$`*7o^% zPvb!wG|y3p^V^}GJ={+lDD0`8?Dx5T->8zt8=TU1D0D^R z=_j>5;qW`7R=>1-DI1O7IHvX7yh!6E9JQWZ;JtT#(En{C%}?)O|2)#`{$r=sXCIu) zHzBXHo2PjSEY^0L2k+T_J=Q$U;hs7I?&Ct?{c!vatwh2e=VGvb$HDnE0PZWlRoD8L+@SR_hx>YCh==t< zHIL;RJ#LLs+Rnv}YP{`C&65QC#T4@P+F;Ka5XYv&?@4dN`O>+h_P2k&+8^@$(DUk3 zQRDBfX*>?TXV`CqUYGMbHC_nb2c{-z`Ld6+KGjES`SI|3z{f>(|6$V{ZO?CWH2*I6 zevyB)<}ru*qAK)AtEbY$^uV?ECXg4u*gWq#a?yY$oE%dq^hJHnTh-V46not6)RJfs@jj|5m~eFnpOo=#1)ebyb(_}vW6pBA9;TEQCM*-_&* zh4lKS9M*VMYpv%$xQ|!__2z20A3W==^}H6V^;z3cR`tWZ8_4&2DrPgOuJI&vwmA12QON~R@ z$*^Ua9(Nktzf{Q8@;T6dKI5s8TsKe#7q2>t)9&oxgV+~Y*Ry~%xuhmN1L{d3^n z*0{euM+So5=0M-_W;xBX=9<>$GyIO@7u-J%_^$1C681%>@_O7^*EP=g%j|c0ixGG`uS)xm@#9f_sgJ_4T~Y*3~?%PicR!f&OP; zQ_bH5@|M!jpZr!skLv*at6G2bxE(9&dHE02@}_e&zG#ESo9@*7zu`WjA>140yRCWZ z!+WRZd$c|a|7m|7uu{wagStK*;`8NRnkN_D-=^=-@@7ykocOBkum%1;)W}&{J{``r zFWt31tzGr`6?;na=R*J4^}gm0TdDmy9{RVZZfTzH>$IMwGc=y?MDzU3)_CvldcLpw zYJ52S4#>z=%lDqH@nvZm-?~-fQ%-9?{|omEr90{QmW6k}k#N3*zt`ig?4|X5-C5%s z&uM+i|I++zT($hqpL*S!!0&@bL*Hoxyt^n}R{O0fd{?;&{7&kGgXXCLb;0B>dcHTe zYkQW4K1PjR+MaE@=zh!P?ONV@iXL~lo7OX}uf}a5&-n-a4X?p^+#`@5Zu_C-KTXzt za{MF6Pu2Q|!aZru9?jDzS>t}j+8_Eo((-R2wLW)iXxs_zK@RTM{N16B3-HtY4Sh7v z&`>S!=A-@X8oUoVX0Q1#gZ_@^wY;mZ)+Yk`6>lqO`Q~sR;aOF$;~q1OKWU})j4Q42 z#q%_73;Al?MXi6{>YB&XL+^`QlePR0a~&UgK;C{6>e)^!G|$vITK`#ZwLTxmY59uq ze&9`6JzsMR%|F^k^QU`je7J+=Uq4dwSAlxuBfKXuS)qBx!0#8X7uR|&f!}NF^3nWf zV)eYb4bXVOgL>S!Ng8*9KF>rr7y9(pJa>+2{bxIAJqtr0DF*s28IZr(KGyuVhiE(` zQ0p0SN6#xC+@sZkeG#-n^LyB7{K9d)AJ;f(`Ji$de+KWvyTf-WcSBuYFihL+H}utq z!u>D3({ufz^*?2)@dtCYeJsc7^)gG=JXOJ-@p(1R>uQ>(^-hh4z`KRkv$Q>fQuMed zQZ@fNOMR}z!Fl8c`Bl+(TA#FETA%s(v_6;OG=3yguUEFE#xqLkapT`!R*w<6b=yBUaU7V+)mY;b{<890}o&)Fj8hAe(4EagYFm2EG zkPkP6-)Xu)AGm5~z3yS}^}JlqX}sY!t!H=WuRe>`JQHAFSWnaP4LWGNO9kyG7a@LL zgx}EwUeWW)e67bVdqKws8+yMqMcaQUyr1#iL%G{!c2ps;8De(?E}V59)DOD@kuS z*;wPx12o>Osm5QxJ*g-7!vv@c+S=>+RiYFhXcFoaYwjlyu@0K zSKF*{-|^c1mH%jbDV&4$T{QpZT^b)$T;qA6e{L75!gm*8sM`@mha9`7Xt>%A4_Zsare_yCKEk|qlC&M%zXs+>6 z_jDYKNYeUmJE_;V;(N{ibEL-mLZ94ss~-2)Ev@Iuh1##ucWXVb!}k;JT-7{PppP*e z-jywdI>;B!qt1F*!vSmk55^s|eXc|OUay7b`BXyV&oebX>W;=U1GPStA&+Va-|LHp zb&uVv`Nu*&Gro_O|I<$U;TrJILXamcsik@1;9XPgSz7+aA8pT>(4W}^?^h4#ZDA<1 zSli*kFO3(>r-`mr)$;bw^}JqyUv;aZPsP(TsL65rv z?n!-@X!)Bhv>g)n>2cRz)I3|DpEGT-o^MBZ*L@uJuTOpLw_)xY-x96$98_29)9a1S zw=D{3o+D*6&kXoo`Lh?Ar|dUv=dI1Pyi=^!a{?S}C!n778n5*~*+h@q0q$8kz`I|! zPMSYsv0g9wosN4w?VoL4YdxK3>Tzd0)Oa_jf7i9w>#_j)ka@%Ox}1jhgnQ0w{l_)Z zcpm73&6%#{Pe0W97$Cp(@Y4Op-XR)q0sS2J58BT5@ZLTY_E)PbnkNMMEwRuCP8*?l z-e1=C2`;VWD|u@>hgH_{q44|t@@+JaSx@b64<>4P`g@BZ&_9_}QuDW{r1w`3KaD%W zccNavyUGW!?*?tsb~`j!>$z>L#zWwq`ZCla%hq|nN3vK5o%QgOEhQ_m?{{0=N^@#w#wFZA^-%a~xj-|F+ z4)pPEMr!$RxEDLLTkHS4gZ4%_kuI8HOQa+8(hI@@gqqKZ*jJ9X;EG_SML(g~lRxNK2`RA*W zTE6oj%^$i!%U|gT_8hL|pF*53P+Rk?e4_0$<(S5|!Tu`TUC--_jpn%*s`Hs+CG>v3 zyi4;ho}>Anp4Rp$<*xakL;O#H@81sEqV4$$>gWeYw0u-6t>;uYXG;UV@u%iVg?Z&P z*776vX}m*zt$z{7KYeU8&u-X99rkN}Q|MRc-J|`%Wsn}%+*$Ltg5TMdiO_Y#s<(RF zdvK4iuZ14BZid#gf4Jt)fx4jgLd`$#vgYyFt;bD*^Lj44E9(aD|IL1BeTsF{<4)MC z@xH?~{u91?|0z_@-l4Y#F`(!1ej{dd_q1bD#U% zdwf~Gj}y0V&a>IhDA5kD7vs-vVqd9+=&yT%UobM`Ap5xQ@3-fdb&TpPS z`=|R|_UBDc)}Mb1>%Sq^4OT|6o`zF7-RKj{>-6CM=wUwQDX&=1gnDd`k$6w+kQv z_WO$dXqT8zO`Xj7nw7xytEOn*PKtep$Gcch{=J;9z(;J)Z!UI2;3t+(sn2|5b58eh zH;c~H!VEqYV9V60|(=}Ox~n*slJ6SZ z6Cuv^B?$XRiuG{gV{A_$@vf2W2(~9q+;cG!`z+VR{elQFel{2Dcs<3rkpbddkcF6E z{20#p>L$kj{(&6l^Tu(UM2on!5c`iIMcAIM;vK@);vQD1l5EdcF<;*Lh2`gnb>Na7 zZ09zyPU82RM*cXNGd-I@JXN!-U=f0Xrf z68+lqmTc$7(#$s(Vf`y(SpIVW^V8QkUnd7KZ(5A?*v(`4yFa-e{R?3|g)g$6$PUbR z)?_~%>&^N-U$CAEV*fG9i1p7C#`Hso?hbIY12oXFR!i4J%s+bNn9@b zAF!US;`?7StXSSo>;rDK=KNk3^=?W{*8i(B+u!dP>z|OwdRlklaYEPkEblgi_0JUj z$P<5--!_Zm%HYBF)CprfrHis3&YolWEU|xNvzhbzsV(cDC(c=2$YDJmbJ?E9;(J){ z#XXMab=g1D4a{qbcIm7bAI=f`DV2wEzAC13x*m_Xe3LG)Ki3Dbe>#bEvwP-j&%2$h zXZ}0py_++?UX1x6asJ`0Dd+c|m^V$k!1}w0cVdq?vV1e~UdlhwUw^y$2OW1!^moQ# zC~oi)>-H7I`m^yXp2xjj&H5)iWIl<*&ERX#{?AQdzom(OAt8kIJhkS8pSEZD>@{rv z6|v5orjTy^liv6#}JJ`-G;@sN2$E?5mRJN!85YF!uv97z#g7t@{vi?=C zS^lrM*V$(b+p|}kdpC;bbnA%oNbzS_f2jrR=g^7F^NV%GzXXdvjak-?HXZiXgSbp6}=EWbgo^6pV?=Q|v_=@;f-Z%6E^L_r;E4 zJL`*mmO3JCABlNrd9hwyO1v}X*^m7bFZM&#d8cQmS&x}m_qes6{ZQ=;>v>az`J)4@ zCoGoZ_Nf@(TJ2^%MT#>I66X_U6y)~bReVRg!cNv-@hazcWKYi5-g2C7e`nTX*^}F` zt{E&}U#xFiB(NT{;he9i4DR2jHR5zDh<7%A3OkF4_W}CeW&I}NouA%|+5YMxZWoI7 zxt!P^nbeE*zdO%%I*I#J9Xz?*_XcpB#Ls5`XV>6#zofGMjdPioy}|kN$zXdPit|5N zXE?5Qo?|`!;yZWA;ymZ&!ffYHOZLOow#?^YZo5dAhUxBR?>&*^Tv-+0K4jB>k2BT&>KkG65#=H<0m*MeH)*t(d_53ZsesB~0a&ueO-%^Z2 z2J~e8ZN$3D?8BU~TVh|kwAg=K^@{a8sh1x!P|69hVUak0-nb{rU-RO0)qRj5YuP^r zQSRYl{U=e>i$P*t)LNWBaqh+T92Dmtc6DbzbQI^@QpNk0nPOknDV+T|-Hzk=NjTg8 z?>E~y@fyq5YRSC1DeLhO{bQh52Rk6nXOV-N9}3TBo;#SwOP?pQe&4#R z$5q^m*>j)u1Z?JVv=Z~Cb4yu%eLm(ZMSZ;ajqO=i%@}{!C(aw&Rz`7ywHVipD#dm- z75B>hM{&G$u;Ov@m|I*f8@PEhy!L1NONnupp9QCz{)G2mk`}Q28RA^ia={<=WjlRE z`_rZ?`=NLy+i7jd`j3fw5PhDq{9UmgvLKS>-G*_!Q{P(|c$od!<2LKb6Zc$3i2LSk z2eX|y{;Yp=N0xW5%Kjf>VEa$>V?9TzFrPM?`E{YE^gNa?F`fCExy(y+U_Z1x#PzzR z@I$LA?4SKtINhiktbd}|FX*v~{oK9~+ux`r>z_TH?Y#1o>rwS&PIuxcPIpU1mjBy< z)2%aw{nLI6^TeU7XOB2Pob-|P7;R_&Y~9NC-xu#!SPo_VQ+~6ZB}6&yug(p6N+0Hl z;yjp3Id0D%iuKItMy%iUE9WaHhxMO2$bRb})<2^wvVMnwtmh9Gm*KwXPea7I=wWg1 z?{^y8Q+OID94_MFp9`0}cRki0CeBF)h;vG_#daY>Blf^pQzg8S?Hm8~AiTROvHp`ct%-r9a`Q0(>ACu24 ze^t!O@;Y*S2KHq?_Z8nY&K2>nJ&X0f7xTN$gV_GZ;{4C#ovgoJL-x-NH;$9xV!hNz zwCC31-HEOu-LB$Y)4Kx6jX9&_fC#Ql^4p6rKFH`x9WpIHC* znXD&&GV|AwoUh?xeYl}GS9y6Ox1S#tG2c;%^EKoh_dAVya=C02_omyWvVW}XIo%SC znNJq`Uj}tAL!1}w+K2uBQ0#{~PT_LN75&JXE}Y-ALY(d@59a3m*bnQga=pHEkmc>f zIPh6Gr+dho?VnYI_5ZVG`2}k^PCN>-KldkbzGjSM{yK~GSPbQLv){%n|4!_`PZ0N} zoj$SODvEVct6J=zjQh-82Xj3&I>+fIALM#kQ0$x3{l)1z?_oaFiqrkJo#hXUb={6@ z+5ewKJAYsor@Np#=l8!g94F;la6DA0$o#cD2w*RKv@ zonb%&*8g$}`=?(U*1s~A?eV|I@`0kh&lU6TpW@znSOnW&R@@61{fp(}#JglqV>n;x zd-uC%a=m-lnA@>*JJ#=Bmi>0A0?QjxIDX3Q;QZPQWBrXUv3_H5F8Z@LCwc!3>&as? z4MQh$yww!v1e)$-KX0GU2^7iYdfj9)^AK@g^6YT-=g5KV&;A}P|67c6X76UdomkHP zSt-upcMW7eG!y5?D*s~r>+RTn=SHl*xjD;MYr^@uSdMwV-K^)lSTBlVal`pGZ0DBZ z96ui7JYH!BE?;k7uGf#6vi>(eIKK-ju>K-9xm-SPV)?B{*b$$^`cjSUtf%=&=0}gQ z{x9d*54C=>|7(i*PHIC=_oTQdcwC%=-PN4!jEZ7^mJ;h@Uuv_SS>irse0wh63S!@6 z?=zNPU72~3Sf6qJ&GLtY9|~ROd^Io4<@LJ~>tA)A%PUIUe~cIH((SXXr&f1Pw|*LP zm&Kf~#lp|G#l7!$=UGp~GtBRYFz+eef%$on<$DKlzAj#8|8&~JywoVx|DQM~P*SwR zm&CeI%0;%bc5hC%#y*xWIhA?VdghnKzCh`V?1#;wzWWvBINy@ayss16vqkvL|24}8 z)nWZ3hOyt`jag6YFD(E18S^|3=9gNsJ>$PJ&u+u^%nWA#H#oul!c_;hr`{bNk8KkB z2%cg;#aoP%lRmSZNn-tKRDI5G4ROBo`z@BA_K10T@!(PV5BASeu^+VPDeJE}iS@h| z?bRFc9zw?i*5mYp%XdQ%$Ip0izwG`i)^C}g^*;(_`Qu`rsQ(V`_a6;rJ+&>_elIiD z;}^kk8@`?OXPjpJdqjNpxz6d%74xiOML1m}u@Cs?hwvivF!j>F@nn70@E zS*mplZx( zihZcGp8Fb;<;~EmhUUharG7Vdg30k zo(c7tJ6LdiX(rm?lNRiU1szz=5_XiIyksQr!gC)Z*54JAanVeHRS z3t3P498PzfIM)>FEz%X|ZBDJ>bS<|rkN?JTQt%Y>hV@vFnD!aA?qEH)#rY+p&Mg0H zKKmi@ILlwM<@$J1j6YX2<9uaDvHrVa{rRl$^XtlN&;89@@3!P}e$R<{betH^bP3~p z`H6XSuno)S6YX$?y_~Nq;ymF7@lO8ZT=w&^a%_+PNR~gakNw$M^mkqFvivz;PPb%B zPIuD|ZU^2LX8B#`SbvBK`!mp<+l>py*?v!PzNn(uC)#+A({1O*_HPpVzuETO9}PIc z`JH{8{Z>MphiP7l{V>^z^;fUW^(dh#=gVRP>v=q%<*N)}eo3qkpP$D2w!vb&Q9!JF zBphcu-4ob9vCo;CS#!BJ66*|=rgOR*<2VkZ#rXE{BQ6)~p3HlQerI0?wr7O6-`B7u z%b(fH>sfnz=Wdi%Ty(9ZA`91sLvxv6@v7a*YE$feSWjjmVWII2Lb3{`_ z{kk8@_U}&QI9$|=?fEO(+s0#9PxltAr|4TQua2UBzb(c^nc{w2L=OA8+yLhGVmFXyZ03ifl$&)lvq&d=q$Q_SC+d9t2Q3z-LYWj`hV!M)*Oe6au=b7T zbgvt@To#G;VdGi$TM}bK(oWWIZO4E3BIX?g2DHI>U{teB7c zB(OdGvzdnu5?tJeO%>}Hjl})99C5y@n)q(i;Y)1K$vxa2Iu&RC3=-qIZWdfF6^?Ma zdDobK2o~`p_F4XlbAzo$aK3V;v7JS~ak?gM?1yM^PtC}f^+!Bp{fXk9V}Mu>52?lW zY^}%ny_x^_ZvwUhKmzTqIwzI=zE|&sZS^syjzOg~< z+a`*7vA-9`XMiW$IZlkPT8edv3v1aAN5#2?7OgqI+r|1rJ$JVAcp>Ja#W}jh-Pz7> zqTQ}4{BT0-D;3<&@isx6mrgFlepnUGJbMV+zq~r9TUqq){T^~0MyGPRV;V8P$o zQiA2%iFxAQ+ng_>GOWi$oG&W*h2x>KCF?0ti{%ZM*q-lVKQu?Yvs6X2+lSoQo=ZZ{ zJ~8j`EXQ^(eZl#9mC5D4Uz|^9Q2I9-TELn0r-<_p8DbxySRU(dna1(#mBHyc^g}ZZ ziDF;l`6zA=ADeT3`u!cJ+d`~YJm1dpU&J|z{p(rYp)B(YVtv&_yz{VcF6(JGiQ}j2 zb@u0h;mq?2upU=OPPedFSKK$5%VqB()^lRANLPGs%WpHs|B|t+zmPa@uzL#2M~U^i ziK{qY%hs}<`s+FVgT*|{wGZnLU(Wjfy<@-is?B;ni}lIWTWseRaX#dTIRBivo#QG! zo9&#e`a#i74t&M>WJ*SA$^oPbcwi$!l?rdX(tzY#iCnyWz~Ijp6d`?ZWae z#e0VT+OmB5IOg@XaXng7f&J6;1lxJun0eqZ=63too=CCI*}fmg&mZxgPlM(xA0Nd0 zUqQBWuILw@{9*ZTTiI`QesF$UiFx87@!rMG%dBUe8S~lZZ0A*PmOm@j}mqFy(f&*jxZv}4P~{^J5)w*QovXSL1d@_l%o?b#^$M>8MxLr^33|Lg~>f81NP zCr8|?T0DmH+w&{e_jh7E5I>dUYN7bvP|J8ux5YK)J4$eVQ$)YNS@gf<#Qf`QD(g29 z=cz_l;`*LnG$!L1x ztS8f-(>>Xk%eSis$Il%nmLDe0d%uri`B&oI$Y0_-WC1bGA1L&Xyv^lu_X_jk_tN4+a!Myz|<}K~n4{O9azrQ#)6?}lp@n#*azpuhL4%K%ee8m0GDIj+h+;eMyp61M+V0Jj^CzASIwfb~cDa6AP6U_F~7n3wcm|F5pf z{M>TpLn^X=JjFS*BNf=5;B~D3fOrSsxn7D^{)Ox z=AoZh&o{BpYbEwC>?W}Ozf-xMt`P5Jjuzz}H=F(ZL#%K3Pv?A{f69Jt|CPC|9rF%5 zSbtc5E-xRkPPGl%qPE8iGJvl*KF4gL@{s7T#OkKh4=j4hU=b1Oyo-A=b z?TYx0dAkX$$1;f1wGi(o%rNEn$r0}Z82ho`%*6N8pS@&zyiRlcFDb#i=x(;tYykWJ zqbb|@`V&tiDvNc(|Bi6n2Boo`p5r;c7r(Qe9j~&U)d$%A=i;2*M!1%zQx4*S0|6N-|P!=x^2Yw<##4=d>%?>{bjt_&qu^NZx-Tvh)E)@mWcB_ z6U8}%JhA@vJBiyz;HNVB&Nc6Mw)7j3>VjZ|n zZMJ{Z3FaQ+9#e!p$4|*!Y>$iB&suYY2y{&HBf#;qvV~pZzoYSpf{h=X+UxlbEMRi+4hb ziGBHL-PsT0L_ab^yrZ&E?2AQDz-$@(#5!|$CHC7)(T;Ty`^e+lvYwWr9392^{5j(L zP0>?$+!Z43DTk)8ANKmNokhj^^TYG3=bSiKIi)wt4>RX--+qhZxpy$j-xTBgIz3tb zx_CFBqS(iY72_P&kL?#K13!9Mmwf>_7%$z?sSw{yC&V!b_Bysv&o zodem-etseRyfB>oGi);F_ft0WElt_~Ng=HNiCCZfc8=>&rWm)MZN&cEBld|Zxw4(} zhH<_&__6)x#CXP5tn(LM&Hc#qGpxUFA&#H=n_0f3s4vr2u)I@m_CtB`zU828>}SjC zY^Sq1r|T)!<&1u_J^mt|ZF+H>TZ{KwtO~OK3yF2GKZ`jYuI^?#Pkrb7b`|#mTNP7vBN=uP5sf&o&rl%whW@UUU78o5ban`+>{l&?L6!z)Mbd zm3ZHBiV^FH5bq543TOL!{$hUe0OxC&*ypO=f%CiTGsjijD^9oLarQ&NBF^vbOPp?B z502Z1m)Rb-n=C)8Jhu;dhuA+e+Oz&^;`>u3Z&*H|6Z7`syu@zN{)dY|Zz;a_^sXWM ze?>R8XTebB8awbP32abC)CySP86drb6G zm)o%ZANI@>53>HJ;@)MXc;BE&ZLTjboH^an-#N~M>#_W3aqcB%4C}ch?guRw>jwM8 zcb5)Zu>KNpZ0B5Y&w5lmm+t}b-pkn-_Gdsg$Cc?it}nCh@OrzQ73Zs81Rr$kSdG)2 zE6#xrb!PqEJK1juV*LMY9jDt_ybFCztVzRUI( zeb0LGMKZ7Uh|6n`ICod$6YDu7<`E~)a5<)(<8;5DW&LMExIVUg!u*$L=e?G&{)S>7 zYN|NTnIZ0X-_6hVtPJLKSBrXGv>NN_wTS&TW(dpwna$~LHRJwkzqsdkMBICAVaw?{ zigQo{YO?$h@tv{#66-(Za#&BO*f)23&+=2mz1MxB-99>t^|)2z{GLnaIGNUwH3!8_%RaiAWaeHEz88RJ^eaz`5x@S`FgaC>s`^pEFY7~_TLxd4SzAt98;I|pB&0O z_9^G9=SKE(+DYa|hjMw%%Hw*p(Vz8Pn!@%hImLRC$1-nsmdi1J4D&D^-Wq0zb;u6m zSx>1d?C1J+T)t=aGe02W+0>Kemx=Rf|K)PIgq2}_uNC|MmN?J+Wj_0%s2i7yO)E}! z#9U6d<|yX9&v5)47w@^<7w1}MU*PfcXKSv%!D9dSY)|&XBXMr_v$)?HB=)uQL_Aa% z_q9h|WqYnq(zfxu>VhdWdA#LW8StCbNe9X`wBCkxQBU|H|MuSH@3fxh@YUA z9G|^TalLCS#`71u*$-`S1>`XVwKy_vA*_Q`Vp3+$5U)w&4Z)x#(-w zpD>%-!#?6ZnuQ1JiLSxi=`7n>+L!ITC+>G&7VX2;K-S+@%s0Q;a=NpfnSb%+a?BI^ zQ`5w`watgQ9PflMA0*n<72+Ie@rP_@keJ_{y2O675$$J-a;$#^FJl{$YjQkv3}im5 z3j5zo+g5b|XT> zt)Dm-;VjmFI)`$8=X!DbkoJ}P<@dAM{>Td4ueA{S{#oMP>^Gv_7{8RuF;TSJ=HfhU zn?%-AD2@H!W-s$=qTgH`$NpI%zEe=wi{(H6$K^HsF5B~866dRGDwpq#^~^VqnwD&TwwNC^aAo^n++q96UEp*LhdJGC z;+{n#aX#>)i02jJ{N&Km96zOnnO7b7hZ5pG>_>4vCsV}9>~gHXWD(}EHMw3l75fWi z#eLhYVw})LtOs5f{YX=B?xj@}m+$iNY=3)kUgga#jw>s%PBrK$r`v7^*Nf%9n70z+ z)5JdGk{z6G{j;oR-&W4ov%$9(scHzY_8Gjb5C`uek z0_@MlR?G{E_QxRRFNxxPav!mOy3L0DX)W%*r;77eUB$R-_D7D-X(CQOi1=)9jr}u3 zj7xj=<^sr#XKp6;kCuybAXUWoe2?$pcs@Fe?N40A{_$MTdK|r&S9IidwR|IP_uee! z_95dt^V_1|-x$dD{}b)x4Y96u?s z3G?N7tmmn?-&9TbEn1u_Xx)k9%2?b3Ezyhp_ROC31dI0>CW?CsGrDuV4m;0&=u?^P z@mbHjbX(?SK6AT~vxWKSM7F1f=pTy?XL(Ptett&0OT6tj`{$1<>o?xT^`b^W=8d=* z4Pk-ow+juKZ+^r)(w%wJ;%vV`+|PX!#CpE2W*#8c8R9yyeB>Io$MhNVPd%Bhy2`wz zFQ=>4Azj7z?UR`Qjui96HJn<)lu}g>z9W(?6v43?sP?VZf&#*b!ROSIcI{W;#|3}HKahVPVArc|CrZ3&isBG=6**w-M8mMQZg@4y(J*RJRxo3%U-6O<)YqZdFdI$R_ zGKqP%X#cm0^QHe4W&59h<@_!e`%_bUu)Li(KXyv=M|BReJy*rKGC#2oRUw`A>=Nhb zhKX_S+*j=9Ro$8Yddzre3T0kr67yT)eBILFY-iy`%$>x#LEl7<&o3|8 zp6)Z4Pl{xo(2~oselh0rRZ zXKRJW5%C`E-s+sMq+HfhQp|II#@R` zU?lpB(&Ams&5;~$3AVhx5hdOgbl%VQbUnlIxhH`6b@5)`95HY0XT<*TaN&Hp9prS? z`)Q*>IA3X^e~g>X`m@A-&3V!O=expsG7oc{KNIUh$7`{kNe`L3H)X$_75nv-YO??B z+OVG8iR{mf_t~Dc;+#gL=zky0=D78`$GlG>+c{LE+ex%z7`P_}d8 zM&|Q;*#1G{eTgb@Y|kY=R%w_f`roNyyw`6N+cQe+yH%{j@==l{BKy6U?FW5l@Bd^+pz zP?WiP$02?+ojSy2<6}AmXH~KkM;b$-IHsuk;b)8830pWa0(3 zbBEY>D;37|tCnaVOt-QAXtB>b%8&O!wu*ay|HS@FcdXN) z`_B3OPpo@P@?<|Gmts8=(>Pr}vEOt@oSVHa-g$`l$@+a>F`sgm`7$w%%@z9yV@h*9 zau?sH@E7M6tm4?7@AX*!rxDCY+VQzBiz7V1+9Tepk7~#I4Y{np<1ywb;=Jp^m#qKr zSmuw#{p;>?Sw3|y^WT@5cM|WIwcX9~@5K2ZBLmBKpT_=~5xXugy6KM?Q6lpMkGgB+QES;M@b@Mo(e_P@1w4`f~+ z*6%x)xzAnJZ|cDEPq(l?y?Qfu6Yu%=DaZ0n#C_gBUAaE~75DxegIIrm@s4rYUzUH_ zkJHTxU>+#Ojfd*9d`a=W-OZa>zPxyssmTMDFC+T#_&Ge@_+ZQ9ldt04QTHyar;yi8tjV!-<67xUeep9dKEPp(J?JSeZ{B{=eXD^uNoM&FT7xOKZm^Te)UR->C zs_+QjHz{|L^)!FR{P`Hxv*0cB!wva@V(r$XvHqS7SblJ6=HH@O zk8fX=|Mh`+O*=04lRcQ1KFxZZce6cTCo%sm%5hmqPIqer^SHyz4{c^USDG=87ydtD z&H5YfV7}9gxyeaRw@)wTM|ZH_JWp^tY~{rK{z2ve*I54#!Of#se%U<|D>2ZztXlPwUR|1I4~x194yGTN2wpU?S^JtHplsxySOiD>7dh$GpFI zSA3Hr+ZiFgXMOuD>%U{c_7@i4w^i?CHWB+Tx7;}0s^VOkcU#U^PFEhcHx=i{s)_fR z4@_hI-NgHExl1|S9b%sHRh%19=MYlsvVSh`V>|PUcliD8@jTaB+<%!}g7ei?%%^(q zX8AD_n9r)pJiwQEWpOW~{w2;=F|i+1_yNz0Z#Cg`gUd0uvt#~K>}xL<`v}JyvHicq ze*J1Mw!dOm=1tR>2MlChb28hr;Uur~%<9T~p}4ocS-j_PSgd<26CdKb-;C4UD&DR7 zJc`%r=BoF98u2<_wcV`e*I4EsQ*$v;mRd1yHH!K8vCI>FnGavU_B83v+;`hAwDVPA z=1t!IM0vYW%s+)Q4^L)ZaR>8Cb(yZ!7TdCFtv zd5xLZ>Bkqk%C7&4=|0{11^M22%saef-piGFv$mg6zlBE*^1Ng|P<#K0;8U4TPtHdD z))SeVJm3xN`(k4|`Fj@Xf47&pWnJdk_dlSX8>!6K1+ktb2ig8ZyE(rl#0US%`msOz zZR7GP7Qp4cvlPeS#V#DT`R8$cId_2Tqe)$E$CAbV+8$eO|MxHA{>y7S_jhA1VR0F@ zx8`wI(mNgxKmWw@<>!le-tAnpAST@7DD!U-d?BIuphBpp(p2Wwms!u~R8DvOBIX`$ z%x}En{2p**9<+)5mYl|Z_I76e?mm~-h#}0)pYr(GQH=lVbY}V9cFf;C!D2BiT*1SFWmkoigU|-#rq6-|G3{7)PZ^8 zC7wrg>%x4FC3Ax*^ZsXfJb%0;^YZt(pLL05zT+tK0rQv-cW1tOF!Nu7m_PJnp5w#3 z@J8mvGMF3hXa8gev!ADx;_|)Nh?e&g$w&F2~hked+Eujt3KQ-aAQr?_lN#9w(15V%{;6y|6^R5^?1}|-mxw7 zzv3Q!Wr<#In(o#SwcFY{sIy=4~vsxZl6NnfZ)M%)b`raY(+w%&jIdA0p&UTClvo9rLvXn4i7O_IIDf{P-94+q0$2 z*VJb|^*EPT>E6uCm192r49AJR`2MCxcb2~`-o0Nf_UT55{oGeuIL>Q`cZt_7WBCq2 z%;UuVosIae+(*HyR%iW1|8o6Z{f&8Ce%5o$lKC~UpS4Zg!&)rlqs0EEndo;~A7*iRNWFqspzg)gQJ~Hns-T{~?#sl>eInI5LGG7z3OZGq*P| zpA^dLqCeXT-huhqSf10M z;lTUg84Gydyypi#zme(6{9F+4%jd-Nd5o(Cm@ga7`~LI#@HqkhN_^hnWm!I-;8Bdv zGwk@1i4C7?R0eXtiSLmccY251#``UDtCi`DVrulA-W>NhXJyhv;I!?^G4w`pO#-urJ7`~SU|$2A(s z<>-Ek%e`Y0=7D2)oZRs=$CZu_C`3hp6ZmE#3CDvhT2ebVfqSz1Chj`w4Rh%p6 zS(wXfeN#T?5Z{E${Y)E#raL$!TxC^>Rr}mE*IOGT#h5_alNw=>mePha=fL9_W%pC`G!B@+<4`w zJU;&<&PDV$=ke$6n>;?8_=@|T)k!?wTeFY*ulXT7u6uil`@yqsc>LBUg~x9fXEGl= zoB5C~%-4P9{(8<2<{c)op5=F$8|UMEWes5-W6b{9b(s0{w(RG^pP0A0!sYe#IG1nh z9FB*Dop~HmZUDzy$F@8#>+Z?pmZp0+&cBFvrN)bMBV+DjvuB7*<9_FsSl>=w#r67b z6YfWbTxDLhDfcgP_c2fX%)IIu=1#86yPRWtY{mWVk1IL9#;>{GpDy+>*T%D-3-L6? zkju@mVO{{Q^Av2$ynuLTY>PFow?wSvc#G`IeCI6YUBtbiT~#>U8f%!JbK-m@nR7h< z5#KpVZqMblYc`i}L?p*a5H<--aYzXt? z?U=6-`};#Gvi#LL%-c0&?jgoHr<5kNe->;v9n4OqQ>8gZa{?++XbRXWnrQ^DbwYSIlERc@XzsH~g3{+QEEd z6!T-(nV&cC_@r7)=XT6H zHfCO?E^~to^Os`$zqu;Q|7pZLK%4`&T*~qf4>R`>@5bD(!TtWP>CDfF_X8cav;5Zc z%&&Z69`KL(fH%yWiF1ID#k+#b#Cc%b&aA(mIF~zFystQ1e4jT!d{3cyERX973}!x{ zI`hB`o}X^n#Qe!H<}n?Z59z~vuXy*PUmccjQ;fNjDf1t#n78s^-hT*l3-KM9YvWix zbslpE@x9UDsVpBR-r?W4ndRMue1Q1w@aaOV$4IPKpAhrD9z%GZ;$DFHC-I)}67fFv z?QcAvIzNZ`?_WGGyRn)1#vaT~AMku|c@O48Kkz#0`}NGjZJGDl$Lsm^>oC8!o7Z*A z)@I%(oY#lV49rUm=XK^T&v;!rx*zjrn|a-PP86@7r{Cap_^ZX48>aC(e+|EEZ1}#G z{D^$PlMl$}R%c#qMkdO;7tKJP;QbEy@JVlxp9oJ!-g9Fba-$uo$h%uIA0L&1@;h_i zAa6dC`NV$A!@Ze12wr9y%f}pNzODh=|E@9Tw^m#B+v9)CSHENb`|sd#Z1EqLd&)45 zpQnjg=;w)dIBrkZ;rfz2k?Y;Pxm>RwMsa)M_ln!McH(;$*0Z=D>GOcclWR?QUQow| z=Oc+OJa4K{kJndMui*9AGFiNSdv}o7r*`9g?Y%pgH@MH-s*V|!@5vs_yM1Rp-xf08 zU5NQWFV0ur8@x^)Wx;%LJN8?Z!R+U*+qhif#D^_kG~xAdhaOz+#*cZP>%WD$y9@JY zxg2li;(lm1d)Cvg5_9+Z%x~^wZdsZ0+h;lRj~UE6yRttIu3`Sjh|4QtKl7VKx!gCK zFb{mpdh()~e-j@Ji+{@YAFIH;=_vNk+TrZ~wpBSE`W@!>Dom`eR)59qUhD*H1`LK0 z+wO-l?drpP^*`=Ue>`FSIG*|T=gfmzak|ScGcVx9`P$ov{oq-R{q~?B_xq)?n5S8D zd7X;j@_kpCG#r3PN_)hfU{k(qI>=D=N z6?b`^(r z?U^TzVgC6T^RWdvzx~EAuX3AthwALl{_Z04lY5w- zoy^=??5FJC!uhI`&3+r+jCp*2F0U;v++GzH??qJ3&+Xw}@jcL{;(pxE8a&>xzrpQ! zesO=QtTnG|l}h0LrQjBxpQcabek!UR_iKMT@cL5e8Qeb>xX=A;!-34tR%GsB%=}qV z=6_o=KOD+@s0G`fd4##Q2m2wR7W=J}3H$lhC+4`H z3@-O#vzhxEGoS0uah0%$<8a*@j^~kX%!_Apz1SbhyhmB)x5c~1_R(A)dy8?=xm7Gb zP`p>%Oq}!SYs-3!#QUgU#r>BK@3>t`6zA)<+Oqt<9^CF(ihEui#d{RZZ*V)jd=2x4 z*34^e!DhoSki*%qMSO34$XM=2eivc>_yYGw4kwt`xy`)e73Ral_lw7g?}Tn1z;+IL z!+d8A_FL^y%-vI&+il}=DL#z*(<3{btxV=CKXA9>w@FFKEQ= z!@2VcbfUs9n5b}WInex^ILz}|HE!F@3fP7 z$_VBO;`?`_KXRPh{>!{;Mb^LHhzpOi0^gQ zs=)H?#d&6{P;yYZU*K&RL7w?#T7U%Rn^K`*bq&v4iA?LY$`zO9@ye@^?TeHQ? ztC})zvXkd2PUD%+?#6t&CG&xod46mEI~^ZtlWMmARLi-F9&8!&gD{}J`L zd1WEL81MmkLj&_w-7`@>w{-^cQ{CPpA9Lg#^3HqSA}_Km9r>p>X~-QGFrRoc73E#7 zr63O|%Dm@vKDTqSD)Z51%*T{qo>GhX$;!-Y$1tz@j_u#og#FWf68pLBN-md1lem0m znR5JOmgTs;pwvisfHSXWoFTouSoqp3i!V@5~l`#`VZWyi;vloBdXG3iD6my@GeGxt_kg&U|EH zcHE&)EbnN_^4?C&$Mj?#osap@Wt?u4Z|sNDzc{W!bJ+hk#k)oa#5`hDDv$G%dh+<( z_9C~p18VZPbjVk3x0{Q1JaQiJIIz1o?_s%z$9vHQnAhvUz)=38DfFFBagz4w@Tt5fWUTvPUEZW#ODxjC0_rih1x z3p{_B9>;N5?i$B!W%1pXMDZPgKi#-K#)|J&d|uD%^C$Q6I3fQkUZ}lVi}y7OOeuj4 zdct0J9 z4_tBJ{g=(+`*&@{z0n!s9e9g7+@Bf`LiZaI#Qm(V!Q4LQ6k~2GzSkT-i0j3`w#=8+ zVm`%zc}wvf>h7UJ-iGbBO<->3!{hn7R_xDtPnrJ|`z&qBaeq2MjNgg|vwWe8%=0HP zUmVZeNZiN#e1+rcvG^X}@euaIsCf2g*>&vyVZFEwlgN&J{P~v?YXTFj}u-Mm|}KTEb?|DSQ-^2%+^Dp5xr_0@sVb;yXb` z?|B@aZvc{Mr^dYv>xdihXw(Otf9oe59>vB9SDZ=Hx<0j8vK8yE=8noka$hX=& z-dJCi+s`*&dHfLjk=y5`F3blW=XQSVAm;ZfF^_7=ykQV?kNj-Um_X)TN^pK-t};J9 zpZlXX&Dfu_c-n3F9>(QTNxU1Aoy_HXMZCM%_dfS`9mRJN4^QQITlbv#LL2TkNB3r4 zbRF}5SD8D$XMQ4sdE#m2L-sJQzKeO{0p{(*d5=8tzITtutS8Qh>-#c0<^$_9Zz;ap zmEVWuOI&1r`3dv7FPJyYVO~bO+v#G)?cO7C{?HJ}`fJr=eln5$Ja!86CFPm-KF)DI zq$l&&VqG_XB-gw0Q<(qm$lP1p>x^?}`FWyW__BfJ-|b^w^eXe3iOicmV{RkfA^iQ7 z<+r3UulRtu@k8b(#P_eg2ebTxBFrQ9aeLdo9`iu)eenL=jToMcqC~q6Vyz!&ADDV3@ z9r@Lv%ws&6|8Ql#^18R5b46V{W*b#|dVeseJuycoxAo)em5aO=c8ZVK}& zZp^J5m}m56zN-WCnZudqJIwsh4CYUgdHh*Bl=-EZ%wLvg?!K1Cu_oP_kDkihWC`;^ zbD38d&3sK?<`c#DRXx6QyXPIve8_O-hqHMcK2UuBwALgZH|E{sapTse%+qG__^`nP z9v_yoXa3iV$Bn-}azEne&Af6vj~nkKPI`*_ZsjbwJvRh%`(O7W zug{k|Vv2qqKau;RqPb=$Z|ctddzw=zly7p4`JXK25x1Fl4Paj2Ioq=&ll$Ms$2ecD zC$S#_n(%(ygE;Q5^YXF(2leLi`WegRJGMYU^rw3t?ynz-cd)I+_sTtva(oUG?feNJ zj`L>`+}=hPV{R+nJv$c6?eM)-%m*xHUSJOMBU70F>C3#d74xXq+zwnm&ivOt=JyXX zA9aFxkVtn@dA9RTXXekxGv64(yz@im#mjN|I*N6$_u_jxz4x%5Q_0MmmF75%5a+cn zmSOoSX{^7&Ugk+7nH#@m|2PZ(4>-c*>syielBGPZSp0+gsZD{*Usq#p_m%s>$*-CJ zxXygESnsNHh2@REFmL0;c20_A?&!__iT7fEIvwEhS|Hv{x**=4@mz$>v%z%&_wRQH zbGvQPgWLIG;yWWQ;+?nFG@%%dWAotg~-h4j6qy_imTZ?h|W@U3c{3rI0xO;$JMn^j>DsUIBt&>;W)1t&AeL!t}odOnU6cn z-2MdfT1%LF!kMnCfkNvY{A^Wqx_`cP!e_W1L*KxVqH{duaaEas1V+_aV zm?m5w8;Xt3h2lHBK2}`6?x*v(<#%D0&-7rPF6#A1@!gP+Mw~B?2JDA`R_wRDhTQIX zi}w{BM{;>J@Z$14*^cY!vV2@mYa}usyO-lFVGPG-=WON+n{u4L8^%1OHS>uNSpWJu z%)2gP`(KLloPF}MAIvMUKZ9$t|JQZq^78TI`gMN|$3yeG96tk^Gk1;WIE?AV+_XCL z(KVUJdousElX>lA<}K~m{te>0pEa^r{@PUbTe1=R*=;Fv*DU7w$8tFarZX=&pW~sK z7%$Zm@3qbr=ZbfV?+lI+=S%B~{$l?wt{17|zMIQzmVe)h`RNZ_kE)CJrUn&d`PJ*W z-WkMw-rAGd|9%I!y!PDVavv@3L2vxTaoALRFYoz0j{n#z+>dBTjoWFaKC1H zfcwYo;{BW-K|FuVSA+S;44#Mfxyt5iYkeD@~imUo#4)nNbFtY?0t z5c@etym$0Zd{4PsZPxSZEvNg(pZWOu%$r{4{H}0e9`KU=A3ukA$!okWu~^&(FX7JX z8@mqjI*HFK-uD^$kM}#~^2XWto=@`+)LoZe=3h^E3mwOF8CG zw!KGruXpc|KfM1I`6(~v;e(hb+cDo7nU4AoE@6IaE$gWi%J#QNU|ys)`(d*<$JN}N z%j@8BF82jy9Jj_FxL%~}=XyP(F1It!Ot_s~d5-(dyW$@1tj0Wkcs7dX3$>T>JiYo3 zp4Z2;p-LGZH(u$^^6hX zc8=$~g3RwFaJ~2tBE|!sxZf`~jQJXK=C)tBo@TFLZfwJRcq8U}k1_A~kh$GP=5Ncg z{a#bqKNe#ATyHM>dEOD`6%X<_+o=KlInGV^rt9S2i!Ki%Ut@6+x4z}(xM#|i6`Sw6it^Fqtne(!7C zKL*${zdV-x*}AIh^mw?8GfaQlC! z64#@lFTSl{d^FEnxBvNq4RrGoEZ=%I^L>ArPYPgr+$=a> z{jM{g5W@5N!qeDqx978;N1x~RFe{hKYkm=K-!_%zcz9i#+r5RI(ai=2v5)gz^uO&} zaXcqXXP&x^x$joywfZqXXkc!!lIu|xyT|aVH~XP(9Q$o_b>{icZ~~{rIc@J!EZoq z9M3f(xn8&|=Xy6~C->t&UUI+iwJq~H&$xfF-_1OI7xOpq%xjh6bn_lF|0LG`pO$0) zbQ{e6JbjDX2W#>Dnr9!md?y5OoQy2N@pfqm$LGNt9RL1_T#xF-@_2RpA|ChNsm0^u z28)?n9AaKFhIy+{=EGc=pSZ(z1~p~=XddS`bqo8a;9U0SN=NqppTFD=^iJUNHQvVU z_Nl2HCmVWmJMi6w+kxnI9G}}qa6J2ma{NCi%)ISEZa3--U~bl(`DgJiQ2r+@|D`6| zQ}Q%(Q*lqB?IHHht0nBuR^lDY4+FTo;=Q)mzGrM_;bF`#*)!kso&9Drg83aW{|Y+D<@>D% z^OP4npE}WjdDK>3KkRD4+{BUBA!{w>b<1;gnCBkl_0KcuypB4fJ9DG^ydK-L0rRU5 zc^&vz1oNja`8-DWFFvPq;S%%E;;iRCbLLi#tf!dxE{4T(K9AJtCiCJ=m@l8k3t?Bj zXJJFUy)g4p+cHsp_stCC=dTK$`yS=@41S0F?xwfM4}WC-pe5_szLVt#xH9)OW<9xS z%uD7mFTR=cJL4GpXZ0rbv)8u|=!d=wxZJ1g;y7#~_E{?Y=6d~P8@Efj;`^Ip!+HFf zW6$H66|Z=HF|;|a4-6CEonJG8_Y-f_<#R{dKQn)NmHFAGd>*Nxt2vg-#u?0O*fTfV z$ox|WJ}9%mh57H@tS8_X+iyFZ^V|16ujf=WaJd+L<9TJ4J(sWNOpb>p4m^*zaF*k0 z3x}=YSW6yHP7wQFD@$^}Z+3;_|KCdPe@hcdCo zE1obvHjuebMdopZn2)c+cK-a#@f`e@{o`)My!ZO{$s!O7+(nee0l?y%O!DdtLSTPPsB5FhHFk7Z!XI? zo=e~0`Zb_5*V6)i+#fx4uI#sJ?%XeXiFVR{J(pLiIQP54jLUt~f6Qa&ar^eJ6UUXQ3x>HN zwimZ=4To|(hj-@o&But_x2K`ZP5&?-YRl`W_3fCqD8hVhEbFgagSp*A&R3QD?1%TR z%&lVBpAlBf+l=9IDSVR4v6T^XU-6!pyFJHA{(l@-y~TQ+`vsQo|B894`0m~mv45Jc zKIh9Vg?S+{&O9Q{tDlc#{~L|qa=cWY<6)9`&wp$<$5pO)55c)A_b>CeGhbPd#{-Gp z%)5s&A05Q}h4}8zMbQs7e9QH&b0g*t{MkPfjYc8*tIPORM z`f`7i{gC5iYb)+I%LQ?}QS2zkr{xBopB8J&ao*_;^J=wuUOaRXbI+m7w~6<`vYk0y z3um@}MIQUX)rb8yT8tl7_;9(*YR~PtM@uf>qT+m-eI<^Qf#%F>)?%I{)-&IT?TA&|LsKjtmFF@M^Z`BG=*XCASC_BUhRWiI=FkoXQ@=5nqV5oR1G?$bDKgE<@w zonGj$b!&x&IOOIEwxi@#f6D z#Ym3l++beseLI-fMSqUqb=1pCdEM2>o7ZW#ntjFsFcar+Qto_0`AT>Bd_~<{K38*O z8S{;unU`^7{wOsI?I~Q3c~k}FIhUE=dBXf>1oNm1%)cyUzH&Ho)49xlp8bINwOE#k z{K}dPzTHY`Ogzr77r9Q599Gq+(Mog)Gy8RjvMZ# zSdR0a6-VCtMG54Oe=={ijMpD--Q)F&_2S*3#&3DuV@4FOlcc<0-t{o^nNyip4CZuC z_TzP=krABVQ-j%`UCME}oXq5T>&7l7=>O7hd0hHS-1}(VnEUH&@m;NPG2EZ#*l?WZ zpUC~=*c9#u!*6mw7+0M6k0D$iU5|Z5|Cp_0UbZ3YNfPfH6uQFp%oOhy{&$PV0}=l0 zpMowtj?F&Lem*9?_fcNV7y3JM`;#E{eR?GFc&v#Hy4g@|0`t*RnKvHKd`)}iH^e&w z3q9D*i;m1AN;2>An*H-x+}E4Bh2@uxWd5Qo^V%^yziY9ddDctjHFhv>+==-=@$SK& z_AI}11oKiM%om7v8$O<6KV0a^<#IKLc^mP*Zt?@}Pv`XGc5?O^?q~N*;r4cv1Gmp( zgSh{lCEgDViRAXbQWW>gN3)r~75A5O2D5zH7f$!;K;{+B@H*t_^30vPvmf@jvfnJt zc|4PMnb&73jOFsGdYRW@(#3pP9H%ubZo%=n(v$na^bl^hEnK*r|DUe&e(3r8;`lp+ zjIxCgA!IAE_m?Cykx*7fMv{>&d&??iXK&dfqNrpfB3pz8WqdTOzW>1E`Rk+8dEasF zz2}~L?tOJ@#_PgzBVHemXYx9gZ^7JW0k3y=3o(zr%=^dV+nI-o`zE~xvwrh~%%8X8 z@;~g#>+Eu0Zl6=jxIIIza{HT$@30pz(mFKsAv)E2*NAY~+Qi1)hVy$_;`cjwe z`L)OoKVFT;h07u4-bHwPrF3Baz=ZjJ@xJ~1M4oR4RcBsoGuO9*;$RmOl}}ym@)9SNXBb zZ#`tb+l||Ko_Ih1viQE(%U|5@vlp=Zy(8P<##7AG^O>LN#N%saH|E);m|u)# z{g&>`55MJl`HOQp^IhC-ey_P-VtH9JY;4K>d)AZfXJZJ@lQTqIeTTT88`+cRXW#w2 zKiX1(`DO8)%2NJZ;m{4tzn*12qZI#cus`!LHe9cMrFq@iP=njEj1#xN^BV3i*ZbV> z@fK`XHG?DFLCwNktb>Tkm1)H0OE^;q%!*|DB1Z!PYb zI%Ko_yQN&7Y~in-EWzy%nZdmEM{du2ZZ^ZxzuaHbp76S3a)kT6(oCLbrgvt$O8mzB z%6y)eva*=_xw1V^3uoS4yz{fU5RaF}<(Rjw%Dhl<=96Q%JPnpHuk=6W!GE|NCM{;3 z@RQql$ZF<+j?6#RWM1+=?sv}w=EF0XM>b^r{d}35ig$?}V_CkF_-@ydiQI1eW0;3# zGoRFq`zvM&^Fe!=N8e$7?=ths7nuhLZW+Szqr~^T@;bBpl3&~o9d|H)V#<8MMA2Vi zY$prFJBLI6@O))iocVK+_vk15qV(|yuP^Y zW^S>Bd7}8Py~RG3kGsgcn)qH-r@t(JbST%WY!ve*;`?0t-MKyIitqV4x^sUu`@!6A z68C#c5ic6SZjPZ+GycPpdCXVsX1;7X^9e(luOH65*8iA4e$DkQCeCYW-sN_iFYdpG zTd@3&@!XG9yxAT`ig&B}v}b#Jvx@h9&HOpuIBf#QC;QLmcxI!Y9RCb)Wxlf{$5D$d z=J@UGm7M2LvkCM69(}_OPKf)8e97c2r%k$5Q8`%7Y z+9|vb+R&*8{=*JWj+2Bql|cFWV>v$1VT>utAF07{3CG6F&l@ox*OGaZ6URfwe&@WP zvf{gDKIO|{`PX(~UgA9S2G5uq{&D`#)puOZpYOOmeI9YVrC3-|EPvEY_G4?iv;X<+ z9j~)L?RkAPy2tCF^BP|7g4gnTmvn*cKT6z-oM+1NyB&Caob1f&qy2nd2c5%sobD9) zLL=w0{P?%by)W|bMxN(#hVJKj6%XciSn`S6x%hPMuhJrZzSqF^(Ci9xmmKB?2cUTx z!jCZ@f1kO}d*-PZnP(1T?(&?=xk7xm<##aK|C$BN?YA-i*@byd2+#9Y)tNv2#{KxX z8p}6X$h`S^=3PV{(S>-H&lK-~RiDiDjr+`e)d}twn+x2J^B;4ZFj?Hgsw4L4-y<@K~e5nfN-9x#77p4WwlmCU_FoPXX2*1xYI^DYgz{5Iuz zJ@T#3?a<1X+ilTpUcX|laQokE%5j?y>p4F2>pHJ@D=x8J#UEn(Y&ns~U19N^*$`u% zw^PMCHYE(aUVLcu9~QLzQ{I=oxWzp3A#)|ivSLX2g zm{XhA$7`aUt;PEW1@G|scz+1@Z%!)DdqcbMd=<6qPQuXY@_n^$G#HmA7#r!QolK9Kp8 z#?0r{XMUp&^J$HkC$?nnCVtnm2Fr`jOc^r&vVH#M<-#z~mGyV$X~57;d?4e-25$U4z4&0Bhj-86ea+W6UQZJSF#l)D z{C6I&Bj(jvK5R1cCppZ&UE=beIKcJ2pw36cyP5$aKYu_B_t)ME-0#1F*nT3#yO;AS zvi+~}WIruAk^Q|!E!dwNF_$N%aycC5@f}hYD>kb|dE^a;b3>F#V&3Q)^U0l=PZ`d? z`!$2hIkbHlEN7*oT;D!zIS%&nCj0HF%ekHZx1Rm>Vn^6-U$C6}@wWy0?Q^H`yt-=} z&xduRd479z6`RMfQ|!mXZt(nbVGzfoa>P44i}QF~4`|DLQ4Y^1|0=WmUhxi3N-Lf> z-sCc$CgMD4Ex8?*ZRL5p^husK`krO~p+Y$K%YpSgpA5I-{=IRZ`8ScjeRn$BPnGUG zFAb~1c6j{*bN@X&kKLWYcHX=ekBcedJ*&0*Sw7#JxvMqvUE&>;@*TOHqmOaD3Rh!p z63Ol3vV?ifam;^-yeX3#EdN@3*U5Dim(%zq^Nq&b4pBvz7cb1bZb9Y^GWd6YJzyTX zleyx|NL+O#$&P!4WTxi+Y^pxNF_2%$K-w z;3je~=jZsIIhiQGO1y8=*y}UO@Bheo9X2zWCv8nf zJrB;MA#YTUc~ad}l)qfy6Y|xQKO&z}pZSHkA5cCpDFykZoy>!NGv9KK_4j(hTQ{`fF|A{kZ8$=BKVOclTlaeZo0zP`ME2rOc~e4jVM0KF340)~tx~N#Y&j zSrb`*^fQi!_|4|_TqFG60sDEsStyA80izUNFUko2XTe}zFUq;``Z8bS&y3l@<#{01 zS^LKw9oA z`~RttypNcX!f}RSt$E&v7UvY5im;wR;+?LRaX4HIjv^1-z83pGH$Jo7`iVUG^+nho zIxS*8OuQEqcY@0^;tun5t(g~jz`xs}2lKvNxW2<5^LR7_aa?YSI7d!TXFL4n%X&&b z<=?F=zDJxF&h21%i~Z;7@odjmBiNpu=ds-u7W?|5J{7VGht!TeSd*X#at=9iZ;|Ivx{_gKf}OdQSYW6&O+Kc~Lpbu)^$WrmvT z*^fH>gza$rQeFr9jbR?Xmh}wi#J^kV0k4}!#QnI=psXn~zl?{w;m9)9<8_0}<0ZZ?zfR|pT^?7qY}M&eXLrYJ0M(qN69*!<=rcDT>WDY=AT5~X{YNfe?NwBdZ^STYVogLD-zoORhcpoIb>pJ2F+s~+eY;Seb**-IcpBDd> z=hfBynRkB6e&ELl=KmR3Pm3AM#~OG%TDdd#UCg}nLFQ3nU*Nck+wDw2_8*#y`vsoQ zxnB;lyJzS$n*EukIcz5tMP6b7C$`U`;++|ndF+q9tb$%uK^bgtKU8zbBW7YMC6}zp3C#zfn(h79ZNCa zwUy_q)yI$;{L5GvCsZ%eij_^YiDKyX|N0J&(CXN9I1~xtwL{GoQGE z{k;<6JDwYiS-$NDUN5TWG2c^^^?a?%e3CQs6)l**5%0n^8p-9U|CQ$}bCKuS{UOhL z%{nn(k<9+mT@hdE|B~fHi?ROW^O=7u$MveRo%zdZ+&%#_m`7e`UcNH-%Mlyq-TE@G zxSaVNk>8u!hwZ%f5$0WlKY8dNkFS!|c^(T2V*ctgbFWf7e`d8}{$F$E;UZ7Q_YnW? z5An|Y{%>60gTBm@^SC{G?Pi`hlKHll%yZ0{|4U_iD0-54Vt?jFX>7NXr!n97l*h}q zrp#My`$%mE9AVz;Aal$?`iA zn1?=MK5`55ZQ>j=dmZmjmsm0{AI5RWn5xWkrf@v7|7ebX78my-_g~~Zfz=tD-?DxU z^I1nZzh%ZK&QHiGnuQahzc~j?d;iDz4@JcHo=&)aM*YvC(~-YFkcK><3iI>5Q&GO) z(ND;GPGDYh3iGUe%r~E4-aU-D_e}R|E z6wmWp^H029uj^I>+y8i3&fi#)!hw=kXZRed?Pxx?TIkEXkrV5AJc!HlDu?&)*RC*M zzn0IxrZ?nzjoZrQ+`E$VRaSi{i|zS)F6WuFwr2U+3poGe+yO4%?Pv;3eAY@gYExjgOHU~?Mw`LI2AFU^9u;(x5nM|9@S1+wJ(@F$^G2>jFduZA z`LF`aW9IO>?9-9g(zs3gc zua^CJ{-EiWo;Rk7`<_iI@_f=~F>{9{%r~}Xelvva*7Q2BYq7lTGt3q7u01ul z9rjsryZ!FM?ff-``^8=4OKktn^8Lj3G&hNJTf4?=Cr%UDu52UOK6}()o*?cuM|EcZ z^N=%h(-h`4ExDWxD{%XqAI$x7H<0btXf@l=Lb#W5&746th>$Q;i z+H=fp|1lpuk=Msl_Pj3SSLJnZz$@lY>+wF$_7TfBEWmu6cu#&rRjyZz8@GSlZ0^Uv z{oL8Qu)XzY&g1B(_-;be2$r|< zW8U&V{@r0Cna>h=Rt}I*uw2lvH%3NxQGl-IT9;=70UBYB>z8OA(yIrIMGnD3s%-0BST$kJT?`<~1XpJIL_jrrIC z+-}drJ+C^wxL=n4W^Nk6{Tncc?c~IJ=A~M(y-i=pJm3}cOcBShD9ZLfI+pdE8^-)X zE|))1OTe%lmF*zVZ(9FJ|1H>pC+(>%zR*K<1UZGCwN5 zYiw&^`E2q1INM;ZSM>(Ww=U-X3W?(Vg%2Mq8LY&6BbiUwANCgSnH=cNezoUH_QT7I z?=*E8!SR7wg_%zm-!olNkoW0ThjH8>;v?_(?~A;GG9g0#81onJnH!bo^1QKOe!d%X z=h4gqwljYn$2?5L{p`iL!yXa0{P2VI|2xk-B8<7|X66;@GLKl!?Yy`k^IblCPPZ+W z&ozo}W^PxQc}O2V?`t%l&r=Gm=JWmIcQ|h(s0{M}YYr^hxN%;={rOoqaeN&dIfyx{}ZvoV=b21x z!+L^kxIC|$6~%GUuoC;XdzYcOp_ceQU1Muruf004y}e(_{PTI%bEhQx8(&wl-y)vX zG-Oz_A63Vc`6Tg9^>1;H)vOMe|AiyhcT7L#9wJZmorw3EHsW?jzQp}Feg++llK+=68oNPcda4E$(l=3S+-_ zwRm^Y?E~A%ldWtIuP(DcQ%t;Lu;Lld|4R-skJ-Wg%<(?_yX6;fImhnjcF5bw_PKW( z_pe<)wukL|*lx=W;(4r45c5*vK1GpmmUp)0abY%!?L4|M&$sLCcztPGn&<5|F1(IB z|HIt87_XK%BOiAc-WflJpDM2i{*`Z|KeSi$5)vxyiZyAi}^(H-I>q!VxF1J^*X$h z+aaSZx94F~?#HcNnTOS2{zvq0VjTBZ#%C^P|DMb(T$rEw&HQZ#uCM1|F8}J=Z0D=Q zy}wxnd7k+qzRPpOipw*uDwjXwGuvn6d$!N|RoOm!iSJfi+stKU;Wx+%N8%AIsx$QFtKpf?^z5rE>cW68E^RUa;4D z{o=X5(w=hvP8avQW_Yvxd>_EPjd*A8L_EvSdC5E{mU*RH%xC{#ZfDK)^_#?e-4^EI zCz*TwW?pD9x4*yme&swr9v6+pxJdfQc5>mUP|ImmakTu$I<%H%scL5ZuyM4*(>IcjxZ13 z#Qe({=GkwUXNvcoPKo@_Ub9(`*DG$fTfezq5=8vUp#%4OJ5Tn*gSWEZo_Cr3{Dn!p zFYvQuUS%)ub8io1Zd8J~t9WO_)r{i<>(_Iq&HBUgjF}aB)ASkT`GZT9(^0^$zRrx`26VBj*2Qa(%b%W2BoX^Nh zw&VPPQytP#{+bWxIW%j-e4G>WE#}Nko~PpP9?oX|brS3OcZ2zerd+SqFPR^D&h2yW zE4SzO@!T&TUAZ5RU0{3Yu#)YtdMzGDMbGp6yt)9dBVLZ|7v=3^zs|BsG3=L@#rQlZ z_&M{w3Cz!a<$Q_0oA`Hg-Au4N36q(}Z(}`9Tlsfib?0(AW-|X@Z$2-(dxPa;cJl8! zcI9%`%;$c|4P<}yTsQU;%A4@If7O%iXYm|f$BpxumlgRHHl4A%3~sZyoNYxMWdkt(-{bOlig|laF8eJL->`o&MEEU!i&_5AK=z}2#QS*P#%Jn(2nhG zoOoxx!8V@9wk9%nTEW~$+%N8L#&*8(BbPJOlH~_1WxiG9F&d8Zx-zc%U;f?C4Y{1jrMO>ei}z98YqI@ZXvI8z1@k)P_;>#XF~5AB`Pwne zgGTf34*1Ib-qe=uWZ_v}ABTnWJipY1`OGQI&!jVN{Dgn^xX5Q%C+_bjOyTi$bQZUd zjWxHY^91H?yqKqtWbWg`+%=2&|BkZV`tD>q|0m+2KVo?t4SC9bSMxw#zn+Nu^8EpP5?*a{DhG!u?q77xUj!*dEFrW}bVQ z`Bo8cciYYKgT%RjxzHc{hxIfW%XWV4H1nS~nE%+tyoVF>l?LYDwsSeVr*iv`v|-+2 z4EOKr1h$96VjsF|5X--r#k_PZ^IPJ35Pz<4Ij_{_di`0<{QPU?uf%+HbPl((`$gtw z#e0MAJh>l}#JrmMnCIKkK|F7#h<7-*iTt|w;q3n(+0DG|A?DUW%&Yh_@6nEVeUV=@ zd@Aqnj*0gY=ilP?sUp71Fjc$*v%3Q88I;BSvL=AJLt*A0*0DX@uFt%r$a^<_z;?Lh zEc1h>nLkWsUc4ih$8lq!-yhR|FbM+*ySIKu@ zuslO|albV1WjncO!}eD474u>f*=}RUu>If6=W(}Z8_#>W;(OT*J$YSl^Wt@?pA-9C zKTq*KrAP5%*q)0H@wtqVF`wh~9?J4ZXPKaW^P60rwGPZzj%L0{>?^wzVflh>nU|Wy zJX)OJl@{NRUeS~F^owIZ+*!QOW_N`B2OoBG3~pW=XY)DA>vGT==FP>sDEGuUR8{d# zY%lSy;4zUeI&nDLbLc&8hil@#?abLcUQ)WC85*{T@7(2-WxuF&4)bf`JDz4mxcupj zxxTUGxPupcV)=!|m|J9UJ1q9$c6gA$_A|LO+sSD0y*aC~?6(}B#q(kKL*_f)vz{N~ zosjos+0P6MWga5l70Fo0^YhDH?7z8sGxxl~+>ph5SrGs3{EFQEJ>s~(Zi~36iLkdX zZF#-;K7!|~K?%&gM83qrn=F4~2J@HAnMd?x-Y$f><8|hNrFnk-d6s!zKaK~!4`hCI z6Z5!|%*TrFN^cbRas0%0ev6BHrcK;Je(QW2;3_M@m z7UyNLBUw-2H!gpj<;#yx?_Ve^utM zd-4427Q*xS*6+N2rHXqT{ry-zBZYbRe*WE_-dxUIZMa@T|1!ULo7-*h6mI_~`OM4C zU^_9r$9z4zKZZ?J*be`WVLq9g&9Lwhk4N7y9v8p-cpP>5%6zMMpP{!n2g#kmdM=7M z_V}J$&PKbqUbn@)yp3DA-7MNMuUm)t%(~1gwql-Z&is>DcYZ{(o#dTh-ftK48Uf6g zZf5>^Df7kR`-3~hce~8GbAA7saDN57W&T*?;UqR=`>~tOeE4SObpn|;*~Pr}GUkg# z{5((GKfNm6shBVBS5_43pm#wo&!#vYFQ=z6pDoUJEC+MHtbEP=n=_I5cx&ce&$GQP z8_N8U*q??KX8ACC=3m6P2rtLwv|GkJB$;`a8r*Jv;vINLn@%@5hhj^bd<|=cOyUgp0`{}-7A2fa^>p8QCdH0UY zI~HR;=Q_8~i(uwu=P|!Ghaf0guO-n}YwZVwR$pl7I`VH4zv8OEapR+@cw#&crW6-JIhMPc@Mf-SuGoHr$f%v{gWsyH%e~stc z?<1M-F2}q)Z!Zjo`8ddMIF8qmp|Q+!O7QP4abkW${ zxIs(7ZJ)FJ{C&(lS~0(r#&L|$i_DXUGT(BEH~h2eFdr|zf7<^7pGQQ9dx#B^`TRGy z4f9xMK1aS0#plkoCoq3~lJg=$gZaGMJB9Nf0yZ*__|EwcNky2SFyiy~stY*Jp=fdD zTL*BS!;>?7?%!fC^VZimf54|1^Zk>VZ(qzjc_{PkpP3K&kIR|Ak?U*UnA<1Kn%jA8 zXYQAR;=PWtJGtM3_p$v1U1K{OxQEBf<|rQTR>OH7uG5Ft9eWe@uL^Ewf9$R}$G;-J zcYh;<{mH??k8RMI{l;<$T%H{wkGE+O>zQ_s%d_?xpC6T5!}%4F6*#ZMyFK&nOIgp| zg8aM7UAg?>HMze=9_4j^SbtvMP5Ln($!2cwzsvf4o3meSm(1lHoX!0>q7v8FwLZ(+ zh4SwvWOF$SjN|(5Ys=$h+)MT=K5bt#8O{irbUK6cD_o|leHX8uC>OAEz&!q1m;d0Hegzj~1Qq37(sRc^!ObaG=q zXKV!fA;)I3A9B1nbCWdYLtpUxKX@jWbAdhE?VVX{|FfU+c)2{D?RJTHMp!}i`S+#Fy~R648R9#bGpDir+c@$(6Ihk!;VuJs-u{%x+-()}7!TI}R@~FLkddoE znfIQ_yst6;ZruRpjcW6{ws;cr!(*8H*)zXw%KW-9^9N?k|8`(*Cf?C{vXuL!n1~l$ zJk9-Xd6n&?wfKIqjffL2naktLbtdzaCd_LkvHjoL$b8Ur=8MF+-kVsKFC*S-IwRf_ zixBUsJs-yPswvLdE7@>)@}_dX+`qv6=-Z5W$U`32bz+&DrZUfN!TL*zcg%9@aruL` zF`t*j+*a(rMtoxVYWJB>JjuMwVdk69GN1UI`IR!<3y7X1}`qHRgrP*@0W$j=8zGzdv2P?-wZEwJ`p|GFOPe&ysLNzW@jgs|L4FwtqXH&XXdZA zGVhwnyoL+g$qawy-4-%`A-;d%D83_eJB0PL-om`I&|}({<$LyIUQOI1t2K<}lf-y= z`;Xhx`~>s;?U{StB!=JCQGe)mSqpEsBnxy(G`6!VHFna>mQ z&5yBs(;()@r!r6L!938BxrHzD^_!UQKFhrId*%bh`xQGx-a@2!cj8+a?%z}5JM?I3@_WZ~xYS_#j{Skfx0wICz&tB}`6yTBGpjN0D!w-w z6UBax%@O8j4l+L|_9;)ry?`gepY*Q5<)7Y*`N+=9?Cm}iOn`9Eh^-h2S_Uw_%}&3(dr%{u0Fi!oo^g5xCDmUFyiXm#e#ayh>A zO?)r)vOmi&EXch4Nsf1=E@i%NBJ+86%zbz8dCk+OJV6-uXWqrYeE35?_u2BAxy^az z?Uyp&zLt4~dCW_iFzEFfS?cYP?Ib ze1IeKNfnqcZ^GQvgLxfO=Fb{3kJ!QdU?1lHGh<%JlH2)I5cgLJckbWEADOS;&GvJ) z7>}c26?j~?i0ApFz%!ng(#G;U_NNffpPktqHaG}BWP}U*IlaA@`;=fm`G@$fYkVIr z(7k2M3s>j;LftjY+lu$!EV{9L*>n868Dp5+x-dVd@~9VZ``EW;z9^g9dE#m2E0-`2 z7T?QL@5>p9`-Z;ayOu?t^Y41~XPzzcjawSAe9wRE$GX2@K2+p6M>J*qKQ}QSXUY9C z+kyFpBFyh6vi>G%%soCcZ@q~5tb5!JRt=cHe9nGmq&R21zJ%qQ)@R-|kmsMP;`;?7 z-ts&)ejD?MZ#*BqcVfOy%&Q$Oc)ne;j^}3=kvEbR%JNN%u>P5{d`KteNg{u8iMUUZ zvz_fBS)AkCVR6HCPDeGYY{&nwOw41?#l4;?Mr@zosxr@P#(Z51=I5I-A61!ov4+gA zbz{CzoY$C&`$yK!tY_w2=5ItiaF&Q49$3YCK3OuKd5QaRRa53Y#k%7q{9&h6JWmEX zF+X9&+@~b-Hh*~DKKGD$!Q;$FdNUu>gn9ORUSC#iXFk)9`JpMy3#?<_@fP#)W?asL z!R)2{UALL<6X(cnKC(Ppv%yf^p8wKsI`dK@ zKOy8c%bUh9KYE1usd>zwJ1{R>j=8;vPaYBDH+K@Z+lXGwZQC=SP?!1S%FH)aVScC~ z^Zy)}?-Jj~>9LySbA%nn9$@(ex0s9LO2bkSZ*Oyy`|BYOYr`k;{i!T*-cd@tZ+JUWbd-IL7c9A(~6$op+(d1qhd z*6otmq_mSTkgzviF4$yV%}Kp$M$)@J@ZOp9++O7 znr3mHL)oXyA3SFMOS~u3b{ywjbPV7;jdIS+ zhfZhSB8d6)UCdwmGG9BE`Q+Ekvu|;|tjlow?0?Skruob}d9t3%(abA0H->?$->X${m9z9?`WZYWj zrNq9ky?B44)p2fz9ikoD)Z=!rv}WGFEAs{wm`~flWL zJ@Kx>tqLsPN1Ufzn9t=YT$_1NEuLozHstwj=?|U{H=441d}-$2M83_-YAk<0g84=d zF8`XD%v&~Q{-Gjsdy!wX>;&31C-67w!4dA!st z$NY9K`c*mdL9)d6U;W<8#cTqnH~f zGe7*Dxw%+RBTI1k+X(&VPqBWpK;{O2=HF*Bw_VS?NCfk-MY;UjdNU8+#eC8O=A*Ki zpDfCD;_@HMcNgyw<%staBKNSK3!?lhPq2J?3iAQN4=LV(>s7;@`6N%~YX>sFZ^e9> zc&Ft_B$t2BZsrwtFdun^`S~>F7EQREhVjf@#68UtBCgwnw=ag;6?wioU6#3jCFXH9 z%x`vL9_7M(`~v3R#r|cEi09vH#p{u;IB&i0$MQ#}F}D`^C&A*J?q)64GqxIY|BB29 z3%_fY@K1~?v7YYY{5nPC>uzbpdPWsuK3trq+!X%dJh9FWnalRjcO>&IQ<>jd%REZt z0nQbEW0dH}$0F}*nmGUcvy$7*Whe9EhnT-U%{(NM`St|nhJ5CuoAG|3k@#-K9q~QH zqcN<kh-d8o*Te<9|R2V(w7DaZQzlx1F|FmvlH9@iEke{Zt5ck@WxcNlSt z^}jgCyw76hXBIM#@ndeZnfaLz<}<{+TH+YX_Y&vYj^|kZ>0#yt&N43}^j{a{j9A2a zl%KF+EXzlT^{$41!0f=4X>?=EvcVTapJxAU#H;D5TClQY_VfWL} zNBAMP+Vi+;CgQ*;=8>^M4T{3$Y+W3rd08so0T=s z+r^48zc1$Jt~uNe!JnB&-(haDn|YczZ#p6TlV+n>Phw~0ZS9%Y9mBlIV&)EWnYZl6 ze2U0(b8Eu#M#8TvEd21*eB5oQAjVxAK8`ljFy`_M`^@9L@)zbe`FPpTm%|u_xkCRd z;kQRW=HCqy^%_=%>ormABcAkO`7Pa;$8};JBF?`?3%})wuxGF7tbg_*<_^o5@7%(? zdm!^oo0uOG^KHYCEdNN<_tRLG|L!ihkZ(AX<%=z3K4BvBW38E+3Eo7^CzXXgEN#I0 zyNdO0ir7bY0Om%eBsDM{3Fq=2457mz>1BN>}E` zM4Z28I8XGw7c<{8g!%J&%ok*GK9cQS<`Yja?>d{gRd?pyjF|g`bKX?CH}e%Gm>)jM z1ABR2=7WFoLc8t+^VneK8}=|?ca*t*0P{b7%sZTBzMv@AYfnGsA67Ac5X(H(oZGq3 z5ayl6G5^+%xl<$N)ts5zZ(`mkmifSk%qOQapID9U^RIYErS3b{(>j^?s$Q(W@HyuB zFPJZlU_Nml^Fv}>yIJ%6FjIWzBCZF^d;Z|xoxGFz?g7kmZJ7UbV}AM-^WgDZPV?2w z&x<_FQQcX-Kq&JEmORfp`7zJl%6y|(Ut$Kbd{`Uit>!cT-!JB?#Xa;P_jx@XRe}A4 z*n!NChD|dBS|l zOXh8a{%Ji~-dp(3HCalnU@iKm5B2U5%HFY zU0nWdp3M7-^T%TAS^oZO<_%1_UL7o$Ul!*A&qW-pt>~AdA}_a)I4?N;KQ8~IlFWTS z@HpBe^1IwmviyG{{v0LpPWS9(J+lIsPZja!I$}T7r3&l0l*aR<=N;yIFECf{tHg`^ z{6WuI&+>=NLt~h)4rhMkB=ZB}{p8sq-y^UK>#=Lee7eY|dNPsae~Ir@_KRbA$8XG+ z8*~4kuqiF`0WaX;5d#LfPR_Q@0L#ZHmuZ=B2JJoSNj#yjT4ggw+vV)>Sd%=2F` zUnPF`m*6+ESdTBeGlp(u+5Ve0WS%L;SNCQtpI@H2{}(Rj+}F$}-(?;z_Hkh^S^lZ$ z-|fjPZ~B&b-Ye!UME`m}X8BPG%q@idSc!IMb&2)(iu>tyV&15Dne`aoWNt0)#kar0 z@_WQQ5GUSMt2~?abeO`tpxEy>n8xxMbD3B0V{Ws6d9PK>9d|M}4rBiJI`cWVnV%5r z!bveth6(u?;Xl{=$iLfzpK&t8w&C$^D%SUo!&yE+_;oW^vHYR~%*{fXH$TI?>`ms8 z@0hPoW?odtcM<;EuCJ_ThB)8%tiuy}&&JG;i+81BYqR{Gw#<8oI7|mumVYpwxy>Br zC6_QC=f!-yh*NoqbKwMW4n9+ygO?EHTtA4*6C?6HmWlgBAJ?#+_u`yAP?SGNoOj<5 z@h-nv{JX9yQ%pZ#P!3GUxc_$HPe)x~;+dP^1 z!g%IqW0?QD%e=ejmqej|cr@!d9L79N+&j2^jpZjlW$q#3*d;|g+4wT+Idz8l=5Xdc zW0_AEcH1(7<%b?;erX?blT*xx3x4_{%YPN;J59v+YX6q?42WWWSoGtMNS3d5mHE<> z%)9JluD+Y;E9TD+Gg!|{F`us-!1D7uFmKS1xpjHw)lHZ;|AEt(;ZzFq!f%%ceDch2*3;@R^THy2YrKu+&xv?u6Tv;^u%1FwnOE{;KHZ&pv^YoZ)t=?;TQiSs z%zRl*=1WB!%v!`xV#Gc)PQ?8VY~X$3%hAj`HekNQi1|x#FZJ@{e^}wv%gpaAX1-p0 zf9K?ImY*x`x%X(o@}I@M@&cbZ?_y9Q^DD=gH(kzr{#fR5;=4ujJF|SzcFf&dGIuG< zJfr~gY6+b8vP(D46>Ttv=4~GauQOdFD{&kHotZdDB_mdj)gPeaweGVIE+?^JHD| zy`E8KEMK`2b7NcP_XaRu(2sd-!E3p*{F}+ltrsx&T+aO2A?6$JF+cK>`P*;I&lTf! zHe0+`R--k`mk{|6#^N0eHxX|iCEk%(G?stYCy@Dubmp!iza_v5-3LRfmdp#4PgF1 zv7fCg_P@VHd?`lkySwJ{@185n@s@(6nGdjJ-cQ7T$~9v7IU*6kL*&;r5#>29^6UPH zd!VISa(PU}dyh-Rd+841{ekimSpS1@%zei*pDN@R4P*Ii5ofa&??_Cn$$DOyG5;j) z`A+}Fc2zcwx!)`1^+f#bhlsn@o6ma2hD=H82#HyFn}eF*a_U77Fh!u&~7<}u>EDSs9>(Em}d#TPP|vPa|r8sHh_7le$10a9_;b1EPv90xk+#4vwJab z*Nu5O!DBnIe12!<9lA5O7v*;l?Yw6=>-j#C`5e)YU52sz(h-|XTUh>sm}epbSpJj9+1{V^q>6o_|9qBzBJ#B!2tGmNj|~_0S$Z`8 zuC*KUW-iQkhppuwZYuK@# zJ@(AwIxt_8*8X;&JN0!`pkVD znSU9{yp138-{RbD+-{a{b&dJkSmu$5%r6SRx_LIsI~U`IGb_uywAfz^sLt}U8ZaN# ziuq#k9>|X#EMK8J^L8R1ubSXbg&rdZ*59Z%^M2y|`kTlft2v(ayb$N(cW1Nwzq!m` zEoXjtHS_ALnBQ8yGD%b6-f3T3x74i-u&tb|D)<5Mi^SvU! z;+4oFdL-gtk4AF*q?<4EAs)=botPI8_h-wAyr~2c=ZQPW?cgBd7#2lX{-hamW07ZQ z8_M!-B2Q-OC6;d~@(+KuXZflkA9&S7mf!V|d9feNLvJ!S+Q>XYw8KPUhgl*HJXy5E zMhpI36A=$tAHnO3`o2aPTh{NilKFu5%4EMG~y*H^9?%kOT^{9jGx4;nK6)PnhtCd?OFF>g_yxtkmFC4S6Pg`Lb@ z%JMga{5&CFdLHXpy@+|2am4c8Mub|crhOi%wYMwpPA1Q=S1a& z|8PdkCm|w_x|cuy?q|^s=B-&iK)m~%FU|q2g`b@Cjps3|bmm*$GhZw61`mn2ap`?R z&s^q(J(=(B$^3XF<~y@_zt;8{^Dwb58~udkXYXR}B;t6tMf}sP4eP05#k@oz<}rDE z?jKd2<*SrpzFmB$BYhu8ZspVyzc z&s63IL>%dlxE~ZG;$6y5t}%vx_r+x9!)G!-C*pV>M_ImnH1pHXnXeP~m42qOd}t=~ zc7K@n68UC}g`V8otjAr%Ni0^de9Bzr`$YcUC9#hy)rIvu6!!U4?8o1gWj*$Vn0FR& zHaDT?O-a@hUYhye;>_=f`&Mtn?}mKm@&5D$^P@MJS2)7_?lR`xW-w2k!~Et(=HGWS zFE7e-S@6$CS&zNQ7kU@O^4rAz@$w0lcfG(o;3D%?qMV^SSw4CJ^Z8=Es5hJCM~Z$i z@@M%Y3z^Sa$$Uu&^Nylk2M)1(;(6w8;+R*AXZ}Rk`4-WSgG4!}2C{zd70gF1V!lQ6 z<0H}jMypuQ@_Ec{g*`MG&+?&e%ojQ^zte>IQxOk&R)poN|6@PRO-F-Ef{}ugm(T3%dTQDyv?CR1WmY+VJxrZ1RmLlJ#p~!Qy_GkTF z#P|(Z!SbC%K2NO3f2%6;eDcJ;_|--J-Fp$t55zFv^@90rF|V47c~~3^8!XE3{J&7F z7dh2gKC2q@fLemrWnM-F$3L9NWFGvU`Gr@^)%(d& z4_W@8c(2$fmgS@GFkdG2`?tiqLuOZ5&%q1Kx1MHR#Qn9~fh=Et2lLFM%-m~+vL5%!%pI#UA1m~i6YcP<5$m~N&)n64d5eL}BZo16 zJdU}G@MHJ-vV1GS?+KnWjrGhIe)YZiEdOK{^I^ho&lcyo?Uu8iqFb5gZeU(|C-b@o znCBg2o+9MG?_v4tyO@{W%Y3)uLQl>8tS4nR^Ugv~6%hwpFWPOb&_7GG&+;Q&9(8U$ zR_u#&#Qt>ZMb;k^&iup$=EmZj*GiPfPw44#h4lvr`4d-JK3vE*7yJE7Cs|L3h#S-s z^{pZF6cFuDQ{*S~7JQ3{>y}v0&&Q-r*SE6djudaApye4Z2Yg@X6%$nyJaneP?r=8rlopIM)|lZbE35b==Y#;nJ> zDf4$tn5PQ;4x(OFgrDOl>RVa(8wJa8c}zuIC8z+)7tGJcKg0>Yw4caRZTW@u^v+;D zL-^ZK&sjd^4fBpk%rA+1D>t9Ad=c^ffQg9bB#U@XQWWbSA@YHJ&#`>QCFU*9GCwBb zIbNq&e&s>tJ%s*#VjuVKBle5@ z-=mqki2m9g!}9Cmm^T*k9UroMlLySpiuua_zVt87Zc`d=$7H9dqQq0$gIEl4bH#?cKp8i7qsn8#4&U(zsGyi76 zJVy94A;N!fYr}eSh2N6dmgNt&W**y)d7*C19YlFNIs z=Lr2fguLtjSkGq>&sib(m0qmpzTktpvixh&FU>^%j_JU9YPDo;BH~w_gr8hf*js(! z|2J;Hzw0Ud>gCofzo{1U6yZPjvSj(jBK}!l@G?Tbp(g9k5qgFRJ>A8=z+cpNhLHCW zzpLbzi}`1Un14b=zt0o>WiR$ej^bSVq}Z?ZZO-j%B;@0pvHU?%o;;!Fm*AI0d920w z>MG=SiSbfe?0?S+J+lR0F7$hgdHaBn&lL6QEVywCZvU%d9vdTgJu$!Ki~0PpSl2d* zb*HVEC+7+I>ta1B)rsqy-;sGSvF;S^!tzOCJ<1X7Q$e)nWYO;)qP~tozPqrK<-!iT z34U1U*(u61UzF#OkXQFXK8SVaw-|T7h5R-lKS<1njm7-`u^RV#b~)zDl>b?Y<^6?U z`dRREBED2!@NZ&YP*&_m&gAmGqn+Rbf3f_c-^`c(VSY*QTH<$;#5r%7EY_bV;$4kX zS>8zOAA7uIc~2q#>jTTL5#>24c#6>TS)8W_edOQG66L@1j^%5LI9^9l-`iq;T}qU{ zm(Vl+C6~uZ)c1g~->o0qK9_zm_ZPh8UzU&m$9$sD zQ_zV0{KLW@o-E??9<0XjsVM&;RK(|3nX!D=%FI8A{mUj1zxrpvdMbjNgLy z67`xY?#mdQ`F9HrWu7Q_L3fsS7{z?tVCMe@G2bfM?VaG^A`hqhK-S+_{O&EGf3eUX zF7%{`{yi-0%2e2oLBy#7#JR>)5x*KF#>Gf6PRodKnkeEnH$`0iw204i72I0PGuMRv zZ9=|i74G*hmdwwXG5;dsITwqud`w~HlLap()}4_;|E40We^N!}7sPpMnvl0E&3ew8 zGT$ZQX){IK%uMi4V%@na&KI7EIH8ZQ=b6H8M~e09Kf#L%yNwq1`An?WnZiEJMLRSW z`iEENen}PjkBWZpEqJ`JpGhYCyDLT9HC(iVI;Yzx{F&*(J}(ISv?<8ttXPz}_{^!{ zhwvvO{;;3Pi>OzDZ(Po;!vDV^;ymX?d}*`r^WO>HOXS<+ zi~PyUVjnbCl(T|}!|W1qgSTQo_)+XPD~kPQ)^%=YM-fkO66MK>WIf++G7lHOn<>gU z@(Sx2cAohIQJ(8!zkFW&uBB+_Zcq4klf^!|>|>Une2;kp5vMvX;uVcWp4(ax2UsfN z?b}6t*NOPX3Q^8}q8;jqIMM=Vyw@*P~52Hmss+))x1&Msf9T)j`Ux;|uhLbG6 z=OFWxJ|}<>_Z}zeyHm`=*`ob@HgJ81iSfHb zjQ1j9zAY`r-9u5%iZ8f4qr^GO1~HFWiFK{0i1T+B=Mljoet1L7hbu+-+X%m6yoh(D z=W{!Z6Xz^1KC=8i5r=##;*GiDyrYw7e=p&On~42ybK%cl5pm1Q!cT55{NBAkxgD&9 zKN&CDEnWC~zlERQpgQ}{@5H`%qA34jk^fvx>|d^new-%!kXE7}J7#jbjTioTK`}1o zWwD+VVb6|*xZMtjeMG$IUk6dIsiIzAMZXLe{k}=G=eRdq-?u`4al!AWvYrXzJk&v) zQ*Re`{!+|K<-|Uv$agMJBQZ{Ei*Y*OH|yCV`cche;RawM67FA_=gOD#LoPXi%uCEBNf zXrGp19Vsi~V2L7bGeuO_U*x}eiMXPjsBc|SUsExk*AV6JAH-lzi4gItDX+QxBgK00SFBU5 zgnXJ<7e0x2;ARn5RO@VAQU3a3-*i&6&ukIrd48YUXRO#yWr=;6o$zN2qF)wA@$X)` z#(YZ*^WmaAd&PcjvB;BYB=U>m&++eG-_P9m5c85^->u>>fnuNAP?TrEW&T}T@w;Pp zvwVVx|9suZ^6}f5PZ0V?h<3Zbll4SxWqw)wu3HGpZ`sFumWZEJ5O!!It%~g8PejQM?$Z8_sim*9q<^;*+c6S&u=?8%`pA{zi=705MM22z!n{%jMZ8=7Cot zu2Mkkv&ITPIYsPiEJU1VqnL*?1#c(zSw}>9dWkrE|732THX_bb;VsMGOJklV_#aXJ zXwlBuqMWxyIUU8keM0bo!fxXdxn39UGOr=V*HQ7ir^I=L*HPAgNZ9jS@w+plSo} z?q>}Z@$d$@+|Gk5@IG#LW9BQwJ~~kB(^rW7@}%0V-yrg@)`|UfElbu@QRER76#M;j zkuTJ|6YHNWcybq(Hy8ISW4f{Yhz`u_)n}d|@&G%uVR=JK<`adUxc)3(%$4~8k%xKC zf#sLAV_v@*^WmcWwVhc0VGri}MSU%V{tRav=#dZW8o*~ zig?1llU)8(v7cISiRE95eb%RgEI%cXdG}4s6NG+05$BvO+TTgU$L@sk@0yAI$kHn; z|60^HXAjGd6uhh`XXpynvv>=0gRm0^(QePfSvxFpRacZJ?F9esaUs9p1{zv}Zd=ZCn5OIu#V!zx+ z>~lwC@$bfpxY=?s|Cl^xJ>A5*puQuyT9hY3?BCmp{j7~RPgMC8O+Rt@Gyh|5EY1@H zD)BnLQrt%vCgK3e;#@vf_%j2<{(7L$pCNcJ;U|P~wG8IMuEq)d~lx-<=;Ko zfq7k_zp2>29~1kCbg|Fs--&^-6ZcYcJh?o{W0`*t+-f4rANF8gNVJ2Uh+~Wv@sn3V{+rmhUK9KAzC!+! z7#H`%ecn#aT;I8(zY2*sScG@#kk8B_LC~)-wOR(MEhJ6ag|{rUa?fntN&SZ zyZMQEEL6m=-iY|v=GLs=P3ZaFk>#^QTxEpdOU3$ovI6TrF5&|(M0~(ateayCv;O|# zciReoBS++48JV#D9zy-y9xchg&uDahp8m?3v)&Om8XdRv=IKVsVIM{xW5o0>^4>Ce<}34|KN81^_qDj zvA-xK_B*j6PNnYsjS~BdQX-%5v*_PUQLoZsfA>l3cM5#qc5oN_vOv)eLq$6zi+ygp zH~hQD#Qx}y$WI6rcKbn`BZs`_-^~~LpNV>16z$e7oAq0X^VtF-e%MO1v(-D+e^iwJ zfY?W$yu^CSiFinTasD1G;saA}u>KE%zZUHfmG7l8d(>WMh#G7*Q&6?ruc#Cbst5l@~W+J9&gm;aoIkJ$@5 z&lBUl^)1#vT$CqLjJv3(tfzul7m~y}Vk_iNih2HSCjV{;u|7tLb}J#~|Fj3J-&^#{ zVxcEk_-T&9&wM8Q(nVq)(M$N-#=p4yt3>?stI+dI>Z+_Af6* zd43jW2dj;^hw@d#KlhhlJzK?o=c%~2GF-&{?umHag;M;xjl}O37wtCf5BGa};hz^R z!@ql1lry3_%d79{SXE>BI+o1Gi+*`1cpFh3QxT6{D)x`AVqd&d#0Of5xWsmmCs0%L zV@FZ1nqs_P6870g#0?ILcCO!m+kdPz^LC=XO24^~ZzbYCc~<a2 zwry*Ii6*wKiOq?Pj%`frj??!Kto7l3UA?5 zP+IB$?Zqy7h+Ww4hmIA!4I$&IDf1Iv#=BGMdn@I+=jEJewD|cB;(xBly1$Wi4-mWV zP>l5?LK)^0W!`egdF6faSB+#I5(wWf@id~ezgOmAb1EKJ7+J5DqHk5gayz{xU%D&( zA0=_Q^$U*I6~!(Ni~X(_zY+a2xBnjxDLg>OK3QJsNY$jS+d}r0@1!oYUE04Y_oFh&esGcXM|fG;hu)QaVscrR z-FsO-n{Q4!^Qu+5q+2~_gWK59kr;m-$Ld;i_|@CNPXs-?6X!%-uqJW z!&y>S86$etMe0#$#2)L2-SeB4d~=}*a|EWbtSpKCXf1IzSoWby zWWC-h_T&E>9J^Ybf@$`8Gedhpc02$6p_5Vm-I!)~2xbV?( zPPaw+87TVDNAk~iA=uzwNE~d>;sK*%eV0q!tdGo3NzvQpqK5%rS#PbbW$%^L7Qd8O z{Otf4*Y}V-L7S!h4AEIWx3p7N{NXe48%HHSnIiSil@iCFh`n!?=Z5>h>+(wKW|yQ6 z^HB6QiRfDs$?LvHEHI>Q~g7aA<_>${v^{3-VS zkHnYZVn;nipPz|7WE1}oOY+HU(oTEvZId1YJ`WL%-deyhrJyGb5W@j1`K3+ZP?vD0qCe@i~rQuHCN_>-&B{}$r^3rM{F zDsi)!_?gs_FV&L#D!t4@=sP^m$7H=~hvB?;hWO!|;%8P#Jnb#@_R(^$?7Y-TmPh7( zE|PumGRcd!i~gS%zqD5L%I?#SPs#n{7)$1|H*nS6+TVY@nAZhpCHlOPg3X1A^n^uc}t$V?BB{r90`*1HS;sY#f~m! z@}+0L;1`vc4?%6nS}<+(9L|3{0xmlu8O zB6(@4E8Ndf`P_rVfi>)nE#f0YssbmQN?eJ zlX*)Y$j==md36hEr}iaoXS>{MS|fVZL-LlUvj2@Fb%vwjSF;FjDf_{@VyBJv^LV?T zXFfyxe`B$`6SBXEBD{pewIP!C9u`0FTGoA-jH`z1BjSAJd1xd1%DW<8M)LCvl5b=c z|DQ$lq@C=KN{F8PC-a$1;%NfOW9@g(tID{}%QIn z&z)k|CB>h-6~DAi?D2xMb4l|2$HEK9JfzFb<2o$&pLfVSHb_^m%Of-)L{xsJtU{_A*?0= zvt@llh~CZ={r^YmrEjFp7Bv}nXqV&(_hp`gWnG4eA8s%0gpvK)PMOaD(Ub3z50sQR zl0f3=Z}Hn_WPZ|%{dN|=Jz45n6=Z$C$^NCU|CI4w5b;Vd;IPUk8{rFPx z^O?n7ipV;C61yudJh?n~nE1C}qUU>Meo~0M&BGx%|9vF-Gez?Mr(&l`WnFs6Iu>Fx z3TP<(xg`GcpyUHvMBctHI#m2{SBX=PZ?Ybika>P0_4b*vuM8`3xwF)%@`;^>ll(2B ztjkdG=hda|R9f_*o#^>W$xk+j{5H|^JTk5{5*I>9T_t}CR>UjP&Q4k1r&5nyDDO2V zmi2uub`)LsXYPK$RgqsL`AGrsGw;M7?h*gFNa9Xf;nyY486&)k?3=<%JuRQ;TUpWD z%%cDA#Xra~bwDPG3ymZnyCrr#P1b9?UHZv7 z-jwgOY?OH@EPm{U_>JcBeV(%72g=HR@PpV(LeVSx9`aLZe}dRcMY(4_T=tu{WuFp8 z_Tvjg4@a?D1q6lUKa7y|IxF)(P2$T%;YnqE>x*6ulyTLTb_$Ar%PaPKAvMp#UWp@l z#a?nq9V4UU5A#I-qsq8S$-blsZXcng1HXd&#_AmHsReKd@Kq?yJmaMbXcB688_ux+j);cpO>ZV6mfB zqMv_A9u+KpIEUEd7m1JcWZtsKzW8BYw)a!A&+R6D^0oNwu;QE(d z=gdgX&kbT6@Lcx4gCxFO6ni&&EGGUZq}b66(f^HNM}eXb-Gwg{JsFyTCuobzXHluo z43YXTIOe!#EZ_tlZ)NWm2-rBXSp6yNZ$AP zDsj1jta}mRK~fhTEBlmcVvoJWu1`yz&{@W{=OE8Rj{VG+o?(9b9P=4cXE-SSwv*(s zu|)r0h@PL2=a#?B{hWA|`Osa=>mFhLRPL|Zdsz3_4FqhGagCJvK;m26pZ`g{&h9%k zxWnzN4P?GZ<}LCymOpiud3JejeYy7-M)djU1#bV#CFXggowPD@k+;!#t^HTw3mJ=96)~ko{Cl*%#!N_#6D2 z*QJ@nsmY?x$HZ@+mwna-iN9f`|7}E{+sS?>w#?5_sdJ8(`57q$GI zMbGX1(EeiYizHsxko|Jq)$EsM{L8$%`2RH$ufNFobv9YYv!b61?{I(G3(qL+JeK*{ zD0cm?E_C2npI z{r@5BxKGyQqvV;}#eTEMdL@wauLYtfgCwrimh;W2VyDIA{HuxBi`~;$CH6S-D(gdY z$wTsp-~Lnd!S)MDB<^gJyu!ZQHdg%h>We(C*J7ttWuH<)>~6LAjc;=QYKiFKB3Z|5 z;^)hV9krG7yVG)CE`r3hL&E=%{vVgRbau&ea>{z86#Z->`ngl`u3zFeHb@-#Px947 z!e>jJCs@|;ro{IqQfJG1g7tQYjCX?g2a9Wo#7|a}`Cl*gzFF!gVZg%sPC-YWT{PRV*S8!d< zD|3k6o|N(S6#w~7^k$lD|EZ`v$|s-s=e; z@PqwQCy6_$B@f9h?b!E_BglN(cSt6P-}@!=*unmb_oqK3eXj)V28+-dE;fs`$^tvR=0&|8F4upC{+$ zfigeA;y0d29+F!8#xt?^!D5dEMc)EsfBkwZ+hfB6%-0`d9$VT^CGjz>_^Uyp|6@eY zGs`^3lzF}@c4xoq5g_rji|E5`@rQ@SFYS@@tkja{JP^A$BKwGOUwFOxiywF@^EOiA z!U&1i=j6U(D#@RFi~SClea8?vA5SUmypwrrEPgwr#ILOX%=9+*-5%udMj>NlT;tz94zSLCqS^dSn&WT?26+TYv_iyo6F=Sl!yPthT-&V@HXOe!- zmVH)CvEN1FH-h)`I=(!>{JHq^qmt(YNgcrM6W$g*TqpV;TK2i+WL$&APAiE1G#34@ zBlCP%*0;Lwl%mhwWFAgPoT_+>*Q<=I*Smu(Usu-szT_eGr9UC1?(yk6KlcyWzuW!H z@ltnPE$3FPL_g2Veqn^fyR>4brzMV;mHTpGBtMBG`=kCcUi+QCtx_laBK_R%&Kl9H3F6;o z-{Jnhl=Ye}@oTHtMGBeE?b6T9;&01K9GoTn87<>#D)XF4^s2h`U+gZo=t*hOlOw{@ ziN8H3{=A*UK|7zVC;rynAGs{&o@qp{LW@6)CF>qd$WBJrZR=;s^p=W``4zYXGb8S{;K zSh*)$P3q_CrJY_9XTM1t86f%F6q(Of;ty|&{dSQ3^<3G1g_85!y;4`)EBmrFl7Fs{ zbFt*2Z}+90!eTGW#s3_XyzaTw!NN)XA(Wgq+54n(#lF%=Tqq}b{$$agm!c>2#qQQg z{_|1%XB_dL(LS;r)si^1P4<1Sr2QL0^*l)NFF;& z?DWiMZvU{He+9^S&2@=8)jx6jJEfoYeS_*3xSd=3na`1V8!7YFTl{tbc`x#>R9qn2 zD)+K}$+<~GZYCguA{#+8jS6}L@$t1tM zCI0p=sXMJd!1M6WO6LEqW4=k+*(1-*B7X9b{*yz@xBkogrHrf0JeD8wH}gZHZ-r(4 z+pgz!>aStGN&3G{?C7)P0|O-g>9K>K8)5_V3)25n%UM3hD(07$F;BUb`I}?R8|-BM zT;_kZ!mHhm!?BmJ_e{$fYdq%QPS@}FSYhmMf=eq8+IAgQNSm3rxU zdGDiy?59FXJN7-^q+&0-#9zgd@y3%l^;6>DZQ1YG`vpgXS>JlfJY1GKsw0hm4%afTJT41|AW}khgU3LcPsPngPEW1#=Nxb2miUl@;4+dOcno@ z>I1iPK>YSysV8?6|FBs0Yu^s?b32NjM_I}8$@egidYbuh$^UnWpZP5Dan(L(33$?e|ze$bI-~ z5>MyIyj79@9F@9O52=To5dYsn>K;|4jvD7B&x3sjexvyLE@Ib-WWAP2eKNJ^Rb#2o zY@fyb&$*lVP}xTe5_?Q5c}_Ih=Vp_9ESKbO5yY;;OTDFv*!2g||J+gsNF#oxy6nF; z|KRy7BhP&&@iBz>^C|DR{esfZM-N$kxa`Msik)tfby+L>LamOL(-CU9PAXbaM-$XVA=BhswX5j4-BU^<{Tw5HAgip`UdcZfiXYf1di!10@ek3fwNj5Y`#O7r z=h@D8>WJT7e3jc-BzaUL$-_TB<8~s;`?guc|1^@g6aFW+e^BB=`~xiid=c}z8=1e~ z!~CGc>#gTm{;-TIhRjbbna?j$_n3H$pLXnjH}Tm;PJ*GlA^mib~#+Nb-Yv3@Yo(oKGS9E1K7a2AuS-7J*IX4nulJJM$tC;TdQw+;C;ER+<|kPE`FWYQ zCt{EGzFv9R_brwA%r1VitN4v+;@^5ooP8?$@n2#`twm32i+oF|Z>*B>_L01_-e=Z_ z-r{Foi5-Q#&F%D;JZ-#;D_HWYgyJ{qNF3ZJ^_=R`PN*;3{|Yh>EoJ}pOX@aDWS(ow zdB7LCmiblD^C&WJEhS%l zEB4!2^vZs3!ruE!B6`wF?os?m%JcJ3>JphmKU;|(TQ2@Ks^n>PW!~(5`)fHjEH3-X zVp8wwBz2^ZQl}~^eyO6^#b?P+zDgcmNA_7u%+E_bHr_a zPOC`0t7;IpZ@(uJPxd1*B(4pW{)`p-`dj89k<<-3ZsYzx7yocu@|Hr<{|&MqIrNjC zdqVtPZOQ+~268*urB0qs{7hllr`YfK>=M6yQ0!&A*h_WcmBlX3iXYx8_EJm6Ra(}! zqO_kt=D)M}y}6Q)B^LkIL-wJ6Oa3rR{B|>WZXvN>yPy9=##xFAKz8zDfVni(Wkv z|F-u#_cNxX>(*Ix5{vEOR!!q6>;tvywpIIe&_)f{g zi;4Uav9IRx`(n-Iy9aB8fBD7h-c#&%faqZz8P`+cp(SpXk~mv2nERPd^09%k&q^fs z8Oo>Tedr;%cl28Fz3Jiya)}>{E_xMD{PS~ZKS=aptlTRIEBnp2a?iG(yl;|Q?g{)S z&wVcSqLAX3mWZ7e7yYR$`|c5}Z9o*Hh8w1G3KzCF6=C{y)F$ zg9ZtYEqVAfvERxPr|wIGSIp{%>vg}pb|Mf}xU zx&QM;{6O$^?&tht%wvjOY?O7MF7`4^^f`gtrz*(m5Rgjh+t0+VhfChFM)JmqqCZI` zulp?eP(a$5ApYO#s87V-K9xFBIXRCTB>J34>RLZUf8xq|Z4f`7T+Z(ni+`9Q>zhE< zYp&S!eu)=1W#6~|GV6Z|@iR8A6!LrPFU9W_ll*Fi7bmC>=!+GEaSZ({ck1yHipbk28o-&l5bB)!H%he%v)dKRpmYLYcfA= zWq&kC;&MsJtD8vP(n#XSTH!%5uIEx04HiFEJvq;356Qy|%DD2$xTKo_31oklO8n|z z(W@Wwp7k%W_ZJc$--w>4l>wxe`p;GI!#!nPs)_xUkoYxQ;^{Vt@BPG%qT0Sy_8mPX z{~0a&h(qE}=88Til=HX<5~s3>9`={|XJU!_ms$M-28#ZF$jtwcLH7FzWnW)T)}@Qg z!xYH}rrzfG(nIX)ADM@t!Yhc~#SlLkI}OiI)KtumNpkyI6Q;vEQr0Ur9e(O5U|yXcn`PY(H%#eM}K&h85khpV6v{J?pM%d13h6G?v6Ui5aWtos!4 z+ZiwLc$>?9Gm+#`n`QpH%5!JSI+m8Y>nYi%*n2KnW!^4`U$Wn&eI zlKsUY;qzr*c~$Bg{iQyiPPl#dqoPdER>^yBN&BaSZ zm3@=_{_p?9?+p~Y$SeDuy`tw6B;Ok$bt-#qDapG| zOFU{Ve%pR`^-r;jVzQ2VWqxW)o{&cJ`EQaRzLNN|PxNz<*j-`SzdRLvt0m)YDDxRb z=HZ0!_fl_cE&d^)FZ|P?a(c3zrx7)a`p@^_@J`%(N!O0kz$Vi)Bljyw~4-z0i? zM)bC51|C<7Y|PV$Kba}xS}pNzx5SIz62F>?UM-b%SuX2aTzE^Vm*x;XUoG>WLE`2T ziEANceG7>`Z;*NJEB&b?{<--TH#>;6^NE2qfc5MEj4ZHe@Mqxk2qGC$iT zzW*ily1k-5fzqGw(x0?qr}t$aw@m6GF~m-P%X0%H&si?#TqkAzv&eI^%DlanyrQt2 zci)x$<}sNc(}yr3zenaXK>SI}q->9EWF8u^c)%&ycZ`sJ7M1!#PO00Ml{!Nr$$w4> zeE(XHliNH$;pIFuy~K-CqPKIcpQ6uKq<%hC+W9H%G!{La zc8|wvzb{Z(^dzm=MNjen_Fi@-(Vr*6)5!W>lJ&hD$m9KTiTN(^8wbQ6W*7O3qW`63 zT+QVCw2ate?`z!uYhtGZgxh<#|4DzEOWfHne#!3150Jd&nE0zfGTvY3c^>lIV*Xq7 zKf3T5qW|{$N_}L03X6W;yvqHYeVKVH@k?o?oki!kofcvjgJrz-UaEa}_nYX$vWwiG zLb8s#gjW=OI3e?}U)rfF^L+9G_p_|z4^QN|on=1%6#x9M*y+DA-a}`&pKWE`14Yko zh<^Spyu9$T;;({b9_;&jn1QIDH~T$4 z`)>SVske*~{S21=7m@naAlYvQiF_K__x+Up>?Dz|De|XeU53eiFi7f_$>dz`g`9(g z6g{#1<`P-om9j3^#1GrPva#58FWJWxl{)ZjIfrd1=Q2N~?tN71irZuzU&#JqmE@)W z2{-+pF8UBGe(9s!OKF>m6>gH8-^G@BOO~A5887F~y~Q7<6@L=_EBm+C(oRIFhXj^i~ZW~+S_|l#ii~&BLnwyb|&VRvoMb&=c@fh zuOdqODMa7w-bF~!!yz)C_B*P7Nq?@%`FL76|N0^Q-zoYqt0d27-5kvK7G)l*BJ%@1 zna>H!hLoZ*^LTH#osbQM=VyLq1oM_Jn5WId{Rv+~cxmQU@-u&%kNICEnIEpe{CsBS zmE{0n*H<2I{CCVJJ!GCM3_tg#%tPdsEdRR!^Kt2!cZSUE)F_@t^Gra{JM0GY>EREg&b$7fQ~&ujJ1GQn$&zgY%Fd$C!7Od?uIdQx;$1 zb{21CerN^rfFsPUKGSPI%eR`!ymU3@HHtFdSe*Hw2F#oGVm`hb^XC6!ek~L8p@o>= zti^mn9p*c8F>e)xd6NL<$v*x@1-<`{dH>Md&gJOLe`IF9w*d20IhoJO#yny|<~@=y zpBaYvuCF}a{4(BaX}F!WC7EB8^;(*e<;%*vMXt>9JzFyWb13tkgPFIf&ir~Y=7nl7 z-#eUn^oh)ijA7ns0`r@~i_T{Gg&UYBeabxKYv%XPGOr_kGV3OmPiTHp>i;dIzR^qS zMVY1Em`&;-l_VbZOp5Ly;Eu$#QnJrFBm0_A5|`UbUFddr?$1wo?vFeyUq|kj{wl=s zajG%j(SrG#Cd~WDKBaFBmY-LJ`J$T4FSKUfwjJ|UO_^sD`OpJdKId@ecVwS6ViwD{ zo6bDbROVI3FwZcA`K}qv53XWfbpi8;Lz%zs!aR?RE1Ts1uaa9fyOH_mmCW4mj9BQ zd2HE-Rw%{txn!QxS7Q0}($0N}JJ%)N9gofJ$Be{0gzy7$9`Q@+%uggPe~|h7E^*WL zznPM8|654^`$c5=#S-`b2*L8-<(%SOSeCc%*PWH;?vZvXN&lnBebF0|=PZ$XM>%hD zKG{Xi#U#80w2(SLc)5QSN6yWMiTpXqW7Em~kY0g2uA%bWrjobMxzFv~koz77uCROw zxo;3r^6CU~Pa}fVZ8l5YBc=2+P}V)6+{fsAna5RJ^kl|ImOm)>#5TxyOGy7?%l(|= zGCyitug%i_0TvHf8kPUhEei7=l6Q@jI=~fqFLhZ=Za;i#<}H&k zPm_-M=3LB|$vNqrxGY~P8S{8@PJLU(8%6lVl-&MT$$PIze-cSvmrB;9X%2qwT$#^- z;aEPZ=;t-j&u?+KojTE($B}y16N$h5#D4#k`x`GLPg}~}2{`we?fNfyZcC}N6%c9{QVI z+@EZRnSYV~f0VpEro@H!k|!rV#?Otloq4eIbEK?eWznlXq7QdY^K-WeA0v5wO36#h zN5C6^Qeun=`_-f|$B@aI#dDr^o+|KWL%xf)WUT-b)+0y>I=`3Gy0`n_9 zneS`B{JijDU0D9sNahRsF(1~5d7WC!e^z3CrZV%E(oX-{EN|z($(peIf71U8by)tg zoQo|g!}3XsF#n?@^Hn97pOXH(ll5Ith10zon1xHq2YgJa3e7#gqPj zD$niT>&E>0Smt^9Gk?^adFEEkXAEUNWEAs6eVM;(#{7=h%Rrg8${o0!WwO50WPR)X z$?en`&Afrke+;qTWumtkq@6~+`MDdVoz?YN{?B&I!-+rq(3$09i$DA<^HWmd*MWiD z{&mr-kD@={#lO{+@g|bzei8rQTI?l3TkiiR(YK0X7oQ~FwVliDFJ8zz$1>)iO9`Gi2`Yj-nGCG&jxGRwb^edUC^EFVMWr_@81 zPa<{i9`{(jqKtRE)O&v)=XMrK-SViklUe%z>KV7c@;>vH!sAIlyU6)PJZWdM=*dFS zt6T@TpG9P!So<2wSC+a&lP@gaO8WUr>|)kVZYQnGTi{8S?s9^`KlhM4ceCh2u=uyh z+qnJF;{V4;Kf{WjEGc#oU+NnNMSoU{-OZEvOfP!%Tl6`E%-cHYXK|VTo)Q;^iGL3D ziRXWVThvf6uYr_~4MWu-o5@6BzM^N2BW{(f5Ow|CNV0r#oA_Y_=#7@@bE8LzV3g_w|-~-=@au6A^yNW%!tW+a~$Slk}adG3&vEMG@>%{eR|V?Oh( zihs$J90bi+cS^ffO)F&%-hR-iB59Qp|<3KYkqTHx$GqQhaE&HQnQr`?6c^Axq1->AcUV0q@%^DtkT zmHCv!%!>$L7m?+&L|`5^9P^gpndkfc3-$K#Bj#&PFrU1IdCEP^Lu_ZBa4qv#^O@hB z#Jt*Y=C?aAPtl(FIN_P=v3$Hd%yYzHzBB~$%3prsxH=6zc;PhOpQ`RvTIgkc^pD)U{jm@kgQyg~xzS5h#KQjYn@`ph%*V}4E6 z@xca`@3)kByqU}kNIQR=VEME^nMX*-dLCSfdAt71<1J#I{66zGk=ZXD$jE$pDdyQa zGJiXm`Kcw$M_puIJORhG2@=OU_htD6tC@$n#r&z{Z!N=cewZv3^F8I5H|xy&_bBFr zSG`f5z6bLN-&*lejUOdG9AI8Jka?f4%!>u^i0 ze|BU(X)N=t^23~8ce8xhUCdt|V?O2z^ZhTF_xiy+T=bBraNSZfPnU~%-{Q>MRb>9I z2J>sRm_Mk){9{$-;Y%{FR*?Cc0?acNW1g}+^Ae?*Pb$j%L0abLA~Fwn%j*UsajEEW~_Pdgg25GhZ2wc{cfAbh&-(2QH3a-l`_^lbM;<4$Zvib2OKL zWBZt2Tg-gVpUgXVU|yyH^L{0n&yx42PW|L~x?Jw3{gnF;8y0grai=r?-$>@ir5;$I zHOn86d$|Y8vwYmr%n#;eo+dr>AgR~A4af5N|6u+?zUy^GV>y&G}?wsULp)!Sa_rF#lJ0w&yHgPuf2z{cIC~$J;n2^Y!tVZ;Z?QP(-3Lp1_<)=pC=l&I$d8zo!vxR2<$4`FlKp9uyN0#64mifzD%>OygJjyoa30E=C zvyyrB1M(y&o%y@c%zx))J}epY>k*k>{lI=8?>*+@ zuQLCBlzGH`%lcK-dv`@tMvnD2SZeAOG~Kc6vw z@QC>>*`Kz3$ns6@GJkl3dAz;M8*XRbelhbnPn17ag8kIlt zIq9Nn%unoO9&Qrznr)cxlY0?i60>}wH++u#W-ar^&6o#fW`6uDzc>-{Ec47GnYYi) zJbV=9gRb#~-Lear$1TG=^{cNK*dqMJ{AN_e~uJj{%ZnXuzr_-d4lKsLQc&PEdP5D^YMMSKXVrF zxc)bX*F9~1)~k?1nU`I}Jj)Q~$rCWYKa=}2I5+dN^_e#d!|jif3-QA~vpu#>#QrBJ zG5ghXXPA$V%<*M^c;?~d-ec~M-2R~p%=_G8zB3a)x2@y}!=>&Tc$)LB7=_Rc1U#6* z{J;Io({EyaXgc%YzRahLXC7A0<3h>%R;!-z{%Cm`-mir(!@OM$=0U}opOXDxkkm_S zUEzNI+|PXJCFaj_aDOr$XMU37P*Jiuug= z%!jvQp5q|%KeBKguihHw-xBeQ$1y50Ki8P~*WS$QjbvVPF!Q;+nD3v>{N-NepB^wj z9Fspp{;?GElwFvoZ^^tz1?Fv{G4H*R`+|8?Y}a+AE_YGxhr|ob{^aW!_Dg3UGCvuY+sPt+xMu;DUmTM8 zGjpK6MILwR7ebHT)IPSNXJfvWCZojF#xAIJQg+koUdf690 zY|8ztD);=;PT_p4Sw-frt1_?Jk$HpN%;*2X{hXGG`P_=kvt?yo=Nmuw{bJ^sYB0|! z?-3MC%ku5(Gmp2N`G(Nk|7o?Df1JwvuLI0GE@%El-cN}Uh2_I+;QpU&&OBE!=6f3n zU&%a1RPIk|d5t$b9n}=F59AUz&>f_G8@tja``slw|%U2lMgr{>#4;SpLOv z=9NX?wk6?lm5a~3skHO`2|su0VdnSOF^{)}dAD24yC>v+mT1NN_h#mUUNfH?mHlu& zdH-&(#Fvm#7ri3wN6yF3O*WkQNvW$>k$XFBhu0?{A%W(WZ#!m?$3vR#qDIh z#QgDY=9A7cPsHV)fb6w7ueg1P`3u>v9a+x#OuRSD!)NBau4QiK(^E1(`<>e#eujDa z{miS$`E1WSET1(d_vhbw%xA1-{_ZgIlAD;i20aj55@fJ zEACID56pLm;C5CeXMQj@^IWBw_Y}TY#uYjqw{zq@_doq^=DCM3uiTk=p|;F_j%6Nl z9P`4%nICAzJVR0D`O`2DC;nvfHn!jH?U={U$-ML*%-cNUI8yc`^NbRY`YvSomhzt0 z($OqmZ3y#+1DStp&HQB*<^!`be;1zl_}83o#5=W{I^=nn^j;wuNw2^^O(PT!Mv!Po4oqO^0&`3-!q$ePq{C*EkDa2mizMs!m<1f zxi2^8f$SsX-u~NrEdT2xbNMVyz#cwU4fyLAw{vqA^US@Omu${FzPtzVI0?(=C9jq6AQH!)u>-zj=Li{*0)-!YcuOUm~&?xke;iWj-g z7Jo4Fl7*SKO2E9(OTH&|Z8P&4otO{J!@PWC<{w`2y_8vdnNR4$d|G1WZ~kS6p1KF~ zZ-tqck^4M3pYi>iE|Zv#Pse=X1-`#jyC?JQX_$9C!uO*N)neZN9pAHhHHvxsRLpa& z;{xB9tjrJZ=D_^2Ec3RBnKx_AeD8baeOhsUf(A1`QkVIS63j2uWL~U1^X=!kpAlue zarScoH^n*Tzhpl1=jHyi?#b)>`4a2Tg)pqor+zTsI*skCaCElc`%Red$i@8418#rC zO6J$nb36T#vcHNNi~VOkxmVop8T<3062~X^&g44y|Qy1qtz?s?T>Q3Wm#3OM`c>Z{M}*Z%R_NO{A)P#XL2uS zXit{EFo~agQr<)SZz7L(&Kc$<3UT|BM=~$8mU-Q4%(v&@aXlHveDyNs=f^VtRGRq_ z`C;!@tGJ)L<};7_g89~Z{M?R{nZNp*dGeLaM?PeJF(hyB4jyLt_MMsM%E^3FX6Egx zF#pz_`TT**6K!CAItGs`e{JTg+c3Wpiuso*{M>nQn4kWe*S)*EXB~S9+gAd)&sp*Y z`>W>dnQtk2iqUbxsk+mm^mPRtVxWWI6(^FhJPH<#vqKIzE3N-yS(M>D@Nn|a#F%*SemHF;D%(q@-UN{x&^Z(?1x0h#Ge#ax``{dqZ)m&`X z%~mmAl!pDrNcn#F@YyVXb`JAF6Pd64oB7a1%+tzu+Kawq`N;C!r)%F?zHw6at5wG^ zZx)XI^TU?R+e~I&dn)tIBbfJ)->1k_ljX~#XC5;G^Q9b?1GXh(`4<0Uesw$ZuO&I& z?T~xgp>m~Xho{8&oPd)o|S zes(?cQ!|;jXu$kS8s>SkF`r$J`S@DQ3&v-@R`y5d&hq?RI>vm`2<8Flm=C_mdf25a z^USfC$CB>_#cIzE>tX}ui5oJXDLi~NmamqBd7Q+|AO6R7J$(uDmo1q04adCU3idO< z3Nml@i2d;Algu;SVtykjw|}}E^N8}jwU)(L{=dr1E01UXdn@x(8<|Jyz&un0=0&#g zJk(yo{OeBUS*|m0_>%e0x6IQBZy@&;zGmieCGW!gliWwj+@0lLqr%#&Ybe)ApkYw|m%cjP-!kuGsN=c4ks%JyJh=?e34 zv02ZlgZuL& zKJ$E%ZxoPy*6~Zc?qwD+Khur*jr`1?%lo#8udzKA-od=!3g(UaGS49Q_s+}j6t|Z5 zfU?Q&aoju3erc!pv820Me%o^99fmUB-el@on^BysohnMe+ z{g&Sw+PaAAhu>#1&m+G>cc>G~XKl`WehucW<#**4MP~Vf@_yyTxm;h3Uy%9odtC30 zEx(`DRDO@FUmb2|S6b#9Zg3qt>{R9*yE0Eyk9oBc%*TD_fiq z)MqgB2%(tw?9ca|dWU9SzV~}{^mTr5g5Gu<^D4n_v7Nc=m}mTp`Q#bQ`+sL1YB2XF z%LnFtit~79)Mb9Z5%W-enTH#}yg@JKEjlwFu!Q-PF1(KW$FV+iIK}$brX}n7vv+Jq zS?jXB@0!kjrf+-pd$Z*GjgREKID!0L=bQ)}7iKSDp0pLm&0O-ka&pWbP%shav8S7J zz8yH3>xXgVyHAf7bKSN2E9NPGGH)ey>Eg+_o*WdNdB3R4E6Q_MglGAK<(ZG3&wNsP zK9DQCi20i!=8t29N59nJG0O++WS)H?^OH@OulkS2b)+ow8*_OblZ|Iy_6hUW1-bp* z3z;u`z`}4_Cuj?^_>j`;Ip_>WFm5h1Pxx62Y*^K!r`M!FheH_;= zL}I>CzLT>y7w?ZYm*qIVu_4F(ukATch%u7$`4d|>-^e5Haol^vc}taZ%xAx1J~s?M zw@eVr4?fMj`V{7Ot25ski}}h^ypL!!g!#f&%+t#Efq$J~`K3j;KkpAQZ`PLQZHBz> zaAG>IdzcukCtsT|PrZxzo}bK%)?xj;`Y-dcNm$R%OC4Z+3bvQ{dzfEn$$4qZ=ge2h z?>l$d$aY=(GxKoryKlMW_nNE9@3r+B#eV7XDdwvavEOUhnEB})%;$z@e|s<|^INT$ zSFFN3M*`*(c>5Kw@hJE6e_NR!m-Dh>*I54NAKagA4Vf2M%lu9%j%#UVGe7v6dF$WI zlgRG^M|{BY(d2tg?}V?D^OVqX-VrSKz>~>$a`KPjeOc7>oL5x2%e;@g=W_5R=Pi}8 za9;F8^0(tvSU!4v=ArvDPc)ACo)OGcTuiIXaAXO68q=J@tD5~#IU?Z)!m#xQ@m zi1~0C*XsDZ?)~LHPrZIDe`PQ8!6<`bm-rW08{M1SUmn9$s5P@Wcki=522yl&x|1V z=#s`^KQ=uE^ETm_cb9uU?-HUoE@nPMeg`wUYvujoRQ)-Bcr5quyDwn* z_41zbe^pt&XE^4Ew(+>~4Q9TfI`dkIn2-3%^Z!$RzhKoNmJcECUrbrg@|mYIpHYK( z+33uh9b&sE)Q|a|{LDjrV|(0llKJy#%+s`Bepl`{#)!r8&BHKHdXN3*U5TeV<@Qa5;1h~=9#V1B(1^WG9Sm&iS|HhH<70dl`rK93y`UpF)V zV=VJceVNam!hF<1=0lb+@4J(EwC&8tN?oP>36_u3ocS90z1I%QI6rSJ_s25EXZfV^ zU9X+;{^PtAT*oUb-vRqMljVnre7Nx}f2j}icSV?Y3F5kC&4bLB4Pzc$n0csV%=`Z2 z`fBm-%#+La|BEH%_Or=%#xAB{`Mq*)?TGwNL6g|r&d+endq{thmSFi6`I#rq$$WbT z=JDz-|_P%1>6xr+DWi)ZtB$N5WqZc^be-=kZefRV$?^sMVg9>2^NACfmzu@>oVA6=wJm_>Vd)H(PyCMC&$FHR4m1=gSa1DJnK$n6~J$Im_WAM;YdYU+W4?Ad_p_yZF#VT&H*b1k_A~A8v%i`v_X?WI z?{b!wdQMCZvjH#8v!Ac@jCrBg%+uv&enY-b9(ybAi#MO+IJIFq?+c3l;CPpAI>*Ph z^1JN~u5z56mWz4lVI0S!gS)6bN;zgzCV-yCCkUX#k|ox;Uk!z?#ui|5$2DBcmXcl zVjd{pTgZQt+n*!9>-VH0=iw(GGe2C1zIcQ z$7akZ28 zZhoy|`5j-GFR#e`iMN3H_vOq#4QC!EE%S{%xIZT)|NlLR^AzKqK`0mF;2f9@>zs9&Apc(f}c^IYdS-kll3yg?b} z1Lb$j@5}GAuiU}ybO~lYCl>d=U^wP`9&tMjRx{5hzavv$cpLfMfp5LJKQj|?+^>3? zd53Yl?j7WNP)Gh@y^4H}`IUc}50dYdb(ecno11bwq2%0r;%%1SG>YvmdBQ zt@kwMq2zsm8edrcY;?|-u9spSM!w6M@;%FssK#-8<9_BLGjcuWCbGZU(v^9->ddF4V?OEw$D^L>na9b-eC|q)*Y!#< zm+Q0v|2^e=;L<(jncp!FotdAzr8Dzbo0va*$~;6wo`;;NnMX~>e24Iaaz8Cg8E&V8 z+`C&M_t;~~_uq=he!qy^m;Nc=Z+uyR^{s7U=3PJXxGKwccSp`-`JuAExKmZ+^E2<6 zo_U_g%;&yfJ(+u%`SbnEL(OJBpc3;aPgwtJjc0yVzN@w+6wCj<%=!G#<;)lV!+gkj z<~8KGN9A`*gXEmL=5+4=-5Ja)bYk8k5A$rLm_Lzzmaf6_RogKyIh^^4JIw3mV10NY zbCcjCEMF%J^X_q(M~coo`zxNelWUka8pb?V8Rj2@ zSfAUkX5K$1^B&uHKOQXi{X(DPy8SS@kGHuc%MbX<=K>+SFu(Yl&lhGMWByjoDI&e# z^NxQSGGF+b&sh$&V*cNEKF66in0d4e%opTjey%w4mg$&(+{5QkTbnSCU6pyRxXfD& z=JT&r3;4XO_bWbM3q6_nn^DZ;S7Scn(+4!j5)oOxNg&J5$;v$33%-x{zqQQA$^E_G zAy|H8M!s)$Fg_oghg-(?<>KvS-Y+z_Q(`^K|8-=K<@V!m;Q8!Qn8#HicSP(@^)##xCGN8R z%>K>wpOFih4^GGJENIJhv#TArKfT&9UwDk$$@`w4J6L{Ks6$h(NA>%`b{EKM7|*<5#-39PbA7 z~ZS znCsCwKlxJV70O>s#JogeZYO*+?oYL0-2c-{cpfs;=J|{nh4tjM{C?}ei>z-E!*PBR z<15QIO3m`CRx$5TQQ%vB~oL=D|PM|G&S^ab$F5j*pY# zv!hR3i207p%qy2>-nj|$pxVq&6=dGDCG#-ZI4?SqiSvZ)Tbak0#XL(2<{=jFbJxG) ze$Kec^S^L3zmJf$JFjEl8qNnACt^P05bH_v%gm4D;C8mvVgB$cw^M30=S%CcA@-2cJZc)Uk;FrQO_`QW77{)m;F z=WLgAw*j{~A1Jtt{nfp@oDW=n$$alwZs$rup8xssJ8|3P+-IYlW2TSB^N?^IKX>&k z?q^_k_UBKUb6l7?m-pkPBXeA98iMO`!w++O9Fd;oYu{$xtr0(WaBt?j<$im(soehL z4&2X-KRNC%IKlZ(lW5GN+~B<8Kmf~6oyYw5YVObeSls{89eKQAy7Ig|$jR$IdLQ$f zsW=b0-H-W*u&i&nLvtQ7S$+?Fl>DC2n_6raO-isGW$(!T=fWiR^95x8`%B(uocNyO z;N$@uPa{6&_&a$W$LsCCncwOd6(?eSUapf|X~}ho4G&{rJF%L@LLRDVY~=0VGcVCF z4$D_&zI6+?bKp4lXVZk3*#5^eJlN!~aqNF~ z)nh(<0P}ILnBN}B&+VIx`~RohgSvg4<&WHCUPAnQk(Df;s0H)=xtT|6$~@0Z=1adY zPd|Xyw_Mc$iBFYgzZ>%jdSot=643q0NmgPF(d!#vhv z<|kG$&pL?zP60dy?<6^Sa-A!*)|!?*xvU!u7NqgP3pV%lz{k=Cz+Q@0y6mwKxRx z_&vCtYV*0?@>{+KI4%>{ZGPtAI?tieTrY}Hj(N}@%qz_0I@Owt%#$qPde_UC%=h;D zjE0vekk3Pt7h^tEepk0|6|Uo5NzC=YA&vRoUD~kBb8dNy{f}0W`O%$kP`=OY*T@f+ zW}YPv^9Z$=H%Z7mY4cb3+$S^m{@c&O%!d?UKJD5IY(M&7=26Enuau2>)_c#f{d{#; z{$v#HXQyh+&&OrnDl+qi1DW3)$9(c0=JogTy8J00Ji1YU*Z0I`=GVrs9{%jXdYddA z>wnhjY)2tOv7MGH!hWM)d-iXoLvwt&l92O_Vl6nI@AN0{BN~_F{Yc54ynk7~jd^jo zH@HXcQ*9f}`>Ay$xUTrKL^Ra%*yp+Knsk0Vlz-Wo56m_UN{sSjJ|;old1X@Med@A& z;Z*$GBB$eGJH-z1xcW}uLfh>VTu&YrndLj*Xa06M*Q-b7;{Htk%zS<%u9FvU!|jI; zK7CNj>?P1%oE3CntZv?JR~Nx5GaU%n$fDnI8lTQt^BBjSOUIelpU&+x>CVqBbd`Cf^UMdfVIJue zKeuKi=98my|M$xK2>lCjeE)fh^MQKbnU@a1@%_|4+@D)}dAz+!@VZ|-!us>i6}FcO zo!P!Z9pd;t?;G1`%uj6BC6BQmnDT`ENy{{7UI7QDvp?*%gY$=V_MJ~TcV3l&{r1lM z(Xd0;w{tw2vX$e@gZz9xd!;7F(^kirZ)(E4(FAV)>(toT|2IFlpBry5&nfY7Pd9FV z;(6w!KQSM-oB3Zwng6d9_p^6EOdM~jPrQy7<-Liqn)`2o=5CQQKmdpG6*+qnI} z1>B$ScX^(ph2{B)d5Gh0te31;)B3P}o|?!!-eBgxMlt^>zuW%#HQR5v$!zaW4|5!! zF^J>!f!XZ$QZHfuIjCd=w3qYgdEb4q6UXtE@uOfnZ+kNzc8mGt7E!UCpi~@R;)mdU zZtoAwYklUtqUbY@Ye~j(9Be(CdH9IT`+VZ(9-7MiT%DcATjDFv+x+jmE)g;^zuAk| zcZJ-aZylfGbch&%3W=VtxKMHpk@}`B8lWy6s^*dbXeQ=hpK3 zP(50+{HEi~<5c43#yrV9?_fSJTQrNub!IdBfobv`;BJRlzWV`gf4Y3HCj2?>f8Ec_ zXPx13{dt|AyZ1cz^W-&N_dn&HOh94I4;SWReVf&l`GEf1&PLfEm6dbqPaMVr(yr%u zXn&S@)%(n6jbr}qJJ0`o`EE~OW|rUgmDl&Oyf1l1eqV3h3AUG!6PQ0g#Qa<{?oVUs ze`t0~0hO2Yyh-x`QRTgl!oyf^v%F;f=PK6cN1J#*()}F!!~dON{cOII^?BEC&Ij@h z;|UrSp8fydbvTY(Ov!PlK>_CRZgV?dhcW*x@5cph<$jjD!*OcHX&!In3w*ATB0KZO zxtYJ7#=P(y=J}^HkFlB8Yt~p^-`6o%AL939y}BTAAz4|rivYRr`nv$zycs1zCQ;A?By$d(o+X^7_W>$NG@qCi5+FuX~&PE=IkN z+)kG>%x8~g-X{+8_40dvsgv_~gZJ~iy{N`~;dWjZ`Pt!snHkuB-jMe=_Q`iLFE?aA z-|QRbnQtaCe=EP^9C{DebFQ~%KCl?`4LO-VlHcL&@siJvTC8BcSiVnHxG>9aP00NJ z=sNGeoVzfN-<91EO{MH68HJ3f%%qeVl1*f0?-dC}Mnfp&p&}tGGD1dCLPAE76jGAP zD9=CezJ7h**Xz2^_nhl|&OYZzbLQ3knVTgt-|fWT>(Gqze`5jjM~k?8jf8X4p_<%| zKmW~sdL=R+E9^&YJA>0{b(_EU;1uR#g?l46xv_n1J?6#=_F zKF5vcOF#d|^S6y!@O*FQuRPyw--&rbPo7V{w~yza$F?X(q0#Tf^VlPjzM;LJuJcwtm`kna}4PLMLqQu<%HJ8_y z`dq#R_tfyaKF;F!X|$Zl!xD|!m|&Gw(e>+iz~Sr3!%G7o>qe4r!yw|UF_ z{6^-D_1S-k4)=eIGr9kBb_jE&aojFAd2xI6VL!Jo>%Ve47^Pr)yPwS8YIAy`?lb>g z!Cc>ozjxIO<_1GKKldguFV^F7DT-u%yBnA9y?E~Tj_%L#pQXz6+U+yzz)V#hH~pE( zN1KKF6_1;6yBXAgFTwO^2%Rtt7vl-kj3>n4k%bX3|PTBwE_O8)K=BhK< z&)E?E-_%8%{!xoLACjMOxetox_G?Txj;r~*nEy*>UfPD^_C^ZxVM2e{)06Az>`<=P zK{HTh6jgJ1zPEY1U!Q1lH~NDcqjUtz#aM%s>Hy|5C$s;r>e`r|?>qUs-ZkNT82^y-+3+!!i*+TJ zV_75Sm({r+^{N5KNtL<@5 z-9F3w!c*qIyRiT5E13taVqT+QepOTW-_P8R2jAy*dCe!*tE92ahje7FKAU;g2j=A= zoF3x|oPHw>*2%TwnR^NAQ`W+Igkm25@3?AC=itT6Z|XC5QfEGKCG*jyoSuMB%#GqW zA9RKF#F|zdS9*__kDkT#X!Bd<@xpnQ$t+8XFT(qbCBpj={>9wh%?;r3(|V;O&#mptR~Lih~U$(E_iXIik{HhaQ6E|hgU&x{IL6=NFBrNU`ZdYr~AipecykY+m~6wK7=nV*nXY{bM@}b8;)n5zLo#ZKQk}v$@%%_5c5^qTrLxZ{fE-M?$N?~tbxNh9-M`J`>*5J zKJ^0gd&0eQb_N`uT8Eimvg3Z;b73D^{xY6F48O!Y>@V}_y}8~E-@|-VHuG=7J&Hxb z`IMa#SO<1wFke55_2jS_>r(q1=4mTf_nHdrV2iWdJ}x$3z5OYi&poZl_C=4_|K$MY z4Q4S9n8SS6Oy(o|G2g1jJopvoTV5#h?=6`ZOy_c`*vjRrdXVE`<};4N+@Z|lQaS!7 zYcMad<@%WB&GolS2J6GTVa)r#V%@trm$}t5*3U76nHT1>J}1R7_l#nml*If_IrB#S zIXzaweJtnSvwc59&WFXq{ea^)>S<9!@C^=y3cu7wpr6*uQlP=F@UGf0_&TwZ3E-P|Px6|HcB3DCYnD zcZhlBGUob|nRhm29($VO=YjCP_S!q1W&TQ-SKqvd=i85uX6`zT=j}7@ z@_Nd^FkTn%FXnZP!AZ<*ZP?F2;r$xR)@=WJ9{YFb!aUlHdA;g#tiV=_nICmw;j5oq zihiCi{EED(@Lsc>F57QbVctCA3;Lftkh#+^=C}W2zPOZmToX>u-F&uhb%6OtVPET1 z%g^{-*1ebyvSV(i&HT;-<^z`VcXj#3<@?#;8>UllCiA|>IDSkzb9~+v_KgI7;(FSA zCfE1qWY(YYomdY~3G?43RG= z*GIlY$cOJn&Cq_-bv5MM4|AM!ILdLAFZ7GLoZwiFfPEX`d zw*Rw@`6=Pv<8c$&KEZ@}!^fQdn77QY?qNS0_w#qXZqDUWX~pF@;t(_|=L@WpN?J`&fC3uwI?e|RO|&oY=63e) z0bR6TsL$=xAx8tWzuA&`x(oXmG=kfm7ulSit@+#^ux-NM)xfP8rt{f1?uSfJXMXpq z2Kw1<#P+|{n2(>sejIGM9Qy=tAdYRq^SXsid7g8&aQ}d+Gq+#6mAJlSZQ$|ma(Awe zb2XSJm^0UmWZqyD|8G_{^Z6f{d!1!&-+}p2Vf=ot3%5sYd$3+*E#r3Zc?s*@kax@@ z=CPlt1NeVWD{(sOc`#o*hWY+~?BAysb0=F)r>_Tp*YHdp*X-EHeD+@EQ-yao0vB?6 zMkjFk7wzPHIMSHo^OF|yM;Yv=G>&-_;l9Ls#_T`h8S`Ilxg9if<$7%)yi+-59rw>~ z*K+%%?Zvt@$b`oQt5sMJS8B6QkFR&I|xg?ljcS8_kf zX%WX^|J~dl`!EW#Q&E=A{XI?L9`CW8dA#Nv!|lb->0BRUe7U~2D`Wi``jYud74~z| zh571u=KGa7o%?G9`)kbCFJrDTg?V)l^U|Np7eC;1`rqaJ&&grk%c|yb{Pu_S@a01u zzt0iw&AaQxadk>~?`*m7zG~hrPES!6=97hf+F)n4cc^2o+nUoq*_Zo=@6)+{X&Q4q zHS5Op`l=3(kCvWbo~O?3PPHfV33r)Kox{3hH<8C*ZG`*Z&VT3juCX`kg?aXn~;TXqfNqdg-;y2t*RbAzJv_GBe-M`OVPcLdQuQgyD%hX{V zXf50$l-izkb*6A0%|4uU`=}vvpD(QczxCKYUs!M5v6b5e-7rr7h6CI#930B|GwcEL zg)KOr3nwsN9l+f43iH7)m`^WZp4*P&VevZVeT4JE)&FrEwz1&2{Sd%>S{n1Moc)TF zZd_kROk|$n&wPF&^RdD^5qk}}{d&2a`G}@m-yhs${%$erhM&-`O%e9hk8H@gRJ@aU zw_dDowoSR;e!YbGj%Tc&o&RIKUFg8=;3wgo5q}ldbMrpTo7ph;)MUOPjMJl0!s)lQ zWF9q+^Fd`j=i8u2&VReNTwYqjy_(e>xj&OKlH+P_Aje^_uK9dK#Z#9x1d7o`U|T>aspR zy2RYbgY&=gIrAN^T#nu;%=@?Jc&LAxxlk=B=Kv|KY+tvG1m`eS=oaXC37HT+o{N!F(>S`1{N?&oJM7oVk8D^CU0k%681h zE@yr=mHAcf?kO6!<9x7oXRfi3`Kg)AUk+v7S(kagR8D`?4CX0AnHPC5x3FbCJ&o(N zhj6d{RY5mi3}HRdi)G#ZDZCs0#*KAv(QMYwRV%n3Uiyvu?XAO@zY+E|b-c~v2sbj{C|9fN+b00_M=JD+R z?<3~h3)s(6w=(?R8eyN0aWa?h-@Y6VRcDwtpUQDn(2nE$tUK$Ni5u(fzzWv+w8q>I z3H{6Ch!>SSemT37$5Zoycz(||v^nOpx|ud|uXW6IRhWB@(?UPn8ZcjXjJeqq_J7Wl z`E4!cTfZ>tVe>8(nPhlUmWze5IdIwKb{x2w~0XGp~1xxm3Ov6kJ}$ z!g}tSK^)IIxm+(+`Exzejo|hxkgL1GL667p*-yA#t2@YgwV@l&<3-G7-E#@zc|yy# z+&(7Ov97i^<@K-OPOQ)A9=slx{hjwcc7CFT^*5~-w->5+nGc%A{QV?u?1=|K$NszLarzezXZ})X2hTia9lr9K`LtZ-r|vRuBJ?Y?o3s7C z*W7N-Phh@hJ#$at9qotp_jk_N!G1w_h2@xt)sH!}`DJ z2J@3!nR^$q|9Zc;9l3p<)7fIDItp&K3=aAp3}lle{IJfPc1wlA8;-02Z>i+TKAz5X$uFrLe$!7}E> ztC{cJ#=L0+^OQHtO@;X`J1y4jhr&M3UkcW3?e-kctKCo@6#JG4^+I@GPyHwN4>cEZ ze{$?S=Ep6#{>~EK_q>zK?Ls|G){T;}+%D9=%(|4K#Cq6y80+T;L2r!{S)ae{U_I|A z=)7?q+t&|g?qR^(GL+Nf_>0?%7o(XUOy+#pZpS<=o%8d%9`gt@Zg*UTd%$!vxZH~- zazEkKQ;s*Ci5#DUD!E>mU*meDcZTa-Z{fXQ%{-xf5$=gvti;C(oq!LOO$o5$a4n9n?_6X)B270fRQ_jd(8Vf(5w<`Xr! zd|f=5@5x}kX%g$aSsC-~OF0e&IaDYg;&}dK$?+c^&wOorZWr1fVO}TfSIL~o^|9$? z=AD$dUJn_@Jn9Pb_e;5b@$_Lmnc~Cx^I-tDI}LJ}r(1D*v}`x?7b>iinyZ*cUuOQ~ z5%bKa%r`t{zTh_VdApcD9Kw9geg0nOX3VvO{ffN`xm=nJWPTx(%Xj8ij)%h<%nuIa zxbi;3ajR^`{OB64FP*}<-o1Rz_4gqsQ;{)=^}*^B>&Y2k<`utLuL5J3r`%_LxD)$- zxR&{kyUcYP@pqM4G5;g%|2(;h?M=#Yy>e&9II;Us6HS?WT z%%jzq4-o7dhqHZxD(g(|5zH+YF#o-id2BHAubY@(@nb$IlzHBM=0@X~4^U?Ae~t5J z$71HW7R>9bGT)xZ@i1p6bARFd;PJCuznXh87q(+7`X1r>zMr>6C?+eg#GZ#g!?&<+~@yYyO;UZ z70jPcVLo&K^B_~^y^NVpXu~|cG4tLPJkHwoi}^*t{)RB#bRNxq9_TS&^N7cZxx)J? zKUCO0^FGfXYQAQEOIZI(F=hLVBfS1K%$9kGul!%r#2CqmUi+Vg53Zd7CQcp{dMQ3HPr`=`l^>^tTw#JS3X` z_i_j33xxfdnRmWn{scDR{hx8qzoLDT5&M~Snfbx(%*O-vd4UikWXWnvT3$$N)gZ(E&a(aq$I3K3Y;CcIZ zLYxGx<$mw!+uU!wwvprZYazGS4>mFHoXhR6@qXqFg$wu1N;y4Sw7K8tA?)`% z_k-L07z3`?udG=2?ha=C%s9aM<7>(M-$2&q(rfJh$ z-bC0>m3V;tYk%YPH1uL_(1rOxQ|8@#m^z>j3m{*%Hf9b<~aeoc0Upt%dy6qX^y*%5G+B0ZoB0>}GU0ZSfME&OVk&bRWk$pvYpKEPPo>!^(!tK23hR)g&? z9pw0*`jgw8G~vDV^{Q+itHk5w9m2SERS4JXuX9)jR4TbWI-p=4tjF9qkat4 z72$r-amG9z8MTr9+}Otd`{p&LGs%;`D}Nj3TT3lo7cT3<@nExq;)%ZISO9jeEA`=f?+ThE^P=~8YNtn-;46z-RH zwqXC$cQaq`h`HYb<{6inUp3`+^GPqxpEpAPIkJ}XdG|#wm#+z|hgwlwzCQCRb%@SC*~fHnX4S&bj}y<19?}U#~mMraJ`Ft!S%F@7T5P( z#mv)>@Oq`iD%O)_^LV^-^9t)yjquKRk~NQm{@AkqS1e(j{Bf20=hNS?-qx1z_@($c z>-N8!tn-uSal7#6Ec1QA%x{cjzF0Vy(JY(OnV-eqm3)cwp=Vdlx7+5N|I6&SJ@S~x z<^I%Hh@aschr6^no|T$%y)YEck6#k*E7RM=y3|yd$Ey?O>mr5w&C2l|g-K7JwdMHiVrZ^Pr1;VYS+KF!>qka=TQ*0-0Jn0Hm>_A6bR z`Pkp==U6%Oj-A*~i`~q#l9|_wV?KQf^YK-jo~(h)8&Bi>9NwGDvHv}ew=gq~=ROa( zKB^^iy?!0VI#95Jb)&^N)|ux^S(j4ovyQn;V4m5M`3T{D6-8g}m)hsEt~#bM|Ms4F zOgr{Jc@OiUb(SFR=H1^ipL2ovy)(>HUNDbPVjXCc%JwGhm@g4@purK&w~2k2 zUshv&Ac5PR34NIVe8c7YWgGJ=?U>&X&R^VX$9lDW3ddpEEsonidzs(&WnON={Ml2k zFJ=RnyIkRVH)}HUgT0uK*JrMIjrG>hhPlQG*5M&K%(c8&XF4rqU8?b89s88cI@xUo z^F%l1H-vfVSYiLb@{v4$5~j{vwKMaL>zT)=GWUMNJhYPek&gVmhdwiJmcjY_SD5F? z$>H+4D!gC6>K~W;UJH(^ywx0^IvcrOZ2QAJ(~9feK|kj8g?;ihC9Dq@CbFI!6!x*N zj$r%oLCh!GFb_Y*>6!eVzpLsW=g(0q=KVKu{$G2>fKJiZ<*+>;h|jK}F4gnL>B*zi0++%}%C_H<)zy^s05 z*UVLxGXI*(`*V(MVQ!OFfq`PyocZkz%!8eno9+LO{vF3ip>bSk3nC!v5rDDx445`#C)Uj=XQyb0zax&Dl@P2DV?(l=%(H}jybGVR zeUv@tkC6q(ThKPs!3Au3b2ibv0jj*Cyo%w+q*V``^5rc|5ZHWmBxDLzA?SYYOi+_A2BKt5<>n`ni|g z0{NtEdd!#VAoq0Vbe30YqP_kB{$95e%%gj-pG3ibkM!pFzdxIE`j=i{KKh0>`tcC% z0XF@_=}+j->kf|Hd3;x zB{}~ZtvO8##_uE)-W$0&;BK_<(R9l*4ykFAm+s+~q9u&+R#X z%)^*xr!e>NXC5$_|M%NeF0b)}c|LQ*18#TfhVpoM;2@5-6}4RN&Umu^_zL@TQu0{$ z{Dl2W8YXOS+>QAYC+1@#nYXHCzPuUh*p&NhA2Wjah>zTER&8PaeG>C8e$4L)@4s9S z&bKbPz&h+_!sQrc&i(2K`Wz1ro-=>gjQiWs!anV#m)Ot9-OT5#WZo~1`G3ylg(oo8opN^Y$^!74FPObN63i$FiX~-Glw?;bvKJXeQ66sn6kd zC-)}nPi#Zhs{<`Kq2Dg?zNtHLtds48d-k3SdOocs`%$03|Esiy)7d7G$9)=onCEn3 zesn(b9O0hWqifiHgRqXD){*nS%LQJy`tpp|mF(_vJ2GB)XKj2q_jBqrxjz0-X8kD+ z;sDKG$@;eG1nYU3I`i%Utmo=gti#WQbA{?lx&N>BoyS>e8<>aoV*Ypp^PQiVC*0-q zjCsr7u{VM^ArX1nP>QaKObOjB)pGYBJ4vunZf@X z@SJs{qbci*?N)9_d@ES5RBTw^B8^!m6NUTtOnb4;_g%p}B!u~)?GQaSTxrPO| zN9*00cM#sYFB{7C<|X{U#X>$z9l-h7&z$rBofhvW@f^qH*u{f+kv03VOW^+v_`>PD zUdw#hRrd2j*gx}rH^=RQdK~A~VXOmBgnOdisj|+LzhS*<`kMLWE8Na@5Z>{u8^!H) zN8x_dSE-!NKezdR$8}^rU08oV*qOh}uPf_(g@W4`D+Tu-?1XiSx6iq~+jocks7CVt zo)`94L>6)SZwmKZ843Ajev9+-nm3orgehFUYgcmn72?Ek`}8sMRl@tZMMJnwL-?=7ze=Rbu&nm0NK-LycLVZ7%Wm)*NP@8OvPn8uN2EnMWO9o;aL&r8V=xo0z9J z}Y?l_5g`Ek~( zZUGz*#|Coz_zU-qoEgCJS(wN5B_o9S@Da>yHJJY?;rcrvj=6FlfxqQ`+LFD@e;#FS zE8P1XdzbC|MlyF z*PP>_@G|qry&Rv5hO>Uwf6V+;H?9|6gP6ygGPg2d{#@vvuNCeg_bg&RBinJk4z_3R zG@AKMZ|0$!nO8?MkI!NL;3M9+IbX{7m1^aTxYkh<_#K zK}I}IjGe~g>xlb2KGhn-yiB-P;YS^hmkWh^grbD^8T&us@wmTmKk#wk-RG%QJinde z!F>ELUKi*qtRpv=!hQlWm>btIw=ZOVZUggm_RJl}FmJM-x#0`u8Wx=Y$wEGN5Z>c% z)|dSRHDdnp9H*zkjJdh6?mu6_<)|~7*Fhd+@VZF@VgIe!ezxx?-0Ky!mH&5>I;Zn} z5B^@Y*PL%D!h7*{=XjoKpEYyUDO`VTgz~+i#OZvT!{3`2%)IA&<{#WRe}bc!j}h)G z2))bs=68U<_ii%thdY^HTEV>S5#}b|%qJ)_cR9-GKW@+b=``k7da{4@0UQt3!v2sd z;at@~ZEjx%YB1j$&D`lXw_m=yxqVFR!tHF^r`%re65coL=En1E=Ns`pt`{-9Z*6N< zb4<|LVOq$el-WMohy9=J&->!K&E|a$KX35--uq8Hj{e}!e9Hmmjf8XezYg*Lb~O{` zA+1Nt>j{_* z#P67G$k;=_Ih-DaLOmeUjO!tKbevHZQ|!hOI0g!9op!ns1PEv%~r z!aDxcmaMCNBA7d@W1XKkiOap>CUf&U%v=3rK0ug{-F=1a2M=KW@*k&vwh7x$AH{r* z9rJ2u=DXf7|0&GhI`rWB)iRuUsUG(OkE~<m1hqr^0!bhS%7>_f6&(&of_on)wXDzfC#Y7ufT6t-H#+%~Z}$vr*jc z3|Y$M5-QwpcKsCV7ctk0VD2ciYuQIR zJ<7xRyWHP1e=(o+)+&#A3t|2GupQUm@xr|{TXfkzO@(=(VBbwxf2*1|L*40Vztix-^vu=02&pfS)xrq|D3m$cB-zuMZrzGYbmoaZI+%GymmA|)q z3-gXIm}~6e|6MNR&p2bYpKr$g^K`hpE??wwuj|2aa*E|mk@A)6*TOokr`yw**Mza3 z%C}q}L$x@a+8>y!Wida~pZTA+Tpv@F*nXon^Ty@uC%2e+m2eN3iSTan+Y9`^_dam> z?mfu$+VKGMMyAZ4C9(fm!hQhPYn;xTg`5u#hRnUrb3ELb!#wN_$JMua%zsa0zN;tm z>>Q5gn~}^{`7^KfV6In>d3-6inej@6P4E*O%i* zWgEwv&REv50f(6Tu4jI7BlF4Un5Pyne^AT3k1gx4wy=M%iLh>^Y{xp^T9`LmAI1MW zp(pd@37r0I!u?2X1RZ!Ylgn{+G?#niZ?4z3w=&-`l=%W>=4y9X2dZP4|GCIqgO_C# z!u61fTH$|BtY`migPFe;zBjuW=V$VI<_5NZ8-nG3-=hC2=g$1PjY*4z>oFKR?x%Fds!zvg!@>E z6|B!mGnvQUWxlJL`R-55M+)a<8n0t}A6@1a!g%DS@UHQdhMYeaTXH_%>dob{JDAIT zy0Ff&e>TU@lJ^{kBZPAef7WuGKS|*JjGeGg`1d957tLGDJiwj#GNGT=r~%u574En1 zeUkfuLvoq#5#|qTp7HlH@d<+;4<@-pP2Vk z;U%IX8VuAc-j9J|8M1N=D*r8|H;>GDKxm+DK_$UCqzLk!OPu>7Dk*u@7pqOZpHj*f94^(nAa1=r^7=z9zF^8?);7YKiJDWzbSL)W1J7O-I#ynHL0zd2KW11NU$P&}u33_EF3? zCo*@R#ys)@uTOtDgX%u~iN@A--Mf&3lG{EULRT_x{JnfROe0AYXl4O32M zi_6TXtz$k+I5&|eoP)S8a35hm%+)CV-)DWeywqBAxmWlx?|hQ^4PTDiKDJyh4%V`L z(GT`t*p9hn9)DM}nasmVIDdYRWBX78{@+!-nCJIk{ymv_-bK!bAC8=FdFssXpJYFc zU-SQ7ILF^RU7dNW8=P+|XE5KE$b4BE`(J#Q(>X*qU*PP)->W~B^XFtEZf85aV?Uh? znHviGzSgy7`@_P%=#?YcKF62)3FGc@zv#R0p5ycHJieY1%KI=Y-f@RMTzG%{OE8~1 z7%-XnhF0uh4&K;GB}@o zj`052(a+d^$9dj2wPz)lZ~Yehz1A%`uFebRn5he1z*l71M=zm81o%1B--vV)Ndz z?nMgkfR_sQx35=YUHx#LdD?3J-vu36|HJMv&lGfQSOeBE#bx%hF`D_dIOa}K%sYKy zel3pEv*a4P@pZj}p!ajHCox|mtlOU9&sC^!_$V^H z`MbUeIuo>-)8C{I>zh+8>vQ9I+@D{+p7no$Cbv^JOW3}JHS!i@wpZ`Ne7isM=q%=?-SQ@{i8(I`7Xl!5?42|{d(aZ-J<9G zzjJZOkiHVm3i!E=HC{x zUVRZ3wljtOKPPOteK~QMxzj7=)1NS(6vzC{6y~aC%o|m){%1X9KIjqi-RGH)*~NTK zH|9F$IRDLsd(n%8ed!Y#aXhO(=K2y6%>BuuQ(0%8&tzSioXG8qg&p&A4Ve#9F#oE_ ze2;LByO#yq8wmHJ_w32`tpq>bW^BJuSohp`nC*}C;{41X&-q_ZIIq!MhvP>_gZoRK zySbkhIfUl{X13*fax@B=e~)3_^fL?e!)N@z50~@&hS~t02R2XO?^3baNhQ;9rt5*3imDaoXL81S(vw9Dx4b{x`f+hl_;+77Ihql_7(!K$6URLGzwyVM<88kk$H|Dz z99Mr2a=X)VDC^Hlj{BJFk7FL$nt5P4f7c%2eT2j$&L1nG-qjRw z{*MvP3lHnXaX6FPA6%dRw__vb+8vqC7y2Q!Lc6)O1N*TW$K3iL^G~tN4+--UPlfZ& zQ>@rem@pr!C!FKX^yhf!IhVP5JLZ|f{_~p)xW4=HbCe1-;T_vS7g%RXh4&YpOl7@V zDZKNZCmg)|^NIVS;9w${ehc2C` zDCICzTpz{yf95Llkv%w0mfvE&y*HQ_wkwxgUsNfVj7TQINTFjwrp!sWGcI&)#$i$amg_4jKq^W1gJRhBSUp3l7Z zV&<~~nYS0tmz`?Q-#fDnbBpWj-`taVPhIAz$y|RM3Hz@c`m%jJE#~nttQ%v5{ee>j z-P^RD1L(|mp0BvRhBb~MLZq;Rj@zC!jhEtUD(C(QTdG9PoA`RDD-Uo>I9X)fnmjSF*?W6b@H*}rjT z=0!7@FK@y5>}tolkuigHsY^2Ryt&L(i`l3w3PiE7TTS_dTjr49`Dbr7TyUeuwwgueVF%{%KXqaPS5F7))|d~+~1pY zgZt-;op|2q`EH)SJ)X<^&2-lD`r!3AUhlgjtPeJs%Kr71^1N{m;T_3i`utr+J$WAN z*j46QQ+WP)qVV3Xq43VgEJI$Oy)&8Db3f#>{V-=<&)qKU8?=h!^mksw<3aC^96vd$ zINnxyaD1K`%JCd6-1olTjP-DuKKp-O$Xq>&+qF@`_`+%+e^;KL}od2VR{^VSL_FvbC(|O=4f7hZ69;eSKX1(=3$J}BU`^jv}`P|fo)49-| zzspd#*yX=DoNwjj%-@}2|8=IEKN%_fT`!jKJlH4UoXh+uZjaIqb9>?YlzGf`=7AaP zKdc$IJ7#;hefj#H+mSD4nGgAodFdSX|LP^{dF)G0=UxN;uBp%1K3X^r8*-o1GeN=W zw-naX-%a6oP}#}x^EFKKvqo&Id;&_EYhNd24-6e^cS!(Q;qz-$ul6yJNAHb7+UZjA7$d7bxN3so= z2Q6ov5C6mMLRK;JFT%X;MkW5=dcymvwho*>K5IEY$M|x2X$t+})588M4dI=>W!0>E zK2^*ki<$4uW}fnl`M4j@wh5b>gGuXaPcpv0@J+_~Eo72-N zkagIwsuDytbI_=d|PYMQ;}Kkkiax z2>ZTN+OZCw7xu#^3hmKveb)KAqnU@SU_NRZ^TfZL&a1PSCj@goIG*8rw!g&XIOYMz zLj%4}Msdu7t5R(%uR&xerzu5>fmk6D}{6AZYpel_8YfH z86TJ%w`4z|8<=|t=jCUIbG|hR;&Qogp37Zvf#XMiKgZ|fUpy{;^?=9GRsDEAq1iU( z1A>`18qEBNHuDjt%wJAqzVj~gsDV6hud;{vwQ0;heP#cV3z_#k!};0ZGUtE2L@uv> zF{~T6#&WsW>9KC)2eR$5#xZ-srKJMXjq2Ah}^im|DV(!N@nYTH zB*0=he%*_*+`v~pS$#$%( z!x}Pgca8n;@@BsKD}R^cLgw|}alXCl$vn@W%jLv#F2@fx%#Dt6T$QwD?it0L5+ zMS}i3sLy`7XfQt{+!yhUmj@N?uXBBWx`nxyD|011<}sW-idk%~_}hbjIJ=d3+xN_u z*mM3QCozAZ#|aHw!(90#^Q@oDqdzitOJQDnj`{o3%w5BoI~-*GcQ5moyO~d1#yoXC z^U2$oKRCktoUs3Vfp8vVQVIJh75ZaaJh)!Z66S9mOW6Ky2iB7%&dmF6X8!61^RvP| z7z>5>D|OUZ_c|A_|0xN~KW$(h?8H3Iiuw9KoNr~qxvB9hXogToNl#(`JXP#^@R5tvIIV|9s3zFmbu?* z=86l<=LqlGPi@Kh^KvC~yK?5y%Q*kXeqlbxiOV-!m_K}-$@cofdpC|NIj-u2cg>c6 zW&5Qy%ng4r@6nLse^eRU$Nylyua^1nChR|?KJy%5zVxN=p3B_3{J;6jm=6`+iN2Y@ z<<({b^DyBYU#St>uMzq=pIWfJu#G}dBD}}?{3ge(wJ^?&y~p-hSc+f5?2jH^=i0;a(cQkzBtlgnRSu&u05;!n18fl z{%Iid7s7pOUxoYALWKL!JcM&z&5p4SO#j1NZyBd^m~ijY?fP6U+l6(XS{wGiPuMU0 zO3>RJA)S%A>_1;P4`nBmqj7Kc^GSHOOZy(@XJ{Gonj!2zL5R1wmTVs++-v$-XxDaX zae2AwGkPE8t8B5l~+7_(;yS6bO zChUg~5bhNp_?`cEu5jM@%??g~(PZXfe#|Y4m`@Y-AI|*D>Fglrc|Ds{gh^{8N8 zAoLUBwsJf)zQFw5IOgN5xjr@*-h0Z~%l1hI?Elbrw!baBJ67b(`JlUm`6qY&-`q9) zzqP_UiQ&RN|He+-|6C@#gV4N~?W6i~dan60fBTL3?xp;_X~H?y%#Lhdyoz~!;e5v( z6}EpYoSXI*+O=xo-o9T<*#6qJ-C9P95WQpXt%eO@;OM zB^!A?C~Q6R#9^EsMJt~FeBOomA7AEkg?CRnjb;07w>Ul5H8~%au4EoGgL&I;oDVZL z@c)+Ca5;LI^ZblwFOHK{YTSMepU*mD*o67gKODE!smxP_`#0VQK_((pKyzLeO)St(^XB;XS?ywp_lM!o2I7rfl!G zl=a6XgVU3%#(YUA=W~;F%$-A+Tc$DZ?#lnGJAu=GMChkk2^kP9XPEE4#k`HsE_dw6>DgkyeEVGXALGg8(oc9d zXL)~~hp(>WII&h^zGoB1twBTP9!EGn-KI0w?$3OYFdiBGkoCb{c!%+laBi!+68m{9 zv?E)E{%7qa*8kug%zcFWf{qB|<@cvKopaA~zI`~(<>EJl%lCw^Pw(3TwyzfEGc%3Y zzEHRi(0C@NbGp#pnG5T%UOm`P$!LKK_uuvv_F-xX`!;vlvaasm%)I<0^X4m<@7H0j z%rc;G`_1|9-m9E%n;5` zT@v~s`=4`toU)m@qaAa7p?}*@n18z?jJwwruzm(+F|QWp(;UaK{jmnjT`sbo?-j-c zY67o(!G5%a_13P!ykEs~&Swv0){{u#{>)yvZ0~K!@l(EqxkVcD4*AUWh4~YoPlCO0 z-Y1)n*DHLRaJ}f#jk*75=8Kjx&tAjaPq05Vf$f{yGWRlJZr+u7oZ$auFxyuN=XPf~ zu+B`{&Rn{$yK!6Au^9`PzYk~LE|>Y~@66qQGH;sA{Q52C#W$G;-DZCLE%V*KnBO#D z{V!HxzWO2i`M865W8uEym?$pCajMMQ`f~il=5jsVWW!wJ2Jy4Wc%)`6T4`?Q!(+sXMkd?fSI&dlcp za(&6T#ql}EfcaG6{E@3O$G@Hd^Co?nTaRNtdJOZucFYYNn9ma40r~QP?VAht!|Uj9 ze)|4l-Z+iR#YT9q;bM1=hew9YRkPTC-3aELn=&tQVXm9W+-nu5XJkjN*9(OEscN3F zeUDV;cXu%N5#AAA`+(D_vYh!(OXekyIUh0)FxNQAd`n~YAM4J%(H`b&-!L~8?$KKM zneAr@@7a0$VEfO1nO7Ndxit0?xG*nT`IzlvFEI~}W}d#5xtnlL!lKq}Un`vZYj=@T7UoH^gm>9~3Ga+Ov)wYsb8TrzaJKS?qt%YUXRL znC~%W?k}`cZ*|#zkTB2Iav$4&C}i#_+-IWnobzXw@a|sbT`u<@!aG614jez1rZHbI zp1HFyKV~9~cluvtKRr{KM+>^-`HAh%3F9CyVI1MogZ+foa(>RZ&wOGc^G?D$eb3LZ z{TbmrUA!IJ56X#o_wAL% z_6>#e;5~);ft5l&I2dyJUkTqkUU z+>ed4Vcxck$FnQ$Gk3kfe22h~3h&!a6W;YR>dO9anKQ2#%Y5Bw<~pjJ4`1w=Hy_XZ z-b&`3W10UF?)&=W!0n683Fd3_nVSgrQ8Y5-xbhLsM^6*(Khz$~eoRI(zb?!-UKQd$ z{22RLDVz&Sk6`;&eV8A<%lX!18}r*jKS8*jL7^|)!#3(6$Ah7;PTIN?+gCSbzT+>) z`7&YsJxCZY_u9e!e}^)UTf)4X@NSgXAhu8G#@wR|^GxAA0zD_T-)hP{OpEzZ;l3KH z51h|ig?mj`uVeeFSYo3VtXH9ztCJ^zm2|d zzjv{4pP~0&&d*KtI8L4l{oBPFY(MV-`!Dole)k>c!<|It0YbeVJeutdJ1~#YW!^|w zuWvSzbxgB8^ZmkksN);i-b}dfF|{|_|2LX>d@JT#0(c+q5aB#>;7Oi%>TSgQ>1*D1 z?IYZK92m-ePC0Qpe-$&I>%rd}G?jVa9_GO*%zcM4zbKr?EIZ5Ty#9o_o6yc`{bu_E zL7bjyRgUL<-`GBG67zye{$GPg<{yP~l$MrkUps|)4`E-Wi7BUZ{3zxV{F#3VW8Tt| z`556`l6NOg|3L-wT|YU_Q-t%d7H*uL^|8zwUSJ+lpX1?F0P}gLnLkWp?(M{S9z2!# zk6QMlYsB`Jf0!F>upSyN`1#bG{j?SC=R8%)>2E8vQ_U8zed`b|FVi0!KVQ4D z{XR|RkD}PmBjH^31QYfXDCp8?;r#o`q5Qusg!9y%kz6mlnllgT#{9=~Zg&O=?@?Bm zu>FrC%nM4GJ34TBqJ{ee^yhN^EStsrZ!q)JLgu+O%(X8vU-gl>ju3C|!nyT-i#dMs zgmGDpF#p-%C)YMrgWjgh=eB1*9zS`1%bF5i z58Zc)zsp$Ihmf7l^Y8`c>}Nv}bI*KEPjMZmKlcak^D%D0`LOdg+m~Ks|3<=oo>iti z54l6o^Yg;}X*shvZvEr9Ui^B)yiT|W;P?mjUwe_;1>-H;-n|m`#bu6X`zHt3f4v)= z9@hx|t_9av-zIlwUTMSp=4R$e_WZx;!aUe$VPE&=`J4~SGMKLt<_~Lxd$GFua=vMI z;Pl(5@b_8?=lY8Va{ID8iFtcm>PJ{7Cy!%&8)VOV*k>#A&i$C@9A*D% z!oB*%DV)v|!akfzp*>wH?89*p-sheEh5t80*#Bvt&HAr(mH7|h{S-A}UuZ=rw~tD~ zK9eWH{+1|VU1RMeu3u?p%q?d#KYN?`LIu~O9m0IFt+0;c@RI#6|HbviRv15??ZNf# z{%Y346<=8o%Z2yrU(RMf+k|m?fhMQFLW{q5$ZzKHOF5q#`7sX?*4+Yyb|+eg|M%Ps zPX7(zy_ol_IsZ?2F;|adUSh%j`%svVjgR5<{}l3J+jY)2s{-b8tC%OhW$v8L+)cRW z(>#ssn>OY4%Vs6>cP+X98I#T2UD&^B+l^=3Z>f`6AH)`yir%ufjSZ0Md~UHT*3E23k| z_Pbq}o9<>_Sj}9=o74Zgg!$HqoNtyVnRj}^{P9!fSA_R8H}7KmA0wDw7xsY!3H!CS z2=U+`+|yE7!vEX759?~u66PHPm>&;jt{=ucKsX=0|18^E3iY>`8w-(ejiPBs~QHxnXCNJb(i)UXdfQK_BNB)|Jp^Io;6OKe&5|Z9t`it`EzCs z=fArr^IO8X4@=?v$d#4sCqdZX{^%md|FICRN8v%3&5C^C+}sCY9p~~n)_E7J69sylWgM-X}P&+D~EqRNQCokiooUDRWcdy|YQ(IX%_4IQ>fn-p!i* z_%`SCeADLo_`Ht!ty0#FYa3Z-s(v!>-Gp^`#e23-_hCLVjnm`c%zWQ({;uwSm_M^& zKPtj{#9LcV=T+fd-Ggy#e=UJ|&$-O!DKUQ{ybF9}JAc<1E9T)DoIf$bx%gc>Io=|Y zI6ghTaGXyZ#{A)FuJ3O;F(34r^<=;d=AVW06qUk#eUF5FWyU{PKmXlj{^&dNTf%(x zk_y&aE8)JZK;c|Qq%hyr$ddCXrVn#FVO-N_JKJj?VBYE)^J~UjzEl2VK1VnoQEtp} zm{HCAvG6{%MK`V&H-vY`?1lHQQ@q)awi)xW|G0kn3iq6h{>t_r3Yk9>?pM(f&T(5r zvY)BjnZFXwQ-6qJdkbORVQ4zrSKMX(@Hq3cbC`QtGxsxOUfqm&m2lCUb2-P`fE&y^ z2>0!{3FjPFm$QCW>|wrAo4JLcw;`@v@AR~o&(7s~{X>`^IOosyG4q(u9l(5MJLczV zxc{kilKE|G=DUP`@5Vu_&*vL5w^w2w-=6vEnanMtnQ#8cy!%l8F8@o+mvrU)92Utu z>Id_;LVLYqybwRa`+(I#d?w#yKUedapAz169n_oah3XXMO6!M_K?TOMpMF=EPrJkXb_Vli$;<~tG4FPmdFO4+O;<86oydHcpkvApxZKmXGN0nh ze92PghWnXczR6tu1@i{CnKu#QJS~*%R|xw2{x8=@mk8$fgma74&sZPIg!StlDr{dW z%(rh-W4*c}tXIzS)q4eGv6<~SF%r+ z{kI>*JW<&9o37w|Gg!;~nl_iq`=iXKG~jaIBkYUVBaFWil{h{RJ2J10Wv(Z*JB`D+ z9+k5j#rScoKO6QlPrT23QX%u#0*^bv_Iq5JS2tyDbDY1|OoO>$7-vMP@DA^~JTCW~ zWz1WJFrWXH`ME;oE=QT~U&uUl0`rHRm``ZLJYHC@3=+;SR26Z3@jcFbZZLBb;oR%~ zb!`9q3iDmU{kqFvuzgk{bC*=+UrsWg)Q5QkVLqhh9qUqy+syShGe19tx$|)5-om?? z->xc5%BpSFhiM&X>=P6N)L!TXuN63)LH3ipcK z6m+1s@Sdh|1=mOAnXFg))-X?>!~FeJ=E>8UXA0-F?{;MSw!*%2T`RW#-kSONzRc%# zX8u8V*ZXW5=ch(2^N~V1<_+h1os`FMqJNWlabM;egm=e$9XX!+Ze^bB%3PzI`(tf{ z^G#2M_v}`xvi~Q-dukJf|J@?ILvhZ9(|PnZbA_;;=zgEm`En8G|5P_F->f;zpEYNG ztu^z}!u-Z$PqyDNh4~d>|7w{R$Ma2R=ArAEcMBRE^a=~O<; ze7W!rsf}>1{Ba}plc37{Y(AGuaW!*)WA2kTxe91gqxL4%tEv`qi!ZG_5o#S|Y$8RaG_jOS4`u-1p-bYdH$NRxnWHHwZVgB_q z`#02JzSe-#89RXY6~qhs#O4d{(+$yLKdtsKeFv)-1}vTm#7GCw4oZ*4P+{ZAI&W!^TJ^Z)1w&gTN*J~54PoIk&X^<4XW_OCUM z`H9b*PJf|4*-(T1SiNE1_&uk8o;mBr@zXrt`(^;|PuMQJqhT7#`c~hL^)MxrxmGlD zP2ru;N=vq%Ahd&S<($sd`OLct?~N{M!vDKRpZVY-_HQbjKMED@&tE097dgVdkw^8p z9qHGd%RR}T<7A>L^LqcW{`~f3UVkC;Y+;^l`3AOsJev6oP39vKxL$0xW&Z0n*RLNw z%!`G4{FVymhNi7#KdY`XcQxU3o)NxFxh3a=&TQs8_c8Awtcw|LW&1E;zOhd)$S%Kg*x9uI32ygvrAGe0?MKe@K{L>M8Vdx@huu&7Q{mpD|3z@KXqdsv4Q!r?ab#1_U9bge$^XJ|5j_}lZ5wQUifl(Ij`sPZ7l3B z>RifkwPZE(KwIVug!3K3c0xrTVP9EM8OMLDun&A~Jlj7L-i3cDoQu5tgX{I&%gjgk zF<08aeBNQ^ukJGM|Bv~$9{jyAE12g;F>iQ<`M*odv(GcHf0}uo(0;w$#P(Z5m_HQW zA8d1wb+2q0*9&tEu3t@;b3H8#;dzqp@0rIBWxjnK`~N8D+j-&L;S0-IZ#&m8w{FD$ z>!-}=eEEmD^BJCB^1R4A%!T=j8utJ4G;>Sg{;?fB_`7OTxqRQYVZKbz)uS&te%1*0 zm1*U&-o|M$Uw?+<)>(M>InkNz)r^?ec4GcBpLN@$7xOgX9Qr}w9s?~KuD?~^S;ubK zv;CHH%$v94bQ&IIE?j@8_^9CgX(8NmmFB_z6~cb__X{}v1BCZbqJ;A`$s9h4lM$RA zLnr>OolV%0{UhcBh4-!UVz^#-tYGe<#=P}L{@=MO%y$&--rDdG-2LTxE~-yxR*>< zc&AcJxRLi>)S@5zjt5Iy;x!1BTv}JK1LW992v~%bWLF1RE@uP zfg|&R`OFoHA3>K^mh=gbwtyR_Sd^Zuo;+0UeUtTV5NFyADMQ*wgYe(o;j zrfZlFc4uxQoPS(b%HO5)lDVPqj`^r}Y@a5amt6FT?fo;DyB}nJZ7g$@I*!9zJDEpl zGLIJSBf6!}I`i`s>!g)%e`D8rY_BW4Q>HBNkOu5WRgbxu2J=qBzTD$Nf8Iv;-;J%< z|4?CF;JPsHVXe%5Hdpfa;)-zIWS1`cQSHe*dnog7TbLga?nONFitYdV%=~IK^M*WJ zR>an_eU;E&ud8Ew^%~|61>RUl=X8M!$Fda#JZ+%3D9r!N9?JDD%!T>fk<8E9GoLh; z`EcR>I~tW>E~1IN96`{k7vw1?=jC3<|{s|W&4^Q%@)u*%=5n!))9K%H91f1R){+*MfD*3V); zw}pPf!?9c+iwl_#?aVr`c0BVt3z!f0Wp31!`2*p8`}cD>otK64K0Z%5f5u;BZY-2z zf1y8fSU9J-T#wTkFWd|CB%9Ntbcngrf6UdUGoK=yJ6JEglc+4bSG8^&*T*xZtOEue z*#6@`wm;pO`M@OBv15;!r=Mi*(wX_S{>+~U=Ma1EV0&}n-LZCh{9VgWGhdy;+(p>G z(O?Yc^JL*Xi?K7?9}&(U*$d}Vziwnd#lrcf`8(MD_ci90!hVu|!oHyUdK~}KJEtvG z*}jdizp+|+_ft3zGDO(V6RynvJ6kx1QfA8bkH;{dv6}g<{mk?IncIBkayc%XXX&TI z_DzKQ_ML_J&l2_>J$c3c9fkbwn8x2_KAH8|>L7Dv7v^^!vVZA(P)H7^KV<;(CxT8c zu4a8$9mss5E%U1m%(aAf691>`oEr2>wgB3(F|pIJCbn(c>Daby+qP}nwlVRJ&9#D2{GTw*?6?0+tKPo%(W z?&sFW%qz+F_7}-}G*!>Bo-5Ly_IFu6l;l&L<$Ig$B%fL(b;40{U#q2@e=R!8cK(ml zJt~f2`H&r%-*ie#guFUT(&ElF9xpEB55> zBwqikg>OH=@~7oHeyK;Y{9vg+Od7`Wr7AFQCHLE}$aiU4tz|tA#qSIdJ5xjAqO8*H zI;q3NXu#*@_mfy95dGm;@Czkw< z$e5+mcespa#eF=^ zFF!N?A>Y%BnV;)O|K;L(c(z;2S61P3%wH+_Jon!V%uD~vJYH$OCzDftH{{!MmOp%* zd06?qk3${#9?{mi%*)8{gXEsi^54cVZ`*?TB5Ai&I+p+RmY;XhOy=L>F%OV){0+x= z-v3L?yo;R6+?Ml~)pGvwvOlleF!G(unAKSRdoU?90b?BVaG{)tT5|OdZI)({<)wqp{taBEL6rr7p{ts?Gepya#cx z3(IF~$2{o(=GXc&-`<+}Iq|2Jle2t}dpvGYhcbUqf_Z;=zqtKwp5Gfin5UI>awsax zSH8#VE#(sC?RzkvUz_>fOw2=sV&3FE@2{q}ncv*Ye2m-|ts(rcovf$Z8RofOF^?tp zQ8UVW9DU^8=C=AgKA+`2YG1J@-+Qy3baH=qki2(L?=RMK>JyK{%6rVq9b&#u>~P1G zEZ_7z^L!7Oum4B5ygw2-JU?&C#LP?o&3tJC=EG$k&rf9eLZ_L(kbCLl)AN2mQk{8) z5zJ4^?{gJ8#PUy`F|Qng?cRvA%o|r=9(@4wY4ScxwH+*(c-$$13A-~VnI~Dtd znBpIUmuLCtS((?5$ozr)-r4yP-2V-7QSYVP6aKW8=P^-t=6P!}&ykz?y;RIA#$nz` z-oI;@faT{#W}Y=9^Mn86{Z&`;`Wr`Be*J3ZndJ8uI>^1{j`BMT3&byc6hGTj>{yO> zY!Ca2T}^(1<*yuKUQ+yNqwOsJbqVv{8<=MkztC_C%jb~iI`t3B@A$}kJf~9uL&T3r znLpryeCMII+#~%eb*EeMo%vHOc^wuT#{8=Mj$t*qZ~rAH@1p^|nU7ee7ls)bI5)5ct3cnzV_s({^WgQFCuqz(snpXl zwPg8E^1MNZS$@tJ=0hd^ADW-{-M6aDL(2Pu`z4PaEqeCkX8rLqFn=KLAto37X_~Q~ z!rho>mgkyRoaOJwXMQ3W^I-qud0Bs%`Go7tt4aO*jI95n(^=0ZdEa54yvJIF!}EX{ zH`vbXIKlkGD&~FVJ2^$mvHa$k%x}xR338k8(e&u4Gc==e*nF7q0iT%&iljR2vV*Xvu#lCfC`3r-Y2TI&BtU1efl5uz^=V+6jOi`=W>CK4hDItmoxf=0CnLA1v=9FH6hoVWa$x>M*$0!)Qk7Qm^#`#iDmj5lktM#)A%l}u6 zc~EucTbeO%T$Op|n#@;rXMUp=^8xbyMSpp}Z*Y3nbM+_B@6!L6Hwj=pxzDqF4Y6av zVjfHGZ5EOHx9h|| zK26W#IYxdr;aDG*e}9JgneentF4>Qkxf%*TQGhdv7$8)aKGgC!k`44iRZKlLI+t+e` zE_P#HY!veilbHt-zg8rW<>N^_^K%{VyQ)c;Cw$KK@OLnlUloRV{jaR&ej=8CScCbi zdcvzPpDXcLUAb5PSnlC3+|T`=A@;wyya$)%D8EN=c`WnpEtnr`&iw5O=6~{X|L0X^ zzP%;$sppyhioxUGMDo*(!&yH2SLPEXZ~7x~(Un)MXP)@AnNn|DAbuxT2Htm%=QIDZ zk@?*_%riD)yR<{jztYP&Ldut{Cs|gmZ+8!5eoyYdt$EG*e?4R#VFB|#1DT(h!Mw1X z(^am+@>vTr-<62@7^$Pa{)gwQhv*3@b+AYox!rPQnLq5z{G6@({LF8XV-dkGd(9fLy#4-8i)bwW zcOK@K8Z)0Qek7Xs$2+50Pd7P_Zn>7_LqBIePu6F0xmT7r4X=mTm6+#j%Y1;eJ6!IQ z_mq2#i4(B?3;*)-wtd7r!+qw1<}x9hHeP+Y7 zSnB_A{$u$yJj?+X?y>xJ@w4^CP`28_dbX@*9{K?Dd=Ht&m2=gL|6}>YVR$_6rewad z9P>M^nBN}BJl-nindLs-URmeGez2a=^8N4wsd<7gO5U+U{K6sGzlr0q{?M_Rf0X-F z73E&j1i43)r2y;CCiki8h`pLLkoBCG_n{{2WchRQy8ts@vwWT(%vZ(=juSjIFZ1BZ zn7<9ne7v-q^d|SG-4^EK=Q2M#hk5rg%x`pN-m44q2=d+j^<`N;UJB+}qB1Y}9)~~R z`$6WjCNh62am!Y@uNbv3>lu}cdH>wZM@v2SXKa>F{5SL9((Zcc=d1FpXKOp=^JU!T zFK79CSD4H3PQa8HJii%IF+Wy}`Sa?`lLRr}A?q{FV3vP2f_c4R%-f2d(IZ*D8bEDVz2(ZXZ>LxGVdba$KJM;@IotK{*GnDfi9V zb>?=zG-Cd?0rQelAD%FP<(mv--f<}Nm!p{<9L4;Q=;^kA<)55neoW4@M$0{lu)^QI zVEv~LGcPOWJF8EyeBg2BZ=}vMMBZz7@P_sD6JCMCz<>tgU%tiReUV1$V-e&Y{*U6U zXN}}9g@ahWb1&wZ$1oo`ig~};%=1lV9#itle$81vvechD$$J4WlChqmQJ9C5`Kl`N zr9!YCaU%iQ{_wiWE%(j(KVkV}QlI>?hvm~sy!1ojtAM7gXIdHNzvMn@t@_KQ6yx@@5;$$CCSyWp1#1lV{8?zhl1Jo;QHUCz$YhkyyTgyw|ox zzGGbNKKFCZQReRtGY__#c?r?e`54Q;l5^f=Cs_WJoc~6VdB3xr^?VTdmJeC}?sw*| zB;WZW`B(K}JdY9QFyFkHc}?+ODIc)>H?b#u|6%!m#NYjqdq<;gv!2-3nctQEzq`fq z;YELkYb>8a^!M7u@*P((k0$bA$D;WnzmEAnsT;f$e_B!Q>z)=ro2oyzySF{_ zY&Dt3E6%)mZsxhfF8vWda_BePx3+hgA3el8q1?myTfX0ZL+;bo%g_2Zm1W+m5%UOg zU-bEMmJis+yp#BaTJqk_3>oKm;d#FPmG~iw#33!j52jnd{a-2ftPab2YH#Fs-!4cz z^D;I+*YZ-#C&<2zJDcUx$UZGE_W!EX6M{am{v>h_A%^ho;x|)^zsN53p@`VewPGKd z_Tm1g8O!`1`F+?+y;y!yOXjD8nBT9<{BuR-J@YZY9-aBUFT9=;{>wb7@D1NszMI7J zDI_nryO#B|>dCxH1?I&PGavPXFVdyD$voqF=8tzV-*bg|dug|6Lhk3Q^30D9Vm@UW z^N?b110-MQCi%j}6|Dc`Oy&orKPN>#|4P=gPS(S?jV%9C-lK_dfaSy7W*+#Od6f{n zj}Ap-UNR)}hLTqX3&--CV==!MlX)!J?KCSPfXu53#FTnzH;cv15be z{rbBpSx=|1%-hR+O_lt;$2Fe!@*@8@6t^2XGxI4$nFp`Vd{YJHZG~r%y84B-tS53e z=4m9qm{g4A=VoUfq9F6Bm6`wU$-K}E=ABnCkF$e$TB%ouzQ*#O<$mKcIXC&Uob{BH z^N2PQ55$o9I^2ZyZxY_I8OyJd{rkK&%TMaTeC#;p^+qti(wKR~9L$fzU|vD;g1GXY zY)#28zFpz{ZvL*ue3l;}@qd&JEdOaI^Q$7?eHY80Sg-`EsdezL30i zkHmWuq`ucQKF@D;iF>p6Xgd73ZGtB1pKc)+p@%###hensy2-z~-Rhvok8 zYB_&tEIfZ1)}N~+^Wz1X_shXNzUW_Bo8?o>{fc5eSU!r}--s^f`#0r&^+>tzk#{t= zn|TKFUcxsBuQZGG{2InQc30+mV)^97n5W6i{7M4m^%w^PNW2q5ysohtRZG;)8VVM>0m ziWQkp2x1#&)>=X(RJo??l7Nxi+R!W z%;#=kerhW72Qr>H#15pF_uwvk=5@ILF!R1r#~wSJS8cK9OV_fVKf)s(VENIHnD+_E^WHiu^H7zU&uhedhU~BRVz*bfU_II8 z{_yXzEI&i~`KSiV_mTH;Y7J!hHCvfiILmO#m<{^n9d^MK;CiTXlQlIQ9{%D%yWurcF zyAf0HddMdM?!-APAL<$N%1L=YW~jk@MIYu#<$b!_eOW$!d*+$seXHd1zSRwR-|&gN zPu)8#x4TR1*nvLHdNbennhf0>_=dD$cD;ZHK2uOjk0LCbTpe1oFQ3*}-yTfWONHwnux z4##}(3m%7;hnT;XeB`pMlT-y*&!NAV-xE8w?l#-EGW(g2-Nt;3oD-c`$MWxmXV}W} zvE-cVlH6nL7=gzje-h?bBu-w_i{&GUJ+HZ+<+I&n{{AQPFo}3wwJ*WEPaEc`hA@9I zlX>#x%(n=iI*a9Z$nSn`7C-VeE$b;BhWXihJZ?|+F#kG+`Q!%7M`dKb_#3a!Z&#WB zp2xg|#3$S3ymDnh*3;F_-=*&Qs{`w~HHZ2BgUq-7%RGw2$@Q}Ecn+(^yhn59CwnuG zE$`1}8N%|@CBIlAdE&zZtmn)H=4+oapCIv`T+a+BDRE18$=8a@_aDm0d+sOXJ@?fA zaQ`EnVjglj^Yv2Sh?IxrTSa3&mCZoFY^k$djKX^ICS_hWAM-ZlnMY{Ee4WI5srs?} z^ghh@$hpAfHY}efh;RVVDQW{oC#mhpd^x_NQPF z^P8!e|10;_qTTw99nHLr`Px~`*YsmvxdZb>&6pQ!&ivO1=B;NlpTCFsTDebhSni+v ziN)hND=qUqwU{TDy75_w4-?;IJxjvkbOk(x+btvUWI54)LiBGHJ0D;2IJrI+5L>?g&_%wl_*Ygo=rJWPn<(=2QnH@vlCOo4 z@338x{zsJWxs4I|X@7Hn!W3Y>uQKysjhNSv?`G6(%JStZGT)My`Rh2$*ULKDwVK!G zxCYGECSv~T8t>~NGnj{L&b+SFOGn6k*Ee#1yGvuXlgE=Y|McNMe6Zq|nXlc=yxJ1x znPxISv6y+YZOjwP@5N+!$MSO$@$+8D&%CqvuZ3e+KH661X`e8kBmR1a`1iF1c%593 zd&Qf@A5ECbdWK1Uv{&v6B|gh~x{G{Gxd&K4{9};ZA6~eI+ikUg`3I@ztXs(PO|~%q zvxE7`bIcFkV&3o}^O+Ji=KsX8E?4J?26 zA@jphKmR)++w)CQZ+RlWryN@3>&y3wOMc~kZj}1WA2~k_o|5(0cX5*~<9W~Aoq6NJ z%*TXgzTqU>rM6<+y+LB%y8mH4Z4&W1pOl;V zYdOFEOX>rQN3ou*bC{o7!o2%h=DTJyufLdi)P>9!E@vJ=+U+6ry4-T#EV%Hihq>KI z*O_nq#{6wWwzq>Mt{yGtSxY5v`kIaPpAfs9NaW{Bp3*cD>yQ0|pLfwk=HJABCGO7h z_IufXe)E2LBlmt|$i29QC0Nh(q|8GFXI@kCh;?_^&YYI_Q?ASJX8v=N_0*U5`rAu? zhRJ&_>!i*T;W4+n<`wfe5qW&>NF3h2KFd#)I$qy1ET31-7Y>%>b=7|m^Zo0YACS6A zv|lV=ATIBht~r=5lze=u3|R$*+6XW%)1iUdcjvpZaTg)^n#M^EL&U|H{d{OMd1@b2ASo z^8aOL`53vFzb?dlcWLJ3>oGstj(PO~%!5mv?V057Q(v&2av6D_UT?>|={)9vXPCFX z&wT%9=AGo+GmhBj?Q%b%o%~)yfzfO~^T_W+#9G7hDK{~%x0(4zxpz@P?p=%#zq3v5 z8Ge^|@8uyL=ZA}!f06Uw&T`+rgw$td$~~oymw6q=*vb5Fsk1GYx>+{4FIsjW>n|*M z;!WA71B$So>2h!O)L$(B=Qqb`MZYl*_nEo<&S~SQ+-~qR%(sgjD=hYZYd6+&Sl;KV zKZ)g+O=f;x;>;GpXUt_iiRC?%+v2a2KVm&+-ZS49f%j2Xxfk(Y0+tV%oOuhWr?tq= z@IU*UIUAjMrlibsXJEcv?B4M*EZBl@!9Z$c?_{vZA8zMm#pWR@VSzAba~5qj>~hMk@s%uTxUI}9y5P`plJ%X;e|exd#U__@A_pGx_J+Vdtvir zz1@&`A13`gFZJhv($5M~S3E5Dc?L;bu|&=dL(BesAb$LM3|=SGQZo-Daoqv&U+*%r zo_|DtcHwK%vYxHdZs9^Kf3qO-Yoe!yGywVC;e^~@7VzE(r-C8n1A_u?wne|iV=@dufokmnj8`#Oo_ ziOIx{1xQ^toaB`OH@Tn9g_pd=^2#KVCS7j2aHdbWtY{T-J3^IPoj8j1I22eO{h!gor1_)YA_k;JS&rr49g z^1KgZd_s$VSt9Evl+0JrbllIKS(y)!^>ak>uT=$D&%+wbS5;)5t2p!Pahbo8by!E% z!)}Q)&mHG|ont=p%M+Qm>dCxfN9Mn!ju*Be%b%3{^y8a4u6&P$9czGUfT-DC3df@#PdC6e0uNYcDKv^4LgbDA4r`% z(Rh|WD{;|88K2NHkJV({%80*cB>u6f#365^u>CA2@pgdZ9e2e3M-zK~vo^PD=Z4Rv zpV@>@ka#1ktgBzaxIamxUj0t$%w;4#oGSZnlB||6FU=A*3XN3tmnAc&;Q+E`SshFZ(PWHw(uf5S-zb3mrP>M-(O%oxlb@JxQ==J z+028a|9>52`Mmd;?-%><<{QiZdCPo}8N`UkVCeBXMulkF0;H*xR4tj}nW$ zT`P5)EaG<-ivNlu>$!^9;f^wHWhJgV+?U7UR1@YOvoa4#%lv@YjkYye{@)JFhfig` zUgFqKLs>qcJoBFkn7<0f{Diz;a49a!Hi<7<|WApYWivd$aII*+=N^#_-JzFWcak;E_0 z*vIlaWgRw^I`hCGtfy5w<`*S@Khd7$zfWMEWB~JPq9>Td&*5dC{;1CSM~mH_BysW! z`TeFa^816=#NKX~ahoXP(?!OiKrVi+P~yM7q-6P($(gqh`yVwV%g2br{CXkg`@|0a z5Idi;C+nHontAhl%-a`a-oGsKHaVC_OvC(~_~k>gzgmbL%Pe{5=)`RQZ)6kxf&2O6 z67y$cnQv~$e6sAXcCwyty=6U9Bwl?i{jVi?Q`GmYKeWWR7k;pOq>aqG%R21Qh~+B| zWWHDYOIV4YL*HdR6D1G2Ci|;g3f6Na8uL-vm|rZ#d{k-X>16%qo5=EcC7-P*{?aRU-q-zsS;c*X^&n9+qgY1|4Qa5<^hV@r{$y`2X9x(Dd%THd$d}3GT_r!mtmVL2J;_A|8 zSbt7Amkcb!_J4O`<|8h!{yY-52W?{c$zqq*KVkV{OPPlgJ1}Dj%MV(^e2Dm+Y!X*T z7d!uaChPw^i+P6a%zLh4{;D|h*J+sd8qNIFN#@~pF%Ki-a9o~uc_r2}@e{vac2B;m zIrJmTrwL&FRm5J^JHqm1Bu^~7j^&$6KAu$aqsvmS_$_(IMu`*Z%6>m1_H+4Q?*AGY zhpnGk{=g&Vt!^-HdW-p|bIc3%W4>4Nk=*rJK3*T@S8U;aW)VN0TkJ!C$S)Ur+wB^+`*Z{I+)`(IC-$MI)B#?I{1ovoeadiu zz6CL#FLCVbPAvbcBJ%=b&+E&2JF=GbbQFJ@Lh{zs9av9%dES$KS$>$rMP=k1zrLJn zcRSAd|82nB;`t*bS>F7}k)bRfYA^H9a$hc{?8irP9yCtwxs8(dM^=hGk1FxZf3hCp z$-2ra^Im8Wk3&ka+e^x^T?#M!drp?WEpc*Z$#>RDe6nBS-hBJ`xqhx^UiTOC-6gsI z`{a42$vwaViC9lE*+*%`?^K!3{VaWuc~Ob;n~9yd^po|}m*=|Dke}KL0P zkNDk<`(yVyUbbTS5Hg+}#s79+!OwMfB=doVm@j$3{b??KGwEZNewU-N`(v zldw{IB^&q!&L|7pZH#8N%`lRx;0Vp7~XY|M%}<`L;6t zStSphHG=ijl|1WzO;~$lbO$zynFN_mOm?YFX|VTZ!PtN)K6Ld-ZSRCCGYDh`FK5f zFW`~*NN$yV{@n4f)vV2;JpP#;G`EBo*Crr%qQb67lNiOU2&0^L+r6=IzZJ|EPuW?^ZhNDm#xG6bbaPYr4I04N0#r~j(Kf~Kg-o%`L_O^)lyV;Le&vVIhJ4-xMQT*T;c@Olg)EQ#Pd2thoyY|X=es&z==ZbrZ`CszA zj;^`bkC)2F{Ed7kB5-;j#}bKSScci&97JDs_)FDR>@J%K8i$i{-ydyH&-W=Pu9BHM;`y>0&1f_ZnPg`SNX3q{XP8PDvp?~>hP{fAdGzcY$?gEgX ze};ZM&Q~WfuOshwY(2#KC(L0!WCZhF5+8>Cm*v-r-|r*-E4+$-I>EdNC2W!ZR^?<94z#PVEY#9n=sbIjEe|1|i_{dswU z`McfBZ?0gTLGEKb%g^%5GBA%P!)$7*+DM{1Qj)5&M7bB)2>LEb}l|ng4pjJdN15hf;U7@5#rO^*LPfngw!i?TFOv zZ%I5{PV9dt@kjPv*y{^CK1nn3dfO}U=U}nVnWnS;XVUIQsY^tVJS(59&j}N_-MZq( zM?GZuF6Wr9mhV%ImWz+YD)M-?D#bjZoUG z<|UHEMSY~6IZe)m7s+>8)&%nS-+>8`^$=6~**u8* zzgXhQ;$K+)OLFe#BH;!0vz}}7m`5}I z50{g6A4)$jN<3fmI6v=nxi42y>ccx_{RG>~`rpZU-+++3@4iZ1>yOmO?)2k!7tUwi zN%Gt+vK|_W-3XqW`)}X9Tq5(hN8+oNVt+bGJbYK`?ce1-?Pd8sWM;Xi6kg7klYZiH zUMA-ShsN-@jcvd@qSSj!i2h76o;@Vaj8lf&eJ}E%#ID|wIPkaF!}sDZZpk^tgdpzc zxIN5cE@Ylh*45k+EPtpi^9gbfp|8Y;M`b_8l=@7CZ@jK{$oup0b{0Vy`la zABmKf^_+p zi=Qe~ll2^vJR+gIuW>(+^^E?_cG8lD{9w!}{}!-`OX6 zk_ED!*gtt3-bx%YL+n5ci9>dT;dT?(Xa29Ow+ix}PIOt%Q&O=0f)c---p=Dt=sEMO z7nx_0`qFsuJZl2x0Y|t$=_T&kFL6R}v8w?RZ&&Zf{TVHOaPSZAXOOJt zyz<@e2a;!%zQ+1X$vNH92;BelQm?BRk>&5@V}7P6^OlltE|L2G9Um-Syo^54#tSpTJC%$s#*UPkus6Uj%0Nj)l$tcNXy zxZUj)m?xBZOe^)_C}OW(%DSx*joa-f`z}LemR~3F)s{Xizp+2_HR3nz_sc@c`{pO) zUPNW7V?URC=eCU746)ni`LO~v$hcjTIzV#S7X`#G@BPkx(7Js^1#(Ajp z^R)Cca$Fvu#u69V@6DZ){OE8i)}Kb~z(tvt!+Ur&Y*1du*APs1hf{-_Or`SLX4X{4VqE)!fg7vOc?tT|FJhdQ!-EE|>GW2@*fsdE5)h zmoMz({=}-yJfq|hgVV9R{fS&yMjx}Etx$?FGpW%*Wxm}eG${aoswYsFvO zk^OZ};*+j{+@I#znE%Pme2tv<O$>u zvYvC*ndcP07FFstSd!*1vZ=^NQl%D@mPynAANYG-dsz#jb7; zdwyH|WBO36KeO1q8&VgICHYhc@q>K^bGuh%9llM*^2H_3dN20Yeur^yXx3j>;>HPY zdHsJBzfeck;i~Z5Zs^^tf1S)r80mj0$zN^Sit>x(3W`z$rInq z;dPi-_WNOpXPP$VcH?wpzEJq?lq|nX=H2YruCc7Au*8koBwv^;_5AJOSbx?^%yWtU zhjL%HmDuyQf3yCnS(qOaJ2_wMYGJt-nkob9k1TbPJ%6$MJjpkIp5b+PIs)rSF7fKN zQY?Q?@{x)1TvO$o=v#i)Ut8kdGvbe0NxOUGKGiYdU8UVYVprP*asNX|ePgi1$?uA= zo@SGnXOlell;q15WnFcabGlU$Z@dvZ-%jeTRb>ATuF21JI4|=HGB5FD{cK9idM1dy zZ76mu*htp%MV{-NtdkzSSWo<7%8IMT{_72y2b1+SN7hxw*sLdptgEE5Zg)sO zhlsyRChKsR#1-X*mzH=VMk9W%Ut;Ia%eW1exUq!fFF#}+8&%}~Je2yzWZ93AWgZWS zy&kqE*wr$!Ppi~m zJ%j2puPJt5S$UREF7apR5-k5p@}_>`j}D5SPOVt~SUDd*A@!UCEm+S1iF3BddhQ^8 zyo%V#J`ykWlJ&DY5%)8V%*%W6*Oets{wnpxpW?ql4CDS}AISW&)I)ko{+PZh>)G0# z`EKzGE5*P3l=v`ecGka8<|Te`mX9y%ZGzP6h9_q|nPeUdcVhWsl2_&yyZ!RuA5;`d z>}t>e6c1R@gL$X|%)5zQZ7AmgFH5nW0WxkoWSld~JjNA28%^5nvyA&wqA&Awaz2t= z;-XICe_u3Z{pDnT4H7#OzBTJvEc%1Q?lqIVCZH_qPgR(C9+{U04O#w*_{U5#U&~~@ z-4nkVxe2#>H6QbJ5?4%@{^S$;7ESbwFU{?qm-SX#*25}^Hm35va8_S2a z=N0=lO`a>R*q?yG+^*$8$1<|~2=RkIC9kPfkoD}8{obG=%V!b&c_bcACi^9y^kF3%YZns_;=BE-cpHzC z`}Ai0Q5P_uAnRmNPL|IvemQ<2mJcWEKfKugP4c{>2eAGey_heQd|`^%ffLgIHnP8V zh+VxYb*J_s|DhrGe_T)InW!^3jBW944NEUBN2NzQug_m4J9 zJ*S=cscd5Bo5tsMPsL&WJs0y!5(j3k!19sBE?pJ*sglQK7kf2R;(-bhw?CA4prhE; zg5vkzRp#d%*M@l#u@51ev3zdvn*(Is7D>!{N{3`#Q{v&Fvaio}U_Dv7F&`rK{F~IZ zzRSJGO0ijgQ@P*uBLd5BmUVS%2+NP{&U~uuiz+Etexl6FX?dy6x< z0Q;V5&6@lV4F)pLBI|jM_}PduKAR%5{w-pMr-~muE_V2&_@h-#xZSK04;(GU^2ue~ zI?BA;_m^^r9s4EwbdcPeofCrlS-cwayp@>WmiQ{6*uxhRCzqA^9UGO~y(fPBLm^-??9%}m zSUz-4=B;F%JP`jit|{x8E9-wwJeIE$$o!D_{o1lm6D46ipJaZQW@h;jGH&T)eRgQU zda{e1`7M57gpBigiT4%R@6=glcrT;x8e!jR&^ekb%pfU5% zV&^kRoS8-XU#cSOk1cWa5jn@7CgUF<@xUoa{I>lr5gtA)f-lcXL#MD|_phTQIiM9d${JXvCe>ow3a9MP2cfRDCOKY=y!uHIYwq>5a9`g_q_x6AMk9mw(%>RkZyuOU*hfXZtPU?)+?z>)2|zxUp$e#;F>&d8R<_C8MitTH(trg&lN-J0233i{D;iUcZxkfai7N_ zxs1c9Y@)v!^8ji0r+lw+gT&9{B(G^G-{puMj{DPF{BoSoEFVSkjv8fH{;urD#4-*| zB(7U7b)LiTc)oJW^S&0p|5sV=e=nKepH*1?m^^PD@tcw4z4%qq?ji9DJLFuTUm@=2 zj6Td0N_=Sd8H)Mn zg3Nz4W4=QA-%b32)gkkVAKxPOq^{(H!(|+<)#3hMk#P>l&+-QoGk^Lw^8-Q5gGt`; zMEqS^*+(BFzw4TW+dU=w+P>q_P2w*54(%7I&mWZULcEsqojrlv|MW5r|H^uJDS6gk zGS123al4t4F}L?1T1q`?UPYtcut{2htMV##-w zdPtl+)amD{+UpJQZzg_C{HR5x-U&AqfB>t|ptdnHoPjkj*{R!p!Y|-R9oUO%< zm6UnBAbxXk7w%6~v8zeMZY-C0EbsC^*ueiJPDm_uyoxekRpoa^iuJ{21LjX=o+=IV z#Zs4BCF|{+%**aLtUpvC=C@>C`pLP>p)joH^l;|SWj|h${C8dz*7Hd6yLhr+UNmGq zWqLDTEB5n6WR~wznECE*%6zFhorHSrg5 zrQJ+2Zs9v~yNhL=Op3trS7aPQNWPrB6YF^_d31pI@gH(Nl6e#BPc@2pXt9R}Qn36v zITs6*@7+z1I$oTitbf{m<}<`DO_n@5v;1!RVDVqYWItXW!Ts4kjrrTI%6JE{%{{(0KJF_rPTa9^d?<&Pa_o>9iFhtxevr(->t#Quaz&hqWXFpn$#BCqskzuafAcyEiuQ5Oqw zf3k^xnIdt^d|Br&Wt@jdeW1GZ=a`($9)gmw1z!^{kV)I;zC&r9}UMvaJ7LKjuxwF%K#GXs7t2Jh50$ zHCb0R#Xff*zF89;ySSGQD*CY=eBKgI?axN2I z{A_yBb0H%4f3et~2~sx*FXK~7#;2mJhgdbZKeZ)(?kVw1iwLaeww&`emvz-@D(l%R zemP=8md~4&d7>q3&(F#4Ef(C$dYYeL9$Vt!j)PhLP-o^XqcATn`@Q5kmXCdk`RNwS zn@hYmP4b%G^4%0I9R}NXh+- zxPW>6>dYTYUNBJ3L3T<#ZK%{G!d2vU(`09!Au;nGYkAyWiobp@?H(-8`lHJF?Jp=QT5>G~yaoAXf^^BH$IaLUjkI;+x&r!^mieG*r@qgx9JTK*9u>O4#FV&sE z^3h~oW=lM?^B?Zd-}1fI2$J_b8pr)n}T<`B2$+5oH{DNqy|&P}W~k*4s&Wk1RmO`Emu;Urg*ttwJn6 zH9hl-;@8fKd??9t(@bUki8?Uf7mRrliL3i8W%>1TzLr3EL0Km~9|V6_Wp9v*hDV#qQbf zA6=GxT2<-{Go=1@RN}@C1-bvbg;y!Z@{`05{*itj5qnrN73(h}dCfA36P`(3@z7bG z$3juK-2!cy-;n;7YsvBlt1Xd&hW!!my;etd`6pNC?%pVwghwbL-Klz{n`})viwF_&u8U%?K{TrWxgV{;&yw>dLAixN8GxsXQk}l&GA`2dNk%AWE`sGWchU> zUpO|)hZ(}Wv(!mO1hV|?`OJTaeLEzHN9nPw=UR5=zr>H9mwHi0$@|iX-|vu|+if9s zYUWRqFXSlQRzB;I}~an3S1@8~M_bAK%E&u;0zeedFlj9c)KtUsafF5)keNL)He zo_B}E=b^bj_I}FyhAbZ-`{hzMmTxTUKS0JmgY4fu^8MSbb-3MpvflcN{=RbGV`~Q1 z|CiY9sFE)flz8%ZZq}dXHs`IsB@XN?aZU`0bEe38`(BCrWA&vEa*y=1*!g;atbdl& z&C=Ck`9_j2*O$2Ew)mGqBLAQG+1V1G)RA?*rXu%$o5UOT-OI%?FI6S3-Y(;FO4k39 zQryq*l7~)|{&X(EdNRnqcp`O-43clw&&>M67h&Ea9P>e)ndcOLG)nTyi8WbILdj2u z$~x>Pete_&@mDgx2W5Q1%6_kviTnRC9rGNruLGnW@?P#$hLrmcvBj?y5j&q&?DOc4 zY(JNU;^zvJoq1b{Gh4M_`4F^S-JJF8>Bzit5c8E{uM$YSG*`}9s>pl=$@i8Y zNq!Vv>Y@*1pPp;N&$X;K^EYBQQj6VqB=gdt9P1xcnt2*IkLV)%H&FENPRsfWh##3I z^FB-JS5vdF{>XKu>!E9x_^D)I2e z@jO0Ft}t&X{^eR(Za4BO=2zA--`I!wMY-=Z`6Bo8jpS>gWM2=FyeUs7?$58f%;QO% zKV9mjH)Q`FmvfUavVKNL{$yDsd*!}LCyAp5OCEY(;+7l| zzx^xoST{01*Jp{hQ%__0X;K%ul#1nd6=R-L;vD;~;~j~6|0nh{pRDt*V)w4dz3Zi7 zR|Bi^bEWCP+`fNxMe>nYvd#<3eASozm|pDgM47LpvQOJ5=I7ccesim|TV3LTH*r}1 zf_uEbwu{{>CjKsltbhAm$fSw5KmVj;ep=$It#`TqgOaeG6fv2XmAKB%i)VIj|G!IJXqecg+~UXENc}KMbRLJq;!nTJy0!0Amy|k#eGh7m*vYK&-GCs; z2QS6o=L#?R#c0VN`%0YiLgw*uQf~Kzv@7N?Ad>j~D*0J|M(O7-d9Gj5a2Lsomx+7_ zsY^@~zn?fe_kV);k);yPPms7bQV!OiO4fP5>uk5@$i4KeVh6rSJg`vg+jQx_eedOF z7=Er45?5cB{d-yLL!`f1|9tUx$HXq(mwWzuq@VV?=l5m36@Sk2l~Md`aamVWWFIZ5 zz~eAT_SX%GH&RR7wN2uR>9UWq%KFJ5esHaPH@lmhgWO2R&l^(KTW+ayHkLTV-v6@u z-mfGcD<$@SviPHn;@@vd{4+-M-;{gKEB5g^EGPBbuU&YYi&>l|`ABE6OGBiNv0v&f z=VhJulKO_}vEOG|e~HH@!EWZAWM9XU{?`fO@eICB_)_Kvaxu>+_Ia@MXG1X7b6Dzl z`xml&>^jVsi~l+x->+CI@14z-JnLfuZg*@$;SHDvh~3^U=K?`;k9VBdvEv1~-MqD! zHy8Way9CP*khn2O^3Z5vhqFn3^rjKF`#)JHVP(Cg6~Eju3hQq#{_B|d!POE+{Vyx) zUnzOwy$~#)Rr()A*7HYc*W%KRvaX`Z?`vd|-+P)`jQihT@|xOGH@+30_1u>@YQinH zlP$&Wy_EG6PV8;qe%3!s)^l*_Pp;tnTpf}z|0VBJl$Sc*W_kZBhQwF)UGzDUUpJNh z{17|bNZL*KjK}k^+*h0->+Sw7)^k+s&wKIXvn9^_A?JWmWPe2#J7B-Z8cFQWh`hWW z0<$qsAn|Z9(GyIbH?ypt)H`{c?~8vtA>*^Q75D#MRp!a$`-;)z{niFj4{R>>{JM-! z4_UYEPxCl@Jk0#C#Jv-*viyb`JPyl;F)uEDIgaEb{f}|GGq*E;BCY`L?U3+=`bQ6COQqEJJO5HDo_`B~? zk9sL~_=|j}w1W7Z=~Ay~CFl5d4=Rh;`9%^><|xSXW&667*oUxUpFhj|CX@5fX%cUj z6+a$L{O`b`{9LW1&Kdj~uPgH-!QZp|MydbY>%;x&Rh#(&$&V_D{l6&dKZe91sf%;F z>sm6eDfPe_2Y4L1{${@CKjy2&4#$+dV8u|@^IGE15(D|Uc1j#lQsViD6S>_*QkO0x zdG{HKAG%4sE|J)!CTsY)Zc07S>IoY%u%3sqAAgAbFD-R|1@eB@45@czki6i#@Gl|1ni=WLT^@O!4x!rH#-vebGW-rWo5{P}9)|%zpmSFx_{QiBphj~=u zw~-Rh9FqQ*khuD{oPUjxbH)&2C+|r-cA+_s!*8j>Y>_--zSJ#0Nqyjh*s*!yPuG{{ zexBaWd|_YayCm+7A@SrwiHqK@WxKaW_US(HYx6sCKNHG&%lLrX-7Wp>CH{A}A|I8$L$3v;J zwH141^}s2< z)-s+ABp*p8>obJp3)96;HVx1HiJFV~aoI;>#4lSt@Y^WXKcg)3`tttrBsuSnAoZDu z;%9%$IE0sVl0w#1avA62GB53A{Tz|H_q^;pKKtak=F57Un3(m1mwo!T`0Kl3PYy_) zK2@G8x71JUe$JE?-2aafXWl!(cDwlw=9wf8d@cE4p+&6c$5Q59TXX;C%D(6%>#fsF z*7K)2^QB@p?nqw0us-WaKA3qhiF-e7=5ZL3hxPQi!Sa<_F>fw@=Zw^U_KRH|HJkPK z%FX?}Aa$^4Vh8rgIINd?T`q}x-%DKGAOZLDo8|;rxf?6c6;UpWt@9Sz3WhL)>D#kK)L%oo=NX9 z&wH8q0k^B8kt#7tz^v0hh-i|`WZ>;5*LPWKXZybnQ)fnFKuCd^Ct7N-MRn2gP7lJ&w575 zzUw6M@Dqt28ie3>GbUwzKyMD0c`eCP7T)1?^;P2etP&R`m32N{>Xv&Y4oN5R zo8=d~CB9uG{$jn@pDS`6y+GoSI1-Otmgnj&b>j`>Lp%p8x}JE9-Z~9+04A#6y~Spe0lmKZg;2L$N2n^vDeGKJpQ}IkEdJB`tvkq zJzYmLk6fJj45`mt2*&cAq|O;z?A3(*-2Yr+C%e~U`6^N$n>dsEIi@W0rOR0Vm=(-J z$ol-By!SCn#<^c4?oZE7%=dR=zDVkg)#W_8faJxWWxxL;d1x51+o|N7`kt)+RIcKqBk@K?$?pzJd>BUNE2W$-l$JWiGuanc zq>d4*2+wcPLd-MC{@NkqA6m|Z`-$IwB+vUr?D=cSvvSHldM5EqFtN9{CBNRik=IFn zsf)IeIzzKMJkBSiUh#AUx4UBl^BWOa|I0?qZ;fOgM)LQa5;r!JI3ejM?&k>EN53RK z8CQt=8BXljth?N9>gmi24P;(J)=7A|uhK>G0()QMuI!^LVkbk2{wreV>&t%pAbDA! zoa4;+ACJ%L<;<`s)Koc(~BQpKA+otBknkFcLph7eBQ<7x#0{0OnO>9KOlC$H~t9Y$|oj`N_E5UlPZLmHD#!;X500e{xCO zV&^`c#&JLIEoMGEAGf=uKJ$a(e;2f1`9#T?KM?e&CvzK)-U_5W$Y z{HMfw^`f!-IH{-E`R|pZJTDVu-?bJ$xJUGSKgs$xh`n8Iaj)d*3D2_rNn(EzNnRgJ z;;2QEhjwVq<6lqWlV1n9pE*T7o#b(apRk^@Vh{h4d#V*=+^)+!4h_rC+ez*%oR)hC z7bPzJF7e@j6a2h!OLKo3NPRD%#4Yn}K#`3ULH?oBK|Q|dw)< zd8hfg5_7Ww_oXiSY9;IGD9^Q8?yDT{!Ft+sV_td}^G4#2@=E;hK>XkUv2U5h4r~-Z zJ982b=z`kJA7^GByCFYs?f%Rw|Hr(n?CT^2x!vV!nGcis{XUi3O(5euTh?unE37Ay zzRL-ab6|&1hPo{Fi-S+ z$j$RoR@QT!q%8mMH|~EbnU|BY-VTdD%_H*TWnRL|ydRf($cSCs|31P`OP#Zj++PYg zll5=j#yqWzXC#^5R1(KNlX`F1wmgrG3o;)ed1bT0EPqt;sppcnrmoN9P)hRm9XDCN zxWwDtB>);M=VeX)Vf`P)u11r2&sBxT=fWMA%mH3|Y@j_H#d1iyut$kmalF zWgc1T6+0wO2&&HG6WEpcV(~{kk8^)|%lX<(Iscj{^`f{kFG07s-QZQZ|BuBV1(&*3 zR=Lj^P4db`l3)Cmds(GRa6hw)|B6$L<%8E_9w7E@Q9mBHgR+mJ%lS?g8PB60q+XOv=J99~ey)D9 zU)omYb#goh^Hxt-e@3YX&X9AEgc3((?Zf)xN}X`L#5r5UF2xi3e|I)NZ}H*WpXq_j z`%6AJG>hn$_-%s3u}>xL>LTZfg=8JRInVuXBz32{;;)N{T@5aIK?m8t4P^ZXY~_BY zSF(^Pc5?7LmH& zr=GlSt2bu8PS)EJsjEbgahoRbK*E{a?v>`uv&i|#MVZG}VwcW~-7YKn#iZ{%&UyAR z|9FIXec9LB!ja^EdaiPdnz-Wj)*!Ki;_@>j^LZy1mr#en~y5rsNB2CC-^IamblP zJU+L?-(8eAd4ky6RU)5C@|5lpha76g{Twa!@NN+v|FaU$Opto`=9;X>?$^bWI{6=| zC+`rucUtNUNtW_BToyYM=Q+z)690R2Gs{Pp^*LGg#kRSur~U`#m&I-*llnuH+^pwT zQRcJcT;@v;p5Kh`Sx==A%oojPep%`v&t?4A{l|Ky%J*DI{$wS9Wy)>ST+gHg8vP-5=1s-!J(u(1WKvhWCU!N6#Ge&q-_2Xj>!Hp9=6~+?cg1_a|mI<`-5m|5%)PfpW}q$hy7uiRCLv9yg#b%V(B2^Tbz{4+!LO z&RKx@x2(*o-editelkxearN^ZEFV|w(%*7l^p)7R(l1zlpuAsG@(Ih2y~}*o5#|@A z9#To-oPHfyPgr?B@xAz|K60KCQ^t9%?B6DmFVB&A`6=!Gk^D5_YJT2t5+9zEyt`*1 zUY{+4GY^t|U9AQ8=Vb`ibGsb#baG!P>r>YMMDmvilHWa(I>W**tbh7s=JRCTh7^0% z{XXkyB=RjpenC1Ow-T~nT1frykleQ~CUN`XHQfKY;$KosW%)wqn7@%aM!!5PA4B?C zt0IrjL^&tQCFeV1esjA!r2doeBg@a1^>g?&%a{Ulz&{an$U`L0FGw+L@7adlX!+kAS%`d@u#{#nj_X32V+ zI)e4wka~;#9?B^3Q|UwUy6U%|+nqOodDa8WyNG>GF`MPzH)Z}w>N%H(asR9SVm)J| zt~mM;%g2T|mzYBR6?llk##+@I)IS$<%9=5@sm zhnD=p-n)4x=jOMPb3Y$7=KlPW_#}bc-)_^H_5buOO~=1I!4{_ruFUyyo51M%0VME`wRKfRi8KN}q8{#-7|{DJuE z7Ls?wm-sC*A)9RQ{up=gSkHogr9!S;~7)zPp*e7 zA5#49bE#{EiOc=`CF7Z0^zR?a{Rxyf^V2<+A20VDdX8lIhEk{fOY*OLi&;;ZNzBU+ z)n)#y{tf%V&=IONqI7EEQ zyizpo=X0qitT+9aSpP`LyGQinc7w!zuBpQMbDU#-AvWv(^NrDooC`mZx>Mr8 ztp7??<~yV=_qjaxe|c->>jRm`>(1@2k#n5XQg>>%g7wt8&Af`_@3kbJKYD`ogqg+s zlEh zKXK*!BFlBwKTYC+3G!TdrH)af8TY69Tjt{=PZ=bBbJD-u{~=$PZ<74cmn z^^cPC)4%0hzMaISGjno(s+?yYRr0K2|NO>(sF9ree^T=I)ICs5z|1kM=Z(ZslaH~U zX5U#)$mMpK5e}*{5 z{dp;Q%5JHv*So=bzDu2Cj>JnLi?E)ek(d_{J8&tG9cQ?!JTH6Rv;I5c7iO$t`9=~y z*Oj_ceDS{-UbFtc?lT_|lb`EviJ$99ezaZm_k6(Zrjz~hFf+@y&&B-obml)t@N>oDXQ=G=q7wfEZsdNxl6u8_Sr7dWvz{Lk zR|f^>=Zad3^;8YU{E)eFF`Yv^xwrF4&PPg1{$6Gm&&!zd!XSMm zJ?~~Q5BSRc3GtD6(Y~zbr_AFpiJ!Mf{p7slp{FZxf9#&~9I-#c#Qs#d!upTP{(3*3 z<%>(cJmmj$o%ch}T@=T^B$1u$QA9;0D|?SJGLkKly-6f{3)w{?GqU$iWMw~OX3vz2 zilm|O`~&aTukTLho_o%@=bU@){oF6qMJ>N;eXaoiZ+=*h>kjx;*k?@|rpKKH{@ zCCk9L8^35d%bnBsz(pE&0zVuB@<%~@o(cV*+?9G<^8d?F@AZcLiz|G;kO6vjo2BK6 zhy2pKy|$w(^sidLz1$14^|-kMHNFP+amV&+`Yo{DW8u8aV58?%7|t)Y+|}b=2LJDn zqUoE!{(ZKGmgghI+oPJl?<$Rtf<6GS=UaYgKCxZ3 zB7P=odVhb7e`~4v-1XAj* z4HF!+{O*n#{{-h&znt~BMWFt7h4VP~%6eS-9jhUbk0JuJJd65j{OvuB4}p64C*tltI_-Cire6>Kd~33%udl^1gu}kI0?5A;>ip5r zr#%h#KqkYv#)FPp(6C>6UdOj;JO%C(K7;RMn}D9{fZgePpFuCQJhkCGXc5$Vw}xsy zr(bH^6TU0&0P)<~P3t)r@Di|IYC#_(8RWbIcDV=f?IFbHFz6q?7^(Hs0qj^7>{4`^ z<}(iFH3ItN2@fd3&}oszJ*R5if1}3tPSp6M z!CF738fv`Te9fm&gvOs-(0n37G(Hvj74}e%WkH?)t*z#73HCh-d9(UZJ+H!fn*a1! znttO_jjvd*`P}NM@gtXUg`O+>ZkEf(0{9wqUj&+)8lUMpz+dBKX`a){_`K|dkZfvY5Fw>^te?Z z@85#Fe;4Q{`{{9KLVxvaXDv_mMUDRl_W&&`=y83aj(z2=`FDr-A2eF?|Jqvf33;XQ z!5=iAHoG)Fvz+EL63)9%{M3AkLmsTLUGwi&PvZd)2cF;5j!m^E0iV zm9U?R-lXXRTWWkH^a=az(RxcAq;XrQyA06h8IYvq*#h#!!g};+t>p>Wrg8e+G*75o zCY;xD_P5vgHJ<@ZHC_+)clltwJcIh-HS9MlmDGMR z9`37*f&ELh!g{_p!9SY~(DXUb$14cudcTiqJ`Z+kJRJH4KIWR<8F1Gh+FmK=G!Est zVM2_i_gtiLn<$OXf%Tcq)UkoTu` z()t+){kNjyH2*ZP?{U~ax);}cE>+ZcrjM4hl8wg0yfwZL_SZXLUvp-@mS@#Mjk})E zxP7?B1CD7q>q8%jemCJb#82~7&40xTja$J!vD*eM|77r6zsZ{a9?*Xv#KYhXnoqg4 z8Xsn><($`D<4-I#Zg*GnkB0r}ML5TN@LKa3F-zksVgL1NrIxcA^zA?H*8Dp{JnUCj z^UsBQ)Dz)+c{A)2JHUO6TM*BCLmy-3d_Aw#usCp~UgsH?4B zX!^OewBCk69Xn};rf&s#>KDWZXXpd}u-5$JLp0vcTjOisJhyBcO}`ZG7bW!3^hsVC zFV<7ziy(i+!uM|Lpsx7cMf0x?`QjV&b4EfOI0|;TcR>5kK&WRX!MQ-T7T;h8{^T^#CV)Vo=Z|pibLN+p#{edH(6>2PQ}d}0`<>EMnWIp>S`^g0X9_La84Qz`>9WFwfqMQ z>T%;>y{AGvEDQ2qgTClr$O~K6XgO_QeK}v#^dBJ3|Ajhv>=>)xJ#Gf%hx)&Uu_QNi-=XCn z3w5SbCC$fat;RROxsTm_J??nu>rPGA{I^5jpe*#$Y@y%&%U<(e1^ey;(4TMeRL^U1 ztj5>GYy9D0EzkE;8t=GVw2J z-@>3jZ)K|a(Ejc>_{r+7nom@9jcI-y0>goPkiNohhs76QN&s{i3Fig#7z!oc6+|K}vlfAB<&51XcOi{Tod2L4|R{AV|;(>WmLqfkBWu(ldM1^ta3aNZFM z{kM0p?soZUJmow46Puo{Z4+4`81-5bEKlwp#un zuzy?z@;rpToEOvy4saf44DtMO9WCcMXN_kp(|DZ|8aMIP_=jYz=U*_d!LYBH2X*gj zIQRc_UXQyxNaLd*&TlH9=hbJG#&=%OxJhM=|CpxbdALmD{o&qk9Q4CC!~W$c%&P*# zf7c3H{xi_uXb$_e?I5Q)*w+s38`SjF@?=9_x<9PD(Cb>ydC-R$59h@j%(OgfV^ST0c`-X#OKW55mmsHjow@IxRG!lrokmm{|EYki=jSm_)YW48K&{!eKp?UiN?KW zYJ5gVjaP+u>%LCwzx!y7Pl7sOI;`umwKN}lu%lmNO>Yf(#QM3OuM61StGT8(udVSJ zy*0iM*3kyo=k^3Ueg;0rHfcRr^wN0jTP^1gs2fWF|K`m!{{tbK{~G9LzP+vK-*4CW z{ydG_xoUZ;PS^Nr*l+p`()=?DYJ4@+hZeAp`vrZuAI~)ZztCsc3Hu8t=s$bz)clJM z*7_-PPUAaAY1{+qlQ1}^Xbkx-2Ikce{I=slEl*eItJlcXeSpZtT0cKaYW{WeX*?GC zMMeiT|Gr?a-UBs#K|77_hJ3N;rKZn+{n-jd%Cd_!2mGuIi!bv%$}Qeb@8d1aYiHAS-A(Rr&F2yLXB*H@GdOR3vr6;7 zI9KCs{WYEszF%+&)^?niuJPitH4fp&Pz?4Lb=|d`k3jxLshWN?_``xsO@B34y!FAMSCxtXR9a?|(%ILC_j%ahnf z3O+>pI?FgSSRQUt&G$BT|u8CA%8`}dB^3mnty9p zM|poVeK@Sg#&DmiDC~~{e{23tAPyIwr|CCC+^7QkEN2UC_o-tv{t?dgN)FNV%i(-> z_Eb&(4)`Bjsp%JX)wnb0`7Z2(0yk)Ve%hk(bg+BNi<&-jq{iR0)A$ZgjsLu+@dVfp z{(|#dfDMQLY5w(Xw4P7**LVi>X=lIJ{I5r8e6xe*pRifuH-~AwDe#}&SdY7)wZ=_A z|G}_cs>A(|PY@?Rb&gOTa$* zHk=FRLL5E{@w_th#{!FKy+sFTd`^nSJN(x8#||3rupacVK;t7uV_K#8UK2I*>qxtZ?&pB5;uDOfG zPr|yW3+Dw-x@o<6SZaJC*l{-Wc`j_ya#n}<_6p>A2Kh14LCYC7T;q>@G=3TSHkW<1 z{99}_9=c597A9aQGRp~#?=l&v%=Rkg0`%3G_ zAwlE8ke9D?*YsUry)1&h-=sd8&vxMR`IM%A2j53{K)zlJ@vS%Hso)8E+=0;F2!p!% z+FNa}49Mg4BQ^be4~=_3|0->#mj4O#qdLNOH$$P1u^0LblOUeA`m5zh0Y5Ye()7h= zYP{_Yjo;R4Gc;f~=wPo}idayEy&P!0M#LASJ= zx1fKLFdIRL~$F=l)?P1*=o1p3af&MGhQGH8mKFh$*S3rNDa8J$W z>l}?wTBGstkY7H+dYS01_3yMw<5c%Sw6O=zWF=xOb5N=NdbgYI{9`eJ-6B8}?~Fe$WpY3URyrTg|7&agCP=*7)p0 z8qa_@ImAxes~{Y-zd5Gq|NE-(2@tR5Kp&|n#HBqm^t_Jt)%f^Kjh}y`<(!eJ@wIg{ zz9&TUe+K!h%|lJ^1@+8;l6qWQm{&xS=06zx$`AY`-)_w(ag)ZE1!#PYkH&M)YWzhx zJ>S{Tw~St_>9@HU2}_hzrd zzO{E{t@C>7@A^L7$<%i>42RdfprMo4K{MJf+rY++wyKH~&11cj}>WJ8zA@gZ%r} zPs{Uql*a2m(fD?Vt2ba@xfkLSR?{0V(Rfi<@3+CUsTzbGk|puPQ=bK7T~p>kH)fDCpms zzt?i^sjT_eE1+@HmzvM`IE`1Gq470Phwp;EkW*DH&p+rd6$JgHkJWr;Mrt{4jnMdt zQySkIq48;u*D^h|Je>kGUcJ4>=YSnoK)taa>N@-Sn*U?iPd$eHa`tVl2S4a@TEV)W z>#O-#*3$R@V~yK;X*_>RJ>TEoG`4z=RxXW~nABX&&1^F?qh1O5hcg?>dth@i9emf6!QGKWn??T+W3weAB#H)&b zwfvY6^%O5p}naTWd{kHebvCd6~xFf?d3NYx?IYx-ryYs-}<5()iPOjeq%~ z@non^{Hkj`Y=!=L3GiEU*e?$a(ft2C(fG348n3Zj<2I1j{Pt))T<)py60IgXh+S^Xs(Y2Pw z@58)`Lf^YfYt5&1j+Xxu^aFS7)$|({YTOg@S4rs89{8d8OqiwdbuBc08vG;<_5}`R zT0c*r@8J#g|8Y2{xX@bjFELu zM}=zsTVTKJ2z{{Ou38V4FzywY@A9o$o}^tG-*ZpnIbfG)$QRpSpEzoQ<{u39tq1kq zQo!G|(RynM{q_ZLAES|_=JNvT#xX-RJ>BzkXsYSYUx#{WImAQzY(4I4@ble^HT^dyjkj;6@#;|D+Ce=~WTw{Joy8hA zKpl7p&ex_uoIle>^MATt;~{XLCk^7;Q5bhN_-z{WnFF8?a1ZYJWJ8?vo}%qF;F89V zfS>R5)cX1Aqw)E7HUIjsuIK-!>A#oK{Bxjx?s!=9@dSIl=%o3dg!@9Hf;E3H=x0`f z^}ab-^LZMh@nt2noK}4`ehccoE2lO8*Bdon0?v_lyw&svcW8V!-0K?${kk7|T85i& zj<5jg?Vxlm&k?A@m%{pjv}{;dK?`d0T#x$!^6y{phc!?aje&h)L%_2jj|9NEK=Xcj zUax@9i>Z3PW1#*|{-x<5EgQnXPx4H(oIjzz9S3#78}Oe**ms*g)bcNbIN-QS)7J$5 zbnm9;gq1LHT@ts$BBZv$oQS+X!>3UH0}@h zQ?UD!gPM=)I*qr7e4P&Wqe2&I{Y-)L+++Tle$F|KKZkRch>==;qc$3^4C`@Eo~FMN ztMM#Yr-PuMRt56!2tUn#XOzZ=QC@?(A_x4u2&_|jm*8KhmZt}-udq7WjyX_Ay|UHx z9)LfFc-sl;q6={EC>Q$Dv|ls8x+u6`>!%6C&zfNOue~&%OI{iu;;-@ZfcHG3>D~Wn zJO%26A#grrRYcpdTvv^ouh#gAy&5mmU*lt7KSJ+XyTQKT=6kJ&Tn~*m=&A8tzxCrqx8qO=v!aeGrJ+$3tLOnkl z@^3w;4|{_@SA=tc(p9uPEugPk8shd$$k)3ezki;u?YpP1#-~Evc%zJ#zY+AwhXcJA ztUFWacTI==nkDd`3vr&_b!>20>){}*$I;MliGlsjVA!XRn4rgXzO3PDGTc7wWG9tX7 z(+6(TxHqiRt0t^)^aun z`_6~_6#)6v?yBa$72<|dxTa5pbys%1rauy@@o5lG_P^5f?_hmJr)YY6Q*D$f}jrw`<#qEPS6fc^OH`+8n0z#nEoK3xU-!To?|z`l>(8$1f~#DTxn zf^j#2KZgLHyeC>eJ#K2eq}slORye4{HMpQ0{z}D;O9|LZ|A-3;j4fgYa2zI8hI)p@|nK%e0^#D@of zuK>FTLcW*_`NH;^wtGpS&w;$q3H+)&*fA3PDlS&b^AgtSG|0=-0XKtw`+BJJe}SKr zf%)!us^wn^^C}AKq7lT;>yR&UfY1ELTAm{y&mr))7e6!~JBZJKW(}B-Fuy1wPS3U;)4~DvT3*^mfkjKjd{T-lx0pn)EdLIRGwIbAM_TVSYpKE)$ zLLB}G>uxW^;clRRTZp%LP}dEHac2PkIk2uv!nzmA=7yf7N{zX|g4alk#m-=;x)z5wfP1K{^y-Cc(G z+!*|)EcjvdceY{<)h05AMk^G}C-8Vh>x0ejg%TxtY( z7VJ~(z~Ay9o>YSUhzs~n9;~~GkY7TfA5{?SJ}E)#c{s$?v!G{RpsxY^r$AkO2K1Q) z`6U(X^$+4+MOfFdu)a<~+*l9mYbo>x#(VSm@}m$rL9h{N=| zx?W&+SJ00q#0NV6DgyP=Uzpd!EIqHG5KoLDo)|%VqxCfr;$&Oc$B{q0g7y9u*4+|_ z8`WTaod!QS0sOau{^`4<`B3NVOw@J>0{+I?nmz^YU9HoA}m4!IA4%SgusQ0GAdI^R;c16%<2HY2F z2H!{bh5N%7K+bI-&ofxRPr<(9fWLR9*7J!Rjh_Vn><;=&06QLrI5rUCk1xny0M=1^ zh{LY|9|ZoK1M8v?_}g~SPcrDo1^j9Xd>8qstagY(a4**e?(N?N{uv<8M7YO(9q`fM z=P~d;(p-pRmOwup{AVrr+djyH`G7tV{3;pZPZNk^BVhls2=MFRhX(LN3#i}fzpB3mIraTGR$iL#2;(OJL|!|cOc#d!MghZ@;n0m%|Omiz~?LQ`2qes1M*ZK7`HX( z`54Ia2J);4@E;2F$*@k7pf0k8x^yq#PB5<&kf$!p_dKlM3b5X5!n&RZ_s86Te>w2O zFJN~MSl4ABJ_kX3HU<6HgZMBU#Spr1tGV+wpSAwO<_I-~)Nn+Ela zCHT)b&~q#B+ks%;4-h9W!MHXsuO<*5JRt9X13yfLxU>}fd=}I{HNak{0iO?XV?3xK~jcS4*$0ru(*3#=Q|QCaZ4^H2CLhVV6R%>C!4@7S0K&= z!2V($5QPJWf#8 zeFFM!poeI%Z!OSg24ezz=gE{yc%c3hkpifj$?4T{=*l z1V4NMdRqy4s{wd%kn=v+{SWBP0P%A-tj8k2-xcbRg<$s}SQiapzI8#Le&CAT3sKu_xJCg^zs>>~!kxFKN2p5Rx9AfLK`eu@G94)Wu0$b;K} z-V)a1URYliptqW!w=u9T3P8QO67pIy)RWo3Cj@YJklz^a4&eW$VBap_w{O8uB4FIJ zKo4cI!5Qe2AYRpmaW{b8&Vv7chkCvyj2i|McmVvzf}BM_&Vdkbd%=FZA=Jb4Zu36i z;|=46gMKn$UV(u7!8+;%dD#cn<1L7j9l>69V6T55Pg}re!nzKHb?pWE>U}vcH9U0&jJ7Z3iBET`Jx@j9|ir%&LGcV!23bG^@h662lVC!{R(ra(>ekFFqrQd z(A#vd%Q~1>35WydV0{e(yTn0W?gI3;Adjqpe6bkh+zsox5Y%;t!0w4qSFZtm4g>y+ zU|(DTgB@>y-yQ)y90lAH^lS|Ag!c9H`6|0P&=p1?nv^bB&A0Da~I{$_wDfSiY5+ybD77~oR}_>=>AMgaf!fDZ!w z`@_1<26=`+9J7M;z90CfL!9x3`CbD4D?p#mKo1^(*9AT+U|gzOx`O;ofDiSn2LL^t zBd-McX9K<*P*R}Juoa}b}6z%Kv6xL=^oc>sRZ6yn%x z;GYEgya)D*g?+>>@RLDM_ih3GQ@lD3cKizZH-oyUE$Cr7@V^CicL6^AKprd5XFu?h zzfcd;e)%`}e^KxgS{G?hmsW=PhJgHZ4sr?fPy*x}5B|9r=zT!W-e5<1*Rc)or+a|a zKyUMb&qa{)EYQ~n{37V{AoyWTpnnK>DVUcD$de0r49wRS&L8PMzYoNp!?5280^A1h z0l@zZ$Y~4nGJqZ$K%Ddh|4fHCK<7c5!Cn-vK0|yy0`naN`^OD{7X*14!M&hBu*(UM zvo7$VbGn;g-&lxaV?h4(kS~sa9S?#&3&FZ;0P}4F>$(;ATMNK90RQu#pFxmMd%!s| z-LG&2J?sE^tYF-Cfaig|TEe&!!H!pfKiwPm13x?k{=5L_kHY=5w;*RE@S%Lv5ad}0 z_$bhuGtmD8dit)@AN(^K@Ec&?8W4ZFf`8rw{50tQ3;5@8;1dt>$AI3b5BvtkrSFdn zpr3eH*M&jO)8PNP5Pvd&z6$X70D0(L^hw}XCxDL|$de58J%N7+;Gbb$-(a0mJunjL zhcmE0ngaaWgFFF{*SZ0pzL3AD-#8ff41jqR1$n-KUzGxRo&w$v@CSg?eLo|RvnI@| zG~jJuTwkDX2zXVf6O4eK?yVJu`qL5m3^7oD&H>yF{I)CLoj{)3u%CSd{gbt@Py7pf zmIGcI{LmciSOe_h2lFigxGRi%734GnK4(D>m4Tk_oi+ygO2B^rtd~)spGM%fJ3tS< zkk@VipYgz_9>nt>z$Xskn>F~u3((IYz&C>40)f9j=<^B4KN$Sy9O$Pz@P7{S8$;eP z0H1|G{~Y9r06$EI`Cf)|?HQowd%!;m;?h#EOCN|!A4zXOzXjx^^;;11d>iEK0rHFl zKd0|8+kqYTf;`0mPX#-gLw-pC`W>Lp{D6-K`#yzxfPaC$5%Av!el-E~&<^b41^z(! zo!)Pu^D+;J5A#7zC$LKg;L{&)x?i^n^pFL5z6Jchf}FL0&nB=}1l;dE339r^xbfgW z=`ikjILEmO{HH?wHUapQ2D}UClg@cJLcDDV^Rfi``hXVzd42$W2hejZ!09`Mks!Y} z*u5OAmun#BexT0)Iq6-RHJ~3W821bKPeH)bVZP=tE}iSegFfjVAl;w20&;!@{@Fm^ z65_yZSQjyHZaxg?FF+p22kVr+_s;}>_zw0x4fK0q+ z1A9#bK6k+%E`S}~0bc<4Pl!t~KyM3iqYuQ5y}-u===Z?-+79#vpf3z^()XvdzWiZa zd+-yApRips&^_dG;1A7UzPX@hx@U42^3+S`^1>;g(cN6U50eqGN9s+u94fVzypf?A41L&s#_`^?-vn0faT_8^&&=&{%JK+7n zKkZ?@W5K?6V7}*o|0vK~4;VKN;!j23(*XRF`f~K0)HcXFRKL}OIP(M6<7cpMRmfi( zfPN6z*AM*77x2pY`KN)s=>7RGpwF^k7wYGq2K^U=b@veHdx1RBpwC3WqrvV6 zf&V7Z^J}n6Wzcg2kY_B=*N64^7W9)J_}2#hc_6kOBG(0{s+(cNA}e zey)KY4uL%Oz-I;MAr1Jr0iPd0p9b}66YxV1m>0eO3}!Kq|5pP2n}PfkSNV6Tqgx0iswAMm05;~?Pg0(xr$IK3-H!$Ci-!B27lkAQg% zfp|rJ{tWc#3U+S@?|YYndA)~q@d5BO;PV#f8$&)NJ#q+2B_c-{{>l`o8-V z)F&a}pQaG!10l}m!n)1^KePfpyMrE1gTGw@J*NU50&+Hlap!{`=zPH%#+?Luru}9t z$XN;Eb}zuY!}@v*at;DLQymosa+ZQ|>w%n(;1BkI8-twZ0G|u;YzF>gfS&wz8H~Fa z_|xx@+JjxnfIJmJ|9PP2VXz*n0)Kb#|2iNi#d%-Q&n_7E7|hEJ#ytx3#esi*&`%Md zr}sIV1D`&?Cm-wwYk>T-A>Pgadzf6 zVWWW0Y0%Gmu;XJ`7j({b6#VBg@Tb1q7WfV&3g$)c$hiO?C-Aqu@SVtg;FAX5S^NOJ zCHU=KxYwNqat4DRUIzY2ptlNuj{|#M2mAoYUkc=`2IDq@3xX?vz9o!19Q1G*Ms1JP1!R{$w-xYw< z_Y|98Ui5u;39#=v_@49*=-&^%j|&EQ==T>&fS+uFagPB15nwMz(5ENRXM??J0(}tZ z(;M;yy-(#2>!JnlZwK=-0(~xm?-SoczOD}bK=til$S?b0+-IO4JNO=XIn)Vdf&UlK z+e`4Dn=s!;VE1Yu=R=4O^!~Fm$Uhh2i50B7`#|3Z_%8u_xdFX5%(oBZ7kW>F-VHDV z{Z|G4O+iljPJAoyr*{YgK|fDm+&Qowx5B$CEnr>?K+d9omjeDrK+ezb-pfw#t8Abz z3hxVzgZFuc0)7?dl?&tE0s0C+Pw%Y-fZjYoPWoN8Xy8MBvKZvI1U@Ulj<&!j0Pqr^ zpAYa}mLvE>Kj3o!#@z~W!x-L)qW34af?Xm&Z%!a5y?gcy<{J+3?}zwM9^SK}cN-eR zygEZ3KLz#4VvwKS4Ne9*>399&K~8!n80&<6p21^76Do_~X!b}-*Z z5Z_4u7s1a>Vcf+qZdaI>3%rZ?2gWriuQzxjVO*+zia@?T0qf2k=x>5P`++=50UrSC zu@BJGxHp0RJmB;Wq$lYAGvKtZISBeZ4gUNd^0Ec^TLSDC5`g~!$UD_xze(>1k(~67 zPhZVBFSV$7Im|YoMoh;Jd=Qmz+Q zFM7waILNsI?6Muk^#uLXyJS;gTv|u;PDlpmvmVG<7slNK{z<ib3jB5(%*z+zKxLS(3GjIYavlf$kY8N^KGctT1@c?~{ojLl8wPx+58Maj%mh3I z^l%L5`+%H&KtCVw@el`Af_*)J5A_La0U!E3og~nM9jwPT;Gfk&PAlNQ6ZA>H&y@!2 z%N6{@65?Sj%&R8Q?*sbUApaeZlitan2JvAl=y@j4-vjylyHw4SK5ray|q;*1+c^$dd+q76W~K-4-=g`hZU8@Y067=Ky88_N=?>%4@5lLr9=d>C9)bL4KtDA>PH&hO-Dk@N zc{YPQZ-D*==$Y~+{k}H+PIn35UkUVJ40`(w^fq8Gcfk9BJoKGKA<)}0xPN60<2C?3 zbU!K;^l%8qT?qHA-okw8-SYpy4|{+-{a}5K20j5m{{-~*AI!@f<~0q*Z4UCg!nnQQ zULTZ)h84iy9r$bnJ34~=u0THu^m!1*Jqq79QG9lS@3YE-JnP_|;Zqow-qTnL-%ru| zuIcbS&SV&u-v3F0`9_0%V`1EG;I{!lZw+>&{N4-ne-Zp=5{zpJd@g&@X_0 zxCj2(3+U;4sA*tds?XnnT^7N(u3-0iptls@V-EAB_}?4oi^917fZi0=Q8>^$0A3Tu zrFSyv9onD3Cky;D6!gCm_*4h_D6q>Rpbr839QaQK;O`GO<;^a@-vD{4A?RTr@S*R! z=^eRDunWCwdIiRP1Af&Ca7!3B3UCX+?Lj}gAa48wdu;^%dx4(blOGE6bp^e-fSied z?||==A3=Qn1>dvBgPinT|7y_Bco_FJ$O+ec4ErIDIfEXafILTlj|1?b@1rY0ov{_GEO z(mUtJ!Ed*NUGjmy-2$B6-C7FqWCX}x9OA|tz!O0pBgl6vK@Tk;J{*B@O8~tK%r_s@ zvF(6WXn7XD^tq0pz>^_*Tf{mBC)Kfc_Hj{{{N* z1$s7t`MLppThN0Q;AeqPB+#3H9UXxF4a}G7=MSJ~>O1AZxX(b&mSC5aK>r-{e+|a{ z0`t8C-*7anBkIq0g!!6*eJ6t6TEMtvfu7#kUIhN;0eZ-S{nQ_zF9Gq~9^@|$^27sf z1$>%AeBJ_l7Qnn{A9o1Gr99gV;>=LM$u5OqTyOBJazJkkdUyzY=>5GS;BOnjA54J% zPoN(FcrCzp0#5Heo`yIx8SK&rmZ)&txL#tngc z^^3s1Pr#0wfd4Jfb0xU&+6v^a0QB^p!*_rEfc^^bKL+$? zz`i?)57^}+(2s_3pTf9BL7((p$!!?76Y!yTOTGhrF~FC>ydr>}-k1Iiepm?f+!x~5 zWf-?C#KT+QR~KR2Q?TAMKo2{Bek0h6-j${AXq;fa^B~?n2Y>4eajzK2`3T}?aTxbD z=yMa;@fGNED#-r;FZk-lrY2=bo+K0jby86b~4&|d)hrGR$>yV!&L z>!F@80s8&mCv$<%J>c^T=nXKhwxFL#@VB}^zYgdFAf8kNd2RxKs^{l|Ki2?0^xnu5 z&}Rbhc@6WWxatV=?F8%25AZ6mE*?WXDFoyC1OHK=2YP3_0_eXy@F@>+mI1sl$VqYj z8PGd`JRzVT`c6Lq)@d}1OTVX64aPNx_0k*oUk5*Q0G!_CD*%2@?{S5JKFz>CCxQHy zfX@YgpnAgw=+}XqJz?B3AipW-^9=ZZdlQ`}b{6Q3?uT20oI8NeLgFpv+?!8$zxw%ujLw=-p9!7!Qdcgjr1<1Jv>;>W&O2W9&pr3~@ZhIJ@6VSH_MK@z~?iJ zyBqw$1?UR{f6Dvcfd5b6?*e(PIm9E-!aj9R{wxM-8&iz^5=s5Ux5F3 z$ZM20OM(9+!nj`KS1@h}@R<#9pbp&ka|HTy$ouy}pPxa_SCE$*fS!*7pUS`o+Gd6d zK<^55juqg(pf|cdUk>!v71mvEkkcIO(jMfj2Dk;-Yd!F<3Vu5Y__qhY9SZg}g>k8m z(E<3w&rldvL7W^5d4b+FS^|8iex3+&((gyp{`3Z%3;Y2;c?@}(?tj`qUS11!_Xj&} z0D5{~k=~KG1oLVKaz=tYk3s(}!QTRb&qY`-Nr2PuL05!vAAy{9Q{2>6vP=%*~``8ePSke5Gz-K#@=l??QY0H^Ob ziov|&&yAL`7*V6WR?Uk{k?b)eq{>)Hq2Ns9n~s0Q=82k(+q2mM&UxKxKM zg?G~4gMD4$yY(UGYITH1mr9Z<1T@5JHou^-Hb^odD1c)z<+Lo zoPIFw6rkS=^v?h{0ezkW{`7s^ccA|U{C|V~SNzg?8wh+N!0w5_e>&)Y1jtYJ>J9W= z051sR27_H}VBHzRygov_ng#j{fOzN+@=O8T2lO8X{@)bhUUss!ds)y!F7S^5`YoV` z0YJYI<~s-G8wqyV1NdU_2g@X_hmJtMGf~sKfFF8-o>M_iW6)a)=)VArTLi|<1OD@1 zy&Hf}cc32z`V9Y}^;Qe)J`(6{z#o1BeOa*MZqWZFkiQGanIFa-4gB|k9qR%AJkbAm z;J*m$k_Yqp3;yE;a#n+J=YU^50lYNe(J<~fuwwf1q|%YaWS=mUI$b@3JKZVmj80sSGOhx)KK%(+W)`hAT`-!%W)-!+~B=N)t5hhF00;BCb`EvMyF zjlY10_06AXIY&ind|iyj2Y=PLBOGu#!o`b*y|w(OT4_A3s>TPvMbbE+53i#6RCdt# z7Hf@L)zo+@*qz=f%7E`O4#2uw-b0U@1s9|SkJR)Yy)<4D@R}Vo{n>6BKL`(1KNza% zy#{E!M_Y}bg^R^c>T3FFfX6s#dgGQF_iCf@-=Lq#KyM57+TLFCzXJRZ!TK6lPxCQv zt?|Ql8gCDN7-*^KJuEby0{k68&bKhHgP@^0sHE)$X$*d~5-#3- z1iuPstoi%F!D%X=VyTL1Nq5M26fTn8k{x$4c1X2Jbbng{A~*O$r*^lVIb!S zi1W7a!xi40^}M3MKU;&n=7N7ZfIs{gp~w9*RO8!RG@cD|QoI@td0`#o@efc}2M^Tp zEP%LF0pfN?sFylI-uwanPy+P)tEZMT8~o=b_<3jWlRBV>X>joQ7{+ygJV@`u94W5n zRS@dik@GcudHA5qeUYY*8K&_OkoWVTPENJbe3Br~c82`b1MF1~ei+YYoF4ZW#Eqp; zXSN4@j+?3Z|D2-nK)~;TUoEbs`5cA*gFWmQdV_x^hHL&)u4;VsNsZqstuG|ywAc6< z_|WUhHBEnLw#LKFG~RozmeVU(;}`#Fd~FNOKd_s|>%tG5M|alrFA8bA0sNr#0uxQ| z1`pU3_0{yBXKMUKUyVO3q461awBG*PuJQXjHQxKR#@*q=m<2$eI!E&{g1mX$Rns57 zpz&U1v>v8a(YWEg=40PW;|rmmoDAm<2OvMrpQZV~9i{Pu?ix?C(fA_hHx7E2C;y=y z^bd=dljMdh$nPT|ZeMZKd_tg4KJcoR)9Hf7D+8Z7kdKleZ;pox+_%r^acf`K_!Brs z9$#MTp)=&=8c>J#sHpk0fqMuI0pAVh^_h^ThW*s@rT5bB6xMPM1U~-IZ_M{ekDCMQ zuIO7$-wpbr&d~3r^Qo4g|5~t5JO%H-7)-T(P5|Bw?DF!np6`oS8c%`sQUm<(hn<$Q z0Q7UJ03HGUKLP6JGO!uvCV8b1K~8SkyfoeFud80_z! zLm#Og`_D^}L!wA7(oE?Ni_r3wF5(_0`TJTK>4P8aM8&@gn^+?l4p1 z@nTwsG*Lc%Q8ux|xP!;Bz4D0S9)EiA8?m2>AAt zTusw&d9USseo*6WcWS&O>=Q%H^thdCYCIR>)x0=8ZfD3-_ZMnB}R0y|ddAjLFzkJtF6!5XgvaqsUQEoV!p!y{cay$SfwtofSW7uJO_)TI-T zX+B{P2O_{93{XeW?~;sZs`c3l_Hm0e~h};K88Bk`>N(YW~;{Qp49jZ zunYB3>34$m!ajW@_{mtvUq6d!`^I=`+z;-nbb>mzGUTtAp;|wQJ{m6%`|jAKntn6X z?PFoTd;8mnH-9_3SO0|LHLruM7JWiz}Lb{X30M zhjsMiiKcIUOXKb^FCW-#f5A#bJTV>(CU;jpf! zR@U*MAKX)-co+}y(CCGhCk*meGQ`7q12vz!i!~k#dYk`M)0carad%k1JK-MDmLXc7 zi{acb5c*)>o@;qF*3x*-DBVvO7^CrkmYUDT%^J7ws^>NMi^e@nb%3+%t?^8_k7|BR z^RMHo@o%s%7}!P6>uyJlCr#A&ZioZUpEdoTW?IhMPc+_bgw{{%@fweRr}_Al(D>UH zTFzN-w4cO7pXzR3&F5RJ#?OGg7BAIu`fSzsrCS;=e_i7Ln&?r^^E2~rjn-?t>qLzk)zi3DRgH%vYx#e``AZL|i^@RVm;n7r z^CUfPP$4bnFSy@Qqpha5hI5Tpse0TquwG1|E}eNn^BMV6;{mYl&O@JEM`44(`I6@U z82T-tKQ#S+;16@Hv_22i)VL#@Q!Ie~*dwT)ePN&Yt&1M_GT6N+$P@Wj>%kHBoBKmG z{p|f3FZy2NMe=L;>0Q%Pu%9){(flo-kF*W+nGO4ne*bCy-*0Q&5#oRq#DOHxTkdwv z|2EX~IZ$uJw$OUs1Ag)k?vdt!|A)ao{UY>p%0gUChW*z|u*+>&cNYff`M!tz8{(zu zf5LYbM?s#s8??RBd^MiEP2tJ8D@`0uw z{z2nA;J#}F>`&j8*7{6_yfAEv9`|{5jmH=?KBd0K>-lK>U9`rnq0YYy=at8xJ`YXR z{Ex(Gydc=+Dx62Sfj_K1toa-7(|Embjc*FkxEI9R1(1KkO|(B$g}hJ+`d35awLHmS z-_UlNexJ9-7wyuxJMel^=%>vLI#mcQ^$jqir|{LW3&e}}w~ z_e0a4tE}a;hJ8>En3pGdgBx~?7c-_~r`{98`c_&kum9^{?! zM>U^Y*EGHg;Gzem+R!%b@J| zz<%u!oXfuxjL$4G#E@j|G3>38D%VBEUU_uB&b zv|k0S2WLl(7oVnaZ5=h=+~BH2*a-G=8A3 z#v4F=I1=jTf>75zfql@~_BxJDsiAT6t6I(wFO6pb9sqUGF!0Z&5NFOozOY-M<$2mc z;|HPcdI{_O#5>JrWwOTUKJ8w(fASFgDiQKm9`t#d!M<$lel6#o#u{%@PUH5VxA;&^ zPrr|I*i!r3@oE}RhkQL8^3-C`r`rWBXQg8rAFxj2c2IvVcG2`^P8#=z_3jA$^RsY| z2@MG)OB$cKL*qT5F4_Zi zf-T%<>)${-;t{x4@GDcxGad5jI_O{RhCJH?{CV;xJ#L$Hjo*a**Wl}#K4GuM_b$`; z*Yz4N1nbnjpw{yOxZl+R?!BABdf5&8h~g06zC->U7o+EO81mhxyPAIK6^(~OTxtRR zx6ZJB-@|$t2le^aUs|5h5I4?2-pLKod{%(}Jchp0cZhFwV}U=!&*l&ZLSet$a-rs* z59<7}V8x=u_GeAs@}|afA)a4?dh8L*chqgoem4X?z^iCo}D}fBH7p zcmRCYupiFB!=Mga332H*)YU6H#>(^oyDaSK@QZ(zOGPt$zTvoxLvxG(H; zSArj|g*cEO^5cHU*9RePtcJMc2=e%U(es`8LgRP-(|8ob?I6h439x=2g1?pfpvO&z z_>cv0Zy?aG0R7wn|0xc7*bjPW27M<7cn{64uU@|sTr_^oQsY%2zsG?eX28C_D#ev>T*J=IOuhsbD ziyFU@r|~BaS`Qg;zq%;gpS%e5a~oJkK2chppTQar4%GP4P>lzi(YQIphph>k-Y-St zGgCG03V36v$9CV-d?Fz~cG{`w9Y8fY=wPC3h251J8k#IkVj^~e7(MEKDVA}d>q7cC(uJjh=-|A|Gd4b z$4$DX@uJ|L^?zvk8Sq`X|K2 zzvV#O{s`w#>CpFnQeEfSc2J)*f_He%!hN1?upYx9P7Z^0v>xi}1c*zWV7+Vy{hPx& z>ICN$aq!(!Tligo?x3Gy(2uf${uRBO`W*b{5Uk(Zu-+TPdPxRclrbQ=m+@iYN%Ix!Mv(% z(sHJ+(D=(W8owB%@sUusREf~^51`K$2IncOBQ>9W7c{5>Cb{cG=n;! zCeS|vyC;Ahhk+iZK;7#J_0?K9U#I}|$DV6FWPrV9z`pzHLCvQz=qKR1rvDE0%uR@6 zMi9pgkQX}q(c^Z9x^(hSO;5i&=?(M|PzSyQISW92m<)A$4#d?p5Kryw}dI&a!=TaSAk{KOITxe)yJ6zs1L0B#3-{y}{{C0WaV9M*MZ$iH_FYd&_N8qZy) z@gaLOo(}axvj>`f2dv+TujzZoqy;JjPyF=qPVH*FiU*oUf z9LMOYrhf|gw9*Yt-w5i2yD+a;n>3%yEgCPeRpSlAHBR?VCv4R8k;^rHXsyO$z@IOJ zKU@I4*+8G{T|sBbSoyjl!;c0H!`HW&DK!oF!d$dmg-^EZb2VGGm`~Pe49JfYVE?YAF&Mh%>Ay6Cyc`Joi`kHW zi=}G*AAtXdKbpQh$QhZd>2pAzj=DW&XbSfYro(p`&tP3gK>cR&L(5qc^p^Na)2G3D z-vo8tAc)T=Aa6QSeFE~tf&62CYWclDKaD~Emhdi0CE%0!Mvr^>qQ*0!uaa~?)6@43 z4p4X91pU8+`fUW*#TnviEvVC+Ag`T;I(BBDp6{R#jUR(P%p9n%lA#_*0el0TJ7hv0 zu?79l2YD($z3~O~(0aAjL)dzaM?oE!0d-f?D9y*2);r)PfExjR5c1%4=xaRyf4%~F z+#l>4e@o9d3;cf*?y7J&TJ-&+KH#>2ks_d7kWo{+CQ!M?sfA z9_~RI!TtFza89}i@EK57+=V{gI+$1KM6HMOuzoLrT|NQ54aidg&KVoR`MVL+$(3`o z{EZ==Op4R=Eg;VL!n(5ndG0_wiA~qz4un3TNvx)C`$FSEfWLpM>3cyvd=K_PBfy_O zz`AyTxRLoy%d-LERSxLE;-%)}0eZLx^j`NhpPrE4Z`{=MpQ1G05bBL@5t{x8@NWU~ z#6vuM40XtA;L`xcjevRmf&N1()NeUp-(%2^nh*UD1MKUqps(^9@Sm_Q%0M3M2KCQ< zSVtdVUfaMw+XDSASTEh+{4N{%409na-GX&p5!UZ^*#G_p`ocgT0q8;)WWZ1a<7j zikjXU?3k&^4JH{n?p=g>z7XWiLEvx4!GB6Zf9xdGS53e!b)oJ}2K_jJpX`SZ3q31n z#oYt{iGg+T9rTl`*&8ZC9;dpr6zE|B=;0sWEx_O0Ko1o_ZyVvBn}dy>a6|a6As_gO zE$IIn?C(-Q{@dW69bi9b1p81ksFMv4=l{SuO#?sq0&?~RKRFC~+iIot{|fer^WdGU z?x4>Qh?5o|&ri_XQqXh9e>z@`g}C$w>SqtYYs0>&CDcE|pKE#UKGAqZ*ss-xeP0ah zcMgG{(0;8Qd>`}x)?E)crzj72#{$}~s=+!s4e~@o{g4Rr-3azd2ffYD)^@25ajAVf zJ+E86G~NgBPw;MJH8@yW1M99b#MO_m9=E{n-(80FxDoJ|ke469`VE47bQbKs4(hbB z7Fy3uV7^(^HT^coQ=5VRW{8v7kT=hRT|NQ*W~c)THP-SkY_0K3c(3Lw%-0&`dkEt8 zEbv1U(m&+inh!;I~_$ zZg&Dbn}NN`LfqQ`>nH~3Pl2C=!npq+Z|(;9{UL7qLtSbNd`w~8HH5e~5B6WSkO%LB zU-`m14XmgA$^iRxJMfe1un#hWxY_{n8vRad3$Sk#;09Qyk6@j)1AV$ce);39^){rL z#+NnK_y^FZJ?t-LK;9n?`LsX8vAvK-K7*eZfqJzK)Jp@w?h7FQ?gjk^0Nw!n+~A<~ z{0idUcHlD%=r@8tECc#rsE3`QJ~2Sun+AEI60F}kpoguNT0bKpt_DGVq<0crz<>5a zzL*4YaxwUAV~{@=*7YlhpU**WI{{AyzcmAV2-MZj%WC~Qf!@02*Yv$gXxtz2O8~?Z z>hFct*8H1-e)d6r8Qe+pdD~6nW`Kuv)bxd$YrF>7eGSB`Jjh?M5XZ(rebNK;wie{s z3-rFV^t|H0ug+R(`W}!Mu7MtIz&_3f>Ve+i|5e*)c|JkjjCRrV?yefQ=&tbr;3umg zZlAQ%eEeWPk_mSI3jSjO_z}qCpTSX1;#%P=j&3AoSm5AdG(w4XFG z)%a$}@53QJc)@(lpWgeHu5^2JQ*tQr|2M>WxPbC-;}u<3^Oy zcr5T~1%B8c;)wzJLRmn+7V0Gvkh4C>V+wKXF2sR>kQc_AX#M;GeQt)h;RAmA1LFK` z@P|84*WH0S=NI^Y7x14nn3ogi;V#6(-jJu(fnQ}qJx~es77q2KH|VD##KXz3PVYe6 zTMqSGcZd&GV3%~5Z&A=sMM#A1ur9tsAN3sAy&;Ud4Dw4F$TJq=>Oa{3dVrr-Y^2v+ zF4!>+>{1x&mX z^-?=n7aL$*Y<1RpPHwI7JSb$To*e3=`D8$x41+k(pr+>Y3GiE>&r4tzYsfDzAU-5Q zecKP>d{sv+|6-8eh4cXY3xht(fZc5%-wo)bfhOpE95y zN9Z#&f;jxtRLfZi&XFraT~`k9Z4k$50evaR;~pUYZSr%-F9y)hE{LD$P`A$m`5P6` z`gAtdc*#N2uue;|I|fOQuQ^@$PGpSiH_`)#N7kO=d-3;8Im zsOHlL{Jb^P3Edzs56a7v1Ehc*uY*6#13#Y&`@wMFUj^p-0KP-?fq9L{C#Piy2l?rH z$xNu9>E1;Ph+{jzPgcNwBmn$&6XcylSQiDr-+scpmV>3H{PIxQ|*J>eY7; zpZ9<~han!mx72cmL7c1#^)hz>c)7;BQ+rYR|WpJ zp>DJTJ8pz{8v*^U9S|qIfc^mZ`B11^JYjupfjBk-_8n8(YyF3J()e-U^QpC_4~F>Z z4tPA|SmC`F$Mt;a=c# z0Q{jR_|Hs;W5IwohWzpg>LQamT0apm-{0VeF|fbb1Nk%-;+r|tjSGN29M*LwSQlrY z-dF;D7zut70sb}y^6XHElbKMLI)k4d0{cdSJSzbI`9FK-{nzvN#{XAENGdC2ltd{a zBU{R<2<2^7_DELt%*e{#D|-`>JtKRMl94^KGZP{De*b{S{fEzw-`n@)$A_!Oxz6KU z=Q`Ip=lOa*A^(hrxLOBsVgl>$FW9fmf;gw&4~~F1`~>U5GuU@~K%I6T;;Jgdp$qI^ zdI8=L_JcQIpY<5xb{yOvHHCHR56s6EP|s|KbJ0(Ld%?K0hH)th^DEj(=bzg!Pn{r- zjRqc1$hQX}o;Sd{GZW@TWr+W$kpGW3=>DdG&O5BNy`iAS{UFX;0#7c;=k?%TAPV@e zKpiz5=Hmkx-w@D$0mR!^h==FZwLalc512rHt_tS^QS~&xHSjNhyiMn0eV|`ikhe!e zT^a&$I1K53)1N+ku=c|C{5ad+@?6YEkCmncxz&x4=^T-V1 z{~yfvI#5sEfV|xg#y1o8*ZlyW40$pf>|-GxeyFJ9+O+_>}q@kA^%v2z0IqTtSm z8V2=}6XgHBkjIKa9aRzXRaK~yXMufw$n)2MXF1d%$3V}%pxYb3^8tPo^mGM%nu4Ex zphGC=kOTQV3Gm8rp0FSI{{sFL)}3^~tAIaCARmSR{uTJAdg}Rj!$adM;oM_4)a`2^ zKR1MR@EycwEeGw-3y4n}s7qZS-X22!`3ZOm@LvUd3&e9I;0EaLZKyx#K5ifMcMRm! zF`#E7$hWy*Ue5#_46sjm2RweTZf1d>1whZ%z>^01f-W%bQTcToF3zKIKUfEU!usoC zp?RJ{yFM^3H415-uAu)%h!aQ9limk13+kVeus+U&aiKUY1N;vhbbpUQUHt;`A^k4z z1r$KbYU*~^)X{hlSa>t;8|&&^=meW0#RfN?1Tb@gY!-$UHi zf%xnO^J^c>-!=ubo>gET^#p(DcWRcM& z0&)8c_&-5@t_gZNK%CzJJ?Z@wUtry@2jg20#w8B$d=UR@p}*PCt{?2Jr^{wV@+ehu37 z0Q-?(-x}&$S}*9F+!OQ<1pETzfnZn%V_>|pO!c^L&8_iLxip>w&k4|X);7WWT0g^c zeKWy+w06g^(_H_D3+Ooo>Vy!OkEI~bRDrl13hVf0ILE#L_Tww*eg(if?gaJid#Lwn zfc;@l-L7vnjhofe_(l(nKZLs10{pasJiHR>hd5Yg^TPbKhx(A7vuzFbJprfR{|hqY-+|`~e3z#?y#K!(e77hs=zjq4 z*>HX`1#o&^*9PMGH^l!Ns9RP;emDv1LJHJri=fV2;mg=0PrM$eFF5W zF4%tqemBs$4~*|th}%h^+c~I*OTv7i_rdzZygLZ<^Z?|6Q&7h?fIQ;^>&`v+ea%u> z*Y-fW8=&3GaPOHPcp_ol&jtBy9_;&yg8gS0uaYqCg#hmdacBc|@)f9Whr@g~hk54+ z^Th`IIRo)O4(3Y_uzv*hwvZ3$yBKk>-y99&LiZ+BAx`qZyiNdn+86%^^RyB0yF(nh zL%YkMj=c%<^fc^e+rm5zF*C@2uV9}$9DWDk4fD4EwEGt7@P3frUV;5n(2e?)0eP|l z=uiQ4SP%G4$de;sUoaW$?O`0>g3e)}LnoL={lGo~=5<8a;7>N>rR9K+ zh5VKZ`(hiYyFRM@!T2gqhMa7!#>Cw)-M~-p$XKJSHaJ0 zzzc#7lb~Ppd#Lu1pYKC{egk=RG1P$-b=Vpv!8wK-^oQ= z{owc7JHb9L*tZ3|F1(k?6MoM)2igq*dq_)$EEuo1u-^TbNB=<)u=jfoBKU&jdZqzVIS=8atD7hz`hCe_ZHwWu&zx4eYS!<#UcG3vlZ}nf_ljf^gIpq*j%uG2<^57 z{4wai7~<9f+N}-aZVGkF0LUAKVV|20^+qz}!KR|~a}Asi zbc6m51$~?#KHmdg9>%vk#KTh<-&o-J0rj~h@Jxksj|bp?Kj0|~aWxd`=l+mS93gJ= zLHwTu`$U-6lR@XN;Lk+xpYpr~_!9x+G6ULm0zDf;e9}JXEyQhYs0TX3a|H&-=Z(Ss zIK;_Hz~6wM^+C_)5VzGpw*t`L^HA^kL*2Cu^4M3{r_jFODZCeD_QxE9`qvEJ*IE|d zmy!YZp-rLPp77q+Z0MI4;8C!Dxed?5JcE7HI3>dW#R6b|8VUCiZD3un2RsqhuXnJ2 zX$f()8shUC#OHL#=UI?9wm=>$3Hc-)=FwZolR;p=2F|sn!MWCcXFZUCuwMvT6&Rvhe`ce{fE)Mq9K~I0s{~W|mNCoZxDA0%A zo3R+;d<7X;-39rOevdE&_}jyLX$b8WgL$zC=Jj0I4-$WMXFb0% zpxvjC2ht#)^Z`Ggfe!vKPm>`YzCv9@@B6I?>!St4)itOOr-DAaA>P(N9xDs$OKmqj zEh_ES@Y1k;0peffpIj4IClVj=(`5TAb!?^o>_p;gLUvSjBhQ7w<@q74~06a z0PKTGLEdwReaddg+k1fj9Pqyb{%gRq4E8&tV7_z%`|AmERO`k&sDW()UFvjOh|`;;8OC+q2M7z_7MUSR(i_ER@u-G2e~OkS`* z2Y5%|Nrn4`gW#tZ*vG+sc^UZg40wt{{B(x6y#VKmWq{ud_>;i@+~9vt(5D9I+zR5V z3*ZM}fBgsU8Slb;83Ft5Md1Goh}&CW-vs)57WAAAb+rlPfp4IHEZEa`BAPljbm9f5Cn$;0Z8}^n38OkoQu7=P<)SL!R#rcy-AC^t{by$j_ZJb7V&M zhUZNBgFo3&zXikm4TN?B;deTn!9E4@(oGnz4sh;W5YE-dLc6ih?l>6t%J81^U^wT0 z1Ag9zacKwk=iln_y$Al-K!4*Q-dte3ro!*GCPKTu@H?z1h_@f0+e-KyToSZ98+0oP z{`7(Rss_Y)OF6p?hVQUG`og-i59Swr$8#^_u@tyZ4}&_v1pM>|Khq!|PKNlY0`t@k zc)o!@FA&tkw|1M+Youup|{+k!q7z}^7%QGoA(JZ6Bna)o(O z0`xox`;OV5&l~91RmfL0VO&1Iyq*a7Vc@6lR(QbuX%OU@mXJS-gZ%=?=XSu;9rAE% zu-^+hG=zI(ThM0{*iVM_s~qr*g1FiaJc(dm3-Zr3IG>pYcv*;Bn%7?-o@WC80ho8i zA#W#xZtI~wIS2N6pxv|J=Q)T^8|beY#8p%9=Mb#piO_Blz{^5B+yj43fxSEU^Bm$T zKja^(qxM1mp9lPlV7!I`UIXyIke^*4-yQ}$9`HpFw?84SZbST3hWYLV@iPX-_xC$p z4|jmPT?FdPk+5Hg0Q=66haW-Q?gIXOVBZPwSJ1Bnh$|O}^Fc5#UO~HupxsEYe+~9? zVcavo{sQpVf_~M7b+9JrQw-WI4LmEsej~)gD)6&6#H}gB`Fn`N4&Wz^yB);g9q{uQ z@F&4InnPUW0{!2@d=G_udj$Gr_(H0-7kf($Am{Of&bRPa|+rW0R6fI`tN~uqd|umfLlVpK7;)#7?&9^FV=&763n|>V4n&0 z36LL(fd9)OFHM4Vc@pT~5p=VFI$<7+?|86}h4+2c0Nf4E85+LU^>Y9`e|`h%kiAgP zxPorEA)mN|{U^ZRz^D7MSNWgyse=is>N5DHmK0E^R^bh!B3jQ>Nc%BYC-yv@4 zKIjb0-#1WK(EE$l!@9f|>XuzFfAc`QX~16<`2PX_W3W$$eQ_PwcNc{Etv=L^mB4-{ z+!tJdI_$$ z$isx^0)E0>A^&HA|6Rb((ZJIi>`h=jO@scP1H20KcNN%=hj!0`y*1e9fW0}`uK_>j zLVYq7^ehMKV`mtzs}P^GFS`WewFKrx9hgUL!T-s?(;n)^vXHNqgZ?)`pYPx&-J_L* zc27gQ7GR$Q?Y@Behu*t*9LBLIRb;NPL$&Cu>ZSWjO;zpjFwjlds!;I9RKE&!fKuwK6f z`$|y9euQ=>gP;4Lz72$Vkpa&YSb?6ipkHPX4<(?#RiMB2FkTU$Lj&-~4(vyPK5%Vo z_zF542A&C!uN=Xj9dQ283D&hA;LmngXCK43_W=I4unz73o@cNw3WAu}^G3iupkEWf{x$g182s4>INd+) z1|6JXT)xA+s08>((7z1eHy}=eAYW~Sd1nLhNqH|B?CCtm3;eMIe*&Q{@&WsSuupe` zeDxUY-@*An4&?dca2`?{?ArqWKRB=W1bA*(?`Fe60G)d@1b%mTPTmUa>Ag>l;dcZZ z0Ivkk|64%6OyGBm4q#sh_$$HhDRzUO%iuif6vV?A`2C|LoL|ia`xo##k*VN6y}vpK z;^#N;+=M#e5X_@&h?6cbub;!b*a_`Eg!x6!EuV(E?j^Jv5Bzfg4}-$1BjlgEpid9z zFTFprFT~qz7+*IS-yUFJ4C3t;@Vp26&Va9m`PB*H{}S*-!@Mp6c`O#%EebsLz(eoB zYXLk4;CTc69SXmz8U*$a;P>6@LAPIEUmD`7DCjm5{A>wv{uSeFM6^ zfPTe-pLL<#Ul0$0z(e01hzA~5h{J0TZ>f+6YQp<5egpp=c)v<#;5iS!yZjCB@u2TW z7Pr?27Qf+rJ2f1%{jahbr}uFkcGC6_fv1V1wx8;t@kwC+0s8d`bhrWfcLDq-y#Hh$ z{Ejt0)V(&qlLq$V0gr-qk3jqvh4qMjx9$&lU>4+=B9I^GyB@Ysm(GIvvn8BE)`ohl zH}LrDurj;^dnhLjkd_QzfCtivAp`6|e#39D2RZ-mW0LxL9+1I6-%BNXBW_f{sDM!c zqXI?+j0zYPFe+eFz^H&x0iyy&1&j(96)-AbRKTc!Q30a@Mg@!t7!@!oU{t`UfKdUX z0!9Ul3K$hIDqvK=sDM!cqXI?+j0zYPFe+eFz^H&x0iyy&1&j(96)-AbRKTc!Q30a@ zMg@!t7!@!oU{t`UfKdUX0!9Ul3K$hIDqvK=sDM!cqXI?+j0zYPFe+eFz^H&x0iyy& z1&j(96)-AbRKTc!Q30a@Mg@!t7!@!oU{v7$69xX)S9$-xVo!e3tJ?p-E70MM^@h)2 z4_^i_+y?s|5N9s%%K8xKKpNmCfPVvg1ANNF52K9hd#Y`3_fWz8~pqO?b4^*8bh3ygm$k(;`j{lxdQwd1E1)M0sE5h4T}sfD$@Uwgw$KL%SaUZvgt-1s(bTPc-;h z8SG8r(@|kCE{EU~PVGR?G4KheOeiRwz|Ymt?ndAb0lXx9lB_-GW?o8>TJ51pS)qsQssWXbb&)4&&Pt`c)tNKMmtZpMIMN z{kjk1-U!B}C*Uo?pJLFj;}Ew7_yk@kjMqA_p9X$b2R}!HpQ)hRacFlO=(z;!Ey4aF z#E&!NpM?;gqe15q5LX+(pPi7m7eKq2U>^uNTfw*l!@TYX1w0SvGZOrK3H}s> zam)qwi@}~g@fip_`+opb`qT&fDDad4|9b<^2=H?T=-j4~?$;NvzX|-sfF}s- zb5+*un!0Fwio3=qyK4Lr@N5VB=!%->0QkQN?EOKvI}mTvz@N&%^AGHEfqk@_?$WbW8 z-xTKKABcw+fY$|{vw$Z2|7@{_^O;CrFgZ`!9fJ15W)a z0QOZthekEDZoNT=mNm7#E!b}bf4TrqTd+R__V1xzp)g-sd20W?APx->w>IFX8?00B zNN1Q|zWCSOEvJ*9{RNt^ofUj9t{5PfpHlL{DT3fI_eMT-~c?&!2TuZ z(+K=O0QSGYz7p84gY`Eb*@OS4FfO#e`w8}!f!_fB(7whE_SdEm&mCdB?!kO<1-uLJ zbb)c9{zihI*}(H1^2QVJXC?6aKpj{G_-g<^?SpK=p6d4ApmPSq&noCw3h>y1o{J#f zS_8iY_;VTfSAd?`pnoaw{|?NTh2Z~K@TVr&{{uglLw|e1_{M|(S&)C)Lq4Am_S?bF zT7Xmj9}DYdJnZ|*!TLq#c*8;GH875cARdlGznX#lY|y_i=-CAPxdQR?7xZZi?KXh; z@qqXV2RsM*OZQ@7(62SX-wXWj4DBWWPdjM$0O(&B+Kq*EjrNbTVO%^R4le?32mS30 zaX1$GyBPZQ3fgsqIH7ugcxc|mgP(MMl>+*^gFf!iuTH?T9sKzW{Iel`3c@^f0zKmZ ze+&L!1>6k$cLjVXoagif{uZFyCOCI;gZX$L?!Rcd#bBQY`0ZeRO#%ER^fw;Py<@<>3;0R#yb%03 z3FGJj_BIasTqq21x;LliFyBDC(V)*|i2sMsubYrRZ-D>(q1{1%X99m1_>&FzQ|MPE zh=&v4{{eVTBNymA5}p@L1wStV-WT*43jXhg=X;%iho1L-4)!nMdDPD^UZcUjDd@8w z+RX>|Wock<0{o=I1mOP({fYzo!_Z$>h{FVUjy)ClAA>)3(BB!*ZYhZ8++ZID{*(s& zy&<0IIU-l!83FC)0o)Aq=?DE?3GGG!e*@rghrIC;>`#HcHTY8u;_5Eg*8&{^U|e>9 zKjFaR194IU{0RlTDe&ipyc!B|eh~PpLBA4UT;f2VSAfR>e;U{qfqqf^FNJfrr-jM9{4Q;O@|`ub^iH zjC&s7!QXd49xDg!7J+yk3jSOMfBe8c0>&{f_;UvIr00cR!@Q0G{#(%BcA(o|=vOz$ zORHg?l0H#T4-|)X{b60W4F2?her*HY?tyOqfo?xx9$A1rJ&*ki`n3V#;X3$V7<7n& zxNQ#lya4;>FureLygq_IH$mqcz_SSOvA{D5^ofM=vH|;k(BH1Wa~j6+6pZ5s(4XEj zumr~C8|b_S)`df$=YHr{Cuny$@SFzw1<>E;;HL@jXMvwpV7wwAPN+Wj1A8av*J{9> zVcZ|Wc-?|_J)vLCK%aHs&pqIYgm&|TpBKP>F8D+5ODO~69tZ8lfc-!4XBf=ud$2B> zgMA3ZTS18DWq?}&&p5FE3V!Z`@x2B5--C7+f_-O*TY5e=Kj@zh{M*5wFz9bluup;W z-UMiO6Y!h_yg&4-F0^|L^8Yp%uQaF=GRc34e|rA80raa7@X+s$mqUN2L!8ig@_4ux z$OavXLp(eM`*iTr4E($eI#dUI1B_!I=+_Nsw+7f#{cj37&^a63<4l9N@`8T-1piON zI`R_wH30Z`!2F_npRtgi%R{@3pufdH&q3hlEa0Kv*_8)-dJZ8!=-C(aISu173wTCD ze}BRLD;e^JC#=iGVcva#b?qhs%M5lzy5=`tqlE* zhx`@<{ptnrunp|vAWrD~mfpAX817$Q!TWPMf&I+?@%>2O;e9oq0AB%do&WWyBc_kgMB#IM*)5f^r81UW`h55pwEb+2Klc&_(SixaxW}t40gan z{p|ugd!Sz{3+i@f!TZ5zyuJa?2=IScA>D2P!0$r8UIYIg@V^7#9x#p%0pASm4g&wp zpxsu`ul|4^1peDLTF)fl39{7oTfxr>R@%M|_|p>n$ta+CydXZ?SZMo&)*4>|coz6? z3jP;^cs2ukGW54P_;UjM*#i1>0RDx5&jdeffIp=m9`Zo^ECc%y;ExZqdncbBM@!Jh z9PDlKYo5;F=QOZ?1o}UPc3(k!o}+ewzb*Jf?>WDeNB8%AUXAw$KZl!Z`zE0OIpALb z{4|cgK+mzDPhHS+6|}n_c$R?9QDA=*+WidvHw61_V4n~CZwB@;U>^?SRUx+?-^wr_ zYeHO|1Kr+%Zf&4l8^|Yjq1~mBPewz2O9Vd)f zZNbkZ(7z|N`w8qPgFW>(AL#iL;$$`W9|_~z40NFNh~mKnc-{k^2IG4Nbo&7P`U~Ux z5b|(3%!?SnN&jZxzZv-X3HVh=+T? zUmWyV3Hp46e*FMH)4|>n{22lM)Ax+#g8dR`_d2wD3UCADlg)sCgm!m9emD*~XF$K6 z1Ku0PaRc`@6J`(VJz#j?t z1@JQq`t=(0IRbb`n0Fh2pT0L24)f6(;&Tt=u_@4QO~@xT!GBwb=TqS4Y|wuW@Oy#1 z6X={5@L8ZwC(vOW#MMaX?=$eT5%7-zo*lsR492Aq^lJs^Py%!w3-Rv-?RtX!9q6wg z_%i|QPeH$OfM-4Uc@A`*0rTQ7jQbL>ZvuY0fj_CR@7M!6)PZ(sef$sX7lA)!5D!zp z&uq~DG}zCCJP-@^bPjnB{3QH6jC(ckXDsON3jMVM`-af21+-fScq#x-70{sy@FW7y z4(L~2;MoRwsVwkZ279;;H5kC&55Bis0P@cj6J0-?0-lR7-^)NfRueVg3d~ zzv#QVb-=zPjMqA_Zw>u@2l!1GM+3~40f4syKksMf$VhJt<8>Y8ug)%e{X8o%{k1%LjDp z4m_O!uLAyr0ABf<_R|LZybHR$2c1nox4SUz#h_hB@N+J-`vdem4e>k(_%DHd0`w~y z=3OlC%z=1b1^p@jeinc{(-p?OKKOYS{3#6W&Vqb33G63T59U2OXBfx|R)jbuFx?6~NE6u#P+h`!K-YgFmYQ_W+)B z7{{})?z{v%7WDuAQ|CQ<7#GSj!7yG?;Qu?wd;Or@nGpXz5TCgK9|L|;9cTvr+XG$~ z@B-jZG01NX!Ow1xmtp`90Dov4lfXUz){(s6KdmoGuwLAUx@Fuu9iO$qJ{<5PfVT&{ zBCPM-!Ji=Dx%O83|1eGCcF^uZ(Ct0&KZ5n{0{Gb!>`Mdw9_p@HFt1C%x<4G&#}W`% zLo&2(S0MhULAxga9|it|f)4+{pS8e$0miW-)O)X?-5jv*4D)mj__Gx31EAeZ7fF}y#xee3< z&QPDwx#BHow=mRcWCZJ~as4))IA=WEcd0-WAIclfpz|c~zY)Y+d6%?mD;nC3g>ioa<1z;PNriUZ zz)y-R1I(kb;Llu$^JmcC@h~6PLcb;g{u}sSV!oddLZQUEuh<6zz0JePUnGrVP50`9vZLq z5N~r~TqZ-ipI}~$g8nv!b{oL_bpW1h@N*%I?*;JxBH%k9-m<{Y5U~FT{=Wi0Pk}$v z0jD^pb^IE%+XDEXz$?v; z4>Jt(?+5x+1w1$CRv6+iFW^JL|8HQQ3ij0ie+u;y)z7sc4*vm9SI{9FcnZV(^@aY1 z0RI<=&p8l>Zoorz;BxSX&S9p&dQ=IJMVd+3)9@Z>;$ zUjx4f#MKL^2R=a_=nC~}Bbe7c0Iv)6d~K+6D9(R_pHl&E3gb8i^f!m+Iq7*?UswlS z0e=SP824fQZ4369VE-HD<1BbizCQT*9CX+Kbwv!c>j3%33C86R#D5paKNBJTseafE zJb59`cf&lgg?UsJ@^e9m|BA3Lh=+S38@L~w3jCSCa}DmTz5u@^@T`D)w|n4^8}I~! zeFgBRB8=Axz@_y+6RWvEL_K|N3i*7tX?j_-szp%~Pe(_y^+fIZdW zEy2Dx)Te!hOZ+oG?En$4mga40#r!B-o4%p{|c(#N5lL+}O1nlzy z|8vNad<54@i`ZGd||%0 z!Tj0>^SvF|r-1!Kh(kN5EB*pM)!~aEuNpxAk+6Q*f}hE-ZcYdNHv`X2$hS$LTRmzQ z>X!Rpe-r#X2kXdZ(0?NEyTdr1fp}{UcnH)>lc3%Epj#>6nE>%n2kd8opJp(=(}2Gw z)cN6nyTE);gL&N&#>*S@c?fl*1K?heKexiTcKvj_Hl1v-sOe z-y7^7L%rb%`Dz;IGY;}kVR(LfG~~A}@SFg>*E9z1O&-F%Mk~12XaVtH4eL}i%!_!4 z!-cSJzJ&bT7<4WTcpKnZ1@`p3%4x9g4C9g;#&-|s{~yf9oq+d)x`@tiPry8)_ayj1 ze$EX%Yavd;p?;wE%2on>HbZ>U`&}L2y91{1-IFWuJ%}&xJ&0G}58aPXhkL*xkS9w5 zJ_6?5UpNOi4eP>Pu#bgxYAM8FHssHZfWHEKC*)gy=?x_%`UTGw`QF zezO9eYS7FGT^@m@j$=FDF*)A!#v#p^ZG5sXA6kKTu}e-gmK&jzu#X1=g%9T>hsv9 zV4n-@SAm}`0pA7V5&`jl7veDVf7CM?){87y?0K_iI6FR-t4hIsx8aWWL@|10p^ zjw$r(7_3M1eCbrk+h3vX9RhjyE%-SR`uha%9pHZnh?5~uul@$SJG5&7byrQehYbN8 zLLtv=20fF(pBTt9uYrFsfteb?hMUr#a~J8pd}h^p}2Tlmzo}6X@_A z>bF|p{~efLMPVHbhJ0oEMCaQPkhgonx|SdCO^|=8f&Fa2Lm^-FgLP^()FIy?uA0EQ zK<7MLq22v3Ui7_&y|AxLhJBwUe9veRJl9bH&M`WG|LZ{K%`lGRfPWt3jry=ZrT1FI z!@Qv1Wv_%hYytW96ZCg7*#Cn4%Mw_pl3{<540$XCa1WU8X|OI#13Urze+Bb`-sgD% z{5b;p7lU~*5yrO$mIUKY``-;Pe@{c+9s+r3CbZid;+&pm%Yb>;7Jg505!R70HrmnMu+HX& z?-CY=yx|7%M(@j-0P)ZX)}1J@UjXql5avaF7~fpLlL6z^8tUXOkmvni-})8u+i!^f zb`Xch0H=G#6`*rDzz2Yyw;?ahg87&m^ehc|G6uds-X6Xu-o31jbAPBCD?;7qTvGG2 zf%^qpc)`{^;I{yOzQ8;!4&Pb35A*Z{d~jkR=<^BedzAwn;5+OoP}jAB^YGo^e;4@u z7k$sJBE*RU__G}D0WUxt-hp@^mlaB_KD6K4+Go^?$IJ39&!Vo z0^|Mw*5#R?XAv0p{;;lv!aOPgxEaJlsR~-RZ!Q|&0eU`xanAvNcER|@L0nA&o_e6$ z6IjQ80RKCf*EUtO4p9(?FCk8n;Xd~a%)1Kkz5C^$LpR97fe=5%;G8xOv^y{t9@)0UreOeH-+vm4ntT9rE*6h@a9hzK+nY z0s4Cu^o#_5UW5NTf&U@Yx9ea&_6Pf^P!AV_btDb?^#Rr|GpKV8Kz|(|9z5*z_zr{o zKOW|97~sLqntuq)$8j~ZeY&T{SHg?r66z?*w(J z3!DS=hjXwia1LV*^@bb7TW*-Yo-n`Kfo^9ZZpQ#V++FLltiHx0VSIZ+{@)Kg{t)NQ zVO@I$asC9xw;;@~2w0b&L7sGmd{qzf`C!o55yo*D_}>8h{0{ouD5S^h7@Su>gZ!Tb zI(&ll+6Q$01O5F0`S2C!HWhU6hjV~ephGd3k2QdY?j@&#J$-+?3fP;&xzGUU?-j@o zv9J!N!v1Izj7vD=liyHJ)&)E_#6uIvw|(Gz(j3k?Cz*F`5bHc%&4lo~=!upsBJiZP(9zr1xUjUvmaE{ai;&}tC z7lF|3Fo?qmmfHXEFnjGOW}Eg>TtjB3--By{}0 zf3WX62KB#9W$n;2$cNVgQ!p7hQyS+XZ#zE65vVV4nH_ z-WU4S9_HN?un&ZDC(@w;jLUzpt~o;9xCn9e8Th}#eq;~qi|M-+ouS=5aIP{B*7tt- z^gOkLb!{QwzhOW71LEf{=y?wGe+9a|g#7aj^mK&ZyV3g(EuapugLyX!>d$eYgFEEI zA244EKwLcseQ2NF2K;e@bwA5p$4N&xryUJ>wGo^XTEMteh3AbgLY-C<@^(ddj&R=Erx#&;_l5lS8uW<=o=ljh<3Uezh_`gm`8Uk#{4h_g%=EYi zK|Iuf_^AN)^+5kh5D#BqpEVoyp~GQb#Dbq`fN#sCb?^fI0O(gf$O9cfpEvM)ln2;{ z!n*km^l1S58gJcQ1AXV~73A&W;HM|V|6A}U0Q`9j_w_Acf7cv-?@8}B3y1iRgS;IK z^Qb21zZu4B1LT3hz<(6*4uFq=czzD?HUa9xXE0yNz`B_qeqYcEp2rvl`QIPrS18nn z$>8Tm(D{B99dI8Ze>MRBU&8vk9)3SX?}_@L-7yS;c~ltie2_ou!2E3p?Pfwe6omPk z8}_qjAs?E-{JH@6cc|;~fxQWwzu7>Y*%adWKIlo`xxNAMd<5#x;gEm+K;GC6_2FMw zPe+6QU7_7wkT>Y}J9!`v)AvLD;rHglVIEZnf7V01<%W6j7vi}B#4~-rX)^S;F~s?I z2R*^)d%kTTPD(<38xQ(8L;N>_`q>TE@%gY`^oIRc9*DOWpxYSOM^Axq35WGA2K1>9 z`>Y7?GZFl>0sbS9R}VnlavavFmayNM0r*7754&MrjD`KnH>g{Rg8p<~nhNWq4e&(3 zyr>8Ehaf-L!+fXv-(oP12{7)CkT*==dBO}h$DRlI;Q{bJfjqej;w=)^9ZMLO|Mfkb z(JuTPot};At>VJ3yXs2Y-6QdjR5K{?3ECu@S6y z4ZzRw5VwwS9}!zl5Bv)_uX_SI4}^MnHT0M6HKv2kr{TQfJ>-XZP>1vYKk2>1_k5RBsi*cW_<_-qI9mJasgK)1PoH!H8>;gX}qyFq>O2jZ|5*nfxoe;4ZQ34phS zbubC$OL4G|1s$9mv<}5!T{DM$Xe{)1EAY^FqJP2uEA2&&bhHcP=Ps~cXaMuEB*f1^ zz+E98Qed9;gmq^9w7*4{yp#l7fsib+n!Fl^2 zST}pYey|(K|Wss z{#=21Z3cD4H8_``?=QrFo~BN^zXie1fz`CV8H~$*$PX5P`#>J64|?tZeJ;cM;oHM~ z!2!qvWg)IkLOd6S_(^cqy4`?0U<3MJhWaf~(;LddekU)~Ev4W-q7}qR1k`~SVZON5 z(T=W#JlPxaZGSlDxd!_C!aC>&=hYW#YCj7>exu(JEQR=72>WiEin?8j&-{?juhh~! z=U|`J6xPST4K>d&Z;dCze0dA?QfY`QFVGaq4z=60)9Hr-vH~#SID1lArBXY zJXsg)D?%PV2>GxR#No-NT4x(b(EgxL4Ok!PJurc8y4`GdjSqr#Jl#**p8)>W5GU0j z{}+dOu?Xh-9?-u&v}*X1&bZ|x2FKLz%Q;c%Yw7tX_@p>8}4 z^Ry?#RU+75fc2s{^w%2By~}}p2dHCnfqhr-a|Yzk#7a7zcS60l3)U}J$lDWKHGeAD zAAq`L2l!9#Y3T>?><8mp5$4@?(7y=OC-yKdyWm`|7tF`Hz+W8B84QqrYJhG{VH`I> z{Ja4F4?*2B4DJP*Lf#k#d@1L*Ax3a4F=IKQLd?VH~Y%Yd;&q{rGfP z-@n(@Jm)+$ZVu1!rh)&rnrNP(FuzX2ysiX!tTM#gGROn9A>MXW(SBxtK8ImHWdiF| zJ6OjTd+2r-!@6Jz`eZcFJmxU&CE+>b1`e9%kCVn7!Jk1ePe;T2nho=-Ampo~Fps)G zJZyx0N*u&h6x2D_z@PfCo_2xtu_EZ10r_NRS*^dJs>Yvz4$EL%8pHn12j)vAtUHw) zv_B(3e-p^V^C6F|1AP*perpZ9-JQdm<197q*@anK$e1-UY1LJiM z^2~cU#~9RD>+=Wlz(dIY^C1ssLmplW{>+7Oq3^P_fp~ifx~+qJbq4Sbpu<3DHy+~Q zHms+!A^sg;Klq`j9xq?e%?08%6!M8vC(Zx2y~Yi`8eiE}jg8QjzTfcR+(b?@ko+MgN~G)})$E)37n^@rzMY~Z_-F3)ph!@dwd zO(A|JK^`b$FX;{6Vc%g2>&`ToU%_y%S`_x_JHxa;{X;eW4ff-;pkEHaU$d3w?+X0e z;5mnQs85E&diOD}ZZ{mh2Wk)X=SnNh)6God=j&aBk@d<6fhk=1+il4u}0+AdLGn&}}>1 zFO-0M>)2EK*%{(019X_3OY>}meKdV<CeVF#A zYa@+kLq0Tz`1z`74Arn64eHN zlMd3{U<&t52@f=XU8o06!us0+@<1ubpMznZ_V1(p_k%ic7OWTR>T8}@4~>7ns&%k{ zda`{l&0`DaFyEZC{gOr+zYptFO{jZ+KGgoV1bu$M{Bo|Y{iy)?(;ViVGw3j^kmjHE zMEeiJZa7Q(aj1VPfIst~K8b|9anV`(Zw~8tEY$zaVID1qx-JjorH}&JpU@T>-`G;) zy_;&>wx7m3f}U%k-nb9-RS?Y6xKX-Y8n3mmPg&}qc{W1+T<)&zFSXHlA>hw}x+MUf zbDIYKjD~e5&Qtrd63!tXX>-E@n7>b9f3$v!o~Hxh_sc)p>xN_Ceqk=G7uR8*+Y9z< z%iujEjiHXc1c_#Gf9?NgFO7eMaUTiKB^EBNdD_DKih*6>Ek(%GFo5njq9(IKB ztx{9-l!1A@AM)OPct5}<(78E`djR}ixCxwZ9}d(07lHLRKg`pHpnpF&cX|rv;mcjM zKZoId_BlKU`vmHiR9N31+vs*jT-WoxG~}`Fur3#Zb6{A04LJ}GH=+LdR7(4A2kjn$ z@ulAzu7Q1G9Nb^HCTZRB=hA*Ih5Y6Sb>qo_nrAEItE*7&xj;R975W6V!hJ2L{dA>Ew$8gZ0Ce)4f zq3#+3=KzPH&YTgd^;`%0xGu0C*_fzxb_Cr_p|1N5^{Szq_Olht_s=knbKqW}GVEXC zVSjz}vhHs!&|w?+UmfQAPS~epLfz#C^LjAUOIslS1O#cF3&OaRfIQO);=dNGcQYXl zZD8HWf_j*K|4!cpHgnVcy_u@Vcf>Z0uREY|PdGox*I2jv1@vzY?`LoZe3QB6zkWjd zxf}3l@En49ZOz{w;>zQdZubGyIq9$;-wN~e(rL|KeV@ktp}uW4UiZry;(q}2HwEg$ zzEHPphk4!6Tl@1A&S`hSy;2agn+)^!SOMMcT^RS-F512btVeC(eIRcDADK(@r@(Us z&!B$m4dXt-PxC*AbDlx5I<5*&(|AcZk9Fy#+r10x{!v(e??b+=4g2vJ*bhFxsQu3X z{}W+8wuJfX2IEWLMcoSfnn+m3V`8-b7UwlSs+!iH-t#aqMf2R>pz->!uNhxnx4RVT z(sFQ*77p?J7~;P@(|r%H-R|(0QFexBdyy!cpfPb_9@MeYM$!XH1674 z`+pkpp&vZwFbdAo{9!#c*`fXU2zBPMPTJ3Lu)g$%_}l>X{BXb{pspAVdET{w_LF`G zHy_R)ykH;H1lHLg$p7tOT&BZ3dI!%HlpCkV>xhrWqhP%#G*#>Kx~0aKz<$9S>PGrK zS5?RZ*2&ucqi`O071o_3(4Xp)uXG*)xCNXWjDq=|2KTC);aqDA)cM6BZ_I&nk0P*+ ze1p8<1$k^3%)5Wldc1NS*7(KQI<9&w(YPPv88@g)BS7bn_1d4&ptBX6pVM>E$@R7W z9UEyp;HCD*b*RSo?bLXGh<{($U)#VvdmDI;dNQn!)1dyT5BsUXyS4uMHAz-{UV6}RuS6I6>~Hm zZm;oGFps=1Yk!92)jT;6w}arG!UXnx6W}~yFRU-iq0WB@=XEIwx?i4CG+xM2_jfhy ze+P}!Jk=pTlx(Z{cR?MJ0q1Y`yfjZ0(C05auQJ_M^K5~-u`uX!sDUJlArH7+&^(R*)A&2ct1p&nKmX*`_@2j15B zSJ>aZuB6-bzomIv?ALe()F<5_{>N_6?UwM-_!h`Bv;DRG$>kcih6}}Va6k1N_WQ5k zJTU5@*5?|;^KMv|FR#-)HTP)T0`^l6Am7G9y_X1a8w+(^3)rVLT%`SU2D}+Ow{R2A z8%wIC{Kf%7h2KF71kpKHbJRC~a{rv}d z!|sZ<&w%`M>VdWoY@>DS266QkzE_wI{?C1?+okW+e;lm+sRiea|BcoBsem5`|3fC~ zcKvs2ye^z$)Pa3#Cgh)>3YtF>o+o(?^STJ!JC|st`8z^B9}ertDLB{aSV!}JhB$BV zU5}Rm&gUs_)Q9_^4)FZOuPWNlX7JqFuF=}h{&0Ris)^oGqwFgIA7{CLi>5Js>X-HdF-}by4|NoG+us) z=I?Sse6&uF}F z8SUpI$OGfFxglw==6^FrI14(ORFQ|NhB8FoXM)RqLd= zp%KLYsXW?#Fzn;X!#e)?ruP3N+~e%5rQ40%sClZxb2a})X&&0&eT~xmH{p4hJaFzu z_opwQa9;rRu=i%|&llL=E$ycJyDUiK7oo05$ml*)}m7#DR7_~+F z69jq81NL{pkl&UEhcK*G(h9$;C>+-?ltm5y!D22^6DX4p9DCET)9B|83*SHlNV}!2e@CJ z4EGVYZ|Z!0bgkwuxL5n>0M7}$gnW4AxaQdb=j7*My>2*1`|0AX`5(bKN$G8xXE)@l zpKxB`4f}U*h@auGpLzs(mIMEN;Cyv7@Z_DM_1Q69>oB#T#x3Cau0<_1zdzJb-5_r- zgZ<-#VcMS@*ss|`y?Xzy=Bb>a@i}m=H~`LPRsl~B;IW720G*)Ts1T$5oUlscc8MCl z2>E1(ySAU(SmU?uX`J5UWVunt$xq0W?O-3e0qRD2KH=_A?Pmw5GbcUJes+cRs21p1 zDN?r^0r_?$oR4jVbHy%uG{1A0#&bdanGXAiD9Bfy1GGN2k2L<@e;W5Mtns>sHU276 z*Igqbh25Nr$SsFikUE>|#+_f6)6T{%V>wH)3|4vx%rbE1? zU)4OWkmv1t=zjHr^CH6@%}?*!{0i%G`x=_(Ih?N!vDWqvq5dBeuKSe(dA?V)=I;`& z@e}qM?+feu6L)R@6Xw?`SVx@Uc>{WXax~N-){uuM!g_Rhjn?xB%$E+Z&Q^l_u%nyS zXA$gk@4@;t7S5kT;rxF#oHIA|)cp9-~PBXPWN3Ur-$U@^z z@H|x^h^x|HwLgtP=Qvn@msHgLG|AHYnp9XHYruWwLdcWWgS7v7;klH}@3eih`5J%O zSL2JJ{@Drlyl3D%+^wh9t>k)*C!f%GzxCSBuFtgo9pGH6^?c1=5caL}VP9P0r}oDb z_GLfeIS_j8s5Ru<%dl^~3HkQc72V$l%Qb%Gr0&-NIDcpc&tG{&X#PZazVYM*-R`94 z8mIRLx45nCA45DJg>#sbV1E|!`5~ys?m^xNh7a?YfIbbO4q1Fz>pX6l#=lyw zet`2plNp-dtAWOYVO}f){U^cmoL;bxHW{z`6@OpjKd);)H$T?+4w%2~yKDX*4w|Ql zzs7$+oF~G)lIb(ut|gpz`M%ZdzJcd_Zb1ECYl3d~;3JKnETG#R3UzD@)HzL{u0C*0 zw|flgz=sanpMh{rH4dJW-wN@T0OyudYUl^hZO3YVj+fJTPuSPgfqmlTP|eezo5s^2 zu8y74I#+||1QOsJ@-)=j32@Gn0Q2`jtoDDw5RC`G{mUEp9Z+Rhzh*4ZI@Ir^ar(|| z(~{ax1JqZ+FfO?rG*2qz?R~Is+SWqzWJ0~M3+7kT^O~psJ&m7OrgbX}^(^yT(J~c5qL0b(C)R>2b|7F;L^JZ)&{O1C8e$pz-#t+(S z{%XIq{g~<+AADKkvpZ?s_7~CkH&|!qJ<zADAzdpdMc0t=o0WrE$BNI{u54)%cKx zI<8zTHGZ(OZui&(jYq&Z#&_5DzH>BQd5ZRD=46c*f%}Uctu_CW3wpdlmufuehvq3g zNb4M6ru`hSPxE`lY5rXsH2x3P-vBFZzt2qjS;<@5Pl7mE2sp7ipETYV z@~!zU&0iDtL8gDS&h#DtYv@-HoLi2DJYX2D`!%$j#y{-Qc;#r_-@^kmeto~@83_89 zE~9ytuG9GZOB(mqVP(koQu~vqgyu^GfH4*t^kxq^CJh8@&+-(uR&u36gt>pP8ieXMcc zLYjX&>{A>kX#4rqwQfZ>X!{+o9tGvrJhh5ye2JyzpXjIi`zl1^``{dD1U!e(3(k@H z*3GjOXG81>wZ;o)c))#tMPYTw9aimYWytRv;VE6`OlQpJdTedyV&nbNd1(wLdvlrn2EoKh57fkLEehO6xy+m$narbCT%d+CD!# z?{o>~og35x1&g)SXlG)sH5>R`!rt4N#ixY>-gzjTz`b@bJg3p* zyyo|Zd%ZHDTIb2@v_B!;HUAgbN7H)`GVFD`cMs}z+XZQSr?tih`Dol3o&)r{tMfoc zjPCD;0oQIC9JXuwiX-(O z`*Q-$2bROWzG^S+{}FhfOzT~`-Cc7v&mgD+i^2E?Kz?fk=O^^OzN4SDpC90P-6C+G z^&Il~GRPap*6MbL9?|-gFQoAYjvC(xdOnBeOiuLH^D7vh%d*w(8_HJG|Ir4{6WT!i zycX)!39EH~(<*4(6!zDJ;JJvSXEe{iHyY2oPUAnGYCHkPcU22*{|xeEJ&5y{pEZvM z)V+Niw0-`)8V?B2g2(2e?0~4(`RUZDz?!53N?Uz5$*r*D%$?-UCsXv?kU0+Yx_-bzxEC4t^&(7 z&(dxh{|o2I4aVs>bkWDgh9jFbf9NHx&wkh+UA&|1Z{^qgF;Uw7a*o6j+CH<5#{IWxe9m8uTfn(cq=VKWBwX|K1pN~reu}$j{{3)&dTOYSlPOjjuk=9k zcb}v2F7P~t9Xvnj0QbLrT5JAQkUzc7>iOeGbeo>u~MANvh`0 zhI5smj+$rIbKT!&P>;=Ar+K=;x#HO0+Rxmrb)2-%(ENQiYTRVL=3lc^lN)!gGn0qg?^R)tnKN&YI|Wn^}eh2^Omi~d)L;wt!t+3cO_^) z^T9dZ=V#h}8sxDkc&UCc+RqK18t=SY<7;96n*sM+q!A|4z zV4s)+=P(x!Yo6c3G`Lozd~5~JH!g#H;1w4207uNlnw>3}VAC3PWqVZyIKCmA41=cmS zZj&!+{*F*b*>=-BpCFzyM{EA{6`JP|)H9ZEHP1*m2Pl%L?RPZS?M6ag>H*``&{Ol! zeMh#Jwl6SE<8xnX|5shp>rt(r+J3ORp6>(h>vpTH*LbYA#y2_Zc8hpvd|tBlXW})D zzk>76URyQ)Vpumj!~JG>j@I)t#M=-!pL|(H>$5pa`}x9N+fRdfrai3JTVUJ^>Brv; zYZ_{uFRar3*uy@0Has`=8P2J`LB6t1(fVAUq5b*gru`3vdiwyZo6|Swao+^z+s>o3 zpW91l`~j@{Yo_RaorutQCY&c9hIL^r#Cfx!+Rw7~y4?c1HQuMO#>ef`{2MN7+{8!Y z5%=}D)P?=5LoPkxE0xl5l5|tITVO58RFF&I3U2inL6rSsAy-e%&@0P~jAJh2wx*G2>Q~T5E zh}JW1hsMjnxrzlm@3e8Ej?Y|h&sz=7ui~I?iGuxRVH@3FPpJ1IHfY@%4bphIdz$|d z)PaLCwY?9loBiNOcQyynS) zePtooH=XOMc?vwx?Ji!R@t5^9kAJAvp(X5>%^|t5GXAIW(v*KRU$6FnHZEp_ae%?jHBShfgE@TH z{LZj0oNS``CqrGae46G@gm{jJbt>>L@IXAzfjYnJ7|l~VUiWJh+{e8=r+M1K`K^0j z&0h%g%s*Z8Pimy`6)=v6;lBPC>}xjX)_%tM>UPU+)%dlpnx{sh#>c_@stfaa(;eMz zLwNq}6YTF6LcO~7x%TrqJa3Q)^^eUO)s{EghBdCtRrp~eSo|NEi# zv-vcQpPR4!ocT-Rt6@F$f_sF*ul4%k33Yg>MY><-q26m%Li7LLsQo_+`}emly4~RU z8gCEhx_1M$ebWP4{|V5qhz!kh3hs$!25bBG-L(!QAP+xq*F2`1HJ-bz=C8U%<1<%i zo{CpBK5Mt;nYuvZ!LZ-I4d<&rt7x9Q5gN|}>(mer?f(imZ*P&T?YI7?+pRiV+kdI1 z@j6+WCo@dj@AcO4xf1k@9H{vRx@!Kkk($4zqqYys*8J(K^nCB#T-*D?{&6L&;}b?| zo?*?7=`|}#cs~Vh3)Lx6YeM*F@vlaBcvPs~b`ywGJ&Ip9C$??cRlY@+h2Vo`8N8^3eYL zgu3+X8g2i;LgORhUf?(E>s>$U{vLRx@yYEqz6Q>34>i<&t^_^3U?0>K_B(yyJg~?; z-R^&&XTOKKUqhg7@%W@zxVJcIL!vhW=f zD?iPX7oJ-i8!Fu~M8mrO8OGgnhvu0J`p@{M^+}D@JYz3t`~%FRs&KAVD^$1ZI!*J( zoz-~uSdAZsI9UvduTKx{Pk@icQ{lO|5ipM1>S;gQozeW`V0}+B(e~Z;=y-FUr|qLE zYJaNOXq?^$l4qv2pSVKfsg*Te=biR*7wjW?57s;(T{WH!@7d^eP`BF$>hOwhw9eCD zf4XF{uDf)P9D* zIa@h9-EN7!n#W|Z#vj4+1M|JK|BD7{p6$IgZeB_AZ1K~0z*>!)%+dHiEra3s4egKp zD$TR1jm8)L)Z^v-T=Tc^*F4*xE-eB3sSpRvUjpLX2lCI8T-u)}5D!_Gpj~)>Y|#)s z07>?`-N?q8zj$eFe;`WZW#D;(MA%2aNYy+&gEa08&*xafIpHU$+fPEgxp?Vz?=8~$ z6oGw~MQzPf2KEcn;XdN%10CnBARcP<(c?b#nD)PpqsG0CYTWU$#!qk1_*yvko(Jzu zoiJYee+A~3-#M*MB;>KT{+hokR^4tBD~+2%+y>if{*6twKizUP|H}-G$N6b|No$R7f^n&LL;Ldw&Ku{X z==uBLwr;oga;-z2g1X&_A)4pTRBb=?mc}g$X?*E2&A&TF+i!(+>ci$leuld&&(L5u+XdQ~2(EPVx-@0L}=FdM|;}?82 zf4>Ng*D9g?jOwWQ*O_P?rY+R=Js)WNZ&&TlV~DqSTg_89P~#~rG{666-QW5_ny1k> z&GX7e>tMfK+h;)D-nUNs6V*xc%nsA-rgqczVQ^n|6`tFSu+luv@LcpIPpz97#9Q4` zn%`!f=1G{X?H|Ma{;=+v=l&Rte}naCEaZ*Vhcr*>J3TJ5t7yD@d(AT$&N&ys`#Fcf z{fk8b&F_<~agzmF=dflvK8HQl_$fEdbH9~tHw^Bl&TP^4kUE9#`f8qo7d76h zq8_jP4K;sz*e|qNqxs*%z165d&2Mnf__dcB@7_h@JzyRkU9RnacGlzDucyW@!ufx1 z2d!t-o0=y+UE_AJPcLy^>+A*Vd#O{}{`(QFLmcey=GW2o)gv|kssxRP!2MB|Qrf=l zFRjnkCR*odi?p9D;x*3;IM;d)_bd(Jy!12Z|L&yjR~e`eZ^8X+RuSDV_dFV3R$RBc z2HyYEpn>K|dZh9EmKyK%LhBq4`^3WTnrCoR?Y~E7jZcO5*G-$Re;^SE{fnj~}A7KZ*G@kF6d?Lk2u=Fu1Jt^FU9H zmx1^69{r;IoH0}LeBG%X-46BnR=BUv$*1{u!2R-6xR2fm_sFxC>wcvd)wmlxcRl&G z_H)60jmK@%{3HKr-3Gw^bj?N0-}I^GkA*tn2HbZng6D+-t7-n#P+x7mqWuhSqj|2t zJ?6zw&9f7p!~ES$+Yf^Kj$qKO=V8s0-befImsjJt-fP^yjpknpaeEKWwNAnLs!JK& zt~>1aoA%NEoPs=1=9uR9s-k&bHq`c=;T-AsPR&zxi00Y7K;u*3-l|@<=5Gt%YikYh z83lDL&C@4vj?@;;ZSFuFbq4nP!4q{pS@=og9lvND_BYbFXFtv31i!yXhJD93$nz7@ zH2;p8dVB+59@T|)w&5zx;|lTIW39G72G7eyrfB<)x3r#yS{knh&qY6ct?f^Y(DlPU zFYQk|_+3oCe%gNCeBG`i*nfuiKLq{JJP(sJ{-lBS$EmQkZx4BF`3%i7ZJ>^~_7HDp zHt2S{9M}9^+G%`DbInuptHwK*)#IB5&y`(mqIp`uerjDW?dOSc8s7-dnY@R1UVBpW zY=Q4v4Sk^P*TMd``B-gl2hST!g!%Ob&c_;q{@dVrq$`uOKcy`-etw0kY92elKR}%s+)Vqqz*F-Ng>$o{T$(2V^r<;b+n0m)^d_5X z`}Xs+pNrw#sl;K;Gpvu!KL*gV{9WCyMLUhZaMXCqDD96Evnf#XngS}?T?F<#wWsfwO^~_dwE_0dw{d%FIiIeHyh&Q5#-?;P%rg?bDJs=dR!L$AG*%_A?Gd(;}1gFkrmOf$xemr zO?HtjO7?3@GRj^hMUlN%6j3rt_R7jiBr}nf2=V>{pX=98ch|Ykea`pna~{#|RT1;$ z3kNt~mBqT8i8wzqMcl91Kb+%JNSuof7UwILj^Ogzdx!Nawc+?I65r{PeXO6;h;`PA zax8DnIv+&)IbGC~Qes@!Q>-8U`^|B<{Db+jE6lfu`P3(IzR_O%&h-}Yow|$l=fYy& zzvO=Qb7Ca(EJu$2MWN#+_8rEHbLn1(INhxt%y`sVJxq#cebWoY6o+pWMRE$_BFE7@&Gc4Ip)8ou<#IgTAVjXzu1lBn%)(Ncx z+1^;R!}VXXKUd9}`?X^IRnOSIy)E510rgjPT zznrKKi=ME4lpp)^TFlpsTCh&MSg+e~iS^45U|uen^*JspZ1;>Wz5E^5F;w$T}xPJmbZC z(N^O9^MZHT|H3XDw=#X%pXXxTGT4>%qurU?)o1|hBh3x`Lo#1^jDm2YGdY^=b4wYXI^$a^Uco8Z-{dgCiB_|MN~T|1H)r zPVQ!VcVihc7hV!pOZ+&iv+hW#9y!2XmT#P;od zx!l)^d1!)ohdk^j>(t9&Zfwnd_G!;?3oXk2_q1dFH=1?!i}jX!&g|#*39P?!EBoJS z5cB!*tbb@4^V(wF$wiEd-u`4i56x$Pa>Tr;X9w2#B-+Ucu`cR&nA6>RjJf+%PB&Nd zgOpO`75!j+6ZSLo4s%DbA5klY?QO(6ibF;Hu^0XCBeCDqx(BD* zSG2cY_c?C;M88vAtYepW#P$4^1N-xA0H+%uzQ^xFS^qzAUiZ2f&)n_8{v3Y9{dh?c z2OBYNZ~U3{J8fmYSgbd065spzhph8e+14>&pBA!H}BYt z{mBsX)@tHBYO*)ihioyAxIUWG&0WMgZ<=v_pE$El1MxlfUC8!rsIfYuVxj=j~NIT@58qcQ4ac*|v8Ma?4<|EDG z**;yg4?*SFetH>>&(NNn-*Gp%o!Nhn?bW>lPtjjLtjIcvV!zTnknO#C@OM$ZDciU2 z!SN{})=whEdP1xi7yT9M-b24|x+hn%pZmmkJ4fs8b6pAW>on|}`57g^8z;Wv(Fk)3ScSG4m7Z*YER ziF%$}m(x9y$LV&lWBn8(=B5=`r(Y_!0~5BeeXrrnuNbrc>n5?imsmeB6YX~OHLPYf3>m(`_oa(N9v1yp-mX; zB;DeAJ4v*+nP!}?!eT!+zxV(~i~jxLAokN@HuDi(s>1Iwi=K|*|vj*!l z*u(KG?!@|=#Q1PyW7h93&WZiI$oi$kx!Hm}IX=UZ*nfKw&%QbA=c)&+vqtPk{}{&h zP3EzF{{Xh1R+Qs#%Yu1lW7cn9i23!6tTX2$`&0Tk>jaDb(PJ&^oE7VJ9agh`gACT` z-=6)ivVr-J!L0vYjJLyPaJr77Us%1E^*8vkPNU)M=fyc}|9cnP4?n``t`hIl-YUZO z-X_dLCNUoz!+vgP$@a$L9$a&A-fZs=Zm$Z8^Mvyza=L}CbKIU^W&fYQW8Pp0^S`2e zs~lzfII+HWO#E)q&Mw@(*~c^YXvXOVi1j_w`K+^f8^?3J_?^ceo7ukPan|1;`rnqh zT<%|^m^Y}y`qTbnfA0ISPDgRh%{i9i`O}o^RhzDC-{=wZpsnoZjT3CYUo@Gf z{M=dgzlkrWTcsh}*K%NePjSwdflK{ z))^+wS34KueAN{5zHPSoF@YJkxZU`9koE0Wpo}45I_vlzV0-o6c!lMh?(DLxGg;*K zr!ALbQ_=os+~9O0zp_q;Zp}t;MobIe+ zD(3H|PuS0mH8~Dx;vCUY5zl{OJoBJB*XQ@WINc3KoZovwzg9BaPZaB`=fgN|uXgfx zaaF8qHT=!#UNd3dt`PH+i;v!$IP}I&v*IQ ze-~@EFISA?pHGZ?GsXOId}Y?Z`GEZi8Nl%|S<3nCYtH<9JnI;}&z*RoUW1ho%%6_IsTRBv7hh7 zc`Ap0Y=7rF=WCqk2P-XQ|3}|uo%>?kl9wAm$4esn>{fg%7kIyNN|4^~t(MFtSesGBO z1IIHzFXFs+6x;u4&*f6goAc{mpY2zP^A(3uISyM`#t@sretL`VF<#tnTII+(9%8+* zpcsF~{^NR*G?Vq+&T!nU-*bi^{APXo&dg)nSl{yx^L70={uc)@53S1M2iHW_KP<-8 z{+6u&^dRdzD9Y*Pb>ldW_$XO0KQzj|lZss5Dtom=eBdC~5*k7oOz@~nSatP3>}{o3BKtg}j-t6wvi z{fXSeI!{BGXO&^TJD2rq-)H-v3(PCsW}O!iT#lz-vQC_6AKsj2ovO>3SGdRi3DCeVl>dgX&Nf%(HQF<8 zA>J()%jAZ})!9$=UgFG7Z2xo^^8?~sU#pw^{jR*v`6@bq+lTuHIo($en2!+i{R-RJ zzJYirAyk}?EhWaWbr!IG0*@ zw&?foU1XgJ-kh&f9hl$pVVwZco*PcGp9$g|wV8;+rB|Hp5HY?gDE1vbPh*|FcbVT1 z>&$gyIbWfhSm%}a{l38^*?wq!)=zK6e2Q2Xnl_d7Z-{$^9p`enhbA)Lagz1hv|;;Q zz1jc2+gPV`5bK!Pu#UeN7kyjH`pu8A&SY@) zg7fuc47Vp`IN&GpU3^#eo#5~=Z83N7A5M*$psvr z?_yr|$C&#~w{`5lZx8k}(~{Fos>u5Dt8o2HuF3j7otcjoahUDG`k~iZr(Y81x1pHt zIEec@7ZC<<(Ez|2o2M8pey?2lv^;`o3M+|2blR^Tl?KgS8Xu zS6j$@t~h7%Sj>z2)!=&aR_tG-4(D`Fh;u|=$FY5Ym=A6o$^JYL>smuQaoqBYdDiTu z>`z7UzRHdW)>rpE%Wr1=^Wr>}kC>x0#5wtUVn42e$XEAk>}Q+)TyOo&xLjHX zuzg5lw%?-mH^ut=QEQHW3wQQER;(Mli*>46;-26%VPD^k^L0&}&nzY0d$bhufKE>&C+;CSf z!s+e|X8jHJY=146`Lx!Y-|VK$P10DWc@>WT>0hkVGK%AtaFcme@qJBQ&;I-t_blG{ zu>LBs?osqR+Z(;$bYCv!IGE>Wows7$AVIX-18Zh2=dGQ{yl{x#rb2aN!67R0G z@?!hkKg>sn^O@7zvOgomdC1Ta9EZZ=HuC&SpSR<>zGt!|7$E{`%a?2?%>Zl&f=Z$ z2RAtW=fv-Q6uid%M2LOcBBGx6D$DV?Himf}(Qf~%#r;Cz(Hw`PlUaYNShsX`VSTgL ztaD}*^A{JGCy4dEA!421vNV_1G4b6+9p>_?e~@)PHQ>1Uig-S`%Q`0opDcdAEa@lv zS=yTQ4Pw1+>`wOokT_ptYQp*j#JbA%81}PZ2~PL7IIn12mvuheX6`?O`MIuKui7=@ zd{q?lzM?N!-$tCfs3O)MvPHdpF6N;QV*SThoNKbOV?S&C;5f_@_YgarWt}Z$xf};K z;dt7McTSdyd$kT?TsN{g>*rg*{Kzr(KPHg5O+VH-^_R!V|D9r;xL({IhKqIbkz+Ys zqjel-$K70x7Gge9SDZKQc!2f4ig|H;KTdbre%ASKD92}<8|Sx{7!Q;f%sPHzUh_`O zBO2tepNB@U{v&_RZ@tItf4dH>Q(D}YG;hE<&sMQcktfUp?y;Yz{`|pzs3`j7sx};- zuwE!*cvOPZH66+JFU7t_-g4HtyNdZuG2gE$_6>WAdEdq=>}N5tF8W8zLwc}&*Hzox=9p#k+-P-?05>F)s49W&6BuoUiHP9fKv} zyul8!K2V@Hr<g~ajh2dbgRzkMu>W1Va(E5oITI>c6FHFn8o=m zFpc#;oMD|GzFdFoMZ34$g>_sDGT%3i^%skB41dD@7ZLNyb;UW|Dq`RHH@jn4F4l7f zB=A3sOXv8N6C^&L=Ux z3hB%Gqr|@d2l0J{i}T6lS>6!HZW^xc;6D@<>vE+6*xpjiXVcx-{`hbn&kqsnt{q=+ z#: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%0A#dw|}Cj@0cp;L4G=Mp4&y)TYu%_=kpJC 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≈<;M!WQsZx$@PChp&wcUS{KC$0 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

8Y%D0 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 *_%=@FV= zO4K~3j;>c6#9{axt#1zBgK7)=Lc`$w;2+rE_HozyLL>ibe-=H~eAEHWUtQ9?7u0J$ z{I0Pze1B|vy0-razRR>dN9)hPK7Uo%zikT}8KIALe`r%)ms|6X)_=IEd6bW~Gv|fo zD_(1!w^H-)g_@r~rujP9FMR^zh>2-0Z%duWt<2yqde_mMt{jFi!LEK+U&8o@0AP z>m43zUhtCUt-;Rf3tE41k>-QpcM}pJFS-@2?HoF<`Kn!--#e$dO^oIRBQzfj-|csb z)A|mtH2-;2^9F}CPY=@EvX&#UGy_M4W}`mF^tKMcP+)-6ZJe~yi|v$L({-f++B z(iE+~vQ+ckaDKakzt+!&`(Iz+_rj9SYCCt~cYg}P{pg#$^gKIsqULKse*yA=I`F$B zOLMjVgW=u;ymmAAm(hM+FRl5G@|y34__Qvh^=&OR_iw8CB>4W}m}spx&(QpS8J%ao zf%CfSi)#HR$g3Yf-rgF{Q8)Oc{e*2HgAcr4E(Y(%hr+u1mW{3#{LG!9z%T7*#W$Lt z|DyTBG|dM=+zx;p``6lz;g#k^<27#y_42gU@oCji^LMac@g2?;cy!fvzQg(0D0qO! zrRaLO-PL^mI?dON*L*aLV<$#weUBcRU#+Y8I~Y$c!ng#-s|^u3dOR!$@5jHuxYR-) z&oo%U?}&|t_1)JO+Mk&*nnzsHybZjsAAMfyr^4?E{s;SY>){@BU$}?fW1=qC+eh<} zj+*x@sQIBRormOyduIjV9$AvNw*MH`Wp7$*ePy_hRuuG>?X;bKuwLG}OzW%f)qKH8 z&9mV?m+=v;F9`i%CG?-6k=o9QD9x9~Yd#P1lQEFbyoY;d>*0A%f%~K#OX%_EKM&2l zTWWp+#>25|wZ73V&39hY{LvlFJ0xk|0`ib?a8A;{fu47^HPhS%=C!qO?ygitZO6eu zb9>mAduOlpi(NJE?xlHqZ_Vp;(R>)3GcVg;>#Ggad=l^wu0ez!Is8qe@d>`yxk7Xi!ReVe-+KkchdaQ5zXtuJ*hcIbi0gR zt-0ef&EsEb-gcAbmf@OTEv)^If!~*@yjklj6wvKEtheSThHG9WOmmy3nje{=`2qNS zz(4T)$rJFr`|Q_o`!rJXl6o0uC=BC3d%avR9EJC}{o(!ZTDUin58l@wsHNL+`&`Yt z!0#I_YoPTHB6NIC!+Y>^2esY;?m1re(R%mRny0{X*ZiZ_hp*RsQZ>zIr0Vf`Uxel^ zn>GL5S@SF_&0%}V(8NaT&o|NB6ZXNvV881*aX42H5A)P(*ymgT=Z@-3(*B=@`83@{ z>zgF#2hS4r4IZt~`tGnlaL8VlJKI+CQ?TE4Z=Wu==p)TX!#ROXBelMEWz7@deczg% zS|2n{^W8#_~-Bt5U2hF3KXXqSKYv>lsl&3k>&JQwOa752d%!~WHB2OZ~a@EmQ1_jh&` zwVgNZG(R^~^LEfr*1-7utsvNeemfiX<=~i@VcH=be^c0ZjfVcg^Y6_xzg$oAzjHMobxQO5>om`T_#|J~ z`m0vD-TxfX`iHT4qh#_L&4VK}UpZ6r!*H)^CVc-n$6DJt3BUUm5BE3cOxAYR?$`X( zYt5bDUcd&pPchV7$2p<5wqIeT=IcvnJ0JFH{q6U9L+v(vkG&4uPpk*`)HcEW)@g9x z@H71W$nzxaza1<@SHpMIOEuAUyx?A>;}os`H&%0}5Y5;5Yu*9wk#&LldKUS0``XxO zp0!Pv>pxKQR^ZQ8Xs_;YPq`@E%MQ)b{cT@I?N3x&U9XdiHNVqT^LsEaB*8gJv(MVj z94|di25!*$sZqLK8{v6$gL|O+VLW*bvbJoc-X;rZg;QJaky1X z+pjcQ^8`3o;0O1rtTyU$%iPg?4xDdXy-xdc6ZBKz+=BT)ZN~-jz`ZxMzRCp6cU987 zQGLxT1Z(a+MRTWoz)dw@w@~wtWX(3Y?J^;$7l@3gej_UAyJ|Il3P`_9lj^_k`Yk(zhfqj`hFny-ZKy13=j`-jFc+K$mw z&24=(ZxE{ax*wYVd8K(Fh{HN_?f)?N-fRZEA3p}?G)5$AfBfJ(U4u4geb{u(50BCO z%VfuCNA_HFvL()!KAHTQt;>HVyv^-tk^W+wnZDdFi#9FNFIDcSE(_ZxV-=9}N2{{a_to9IEY?hWl>EA87sc zTbkQn(>&>>=53)JyPeefFNZZ>eNglKP~W9nwZ88%&9i4{-W&GKR>A(B|6Xm!9pcj& z;`}{H+bIfp>@(=Mk!jk_wRFuJ!t>Jgi`Li6)x4CQ9tRTPeb%;WTK@*tcU8bnMpJFa ztd8chJv4vqqqz&L`zp@T`i;NPoCF&4&=jSa z=2Z`AerJc~pSEj$4dPIJm)57B)x1KK=9y14pZ8Mpc1fBKNYmUXL-X07H-q@oeM6r_ zZQm69w}t(aSy!~3^;b1-5TW@n(2u*Q^-sbzUkdG>2hXqB0&VBWc+HcBXzn{ub8E1( z1okn~;T%N>tm`eHzWIO~ZPb4DS*>|nIDgxJq}ChzY9827^Bb<3--B}t@bm13sW5N0 z$fxbkFQj=%3(YGQ)%+#QgBEbk!3z8tPV@DbJX!GKmzw8;?+H6*X}uHNpZY3GH5e>% zwVge%56}eSa2@iHw+Y&QtGk-dg8Pzo7qvbL*7ZLRYJJB8njeI7CK2IUpL#`ePdFFk z|48feC28&q@r;1|=StA-h2c5s4ElPIH&*(t{cHz$Z}m@F-~5;63!oof$*()^Bj|^P z3TS;*c&=Y*xdDC_$uJfCOoaQwqv1K)R!kS%*+p{;56#Oq(!5y@&09nMyl0Nqmzl2l z>iL>4nyvYdS(=9f9|H4oI?PkeK)(Ry>+{pJKVb_suL1W!uWr)%>yY=(JgxPiVVbW1 zKJ&WPn@4MYHCFQxkpCZr2jkxlZKqb2=5E=VN5K85E^uGW2!7w8g_V&kz#QJ=JcfH} z6ZNoUX!}>1H|&DEJs0x!_|MwTx8Ir{f;d>geZ9UVbR2fUeZWa}TAysAxhvSWEu{5X z(7x_)UvDAY*Mpx0Fc?AHhNbFwPJW}g6+9R2ceK921%3$%S_7;kgIjy>qhfWFgmUG5d|hvuE5!?m5=12q2u`$!KOYrT6F&0pAR{sq1> zkXA_R>p~uqnXLz!c*u)PAg^#r({_$QURMFWb7BhmX5fEu;ME`>`vv)uFXW}Ofp>)U zP9E5gg7sG!$Zux@-wx}w!>Ky{#p5;K@I>=Y&o#f2sQI2Bnzw=e(-ZP%U+A|*%IN-_ zudL?x9W{?BuXz!7&DYh@JOc9G2d-M5=cM^X*nfBl^<7}8?L0EmyfU263ANVxaSoct zm(#qZz2?_oy>K1IH`5y0&fr>_yTCqAN)xR=*;Vs#-8HY>LG!}inonq=`Ilyzmu{|k zB-E>aZLL2IJjqMz?^M&gl7r@FVcr=B?_ZLjKbt{+um!#mp3@5zw4cqZY93Ho^H$*h z87r-)_hLuvw0@3_<|RQtzNFUsKs?(3e-3u8T4?(PV4h8Z`E)<*^Lz#UWtiXVrRe!0 z=&R=aVZYJyo7S7b{?#quZcuImn6Kv<>v)!f{KpyMTpIXi*q^Bj`@>a1zX|5ko-qD* zfPR})Sl4$Z%o3qBj`W1pxi%@r}fFN>lFs^JO=x9(J*c_hdg8= zjKkX+Xn*R$ep)%;XJH!ac=OdWMgJ2x9fpM=q=b6p(z^KYoH`B80u5$LUeKZ0^|;C=n_OS)V~ zh?^b6r@}35Cmz~mH;kW^;5!V~54C;E`vOxxM+tmFAC6F96x zi^2DDtHxUughI|O}Bg0 zQqA)(*LHp%(Y!%@ZD;r?t)DYi*K6V~9p^SMp67@6L>Y&){h&6Q`@lNo!$0j$$!XoA*Xh}ZlsoZBgqq4kNSb-9bZHP1g@+nGLA*S93>|4jZ*+kXPT8x;@pjveez zwn))_rassF0-SU3^VRiQxMU%p23hyI%X=%%>=_Cx-rYyHC)nr|7V zc?-xBwiMR-TJXKZDfzViyou%m3TVF0Nb@%XG|vxtX#}imZtT`}PJht6BfO8Ze6ICx z_i0`pp1XwFTAvN~j(uWuzSr}t=Duq+p9uG+&zWg|ZWhu!7X0^KrS+G*HUICq_A@{D zV^>MrIao^bw^o{aw$%IwJlDUV9SgvEttG5y>w^7b<+VRsD{Fqgisp@zbv(PmcO$&@Lh=Eu&=%@T*tu%^5JJywfr?%QoYP2plt)|vLg6~n( z*`)R7CTL!(ljf_3X#NGhPx8)Bx3870=3mxm`^gZ`V&>XT75HAq*Am)(!y`J*7iMUF z=Bnl$T($ja1vGbgsO^M$Y5j`?&BN_=9Ns}c-*Z9R=>_xS`jXmyP#Mi_?rHn;muQ{} z-+?@QQtKU$XzmK%liB@B>vKM6UbBR*S8d=CS=vtZ_nNz%(R?v{H)bw;_omHXZKs=~ z_CKY&=J(*e=hJwtw|%d9^iR#J!nwO2@P6b5?31^DrtRlJ{^-ANH9uZU^DmV(9}fH8>tb|$FTT}0KtI-ouuQGL_fqpn zxCdts-&YK)uj}RAUGs;&n%5Ypc}73Y`%KV08up!P!S5e^XsqqbX`*?upXPf5G@mk5 z^NmpMR48|D4Q;2tx#syF>h`_1QS%22HGc%($*BW&7H`sacELCha9Han-qCz+mgZ&Q z_ZH87(t7*Hng_kn{0cme=@6e7IQRIjskT1=_TMHK()uHCF76+k2R`sx&pTexnjeRG zeE&VIuMYEX))K9^T&(%tO_~P)w+zwx)U}%Lf%UA_b*(RUSo3q>Pn~I6{~Ok`y?SeX zSJ)?sh5d)*k9q>Ix~=)yaLsLZYVHo-flPX+^}kB#dbz^B&~jLpjjXQiL^szw3clMp zC`$X;FGF)9*cVNJ_sGpJYCBe-cZc{awAA%Vb!0M;{5|Y5uPvhW$3btN zspD`gUGqM$@7gkF6F{@jCoBo|Mu@77oI;iohYh4Xm#;JrhY)!NRh7|ku<99IO4 zC&ge~Eeh+Gi!jdH-_riLf709l`}2ojy%rDaord4F{q68RYt$F5Zv*pM(cfC{2j}o- z!a8eyLp}d)fcgFIOs&sdqj|M0nrA>>lyX<=e?HQ@{SD1uAJKf=F3q>WxsHtkw7w#| z$9D_T`hyUM_n}&U<(%frUTOXr-lz9|q4lwlAFh0_^~bX{?+)ubzjUp4gZ%b2e23&j zNuB?nEv&g6oD&HCtNkhXNAn*^n!f}7`>oa=g>{O{ajmz3{y^Wo+;UReNjs}~_ejmV zz`24fSYJ%|q3wK2)cjYh=Ftx{55J=MyQ7-BZq?juzwl+k=p zam|avdUM4uJ)d5J{m-$mPaAMr+j#|f%X2t~JZP`B(`%>ZF>s&d*gCBb4A8vn3eBBY zY2FRWEdcqU*IaF9IQTPnq1Hd1rFkUi$1m0Tqp-48k-(_R9oui#J z|J6bB&Gj_TgZI(4puYj@i=BP6{o%cU57hk76wQA_eA3}u#G~2T&TCjNyZ}26&`<8p z)b^vsY5pAe_(@uS&|mY0z}L*z`nAwMe?otDg8sP;p7$i!zp@2?cFoa#<^*cqd4uLt zV0?3hdk}vjw4Ii(G|z_jbX$|PKJTmMZ?iPF{G+*Tn&vi8?t&z(FP@@#OVA(vto6sC z+&oxUwuJ90v@5FT*_-7w-|VQl5%8%FT3;EyGc&2C)~|$fwib=Feqk5QCl1rR%V^E# z`)U3M){o18=O3r-7=~;9xu52L;k{}WaF6cVPCDeJg&~j4>8kC#`A_qt$(sM1uleZ^ z%|q5`-U0NNcWQlOSYOlz`-_)rJMK#~{~e_H`<0rH06U-kwf-ZlU(N%+4*NWRfsdY` z%UwN2a}((2RztNueT3#E25BAx&*LHR(*x?&W45;6Y?9`;r)u77isnm!n?QXp_tthc z!t*t>wbqwys`=I0nmbh2{D_CoXlS4~FlJB!rsfZ?Yku*X=0@);-} z5!lH+smr|q@jrP)>oXvqcRHZ;gF`j<+oSpZ-I`mR(0m-c2loe_5B78DdlzG0=yG2H zFaAdB6H_&R49|PccdaiC>w-RsT0b556yP7@wVhY*G@k|Uxf;LK`eN|@?k@0iu#PkN zrtMp1YM#$TkI&VuG(TKg^XE32Cp&0v3-j!q8d|@!n&tc8|*V*hjmt| zD%y^-r{;xV-mhC(>*GNG!d>eFy)-w})jX|*<|b`5U(iAGJv}t9)mQW3u)fQH_Xv%K zX*<`!P9X68Bek6~JvD#UOY>Tgmu7d<`XE?u20=W_LOd&gpQcc*Gw|)O&b4Z<{cqk` z^G8sxrLbNu0qgf@(02mYeawNPT+yV3Kzf#)%YirG)7uP(yh~}M5HUDR(`KtVy`@s5cf|eV8 z<WFy3y3adlTgJx=z7{kN;Y`vK1c zUJUjjix$@Yq!iP9w7KS!L7xb`BCK;wEVcbOD7O^MzuSS+_oCfxbh*wYG%p1DGEnYH z;Pkr>wZMKT#H~Uh!^#l*)eJewpYe2iK1p8aS&x+7q`N7U_h<|g)GrL3F7D2trLAjZ* zj_3<ozLCD93LS9!D)*bg@A8ZTc zlR1!InS=cs;LirIp8@tug5Cr6_lCjxC9kAzm@LTWJJ@MG{T|Iy*taym`>Y8r+J41q zntz1%UzLE{Rn>NiR@U6RisokE|G5fUZwmI)Dr)_E@V}0$*4sO4z8ChHv%t<@;ND=r zJ@`2U_%(=UCcOU*gm~73{@?-Uvf`oKblA6V3+0x8dL=`A+Clt#+3WVQg8N5~uwHhB z=d=Q>(+yx}AdDN&VLa>w`g*`CgP(_CoNN#KKTY5qT74K-n}Ho?Sa+wx`+_RKpTPeA zJjhR?AP;#6dBP)@_fsGrqxHpG$ZwCpzAOFiz+2ciE(-h4Zm`ea5%!0psT5 z6~t!(w2Ld~{iAigI)eTU^oLPkXEgYK8ro$d#PcUSU-_Z`tcUh32L9{-ZVcsK1wYST z(eYdc@iYNG9PW#~gE)VLa*se9>Vm%cW$pj@3z`=R*E|`{E&H9-`bpt_dx5{!+iGv^s{07Df?L4Zv*3G z+2>jx3HBd8)A~+e=MLl*kCU~X$&lwXh4;wSVZX~7_FMi!e(05@{W%KngCg}Z!Y~c; z+dhyd*MvO$4eT4NfINRTtUHDQe^N$Qz#Yyt9fJLVDzMHnf%Td_tP_vHdT>oG?Pp&& zw{`=*J9MC)wlkrL<`02S@z(n6)|yZC(LA@6=Ii17=Z_Xzf3UOWhgxc07X0yStM#v; zzP&qW{YkKIfO&6j{aq`ualYNB~2^uv5`F0?f8 zD>bzJA+XO@ANV@hANvRUW21n3IcR@Y!njc$&L`}H@u$1Jwr>IBC+)A=z`jH{?6-6W zy_2c-hrUbm3-rB!UoW8THv|31e|rAP2lLJa*gxq5`zw1KQ;x=r=*R+0cL7pkDM|Z(Dio=YDuDLgD>R zgL2xAi=*amOKM&b@(NQJH-^G{A}3g9#T3)!E&=-^EVaG@*m(;1Ne+y+{~#ZD3wmF$ zzZk~nV_@eClp6>7rZB%Og#4!r?r!=%FW!(#A+dc}jCkMLaVg#I}j_)RFc57>VX`Zf?B znC=X@V1G2!*9^*?56@RRwEGQM_r*fF<3OJT>)FDvUp)}cA^5?%+XeQ?^T40%uX2)2;+Zy*vEJY z?MV0L9zq=UK>u$6@vIB;Zy?w)g>khwJin75pR5eyzdPi~=@xoGDGc*b1IWW$L!M~? z`xR{=kIe@I*>9N0V?o~$)-M6T8^J#69$4?teKBK49Zx?e%{#biz7_VFi&WBjpK6-d z0-gwbL0xU94(!ACf$uHQ`=;UW-k~YH7chZx-vX!aCo}^;yOzV3T*1Rt0|H8U{ z1Mr%_PeVTW5Y}sR;l0&2?Y`j_*iVM_-51bLg!SflDAynM0nS5Sy$a$p0sPDWe;mMm z1gwu9!8&CXtQR6-o$?aavthuu!1=CCp#KB>I;_7kVZCMncK(An1j0J82*kk~)>9)u zUkLO!z#rN#{Yw1=?9)EaNwBjU`X|-5DZCfR2ha5ic!0aqA1~bULrq6Y|nxkiU(G z`WA*fvk>@0_fi`}xpvU6E1pVPXaCg|>wuOFp2cGK&;Eyr%^AE5ePTzAF2!3V*Pk{Kl z!}zue^jAS&4fN|^{GSGS$PBP!19qIi&Pd=fF#b~>xD4zRgZcC>^yhKl{|(qzDGmL9 z0L-&}AZ{r%k3$>^f}Iv%ry=zJs!*?*(9dtd`eG^Q&EWYp0sRNCUk1jL8u0vvz_{%P z1HFLDR??+kY69Lo%_V+;NVLH`eha@|1R7}_fZ{AmyU zDi_M_2hVR^7_SVVe+ksh=-&f>1oM79(9eRr=sVci4}3l371to|{RjL9H>cY`-G>#e|w0}a^P|BTwjL%b`tt|FxUx)dS${m@E^o;E0kLp;xh<%FgzCt z&_BmR9L@mGgXhZ>%C(1a&j9)(FuyE;cv=C!3iHJ$h%@bj9fR@nGW3Vi!0jP!X`s)5 za?_x`W?;tz?7Rei3ivIspAPM74t|;fpAGGG8}xsmpL_#X!VAWz#4`w|r)Up0X|@F3{NK)K(b+|RH-L*GNV1pf2^J7*wo4+MV(LA{QE zolmfiu!Qwde^|eqG17TLchJ-R$q~@^h4tNaD0d{Rzv{!fwG`Bs&f6ry`T4`J?j8s0 z;-;__X$R+jE`gm)_#S&h(7SxpJz^Q$izxv2Yy6Y6 zo$}z%j`v#c0^h|l0zc_@xN3gV_J6_eI$eX`lPV4MY7YA2uXMQ!5;QOJQuBpznm3Bq z{PGjck3ZAAJLszbZwhu=#%lZKFEnrRSo3obhi0Hp1%EuBYx|{RG+zmNANc;871XN) ze5bA==om>K6W$XIg8XU%j5B9?|fgcCn0P*8i${~4?kgMiP3b=E;xcYlO9JcIS}8L+ zeLF(G$^v~s(Eo#eTL${SJ3PO8;r&!gC^rhm69=#p4f^A-K3WayxI}n=4dx9Vpx+DQ z+ccOL8fEJ7JQ>FMBXB<=4eXSId9Wyq|5spMn*{44`dvaZ_rkAQiF zKj?V+gPlakHv%EgX$3q2cwxwM3{Y+p$j2@Nr{6Cw3;EbvSPy2vx^Lw>9Zwsuf9bW> zuLk{n$a_t}pH%SQ7VPhaytf7T*%I^}K|c|=Db#BowBuv2vlZ&~8RAe9;}AK2*& z`m5l-H*hDgPrsL43!WEm;89R+InWmeJ{{~-h4n=w=o4Wa=m2)+!Z=VD#<723XCI7j zhhUtX1w0S@=>X&TcBrojjOPQvek-s)5A+Q{?*j9kJNS7V^ar4QEg)|8(67Eidkuzh zbtc$Phd6jaxox38G=_2J4fr`9>`#Drj)s2w1@;rnz|INK7lC%E4dYBM)YlXAV`2Z~ z3bfaMV1E?w889!T!Mt+;{HX!^LdH<;ci4wC1N$Rj|LQ2%84mNsEzoxdKL zCm6Tq!Z`d5_TLHvZwUKrA>hwTurmhMU&~>A6aeeN?XceI0sDKk!OnLm_Zs;5`lrsr zhrv4Z7U&JYZJ=J|z3+&rLJjX-a zzQA)qaXSEUSPuO^0OHvN>RSx#v;w^Yj2mfC?hVjihH=9S{GsPP9sKMDcIv_S5DeTE z{Hy@_Zomsb9HJp^XF=Z;_(teg889DZf}az?{$_|nOX%lmpq~l-c`M92RiS+|;d$%^ zc8uV;J`Vb_FkTIUa?>H6cj0}|WT@BHzj~aEg*ZQkebF%Re=XQw5BrBspnnJY`%vFT z;OA@D=iCJPxPLl6Gl0|gpXq(j9VoXL-20&KHm`+^=1ABlccb%8Q0@mfH`Nd9Z-o7P zE6|(5dx|X3)9=F5`-p*H=LYy`0eUAm7f1KpSAjkY&Lvg@e?Gu_v2=LP;tTetzrk&G@ZTT&$%g)B4ey)kLc4qe{t5ckb?DEFz|X0mzXtwC0&frRwcQ|Y$Kk!z zJa}IWW(=NS#}VGwmw|C|G`#=Hf^m2Wj58T9?lpmNelGZV2lDg096fH=hIz^X%54bt z2g3Y59PAeaeh=&qgLpQEau>pUJrc?_0)02gmli_a_!aVs2+)^@Jgp+EYn&mk9t-7G z0v-nC)&xJhfc`4jp9OvvhCF#A@BY z7(Wfb$HM&b6XperTs@w5%F{d(^7B1lXB6bmOF+LF=CwNDPbILQ3U;;t{{?wSEtr@4 zz^s=^0)11^PX)a-+^6dZ=gp?VeMSSs#}DE#2>dw+@uBYv1%N&S_)sW! zImB%X)aw^;y4O|~%54kr84mu0!oABoP~Q-EE}DSf;|6$Lv%u%7htgyHG|Gz% zP;LpxqdoyY59{u&kk|bN{Yl89=(|j(VBdHVlzSF<8Q`rUUo`{&_kw;s*xv~2-#QTI zagc{kfPI5XkjLJFbwqj4?}7C~Cd5Ah{PBlP6?|3qU`&g?OHVag5f*_aL6lAP#oW z4^M!fOQF8g!T%mm?p1hR-he-Jp1&2?v4V2*pnd86*E`TR1s)FZc>(b`0{-^`eM`_k zf^x%vSBB>+5}u=U*dN;kaV`M+PQxK?HGtE3*Ml%V&xU;@2hbk{UIO?K*ncYl?ezrq z$1EXkX;AJ0h>tn6Z$I#d-cvsT`&VHcI0Vn>bl`c=uN=V7+Jna(r;{f?gS+L^;e&ztr1Uqivj~C><(;*Hgp`Z9by-Gm*mw~@S7*n*yH!ybI(H0Z{IL5TCKoUbL>6 z5Biocz7+@mzd$_cUiM$;Ctsj{UV-`dH2B#7{MinA%ByWa-yYiKH~2Xk>iYutZTTq5sr@c(wsMzEG|e#F>5<`y<3>EySk}*uM;Ma|A!fL%H-_i&dci0Diha zJWGN9pFnQ}oSv60P+v!A_mSX#1dIdp{*=y9(>YH%pXmYPvo+MKA&g5^!2eP(E`0+# zSulQ%20M#@7l3;8gmUTk$3wu51Y2N$<`xthR=Y)bkE?}oC=o>@6 zw;J@%pk7xYPj-WS_z#fJIK#erSIDEf1MdNLCPMqR1N~WugB9%0FM~YxIq*%;Uh_d; z7v3X0fjH~|KmS0x2SEFFhWMO@{^<>NE`pxkBaDT5SwehzKs*;fxyBHOztEp8z#sbk z$~$1E6vU?^=pDiTp3tA|fFA_^>wvx>@NgJE4}tzQjQ{mven|lR7no;L!5`&B6bn z5FcN#GYZPR3GG-J;!O9jnnJl-!A@1^4^2S72A;bUP;M`Xj|ud1vNIq2oCo$7!SkL7 zc5Xxb=YySf;J*uu1EnBt`C#1p0{agZ;Li!LQy=`P40>14_knfaSg04>N1hDh|3 zvK#a>pk8Yr4y}Nff_SDwx%Z*mKd@e=`=MPSZsb4plN!*k==%vnpF`JDiI zdjESF;_wW{rJ3+Nc7bwppjWXCdBhN#H|?g z+v33K_X^Wty-*Lz-3#{H!T4Mm?9_$z5#7JA13w$WzC?BK^Bk;~X&be-g8ip3-aZHZ0?K^|dIRYH0lx@(Oydj&$d*3eI; zf_?g)SV6E;9qKh5p07F(=K!$(1Nz%7c)nUeeCU4het6!`!?hvEO~}(Kf_=EwW1!!0&Ij}U z9Po#J$EqXLYZT1yS0I0*_nvhi@0tg3SPuFO;PiW2oj|`C%5?`lC>Y4lusaIjH_n?sgc@Jt04Q3;IkLKM%q9 zUjz7D;00h_I1K*Whxw%y@P;s7pM&|dH~6y>=1uzkGkpiUFZgMIa(_U%&!AqDV7{IO z`rhErF3{ue3PC*S_k*Uwygwf5YYXvlfcm}x{sHRS7yJ(eKjXmu35eSySa(n!n*{nH z;Ll~?%Yf7GQxt&s#6kQYz&fZZl-n1^LtD_(?_5~IIN22J(EI3Xp#KKrsvp$%1dLZ* zVZ5d9sE5G*@NTH@W0*$_p#Ki~<={VkuXR1ti}v$x!@Qgf{UHwY{UAR-0s3hWPhTk4 z73Td)Fb`e?f69P;5AY`q;=dZo{Q&kuq1|6Xe?ABLvf!r)_!ACsxC;6i;Qu6uLvP3* zEWrMB(5J!kTN>i<75vE$`d?7)N#HfXpS>`T%mIIX!TePZ#_ho{&eMDOQ1H_e=IbDc z&wiLUH-Vqmfak%u{Tk-Y@t|J>aaaK5E&@CD&|dU=7JDIXUBI70;EylFvjy;QuutcC z%s^iV;y~X+t^;;{LLAD0p7I$ZutUGo@dMiH8I(H_p0BbH2m0NdY2fD$Xs-*f|G5wJ zcVPe11N2VdPdw~TPJ6BQSIue^KzW zAv~wG;Q1N_dOH{&%)!qLnD=eK|JI&FW0`CuY=-gB**!K$n`_DlC8P*FEAs_w#`^hQbKiyj|3wFXG&$om70(8I0687gU zV4XDu_I0~}pRK`8KPcA=^gI5~dfkBi`5(}}bRT3g#5o?~&=2<2J3zS=pkBS9+zN1B z#R&T6Oo;Owc<*x_{LF&(tqFdbLL54R{cPB;xB~TB2>b^0A5+jL051s7=||wSj_wQk zTv!*=@0)jnafbFumP5OogL0oi{9R$3q~GhA3*{!ly0SdPCmH6E8n7;o2S3ljdTIs4 z^CkG{4*t-0V~T*CT&V8~us;Bv({)ha9nk;jyybTA=P;Ce0s7Bh7!NZc&UEj%7CeuC zpuV0^Zei%pw13zY%KZ!Rr0>QY0R3a&Wr2G`{4L=5S_yHW@6}%eJ$)y?4fxp?;?@k> zs|Jk!hat~g2Ia1Ten|O4bBJ3A^pmRaTvUhtYzf=|ydU^Ow+CRK_<87`V}PH5=VdJLFnEp(Fuo;1|NjTi^>G+y zUVuL?FizHlaj7lnFM|Iwpj%S@mxKu2aiCxuCN}YI4p+v*uZ`N`=ED+atA>idc!(&D)2YJ!=cmv5xF4*q>0D)D&@YDPXc*{C;rTKKJ83YEO$YlwVf?X# zatA=U^xd=TV5cjLlg2RqWJ0}K!2D7I=8O3-FMNghy)W4B0rO*3;B;=J2+Z#_!2f8N zuS3CqYsd#m0;jl9enr2Bbr<~E3gyx{s2r%T1=wj1`PEry$FksOKPa~twC@+NL;ZyA z?_7rdK<6Lu_qM>#!BDSFz@NeM5(<76fOet&HVFLe4)#YtJLW;VcZGKO1orQPo&4}T z)`GZEKKu&&KL>m@jE6TMZp}d74g4}{BSgsn+o|!LGXVjaN4Kc3icmDzH|}#gCDFrHbWf#13n+}>Ky8CkSEhR zv?=)c6?g}zZw!>%AMBike04hLM}s~A`p-Y$Re>Lea;rkQ8PFek0dEO*ih%wE_(SUy z8_*AecKHGR%!U4T8P<<|!G1RA7sC2sWV@uBxP^t(t+puOn#o$0#)Y2ar*=!djFHWTdZgK@?M`YpX*rth)G z(sKv%4(&UwgK^s*{Qm*-%OkKu-$&X6cFMziX9fOD0X_`;iGcV-L%DQ*sRQ^Q2jwO~ zzF`LbZv_1qu)huXAXrDxesvJ!U9%x>|3TbnJxky1af5ua9mHWQ_<0lZis8^+U7%cg zzu*Y=W5Lc);6AW^r2AI+K~LYc3y1Zl6U6N$=vPAg+d;qT3-O`z1E-;0^quzgp#KN$ z>kjLM+fc7XV4vO-Re?Axg?5hx{W#En0Y8_5pI1O%6V8D@gYjn}yk{%|?b{Ii&j3H^ z{>VCLuY+K}ImFWm$~6W1C%}Fl#32goOo8Vp1pG;a_s)C4&RgIM!Oj%$b1~RC4R&0B z(|z09aQ?p<#9=h(Js|$Ua4vl_oV$Jo{r?E?WT@{M(02ko-BV73`xI>;4qu>LH{dUT zmjX`riHd?hPr%M@sMm35uS#Iw6!dMOeSbo^NpSw(4ayCLaxLNf|4JzL8R+AHzk_58;B8-OJG-IW_}5zR3Gv(vamxqg9)NORCg^gPgFnvDj%!|NJCnix0O-#~ z@!F0L=v#vSbk8de;x-EWHv)Yilp6#1F2wCT*xvyDQygA{ zojYL19k?s>s{-)6XTv-d2zIIie+u^BLEPwj2s^=kPvG4l9|!|~Ho`o973RT5V5c9H z>k9Ea4*5(3*e?P3VO#Kj8I&6Zb_zp0=R%%b3+fvQar+E;=`bkQ7}j@LP;Pzj^A@Zl zen9+d!T!St@SlEzzQK3-(*|)OOZ&)13S_fp*ygal76{+kXdk@}M1O03X&) z+dm5BmV*A12zE9AKMno)T5Ii(Sqsfm;Q6}WT8Pa`qE&(4d`R4XggmjX+8sZFPJZW!v$vh^4k7jnAZYf{>l&Y zV@t5V9_D3J2knm!%%4jfMQp z1%8JyvXHjF9?liK0Q(v6-aifO(EW~J$hTu4PhJP>Ao@LvNLcTjgZEQQK)(&vS&d-5 zb^+Fpb-{i-te3mP`ZomhQLtZ>4*M{XuwV2S_ODvOKG=KU!Et)O?!V`n?|P(%nYu@*s<}tT5&$*>}$(x#w0)3Gvt#^vheD@8_s8`S#tzQpz20@&w9o2S@ft~gc|F2NrozU)ipg(g(`!fgZj619KQDA>2#4Q=x ziYramt2VR{3qI<8o=L!oo_F+og3hPYskAoApc2>*Y?N1)Vw$3 zT{)oN4&}}SKTkq^uY;dyue6`3z^}d0`X`W=P6a=wC2BiWz zfS+3+pQrO74Z(g5STEdotNmF6@2xI_{e}?FIZ*Cmh)+wfKMdl~1nihVxx=Bp3!z+! z8=X`757u`ZfYbZy(@@{$U}rA8AE&ro2R(gnwid*vH9QyIz;8o)^#*-BJYN^Ujv3gA zhVf(=^oJxU_dDnZ0uKi}B|z^5_38&a4D8$lejMzy0{wo_R|1|7#(`qM9ihGG+~8+; zF1myL|DfMyfc`Q(7d?Rw1Utbn{$xPh5@Ec(1^R~I&v4*>p?zba+^8F9zqSN`d}7_&E*6^EB|YKb%{e3i{P> zZtWQOQw97f^Ht~b?ZD1F@N)t9V-Ds113P!&{m5Zx$5o(Df&TUZ^j)Cc*MgsGKu^Dm z>HvATKa7(_z_Zrn8K9j<=ofL>$ z7Q7Fd4t}-)f6jydt`LVxptruF{htoy{sB8a&ABA@}(zW=MUr?E5o#( z3DB?1VSHW=`A+8S>#}&|XDAe;@MI!O;J+p}ryTKCvK_+X;BSce=k-g#NQ0;x;Hj z+ev|Xb%y>tB1zkM3;txodea*Gc@N`2XK2TL(64rY{~6G}tsu@#p}!S{dQ}E}d5Bwo zsP8=R|2DL58tBhJyKIGc(z<>Z#3wLO_XoNUTNvuw5&T&R&ru@8p(w;*475AFrx*+V zoCp8wLHnKsJM{kOGmHaE!HxqwN3jqedT&@8?39E0#z23l0sZX`*ztn>5ISFB0d^`t zd_usVdSHjnp9Da^ngDiAKs)XReQ)q{7qrVTh`$+(=l^5xzW;wN-~aJHv$xC=LS|$O zX-Eob5227UDkCiwm5QV?(k{JJh(smH44GvlN@>`#_uk|44;9WJiQSAb>M#u*I7Lg=L@(G@KKDn8T<}K{H1{}1OJa0?`Mc}55{#4_J70vI>a** zdG$GX)98+^^;ib^sXB8l>S0~r3sDcxBL2-*<3b&uFw zTNw8_tU+?oX(EBKF&Se~gbh z7UM;Z#JIk*xgPc(L5B_SdjjKq<9HlTgM%@C8u7e)IJSQuc!#60{R8lOEyndX^dE94 z=HCJS1Bmku;QPVz5b$Qee*xYT^VJ#SIt`w2n6LgA*B8jE6VU$%;%tGux&U$Bf^oeL zydj<|&yT!niE)(#UI)4@Lw)FlJbVlBJd69g=EJYvSKJ-;uVG$h1K*2z`4M$KAM!`< z!P^O)yJH?dg5QEHuz&n)Y`+8J&2}cX*LQF>A+Po#&L-z#{&}Zj{2jzI z5U$$M5y32%ef*WBUpi*GBMHLOgTuzS+s(DHw;7F%Rz_yA9(i0Q+(n zZxO_k8~AdJYaHIU)*bj3@D~8y9^Y%5gYjMo`xVgb3Fz|><|Q}ySHr&H>3F@IMf~Mp z|19(wig;$C&Q!&CyQ2>1JN0j4yaiBi7eN1Ws7pPt9!sOnoPcik!|%@+?=HmC2KMuT z-vqoQ>W03L`7!1(JM@``_&Y$KwcvRG_!{63f`1|6sRy2?Fu&)JSBK!YCv>|@_K2qk z;(rc2dcS&4*f+v>%VJ%3K^@MEJjd%!GwQ(p4b<(yuwQ|CvKMh)iMo+Ld;A|c!9NZ4 zvoPZS4?NqT^DMlN^ceV?BK|DEC&TY}*tbPIFXV`ITL$~PfWHSk^Z7CV>xgq4-m^MB zcg!;c@n4VkzU~D7Z1B$j-U zX^j6nJH|8Ki}BMarLwiuICpb*%IK z%VYcnoKH^0`dxzWDYSb7aefrz<@?6?NBGV~PrT>6@vrf?UY-`?f6Rz+eK%)5=4I_u zar~o(#CXAHVtil282=Xg``_`h&S-!Gi+RY;%*ex^yT$S3yE(?^)Q<7BcprWa)c-f} zp8P-X-Gn=_zBXZAp6wmS`9s?np99@KM&0Ov-<>bU`r3efsx$nq!}mD8#XO$ZA|BTt zm&f?Xi(@=D>fSWWSGP-Jo;L8i;D*@#)#fq&Hol*70Cm0xE^OYtKIR{c@1b1qU~Hdp zQ;gSxo>g)FP!WB?(JC?jh-+fJ8opQZ8ou9A8Q+`Oc2Ufq5A*mn^v~QX=6N0U_-pcyFxb%j{W|xM~wGDo_yCnwqO5pj9>9$jGscCyawxZubpwf+@07j9`73S7poHE>#&a>d_1Yo z*Ve@N@Rp%@#&_sjmZ2Z3lQ-u1tbL5X@pO#;fPG;IerRb69dcp5zC&Mq7xt;gQ0Gr} ziQ_+k^)eRs^VBI7^BgN1<0WxDa#e@ezQ&Xo|M{O7?}2*zaIx6_Uz}6zLH)^t^*b2r z=;*_---8dt_$izl42C}MT@dq>DiY(Z&_5JkAKQP?C&qure!3dh(W_sIdG5o0`Z4YU ztTZ{U0~xs9@A7->_q=N7h5vEr?-0(IfjZL+>$=wcG0)()V!X|}G2VS#j8|O{Xbg(&cA+{pg)Zj3)(CB|?6Esp1zg0X$O zfid1-c#KcGFvf5HEcW|Yg&04CL>zokY(HsijPJcJj_2QpV*G|DWBlS8G2X6!?Dv*4 z;WTDs{x`-?Y>x5i1!Df6kyk6fi0#)8jq&-#WBly@;&_^%4;j-mwy%uygszif`|MA| z_{#fYdaMpQl(?O9exjb;hVS+9Q!`TulqU1AAsLFFUIi#*j{7{B$E7{B=27(b4A`SP9Ez8?0+ zeY0ZwN8XL`v3+BF{OB0({dAU4D(X&nV2Vkv)FHz1u_2quo&;NJLd0HF~(oSesK%x!+E&wdpdW_-)Civ z-*qg;|C<=&1Fwwn(a7_caennUuCuX7=Lq4ynfHa z`D#J*Kjm=_|M=%I|AmKQd`Q7K&U?_GUySSAdvIRy@z?Rbu=9r)Z<9NYb9vhs@AO8D zPkB4We?>p@GM>k5`Bog~*B{0B5Znj;O#3*V_g{_iUvOU05YHi&dMS=)%Y8B4cxsH_ zkMqp0^2c$``7`D@wIs&7Umo)u>KEfZYsC18mt+2WPM(ebpm=QGXi$v*g!9s~J!1NL zBVznF#Q$m&_n-#;IZ>xCy`d={SL zDAY6NAM#p^m$^U2A4FXm{!<)J{ZC@N3hq1AcTT6HuRgmj<}Z^qj(-%cXD{y++mC1! zw~2jcpx#)&wdTf4{gs^8Ty{tV9Z-&qmIQ@&Y@zjI}b=NKI0nX|?5m-sZs zf57!uB|N}za?U;HP=vlfl@ELA$jd##OmvJH*#X6SRKPm1k7$NAoCh-V-A)mAvq9Q9c2 zcWU(*|Eo}p&ngn*SJaI0N=Z()Sj`{ETJjNFfiSc2N#Q5De#dtU1 zSH2zF>%FNyQxu}*KeJhp$nU5sCZ{9KVIj^_sKU#;84 z_Dw6sc!O1OJcaQ4#Zb&|cJwC|u8sMJVSoPxI&a(-^Sp_16~8tf@2E2|&+a#3yauk9 zziA!YKRYGHk5rE1x#gJ{e;fDh3_TU|=XoK<=a-G~^NPjzKUc;0x#wbh?u;1E^i7O6 zXcOa?ULE7xP;V#fkL{~o6YDv+evCI*9rG0H9^>na$M_$Y#(4L~WBji9FuYJ@U3S&hef-9P^w#6623xU#o)t zHaF^3rz|o5(lc@2GUB}0zUf6V{>qIp{&KGvFNnT;M zj_uV~{Eqp(8s~?bZj1SAK+i@MV*BrKL)AmQWBZlZ7jhwQ>!5C&e^1Qc=z$oYi}g4O zd2&h7nCH73G2R$;{#MlavERo$IdMNjs~=+fTIeS?5033?_KESezz4h^+s}AC#wTLl z7q*J+t5%NjL3v}mBlg+c_r>;?Lx?o2d$0q^*9G;eRpiX^U@d}SvtmVsvYB5+Qs<2$hVn4#rC6dZczE3*#3>LV|)SX zNy*N!{d>)0ydL`M{T*Zb*CxgI&VOV4ll3wF9rAWC>f0sgGk2kHoP%{;82!~&)Svsu z#qr;_D8}0_j`8zw4%6bp*uM3fFN7G4yqrke_w1Umy809@m8* z#dt-muPd=nabh=(rziS28l{y+U) zY=7R47{BRkjCb4_$)EL+w-u$>_eQ?A!kpk2g2^ z{5_~A_dOr;T!;Q-9_rp-nBN<)U#$8z_L~#y`c=$V7VHbzuuf0?9Qz&oYm9#go%d{s z?a!@=@q5un^+*19SQ_(`L*G(lMQnc>`QHY8;IF9XT?WMbJ%EqIdfATt+mS@q|1M?{U6w`Ps9Eo=6%=XnE!j^zn-Vw4gO28Z)RH% z`l&rLBt19dXz!Px%pobmpCpiqpr!TnL+os0R0 z?vC-oxcRqQX7ux2Fs|Ont5@*6*nMT=ysC-&ou0=1?OUK*uis-Gj-kHw9Ut4z#&yIp z>}wNH-#VerPlcYHkZ%p%i{l*kNQ__DDaN1b9^*6Li1FW$C&f{>H*Jo2TA*G{hYmGo z#XLxn2XX$0I#~tv{DqBiJnv&a-GzDo1$|Cloaa>U75lA(bHC39#`f=FUmJ!z zFN1USS7Co@Z0z@DjQ1TjO{J z<9U;uVVc4vKTMAJ;u8piSYsZWBfMgTphTc7t6qV?H;%=-e)hw^LK}9#r7ZK{>re*!%L=T=RjB`Su-+$3kNr-^y3UE~xb8UjXg)9IABT0f6!}mO>wU+W znE#e@G5#m^sfyT_$NdxYl*K&iJM!Ch#ym~1?^i+nsepXQk9i*p`vxoGc&g!gzajeA zvWH@xg6JRgJ>pB(#yoFeU-%1k=CutmPd8le_s03aQq=77hzx1djiYFWh|pJ>eZJy;y);d^_3sjS-p`D#n;6;Ov1Xzf&INV*6%x5zwOXp z^_mvP(;nABFOQ4u>!TjNGBLKFjd)J}6x&~ldC!k?zYfr$FY3}SyJElJL;t6@#rFA7 zZ{J0nd(l^1hU+CPbNUmBdE7o_r!ij zqMo0Ho=33n)W^Bva_GMdc{>6;PoPiegx^C;p>H_>JR7cSav&f6f&E5Yk01Xn*8ffH zFY9ss)&lx}h<<4b>cH3k#_{aO{#Xrlcs=Sy8|2Rm=wox@`lSqXI19f$P*2`O{r?pG z!vf&Fu#Rp(U-~ZkqHd>R{YS$7BlI(Gua0>RK)0&M!`s1A5`9q)^kYR(xBH@Qe~max zqW>(mCLV8h%H=tdHaQ3Hde%b>n^1htjiR{*&`#{4n;NGw@pw<64jUnH&4*UC`kU z`7jT4V+QO$M_;%8 zqd3mj--vPj9{R|uvAymy&-Y1eU+B9S&xH6FApbidf4X5Em4*I#?)BK*I8No~EbI#f zu#Z%Mz4B)V^6CSehit&P)+StE51bT_cg_znUIX)}=j$7O7V}j2Ajap7i1D+Z#`x$l zF@6@;DO1PB_MN|u@lzP@y~vY4F~6TVGfvQJ0`U&y3&E z{z84OygSzOFI->m*&5rIML*vh`^5p&jhUFQ3AkR%2D~-q_Z!qD)$K2EUHJ?AuETZK zN6H3+ne;qd(k*c|Wu z4CLFM*>U_jFKvN3yl8yPGxFOQ9}fIl-~*<|Je7Wo@qwrtxzJC3fcd=x_!#t`b+*Lu zWWse*(`~W+`8anigm@+)4{yTx`LodHAlAFiTb@Kdk4HW?fc`VlhkT9emoKp{o<=`V z8GXf-I1k*9yc&UV-H-bA)1i2NcO8pyyuL2uebmF*sAKKn_cQ!nwsm_P&zs1%;>geE zu#fBh=N~Y?3sB#V;auw*SyRqH}q8^@yeKXV6cz!qTiSgeK#Q3Zu zG5+Y`7(co%#+#!L{1J7s3dU6gdAkSo^DOG~$y0Hh{{X)T`^!X(w+PnVKJ*VSV%^<} zbypkpp%&`TAE+A-qt6+J{CojCSKxZ>mz}ZBc@D;SSM0xefWHC!N8nA6hb56GH8HOG z(7yxpZ;3i^G3wPW)T>rF7di<07h!)7^6eMwzm>6%ufz4r7+iM@LtT9ib@kmJ;ykH1 zH^whQKT{d&XfO7c{@AZaW8S~Ux~>oY7Py`rgZ*?Xbm%rY*5Rw~V*DoPUmoYEOQ7=| z(76Trt5WL!vHxZu4|^b<3E(dQ`+A7;B-YD|7;k>eZ^_lM{xh*pmBaPyQS8_KP{*zU z-UfI{TrbZ@J=E{)O>s{6)~~S+)ljdlKwZiS{9mk>da%C&`7j;%Z~^+dPhkHi@cX96 zIuu0RyBPQ+)Y};t*H?)DNnO_<&kw*pJNQqdUj2)8J!N97&zBh2Ip}!+@pK3N7Vxi- zKizfjm5f>*y7@?mmTmIm?z zc=rIG3%nlin$YI}^goOI*@k-C59=!nuG8lOzZ3Ja6Z)UTb<>@=E-M6F?`JrL{$%E& zc)oJtI{k0#cm2`dz6PGxaQ%2Q_Whq0#&I6}DaJ3v_0GNpvHgx&F|K|oFZwt2btln} zeF;1>;;)NyhKJCnT@76K-F1XMkD<@ZkAAPhoLEmi?=T8HlaLRWBmXNSKfeLq0XzqR z|BN`F#`W4MigT5Q=x=vpotDA6z7KuHRP+^Vv5zlNrTuo`!8F zqburL6U5UE=WK7ne&?Au{_3c=8F*jHRd`S7VVnoPhBz;P5TC&B%h2aS`27=jC%jkf zB;qND{rwQ^^W!^oO`-Gqn6GEh&+I}z?|}V2oCjVFT=$LS!@1Mv*pH5)uWkT*G4`Xz ztKz(U3fCiba9zI$`%Am;WB$sxj$Va2{O6RIXXoS??+m|1r^WXDu&bHX)~y|Iog>Xd{Ccm{ zN9f1e{u#$J1M5`JA(q7cyA*hP?7wYLmo@;u3w1IZ>TMO&+uu;MTrdlUBOFu&ule_eYz&cnm#iyj7EF_tsq zD&$EUJRh9{_S5h@P6_DW4Ln8g9?k)n-}iubL7s1f4qMSL&BFXHKM~K%0`vpl9E$Ci z!2TZe=MN%pYa`B)us?P#j%Ob5zoFZ;$lIaFpN7C&p&z~$d6gISYBkQCPQm^bJZNzP z@N9U`@DiLm4Z``=`(w4@SRn5Avip^6Dw%VFmPQGqH|t0Nw`c=yUMz$A0%R_|Kt#n1}uDF(+4~a zVZRjd=zSM@Kf}G)ufK#29dRD@Hh!<1x;)nBGWZ>_BDVhmeqUP^+g}ZR9zmaT(O)so zblmST8uz74!hMw+fzLz#Gar59>)?3>=Xlf6Fa3h`)e3!1YxGz1u-<>hdOwQ(`Ay&h z!M_`QR9En{M1OS>JWJwjC*uRu+yCLZ<0m}fC~I+u;@o1#D80{fbm#yrQ%#CW#~F+Ti~7#{|_DtPAM z`&obEdZZuX>|HvJ=K|=nAAU72d5|ZiasD<0`MI<}9OofiA2q=5TsMM8_ghv&Jg0CT zdn?WxM`L}>g8dGhljp+qS3}g*EU0f~QD+_lj?4FqpHXj5W4~LBcqYRBGMqK-uY|f$4gKNaY_Z>J*k6iZUw8|@cb`U`Y>xe+KJdHaFf*<~{l5xz zdkD_`{>6Tg2lo{mfc+_4?+bqq_p#K*?>-BGKM8yhekYo`H$E>KigU;YIEQ%}=S!d9 zTxc)OKi7fhcf|P$#iuN8|2$S;YDjnNTLqAXs`+l*@VxIqDKYbLxE1krCQ49O{EvWNdP@lg;Jg2db z4}kp**iTPkAH1MZtj}-Que$(W3w#6mfsycg8SpcW<2a8tjqyX*$M~DDzx>wNen#^c z-`6C@y8vH&ZESx6<2`b9Y=2$77|&ln#_J+)n;_4Rq7Qix_WvROuRwmPZ+Qzmhp?`% zLtmtRdnfw;55cnyb!JrQSm*n}|2OL1W8gnrD&`+@NsJGM-yP`RHo@ah=IhDQ zar_UJiSc#Fs|?uhNB$Im->ZOUE*r;F0r@|oLTsNG@xO{V%iy}H0_=OB{^SL|7}xu? zQ9u7goqQkoOXw@w;(GI6^bgZf=cmEGN!?igU$MVjfqkkh@S?z9xjOdy0_<1g9HTq- z$Hvg@O4x6O{m1C9dO^2Ah%+B}&PP1Q&|l3#{v1JnI2ZXj4f*^k@~|h?*Er-=A^2?p z-S#4$p|HOfdA=BUW$<)_{cz07BIL>ckhfRDz76832R&QidgmIf)1tT@`2*v92J_ny zJTG8=uR%S(Ky?-SMPu+Rfqj+IaXmQ=`^MN`vSOcVhW+|sT<0#lAdaUwuA{5LetOZE zrxN-!^;g-!voC+l|2O)j3vixL2|T?E$NcY{ALED6|C9#L<3(bg{je{L^T{`0zXIni zYx2c@^Jk0k#kpd54;p~>je8HnD^}kW50TzN!JTw`vuT#39c_b!u+0w{T!^v zYp{;GU|sh|9rzRdZ~@fA7ja!y0(J5Y#FM{btmk;(l@Nb!_^nhr=KlxroP`cOP-nV< z=P>561m=AS@XT1(SuyV=ke|_Lbz;g=r7oh&M$r}4D zk}1X?&l2OAaK7F5yx9J4{C-ge=js>ZKFNN#pK~7Uf5rWrH{!m{bFj|>d@_DVSc>0G zRwK@;_&sPBei!&2_w{Xq{x<=~c9F3O^Ii~nqVN6fL4MXle%_2cFAe+Zh2nf$4Etu- zr#=BsCG3yGuU|$IMm*|J513!ZPa6i_|`W*4PC<^>X;QdesTB46F zj{T)Q`s5j~Zw>nzh_g9(vf+9p3-}*{{-d$K7eG8?;P*Y~`7rngg8yXZcz$mJ&)e|( zFY5C|hm+`$J!wO>w{+w^uHJS+=2LaLWlO?e+B!9-j{U*@wW%h z9k5@D_;Uf*eSo^pXE@eHKJ0gg5&s3K&!xa~6ZVmQ=+7HrfBzSGH5`6#MVwPReO2_-!5b)?+ z;$*p)Cj3eae-88bA@FrL?P6{qRuq z2_?{f9zcJ4H}(bnE>I5fw?d!)FRp{8!2W%Vw=%|cBgS-=^- z?7N`fUIxG4fTtzwKZSi=*yo4-6`)&9=(ZU=de6pI)JK0Z z6LqN}>WrQb8df^4lVz*KcxBY#7cYzL7hylmUn#a9j{Wp9)cHnLW1b0>V|)`?1K|YN!uKfuBL0`5JX&DeB=q@JvL1^$K|Mpii!i>)e~c(-r3cFW{X2 zUF-|5qi$zMg3feK4%~5c~;=n(YGu^|8p8V_0fmS z!alMR``uCOYxTj?5B)P{G{vj*udtl%H5993$JUil_0e!xK&L07v zfcW16J{$AC7x83<{awhni;$o10e=^EUQ-2?l);LnQv@lWi7YtdKy z1Ae`C^k|+~hbOVW>;B=w_sb*w3PI%EI62iK?Dz;k<}IL@DO{rly0vHjtj zWBi}yG2ZL;7_WazjL*L{#z)*1u?FeM=7XKaXJj zRsuc}>$e)}Og``kKZ5hv^T6}mW%2yZLErK_`j+XapU>iYsxSE4pl-hl{#(G4fqm*b z*yluFv=;Fn1<&)~nTz+jP=}AFUBXr{wD1Eo3Za_zrQ`M67xs5z-``a%=6MxyR>i#Jgx^14|80rb z?+u7^Gjy(wIG=+)y8mz{;(rNvKU_x_!MH{O{}bm4SHZq-;aIo*$e%{Q`@?S)=%)AZ z+>1Eh#e8i?{LL|s)r-dCtqJ|d0iTR>rxLJl27CRk_rC&hoUh^>X)5&B_x1K8o=oS* zezQX78L%k8VMI zy9WEtDd5x4Kiq?TR`yfDvk5%)(4W+U{b`)z-HJXc2l%&u=QMaG0KW!!Q}lbgalM~W zH(qyZab1uDedb%2$2`Yi-yQrl5PvK5;Wxs*H1rt)`x{|j5qQ76aZ zx@M~SOz;dxpIjdC--3R1BJf-oR~Pij#n9h2L!8y&H!u3<+`#ukx39r}?810{Ct+S5 z15XazvN$1bSz`N4Au@aY(r?xQ#ZeKLcm7VKZfysSiD)DQLxkS9aH zvmEx_fma5;7=7sx>@P*oSN{#X64vk2sH+uFAAUn!+70_*sFS~6kP-g75%o>)dz@J) zq{+y@zOXTGY(Khij5o;_<7>c^y2j# zz~2cxePFNm59qtz#j$Tbh`h>+eP8bh*L(TKV;!Bwx;R-np0CZ|83g;E(0A>_`qlF? z^T9J5_#*UC*TOyv@Lh=WE{ykC=&AcUo`T=cG4HDoPc85)hYsp*Z$;fZg7KC?-#7(+ zD z2>aR<$cIm%&phPkWf<>|@S6vHg5F0r34Z58hx;(DmEaiz9-Rk{K>gf{KI$a=F2Qxm zH{c%x-I@V^0rOG`@pQ+0&4E7OLFYEeAKm}32!7XMz0^T{`xpCme-6!CA z4))_zuh9QoiT-3I`m}uL1B=7{1o)ew&(wRU=E1%${7!~Gx1Ar?|8Jpl0mNSde)WE^ zXJFqEdDsl|sP|zGfc++{$F;!q9(&cLb;#$vs1N(Fe&4`($Ru13&cJnL^=k3_PJ#WL zTCu&JJNOCwPt=TgI^kTmE3Wr{g8eGs9qPn>b)Itv;%o{0VfbxwdF(e2cy6p0+s^>c z6}4mgf>*_O2IjE_^yvWpMaYwd;QtBd+xu{Sav$>fe(aB5fah+kUwuboGVEuf{`>&E zkM=v@_h8@o4fRUZ&|K*JB zH)N0T)!<*0Ikx{B{BLH9?GJ%JFYvMF#XRrlit!eiVtj4Z7@vl5eIJ`=tbuOb!7~!} zD-lm_=x_mewgSHo`u_;~ZJ5U!k)IQhpI0LfpTvAM1il*h3Fxy0_Vp0|c-X%L`)aV? zjq#QM{ulbv;n4HD{Ba^K0xq75&`%D*ykCKSSnn-Aj=pXec=n+_7sI|Y2=?o-@4Sls z{6p+JD{-z;3;WIyTo+G;4i{s;o(jK{F|OX=ISBi=a9vyn_TM6&Qn=2|k9gWZhX+f? z`KTU@7CK_32FHjaM_@@*yj-UR+P5PxsvVQ$ou7tu%QebFny z^G(5cy!}y!|3ck+8TINczI!qN_4ed>aXh`S@6XQ?+y5HF8Lwa;uYBfQ_!ra9#dvn$ z4`I9`fgd>;^Jn0@Fn8m7Jul$<_3t9ii!t8cfp-C32l$nU|5L;{2J`+h_H+t zem{WU6=61HWLyIMiz7eBVBXsz{tv;k9PvDl@n)b8Jb=Em0{VnZ=$Dp*e;E3l>w)V! zi|;c>9b1TVywRvjwNdx(LLIIPzfIA1>AbE3>b9<<8zY_t=)3eDn91PLb8t&wzY6={ zv*-tUBhGTz2OEQbJopQON8h1%3w=?4_^p8W+asQn$it%aIE(H4uz+XUpI0*aFs7o(l{WeBjx*UElf_+{1oq&4yHTt6ea6O(G@iYg|KHx{d za~a~i4)N%{(_P{BJLppv@ytRz_aL4E;L&%cK1Q4uqA#rj{=!%nqp_drJ0R0Bu5*a9 zBJ#f#;?(|i3+AO9^87T$H37O^hH*{A{N_hL-w5N%0>2ldKi>$y<)FhU^u0Ql+lW5x zXT*bTBx4Kux}VU$RfON#z!!tR9PBRzJ_hkT0o`r|eg^uq0sn32w;upr0rBqz|EItw zBF+l%n+^8kkk9MUx1Rz}8H}qB*6AMPIoh<0_b{#{i03lQZwcU!0oVEbP}ujtbz)7d z_s3!XAm*hNbSn>?M}X%9bjyS|_1)EXQCHhwzgP}@8+fXt{?~+kIn?c%@cRYE`!aa4 zL(j`m|FePr3-Is5cr$<(15ZBqy&m=}fgeY{)kHkKz*7tJH5J#b1wI-0fAG5$aUMYZDTTWI0q|c?x3@#*C$S&3L_9xXf6og13Fwd& z{PPe`E!bDbc-8+PoQ%ETuZDPX!u|)~4S?%h_fFW)0{#}_RKL*-_UDjS`5|0g;5#ud z`aQie?9bx-`Cs^Lfjs;Y{Cj|F-_L;G6YzU0>P#8%d+9_By8wQNV_d($ zz9#T8&~q)~9|ijt!M_Ik_;Tp4@7y)ScrOLdF67(C=LJ!-?bd)pY2c|E(3p4n2>O*VjQy6)BA?%w#|AOGjg>|j->N~)rzE|IW)OykR-g{VIw_|?CL;ump zpA8t-L-4yAJl`Omwb*~Vp$;J3GFrjD2KvU;=zqo`&dlh?G_FZF4>^b5yALDI*N?>a zAzX*}KRO=USHbV&g%D?b_|^RkYr#Jgx=n))dyd8NFUGhEgXaX|xfk&q0DoohT!c7# zp)Y*`an46P*CQV;LY#kM9c_eP_5Xi^NA_P~y?=u1tc4g?9jxCOSdUl2z8C8MX^d+b z?EAuRci3MHyddIS0{b!O_fDeT_J{ot)a?!6$%TF467X*U{yq4!K!@{yZ$w`8fo_eF zZ#fWWPw*c?evU@}PzCFY_y55D4%GAW5l<)dnXiFo0_xHttcw$k z58Hre6y|*f_ODAZt_9#(ia3iQpXb8<3XH23>O)D`e*pXUP?sJD-VXKiUX1HO_|1X3 z`ZM;m$5B_8U|)C~`^zlwtb=`S)YU!UnSppVV!Y#V!LT3kybqpw;OU1rZ^!lQoA7%T z#!OVM#^Z3eJvmMopaEkI>!4r#?=$!%8U4a zMLg@!xAX!35X89%ezzn3edt3jgnhrmao>^!*Xj3QTtg1VJQst%2jZ*)p5OP!{LNvX zeP3+90zBUxi0wD+iSe7@x6S|Of_81G*2Y=Yk@(0M!T zyJEb#fR{&{wXxp61WyUrpFsV81oqd#eirKOBE<76?6-h_Gw=@B7p_Ge&X4Pn^@wLT z><0rshIj^J!`_JNrnBf1Mg!OVpYvgV8RA(D`=!|TH=w^dfceS}`wZw%8-8~HpM`n( zMt(8goZuM_`)3eOXY?B-ah>uXbUTFkdI)|i!0%Jgp#kjcL5IV@$D@y$kNN!(>*Wa6 zZ!z%X0#7F3+kj_-p5p%%@!)6JjL(oiBQU@D5Kk7&V|Va>jQOf9d-&}K`}bk5>%oV? za{$+0S#X^-9`;Lcop=!QRS^6aBTsbBybL;g2YeUie`d^GZ8HO@2ZK>uOTVI%xzfae|f{So>!fX?F)&y&#YJm`E9@#lyA)9_ms9mMlC@NY5R`luU2 zVP75Vv=7$T3XE$rcz#2k41#Wh!7~{=&tkmg5vS}QLcjDX)=^>fKf2F$9SZJN#Ca8T zsE_<<1)f3}R}IvY!QjsV{q-E2o+BF$JvSmhFTi=@TUZy>pu?5GJHzi)@Vg1?;&#-H z|1jQvfKS1^EJ8hOhTng4gJ(Q=Rs&xFedfac4%q9x8T$PtJLYRY^6)139f&yBVIDKX z?-u0S8mt%H&-OOz)n543dE>)a*QYVA&FC8&BL3%Le+)Xj4_wcoKLo#b!SCI$Z-zQq z3OXNz{T%RbMcr-zo^rx5Uk@P8cj0##^wINBw}7V_c(P+(J0I~E1zr~8(tUTjU#ly4 zUI9K8_+*TCG3HC}Ytnl>bRFFvea`LB?HKIeg}vSnraZ|H9SUIm>izZ~L+4>QN7{(^ zCqe&_$iw=`=TV5KDbC*xLWfVmUkT$nhWPu#Z&i%zGU#&>ertf|5bVq1d~zV-%!6~z z%;4_`9(||sNyPsw{Pw~Df!+i263&P9o|*ix&ji24pl3athZlivb#NYj7JfV7TzVDs z%!D}WXug0C1>OSl^&j$iB;wco-jiXk`?~eKY8K3IZPbk-c<<Hr^% z`T7d=Y6J9n4|PfJNoa@pdKq{XYTGI;=dL;=yzv5cUBcV!x8@p*q1^6 zWI&%gpl5sN^D69z!EZLynIE9%eE6+~{A>VwJ?Hoi;?(a)df!wjtc%|;U%w;%zhJ)w z^Q-qZ+=4n#2=(wu@E1a!9ENUs-`$7ce+=>H`OOK?IScgs1^k}?AB_CTK>e(a{Lc@2 z-Ph3%`{}P3*T2x=b=Y5nb=MvB`3lT?5BR+udcFXAy;txI?DhWn*%+6;W3?3XtNTE- zzMcb*-aj)M^U@1-Z#C?v!|zV4$LZjC0C{@|@l=P-U%>A)cy#~X^RO=tzlWjQZy4A2 zh_f*4SD`-t1D-ojpNrx97rLM1L+GIAphuz}4#4@z*8k(axf}XxJywK16;N;YVZ6`7 z?{>`BkHA-A9`|BhREOWQu)h`f3iz!B{^E!~13d3w-gm*i7V@((^k0TN(fb=!-x|R0 zb*MA?e(QCJ^9zi(6ZCluJY~V7bJ3>AXPtwshJ7XY)$cgBfu|aHRF?{9onpQgBX9pi zp5#J255ayi{BFW{-@v&+d&JoU_8%b5{D?>Q`E)`Z7z7@jM_r3}_CdE}us;I7dXKuk z1KS)t`mVu2%vUG;o<0(JcoF974~+MBtaq))9H_T@|Bt^Lwt#&*#8VCW+>YzDg}|qP z=Vs`v-%0x;uO5fr^NfyB*R}HKSJvZ?H<|_~U_QQDfJI=qDms+T|`d-+>7*|E)?ZfC#dLa-0 zLOjx^1#~Nb{-hw*V<$YX)Droi_ZQVgJo!=`?*~tIjH?E8UId=Lcwf^~Sf_U)pO1n6ZNxJQ?^DwAr{ClKQNxixGZ6n}h)2(V z<$*rAudUv5)t`xb%MYyAXdK#PcNh zuLG|4W9xpZEr@3~@W-%UA4Ps1Mqh!?eP>*adDp!3Kp#>B^EC|iec*Q>#+3(nQ}C}s z-O%$ad$BG$g8we;3%`RWEAUoWzZ+n`3-#(8;;f2#SP*)a#kghxuZ#Gl5dBo0A5j{|=Z`VYar+!XVx@6+l14;eU*8iW14 zBy=c`I6GmyEnt5s;@ODtWFPsOQYYpe!)4|FzBZDw4VmgY4GHLo|}Q| zxy!XUSFDJ6c>!_O#_w(`p#KD%pN~ZReG#XAck2P3t8wo71mf3s-*n&9D4e&SgPyP9 zcY*s6=Um`_!LOc=_zU{q0G@Z?_i^a9uQ1;J;9m&)Meth}<9!_bpW`{Km+^bhZ0LU}_^(BrA0p2C!9Nc=Yy{6) z*l&it-tX5C+X3GQ{4DbD5$InZ<2r|N<;MKxh2KALpJ5Kn<3z;y<^^&7e+iy% z;P*tO#4o@X41c^nG+v%q&EZ#y8)hv2vLMe#gN z1ph9?^A+r0!F(Nt{x>4uR={50;cbn04uby=@ZSZV?XW)&_M@TOmzbAjs3$w1XMWf> zh5aGKKM3)(#C~@Z?8m|HGWcBpp8Mq&I!^`v^_chDP&Z~H{=u-{hxjKTo-v4jBgUH> z^IH*lrF@=>IBSDP@0%@(`rjAh-3a|3hhOdcrJzp+=BqC3yCa_d7*|W^wjcbX!2b^H z%foLU@C+^%*X~c5sYgG;;D~#mSf*(g?y-r`Fay^&c(R$mWXv2ia5t&T%Cb0 zhCU~u|C<=s-{7B%e9(G%4)*(?^Xt&_S;Scl{J(+!H1K2Kxf*y`#M2S@A@KYFyeD+1 z1^Z8d-vfL%^5iV?Fe~gwLr?W@+psTO1KrNU{?!D2+admvSdR^0-wkp82p!g;uU3Ef z0_@9UzHWdH)e--ri1Q$Leu4gzVgCl=)N_$*Fkh=NFGCT3NAQe-{bA_yE&Se!b(abJ z$ADi3eLlo>ZfT55@9kfS{LG4Z)N`rXVXuC#Eb`$L;$M#OX2rZ5gncdGdY*I_&fjiA z{L^rb(HZx9-w*qXkykqr&zIo27xh8s%tOJm9p~h$5U0M2F%7!ihG(Ll#uR@=d z;J*y|s7`hU|4FQ)xrlQLbo(B^FARWgdY=6S#F-m@8{_wgH{tgM{2oyaIu8f`t-zZ= z&#Lfy8|<4QZ!6&Ui`vj_KI~P;4q;r+A>URaPfh{Xee$(1-u~cO0{g##S4MuG!gxnR zx9YHe32}DA?}i!D6LD@te(F6}lVGps{bwV8ngf3kI%meZ+lX<^LH#`5Kl$qNlxU+F#Nv%1M199=>I7E>be*e`(2yMezA{w=ugNZ*5K3I45!^Bw3p7JkPfPx@hg_5QubV6Xd-r^9bq zjQ3is-}j*Nk6159f$P2?-AAPNOezoipsx0S4i5s?`_(VOxbi@^1*o@M;5RRLx&fby zI{6RwDSgl7Hta9@j@3};d>{6GJs*7q`V-lAf!~MF4?F;!7r}1}@O%RO_1@!O;ddtH z+c=SHc9pJwn^Oy(v6o=pT;4cdN82G2a{(t!0VFmQO8|T;~Fuyu?>W1;^`yC&` z{vnKa9q>Ki$&c~s_pcS;e;4?j&{^lqD_}nz_{W&v^N@#!VP6yTTLgafJ)lXjFMxIT z4B|Ned@AOvGJcoLg?afC{Cb{ZG?-FGhu%g`fNttHiyn5VE;bwyzu)reiyC; z{Vzbit;cvb!@dcAm*0f>(*D&AzvK5u{9Q5LAE5K=;K_;K<@LR-_ORD;CFd}YqoLbu z=>IkJ?+E-B=x_@BSA%Cibh`%QdIR<+G2Ro%XT6tf8Tju){J+8Pr_g5v?B7H_KLS0g zBA#>LDGvKfz+VvYPr#O0TlZaD3mvK=p4J%G1n4{+d9@09 zHV41nXWkEfCxHK1=-Cf`TZ3Qkf1ZgvACL9;0pj@^`d5LTH4x`+;Fn^&pTKWJ@brVd z?$192zk8rtOYr{=``<9{ZNSqO*GE3&2mT+%`!noIU|gAi>v@MW@T>LvF6QwS=uis$ z&453NdC_{;c}_jdS7Y$k2mTl0JcPW}^NiXDHII8Sk9R=-<%quk>~F`oj-&70k9bsP zmf*hM+K6)i=4&?Adj{x?VlOK3v#Q87$X29<}@DB&i zE%5sao@Y4(d^GasvEuO$jl<#hKg3@V&#|5lzuQX2e#>HAJalnvUk35~hxp&cb3+YL z=gZ>xrV^Sj#B&Dm=((ze;NJl~FTwL)x^9|=JQ;zyu^9MWnD-Yk-b-NrH^$opekWnP zSuw5$V1FC@=E1tq^GfZ&KLog*_q-8)^;}zHmr^zfiJ+k)QA0*SQqz$rww>!0bh!7b%)@>zB4e9X&Y@Kl2SKSR$`z+VLag}~cE{}!;H41N9tJ_|f&5r0M4zXkgb zFpndVZ@+@4JMfW+ry=}m-~R@Acop(|FYMQ$KRJdtdt&`Q`+wwb20a%do_(-?6n=-J zKl~2!vIW=C3!vv#@HdA({V}d7=(k70Z*SOt2>!Pb&l+4`GzHJ?!1X)q1@NoykY+*O z@)C6Jh533Ne(S-01L7yGaArExx3cscBJHjULEB-RDKLWok5vT4S_zL&q>33D#_r4c#)`I?j!M+3H zUkCfEfqx8K_j}xd`I?4&>w!3j06zk}5Au8_^0PVO+<-VM!*4U>&mPph0f@5)>fv<6 zujjI_L7ue3JnDN=B@zEyxWDB=`0WGx&!FdR;3u5a2dlL5>-wfUK zJxaYlb3N|&o{#w3L$?MP*VV{pegCu%{JsRgzr%hGbkqAuwnNV;i2pzEp9Q`oJ|@p- z1^!8R9#G#Y{ucRP5YGiP!hGrbT)OYB0>-rm@vKCi?*UJ5=&AS2&jydaU;HVa4?2$c zn?TQtfFDOZXMk70b3@-FALf838{#Ps9NSvPV))Ggo+F5VC7#>;81XL!&jR2RF^~V@ zdESn&e+vAc;yV{FAx~a`{k5=P1;6XSa|Pl*i0_+BfM0!gW+LWy8uFnTo_EfSI3L2i zpl!@JhwrN7fNnj(e<9+32t0eC{~H+ZA>{cTh-U_PK0}9- z25}C=xXz(&f2TO1+x=LNo8WgS@^&-qyTbkm;+YLSo8Wt4pFy{S_zvACi1RvpU+f_C zxf%Mu4xV2yFGVme?O#7Z&y9%lVd!}U`pI0dzZ~{wF^_Gb!*N}Vlz%w54OvbqGhJ9_==Ysu%h^GPOy)JmxVcqq`_ZDwNoJH^* z&kx{tF}`=X7V~~D=Bo(s53nw>U|bhqy|0FzN1=at*k20!UeMt_*cXNV6)>)b(DPQ< z*T%ZOALD9+`7MYzn_^r?z%vf>dl+%%g}v&4*7ZKDi{jw#g7IDmowI`H4Dic=-v|64 zbl!z|91Z*$;KebnOo*o!@czKF!f!t4d=T~LOV~ew`TZR{8L%I{|6JHPb_UNqz;}Uv z0{B}&pUU9BZeJYd5X@tB*gpcl`hM{ndt$$D!0$GU_YmsjZNM)^{8^!MSMWRzo(o`q z0^@xY<6Q{;$>84(yvxp5=M~8R-g{&FC&2#`^6DA*9fNf}WLNBWJovu=J_+&Xg3cvj ze;oPH19_MW`kcZ%=12V9!GA5{-wgfd=0-}LFbn-F7->BVc#D3!2cs&8usd!j=}y9 z=(!(wPULwh;G@8^75MAuA95r9>oJdcfPaNNe+~J0KJp9P#8teZCg@^acNy*q4hT{=CSOS;&XJi02;oy%yum4g15eKL%Xu zVkpM@3)YMJkaF<59QvGso`d1HC3F}IzfG`?j$+*vMVuqxw+HyoV7-3`oioFJFRqU| z!*4m@Bf!4`v=xC!Zkx z%MoXF=y}DaIL^J$?Hugo_Z-HRAMqat|Mk$hDaQK&c;+JC3M0<9!T&PsHIMgWyuX0w zgN^aLOb5@0>tp+Uu+NKewS#?Y=y@1%4#2p2u8ZS5jeL7|O>935@n-<ac$h{1-syeTe^Qc^$zfdfMxUR(YdpXQYIr#kwaV|mrOP?{AuZ4*JB=paY^|c80 zM=)Nk>$-@i2K?rQZWqE{>vSIc=0^NC!S5XSZH{@o3Ow6j-yZnI;OU0EJ%@U@6ziom z@@ESCb^zWLJUg&n&Ov|u-gg4}XuZ!x-d+g2BJ{ZcmiM*Nooe;V=UK_2S&!4ZgO z68fk&Fs>u$+kb)mB>1g`as3A#^$BB;C-tGv5ybN#>^I{aK<6G=(9aZu-@KUjCxFib z&%?mmV_Y`_AB}mr74c-CK3s};+F-s8!v1CWy#hRsBmT3VO)Ct_cDyP8t&tL9)9~E&OdOU%mUco0{ab^$3GCy8RSV$j7#@x zWyN!0x^Hj`?kjr}@#y)xeb8YU#;f~LFNMx}4sj0r76N__;~kFqT7h`ZfM+wty9W04 zF~7&ab1$CbyA}M6kq>vAjeplW2A*c;V*7^B`C;%skNb+h2EG6#Q-JC0mSN2z)+xCc^%j95Mf{>@l7R_St~{ zmow(shD6DgC$`@O`vb6lGk?sp9Qcy+WBc+2W4spd&V^(9LPcXdGw?-4V*7`R#rVw^ z#rXHYHga{axi^JQMJo6=M4h6=VFDOJn>T@QPJp`@5^gc(&>> z{zr`%UsEf_+t!Kkv2|m7SG^c7SwF_NT^ZxMf#+)&+kbp*jMoL8_lDU1Yv4~djqQ6i zkMS(PpT9Y_&vR>x@4YR?zqu>Mr?iOit}SD{ZR;4n=)M@w)i%Z#wu|u@?PL702V?x9 zjxk=UbBt$uIL2pnjqxSjWBjomG5*BkF<$1$7%$N?#+N@Gbx4da9vb5xz8&LFyc^?9-;eQ&KaBCi zAI11DAIJFc;W7Twr!n4eM2ufGD#ri$JjOG=i1DstWBiwKF}`Jdj5qu$#xs2zAoCI4Q=TnjGV$ro{Lt;AN)A_Akwd@!2zDyx{Er8(w5iY=3HQjPC~CZ+>k5$buN} z4Esty#rESC#dx2eV|*s;^DT+(%L6a=OKhJ9_-{*N`?;`(^8()no=UJ^0sC{vlLE-AE0CYr zflo#LPs4f{1bhJ2@0Gy2VO{@+y0HiNe?P|gc0TIc&8UZWp?*%77W2P_`dkWie&%;E z&$rk|dVdq!Z^pj%4e%eapJpEu^FK8*#&diYfX{D#kCt zxzHOpzbcspEV=K$4`p!N578oYG1^7!_Q*;?O`!q=bac|JUGTXyc*-vUyAXw zy<+_E<1v0;w;12iDaJF}#rW8kF}~@J7%$p9#?M?Aya1aICF|a!TYt$iZMX>qViY+P@b{C3;W4EFRD4?Xu ze=RO_tvT!dzWBet-W<=l=b2~k^V$2v-e+^=eX%|Aes-6<-@0So=iegl-)xlk57x>1 znH}=J_Of~ZvwhyTT_o?%EtvP2^XC1iS%1W@m*uDBebg^`-|xq~ul{x3ulqRf=e(Eq zCU52azL)cU#4~xn@6o)k@nGIpygTpHZ_WG7*XR9}tMcCR^1R=7LEgLf%lq4B=6&iTI_qjl8^uCrMyoq_9?|at=OyMrx(ZnR_u*l&e!v+;`rl> z<3D^gpQq95d2e6rOBJ`*gg5hfo+xhj``*dNZ}nc@&nxbq1B?6l$sgzQyjOg^-1uca zesuBmcGw-i%koSQd^S;owdH-VPyzkOA?{Dvw_h%2x``kz5{jC%7 zzG_>V3V|?B_ z%$5JJw11nt4_hVggFEK^kKOZr$q{+)bY|XP8kqO@Zp-^}Bl5o6TX{eE>%5;hE${0s z*d%@dk6t?O->;wd<#x>b<@@IS%MKAZP>M(6$FAM<|4%)I}+ z@I2A&{AKgL>IQl5w^QEt+BfeP9G~}|=jQ#-!Fk_hXx@iCp7-V>^M2OndB5$Kyq`Ds zywPpr)_MPRg}h(8Vcw73G4B)hF7_ky{`l#6U*n>@-!dfceecbC(`I<)m3)pz^Zxa-d4KcGybt*x?@xb~_eSIMzU-8|pEE1(2RCaLZ}--%@;+{{y#KmP z-dnGl_gB`=`=E{Ue)*PpZ?}EkPv14~Ywe!*K|S)m*#3DRd2rr$Jv{Hv9F_Nzj?4R& zC*}RhQ}e!K@4PR6THb#>J?~S_%zNXr@_yjI^M2Xcc^_At=c(dyPbrRHtvG(SKKXM0 z?3MR1r{sP86Z1ag*u39$WZv&TEbs3enD@i>$@{0>^Zxv9dB1I^ytmpq@8dSf`yuP* zedSg1{@c=df3|Jj?_VhI+ce4hJJa&_u^lJmy~Edezio8h$G@KUrcdR4*nN2)c~jmO z7?k%R#m}kHC*|Y!KQ!+T@1FN=+vNR)b@Se1>Ad$^DDPv7-z$3kn1A1BGdl0zKAZP@ z@5%e+SLc1&xp}|&=)8ZiXWpl8k@rC><$a?TdB0$4{=K(t@q6<6FX!WryeIF^U!M0) zz4G2_zq~)Wb>25vA@5V0<-Ps*{P^g+xAK0&{dvFm^1T0ia^A1sBkw&n$otN1^M2%% z{J40R(Rp8Pc;34X%KIKC@;>GF{Jiu{#p{aCy*(el#F=?-+BNUrt&sPZr{}+4-2Z0YZz}%IGU=pz{Gj6R zM?DwI$9EW)|1LK5sl5N=vb?WxP~KNAUXOI(y!rUmKFm*W?_E6cebQ<9__;de{hIc9 zZ!vymyaWC7$-M7>Vcr+nH}B0?%liSp&xn_M?Z~{}HYD%g9hvvFH_iKl&GY`&N7Li= z>2O!x@9v%VlXuMf4Q=y2{QGI~axZ-(?{oFbd(S=ce&TX@A2V@kyxdmL=Y7cKdH?#r zyiZ;$?;p>a5-+#)sJx$eL*9QqF7KVU$oqB+<-OmR`5X7ZVR?V=?7V-oTi$0ZoA;w9 z{~8@8znJ%SSLXeho_XJBT*CFpi{+tvq_p0~u z-ud>t_d6r+U3bg-jw|N+}BGd0+R=yq|h@-WThU_ZQd9d)uaY-~G#9;`My_ z@w{(5DDS5qo%g}p=Y5xD^S;s_Kga9y<%fB1@<`s>56b)I$LD>aUGskE>UrOC!MyMP z(}Z~a|NBPX_r53Z-&~ycdydchhP&tev-R^nxP9KgZiO5S_7&ig5I<-OH}anWJdPx3x(WZvH%k@t`8%KQC8^1kOK zc|YLXyx)9s-rF9L_b~_L{f=&Vzo%2)|Fv!2-`y*>5d`Ay!R znm_+sUSr+758fy5clFErIS=H0>SuZX*L?Z+oCzD|{e#2uzTMS%Z~l7Tf1H{3Va4x< zs~(zvKRo8zyzeLM3 z^WOBWyf;}gKcBG8(RsgNMBZC2n4b^XWdFR+`#|2$oF_k@^Hle|zjSZjhtHj#r@CzK zyg&M2-oKkaKhM_c(7Z4IRNl92m!Bu>baLJ|d?)WGtdXDpT;qbgZ}wx}uih~~ue;YB zd4D?pxvx==!{V>ujb48>?`N-^pKqV%yu2S+ybgBr9rNE2=DsuUO^UydOgb$8-DIOz z@;=W>`R_zs`saPdH+k>7P5yh?JvZgO|DSpPeE$pff|9buM zzR2r&zrJPbc%JvW<^9*I^FH?DytiL+(Rls=`{n(O|I7QhPxIcqeVcgx_4myCy@T?; z^ILg;u4&tN{*|`Q`_sMiKHspsuQVp__b<^dUhcu2^M3j{d7tr6-jDb;?_ac9EMD$q zTjl+u%@ocE@!^4|Z){PX36XY;<<6?s4P@VxJ~N#6HaAn%)ent%S@ zcvs#R?vwYIw#)klt@1wRv;6zU2e;>a+2iy6@rHR{dRG2DYK@ojzWaH3|7zE~Pi>L+ zBj3%xA9fp@_r1I3ePGMHpY?YB{kGA?d4F)nyl*;B-v4+e|9-w@@4P>-PTn6Ln;$Q% zdsE(D>7Mt;7RY<^=knv7O;64Hz8&&@)u;LK*Bck-{iDtDe&&Syc(CaWd0((|-n-1q zk6ZiRk@scy%=@j4^WN*;{P_By?s=bYuDmzDH$UF*v}fK&&C1U+tS~h1>vYNc4^#5< z9-j`$`+v92`~5%U=UXOUlJ`FA=6$aZ^YcIZ75}d1!{XnMOnf0fA2sr@y#G@Cd&bR* ze@Ad`=ls0ctm5CR?maL+FL&Cyc|ZF7{Cwc^r{sNj@w)WhkLKqmyZ6ZZS<~|Kq8+Zu z`>`A6z43?ndD_ms^S<0-d4KTH_%Nl>9o_T3&b0iz^vJ98e%MBNU+%y8`S8t)o=p38 z`S=$f$+A@%)Rdp7*CmO^wGtcVgaWw#)nJPfdyE+2^3V-`XtiC*Sv5 zJkN36@_z1&U*qw8Z_azCo%23!;^cUqE3V7?*W2cO!{YC`y{?@U&;QJ}dB60RiShVt zhvdEe&Us&S>M!v;H{P1}w|CF`6HW5ou6VuTJcs@qFZYKwd2jUkgn0aEXXgFk;&mEh zzaJmZv)Yinf7&(gUFOUC*UycM=U=gS{m;JZ<>TM@`KNfEmG8;>4~OOb-sST?_qSu? z`QN@d@16dY_e+<{`|IES7|(y@9eIE2n7q%ucHZxv`a?YbTTkbGeE+;JzgymWESC4< zz8e!S_vHuj{`y&Y@4jo^hcBM@dB%MoFL&9e^WO5ZykB>4-iK|J_a7F{`yOMyi`VDb zXY$_Vn!HaxG4GFd&inkU<-JMsy#M^;xAA%&^?KeX+>`e+FU|Xm6Z8IEkGxOrnD>2G z%=?-x^M2}#Z{p|G?z_B?d^hh0Kb!Y2@6Y?fH{`v~z`T#_oA-Bn=Y7Fr^Zx0ex-_0N3#IeX^)&i(WL-JyAZ z{?llQOo z&HE>(=DqviyuW*Y-YCb<^9qt^S`S*?Hd*!{| zWqEJ$O5Q(goPUq{Ws|)3I5qD>AIkd&Kj(eD)${L%PaU22@9)X`BjfY__L}+k+eJ>y z`_hl(efade58f*Oe*Rj&ydU>w-UqkIj~9;EKkvugk@q!=*Q<}*JUSgp*EGt{GrZR$@BN46z0>^pd5_Kq=Y4@E^S*YQ{Cvy6V~WG-epSOXY8JzAA4X}-hXY8pO-u2n7prB{JZ;uR?W`` zwmU!X_x+IfE<5JuCx;Ks`+%nTdC@C-=KcOx^1kWH`T5w32IPIwF?pYRhy46--{SSp z!<)v3HI2F-miJMw=KZwd_0J0wuYcaFc>VKM#p|CN6|aAuw|M>Y#NzeO8yByCZsO~o zXWy{C{+au?uYbnD*FWRn>z{G(_0Kr?`ez(`{WA`}{uu{f|BQpLf5ySrKjYx*pKR}GY-D~83$kgjDxR##=+M=z{G(_0Kr?`ez(`{WA`} z{uu{f|BQpLf5ySrKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s z{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB z#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B z*nh^s{xc3oES5vwoqOed;Cp$u|BR>oXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W z9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM z{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-AN zjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jM zu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5t zpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG z4)&jM=+mS*?=*P({(gDC{NcRYe+JP0GY_6jR{}~7S&p6nB#=-tG z4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s z{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB z#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B z*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S z&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?8 z2m8-B-1x{sywl+Al=&8Ju<+r1`{dpJGd}j8aj^f4gZ*b5>_6jR{}~7S&p6nB#=-tG z4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s z{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB z#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B z*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S z&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?8 z2m8-B*nh@hf%dI_6jR z{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5 z<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqE zXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6kse#u37r@`9+`{n(O|I54mX8`R#<6!?82m8-B*nh^s{xc5tpK-ANjD!7W z9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM z{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-AN zjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jM zu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5t zpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG z4)&jMu>Xw1e8bxEPJ_2Ajmi7{OSEfnBp=#;#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h z`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk z83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^i zVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBP zKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W z9PB^iVE-8h`_DM6`0`@B)8OqIzvO*zyY>x^_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqE zXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE z|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{~3n|yDiQ;4c>M;KJSlToOk=r0NQ`X!TvK2_MdUE|BQqEXB_N5 z<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqE zXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE z|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{~3oiU6$aT25(O}An)Cd$-Dh$0PR2HVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2 z_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7 zGY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2 z!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMo zf5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BS;0kLIrRdXMM*&tkX#jHmr)9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2 z_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7 zGY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2 z!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMo zf5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdS$vS039FW4vV{f^GN{bxMwKjUEk83+5%IM{#2!TvK2_MdUE|BQqE zXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE z|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2 z_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7 zGY{&I8P&p$8k_MZW?|BQqEXB_N5<6!?82m8-B*nh^s{xc5t zpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG z4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s z{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB z#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B z*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S z&p6nB#=-tG4hJ9Do_89&{cYpCH*J-7`_BN{f5yT7GY_6jR{}~7S z&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?8 z2m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR z{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5 z<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqE zXB_N5<6!?8hlTsJ_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE z|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2 z_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7 zGY_6jR{}~7S&p6nB z#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B z*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S z&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?8 z2m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR z{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5 z<6!?82m8-B*nh_1fpr$)od$0o9^0zH!iVeLlz02j_}G8O!TvK2_MdUE|BQqEXB_N5 z<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqE zXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE z|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{~3ofCoIf64c<1rA@2)z&b$3*0PR2HVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2 z_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7 zGY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2 z!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMo zf5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BOSYJs04e25(2rYTjVs!xe_+-TpH^_MdUE|BQqEXB_N5<6!?8 z2m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR z{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5 z<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqE zXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#$ms+n(_6jR{}~7S&p6nB#=-tG4)&jMu>XvM z{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-AN zjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jM zu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5t zpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG z4)&jMu>XvM{bwBPKjUEk83+5%I6Qw!6W(d?c6i&o_kMKl21oLt{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h z`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk z83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^i zVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBP zKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W z9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h z`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk z83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^i zVE-8h`_DMof5yT7GY_6l1#YVsLPJ_22KAhQL;lswK=iUA@KK7q+ zu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5t zpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG z4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s z{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB z#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B z*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5u^v)u-`JgSStQn%ZFD!{<)SyZvW; z>_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqE zXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE z|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2 z_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANj6_6jR{}~7S&p6nB#=-tG4)&jM zu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5t zpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG z4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s z{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk z83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^i zVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBP zKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W z9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM z{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?8hflkX=bZ*`yUdsOub&&& z;7C5S|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7 zGY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2 z!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMo zf5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h z`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&ktd|mu&EblaUd+Bm{ zfBoAZ8yv}p_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h z`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk z83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^i zVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBP zKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W z9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nBp7V8K|9LjVao>#r zq`}*lAISUbXXV}gGl2G=aj^f4gZ*b5>_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBP zKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W z9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM z{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-AN zjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jM zu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!@J&ew(g=h+bUpSeHm zG3GnoY4G;hXY$_Vn!MY82GIU94)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE z|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2 z_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7 zGY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2 z!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!8>IbRp{pJzkZf9C#R z{~3oFCw|L24c>m&Bkz+t=H31?fcBqpu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE z|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2 z_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7 zGY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2 z!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!8>IbRp{pJzkZf9C#R z{}~7S&p7lM_zmwgcssIh-rwz=cl*x(+JDBu{xc5tpK-ANjD!7W9PB^iVE-8h`_DMo zf5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h z`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk z83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^i zVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-vcoUaS}&$A)yKXZSu z|BQqEXB_N5XvM{bwBPKjUEk83+5%IM{#2 z!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMo zf5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h z`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk z83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{_~u#3;WNrA?!bMf3W|I zgZ*b5>_6jR{~3qJ2IsDI>s#`E%|m&&|BR>oXB_N5<6!?82m8-B*nh^s{xc5tpK-AN zjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jM zu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5t zpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG z4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s z{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GYT0jD!7W9PB^iVE-8h`_DMof5yT7 zGY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2 z!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMo zf5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h z`_DMof5yT7GY_6jR{}~7S&p6nB#=-vcoUaS}&$A)yKXZSu|BQqE zXB_N5<6!?82m8-B*nh@hfeGL7PJ_37+kD?(;luZ~%)9+(eC$8tVE-8h`_DMof5yT7 zGY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2 z!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMo zf5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h z`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&ktd|lXoo(*CDnfrtN zXB_N5<6!?82m8-B*nh^s{xc5tpK*Ber!l_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE z|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2 z_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE=i}*MXvM{bwBPKjUEk83+5%I6QUqSl(&y_WOJC{>b>e+kXbo{xc5t zpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG z4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s z{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB z#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B z*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GYhM&pQp?9(PCH*PN7h`_BN{ zf5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h z`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk z83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^i zVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&ktd|lXoo(*CD znfrtNXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iaNYyI@J@rbXUsjZ!NP~@ zb_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2 z_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7 zGY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2 z!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE=i}*MXvM{bwBPKjUEk83+5%IM{#2!TvK2_MdThug9;v)8K9Y zVR`Q~|8EVB_6jR{}~7S&p6nB#=-tG4)&jM zu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5t zpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG z4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*ngh$ zbz%Q`HiZ3W?hp2#aj^f4gZ*b5>_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjZM+ zrqg(*!P^_I%6pe7dAI)zp#5hY>_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk z83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^i zVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBP zKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W z9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>U;g z>%#u?YzX_$+#l>e<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7 zGY(yL{GE3iyd6F??*p3t(cnlvwEv8Q{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqE zXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE z|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2 z_Mhi`UD$t~4PpP8`-A;w9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S z&p6nB#=-tG4&4vqzYX7xdbQ!g$EU5_IQ|dzpJB28jD!7W9PB^iVE-8h`_DMof5yT7 zGY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2 z!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMo zf5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5% zIM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h z`_DMof1dMoVgGqHg#Bmk5B8sNu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqE zXB_N5<6!?82m8-B*nggLf9T(YcN)B%@lD?QZZl7VBl*z&GY_6jR z{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5 z<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqE zXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR|9Q^Wh5hH*5cZ$BKiGf9!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s z{xc5tpK-ANjD!7W9PB^iVE=i}{lWh8Y>0g?Xa-1ww-0@v_dZ+C*WgG#wEv8Q{bwBP zKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-ANjD!7W z9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jMu>XvM z{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-AN zjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jM zu>XvM{bwBPKjUEk83+5%bG|O@KhK7+|IGct{xc5tpK-ANjD!7W9PB^iVE-8h`_DMo zf5yT7GY_6jR{}~7S&vWh%_Mc}%*nj5!u++f|@J@rbJxAny^HvKs zIFb+TKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5tpK-AN zjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG4)&jM zu>XvM{bwBPKjUEk83+5%IM{#2!TvK2_MdUE|BQqEXB_N5<6!?82m8-B*nh^s{xc5t zpK-ANjD!7W9PB^iVE-8h`_DMof5yT7GY_6jR{}~7S&p6nB#=-tG z4)&jMu>XvM{bwBPKjUEk83+5%IM{!l^L1hWc{YUoXYLR7pK-ANjD!7W9PB^iVE-8h z`_DMof5yT7GY_6jR{~3p>|NPL<-#MVc+w+_L(O}`jK|S+6{FS_~ zxALFyJXa3L`+Q^a-eQMY@jSim$on%*jb*!;HRpzwpbvFWYgh zc%ECY&HJZQ^1l5)=Z@zYaA)2ho4ZLo{)&C_{_#V3?>PTF@jS;LnD@^g&U>?F^TzXx z-Z$@G+?V$=8s!_fXV<*{`^LP_^-JFG>)0$_&k+~qeg6OEz0&`#pQ-{jtOIepj!&@7_P}I}FPECfDbE#GQG+<$=7n7?Jm3&*y!~ z*YbYxn|XiboxD%~An&_;IpQm4OyPr|qPY$>upQr8ldB5@WykBr!-oH37@1J+g`;uGd{j9a}zVxzr z@3BzcZ=aFBKWzL%-rK&L_jjJk`#5v zF0Aua-Vc8%@3V&H{gMmvzRNLrKf80@+pd}Sjtdw2`22JEnm6;l&%Js7_58eVa9G}V z*f#G6FO&D@e$T(pyz<|?AN)|>*SwUw?dlytC6Yd4FbL-WNP5?>DZS_s5##z5nR^`0k*gdEcv7-Uk$qE629Y$1gNC zKR)gMSl;(NFYk}{$ooni@;-BFe%!t5D|w&is=W6)H18X3koP6$&HFCz=jRiix;gKy zPs;lNTjl+{mU-Xs%ltgad-vyk^?&Dm{?2({{U3SXdR%^_hVY+0l7Fd(*rh(>(9bewLqqn|V*(mpm))-*w6Rl1t}(-AVa*!Y(i7 zz1x*}|JUJpzhINRcU~ax$9<8X|D5$;-j6SyM_rw4czF5cjLp*Mz7wU z_odFr`#D|nzTAp=@B4ecLU+BF_qU7Zu}7bkkH58B-d|WP?{hWD`{SSF=i9e=IPdpd zl=n4y=KYz?^FFF=-jAA;|BkT2$h`L+n)iLq&ijk|=KZvd^Zrchynj3~|J`KDTX}DD zPu{1Wm-nuR<^AOC^S;{(d0(+f-Uoa$Gv0A;d@=9q-In)u{qz3B;d$@XDev7@%lldj z<^9r0Gvf9Cb#&hEe=P5#ug`mjzIp%S@VxKUCGRh-pZ5t%=6(Gpd2c*!di;D(en0Ok zKAHCmZ_E2@m*#!{K6zjAki0k9E$^Rfn)m)I<^8Zl^1g86yk9wCTJ#zCY2J5wE$;`6 z$or~y=6$=X^M20xdH=L`-iI8S_X+#teZ4MuKX%K!Z?&ebYDcKKX^b4}CK4>pYzIKkv=^u0!+Q^47e6`+s@A z^QyeRJ2>wnF3Wqzi}QZb`Fa0#K;BpEpZ8tP&HFv)zmKNQt|oDEPUQ5JP$4WmmZie_oL$W-SO&t{4&M;=k=TO@%!A7_nV9R^YDlA z@l!|Sea~m}{`xC<-*!~qxA-9M=YNs+jmG5tq~iO`QpNYBsg3jZv7XKIepTzd@3C~= zUsxsYt=22{t@6I_&UxQw&%D2MaNc)0KJPo9nfF~U$a{|~^ZwCIc|Y}mykGQ8-p?AD z_l-Wu``16_{kds*pQ~y9z2fw?d4F)lyl=Nb-g|DJ_xbk7`}#fee(0%rUt&Pshg_BS z$wTvg&WOCXd?W9Rf0p+nCgi=>th^u8D*xVl`to_7u|eLu?UeVs_sM&UWApy+v-3Xq z^1T0id)|+EJn!qgnfIPw=KWuj^L|9r{P^g?#qxgk8hKxB>%8C8E$_pR%=^**&U?p! zd2c&3@6U|L`;l+vz2Db)pYdDX*KVF47yq_&-p8+(_YHT-`;q(Qeb5PcpWH9+uU?b) z+wRZ%{V(Qy$cK3!KQ8YpHO|j_Y`!3;k)O3_kZR6>*Ml1iY`tN1(eV^j0-=l_xSKO5)2Q~xTn0zpsDE$A4FRKkxlxKK|)% z^M3W`dGGOY-j^wUPVM)0KK}FK=iu2d<>Mzjm-pVq&))?e&d2}b{=Bb#ci!K*J?{f< z$or<(ev-0DJmx{+1`%KKo z-&{OSx$m2N{0pDveeThD|Ll#t?^Qg`I_H^u{P>6S{=oftzx&R-_q#FgTV0*^B?snx zc=7mj?{o9<%}&qz(3A4M>(O~{c4*#D*e~yQ@0s^4cg_3%ZJ+o5Zjtvk8|3|{wetRZ zhrFM@blz`UEbmLU&igO(=Y9LR^WGspUES!8U-R=YoyO<=$?x;t?W?@+@nPOKeLL@; zy`J~gUda2{C-OdIc;4r^H}9tm&HIx#=KZUy^ZwH1c^`XG-f!!h_tVbG`@eeUed`nQ zKH{jncPXA%{9yll{NV0+fBK(!U$9f&58XEJJ8zNq=Qqy#uyyl(@M?MAc%{5wyG-7f zSR(INwaNS1#q-1K=709lXh8n8x6!y+`FZK3XXgFV-|{}@=e!RcoA)=r&HFuHbAUZd1Kyt z56SyCSLc2CEArlVVBSYvocHA~$om<^-)mkxHy^+9zw>^`>3M&@SKgbSn)l02%=@v& z=KZ;&^WNo%yg%17?*|-`_sb5<`_~8LedNA*e{!$95AB}!KX%W1tK#1^Jil8$ewEI7 z|9+ReU%hkQm)|Mxzi*%SqqfU?k8Se)=vH}uaErXpEdGu;f5&`$$IbHo`KEbasMtGf zl#k!L*uUE#AK$Fld#|65|8(8Fe_rfAteuaaTI}z&kc&s+nvSt=XZ+z%i{a|ZN<-pvBl4k&%5N$_k`W@zH;&NYgX~| zZrC3AJg*c#H}@`n&K|Q*K2NLt^1e{<^ZoVW_kjnB*U6k!{9dtF@q5S`hv)0lH%dEe%iysuL{ZW?!cKK}dS-~aZ%DgRt=f>%IUu8z##}&u_TI^RA=b8JDeEy~WoU_lG z^*;wpE{<+j>w{NFpk-^VZa7wq3h^3Dat@zaX)pH}Qs|Mxt9 zU&_p4U${8WCco#;tNH)B{eAw9f8CM(UU=ur;`|pD=ik1#o_iMOU%c>KwAeo?F87Gy zdahRN=M-P~zZI9;sQA1-DULs>IKF*x{36Bm{JFTE8y3g^r}&2XpTg~};{5v+`}f8E zOY!-xSlsR{i|gN~@VUOY{udR;FIHS`o8tOERP2iv*K_CM2i8f&dA=!bm-UJtpyw5z z*VV-j`uU3Md13JbePnTcE-J3iXT^E0EpC^87QeuZF77867oXR@#q~L%xc=J|*K@1l zcIi?aKk~Qy{qwP6f3vurFBF$MrTB$v_@sQf2N%b;D;%Dkn9p-dalbvJxZJ~w^K>q* z&oagFEsEpY7ngfXvF}uzXH;=J&RZP6WZ`yMak-s}^KV!jzvYDNe_e6>3&q#V_r<Rz0GvtplB-0rUy&bJiD zzgs-eKCd`_r{el_FFvmeiu?05#d#(c`;o=%{zP#-r~i;|_os^ECl?M67oNR~>-l7H zyZ0)-?lv#ZKW}mTPQ~@_S2!~zwqo({5;yWxZF*O z>ihGt#pO;d96l*7w{vkluPkoId5iNjE-v@F;`XZUpUsNnmnlBqmc{k29!G3mT>lS? z%l)$Wyk0DRt}R#Gj!PEzpFa!db&JpU%Hlj<6`$8H#piW#;nu3S{^N@4GqAWmeT(x? zFZLP5`R^`1ufE0a39lAEPg@n|-?+H`4;9DXTU?);i~GYR#m}$#i_5M4VDw{gKYXhA zL)dl2^BC3l&rgf{$@<0TyMOWdo?Be*TgC6mix=nLtGJ(RUEIDO6_>kZ@rS<&#raPx z&c9l*Z(7`r-HQ9?p2g3jR>k#vsW^Yv;{1CT=Rcs>-zx4uyA-#}!o}^_vpD{S;(oG1 zvAr#ry`DX#yN!lzSldo55Lzi)9pdlaA7gu=N|ar}ve z+qmNT99EqFgTm*k;&LA=&VNX8`|ea+?&XDlx8nX&{rp<7IR9CN|5wH5bz*USMijUE z+l5ec_tK>JFYnYg~jnl7ngfxak~#K&U0IF|M|4I zK6e)T62{48x!-~&$P;vjPzQ2twuIK56 z|I@|!I~M0ztT@j$#qX2tiqH4>;_H2Qas0Ez_4#-4^X}o|^XgYTuIW^KUXzN?Yt7>P z!;1UoX~pB*y^8a6FOI*qxSmfIp1T&;XO-gqzh?3H_pIXhrp4u6SKKaJ7N75g;`fl- zirf9_Vy~WGx}dn+=Znidr}+Bawzxn1r#R2d!e_VQ@$5f~>p6GvIQq`w_`8bR@r&a6 zPcH5!j}-UA8HN8l#pnBd;d4@PeU>k-fA#$KqQ&_;7uRR+;`4o}IM4CL{o$wL_(Q7m z7oYDD#rLH)#d&Ti?mvx++vVWma+fTw|6#@P`xUp#HO2McvAF+CE%y71>oc)9ezW3o zzbvkQqrz>6;(ju#cwVJ?KJcdEbuyO}Zf_OWr&F=tReZjKi|g5?IL`sa@&72UXZ3fe zkBZytoZ|KxUYvhuaX%kW9KUaIdo5YKF6iII^?9cFIdy#DT)mEE<>LGE%Z1O+#rZ!k z?zg8G*MCrP{;iAGr+rjh?%KuPyg1Ju#r6E6xW5f3&VNF2KWtKXR{s!S@#6f$it}$> z9RGT8xknWD!{dtcA79)L_bJ>iExvD@R9w$BisN4?{C_I$KgSlYdtA1-+!@93&lcxD zw{W<*c%A3hh4aMX_?E@zTfJWQpT+Sl3(sD~{o#RPf3f&_nY%dutm^f##qpmO`{Bht zqPRYf6rPic^W0q=ziQ#xzj)p9*@fFbitD*!;WMbX+yTY)>{NW6&Q;t$CluG`r{Z!q zEzZ-eIL}AL&zp!9Rz3%Mda(^hUXNThF#hbv>c0 z^SwoJe|W0+zHw7=yZ>429g54{s<<6*FTS4-FV6pJ;qY=j3AlsQ5ncY2nJ3l`t^b}ZZm6zAEwxVg#%JaeGZK_OFV^Uk4WV^XrQH)jtZK>kFUFipxE=_&xuY;`g-b-{+1g zuKyXu{zC*Gl#!8@l^Ge4l^sR)O#LpG@8wtT%ky)&UH|I&xL!`@e(vXf?&m%p z_s8S$0ow8Zy!Rke+z_1g=7KEr|9;T(hDo`M+ii#idt5=@4a)rv?X?l);l1pJ?$BNjz|IL!?kvz#D$7&GKUzQ>`WuU7T?IiL zUIaZ3@IvOAAioW`ZO$wcjDGY0dv=5W*MNUOz2Pdv1HC_?KFIfhdbI#M|A3u~K>jiG zqpnbHdm}IY?_vtbR{{NHfV+eJ?*A*w=+{J$uL~T$TWIJA@=g#Zhr#{`$UpGi8$&AO z|8k(e5!mSqdd5Rs#lbk$8ssZNy{dto7h&9V1Al%uYSsT;ghIXALAkz=&%+__QM-2l zJ@jHCTK^7*a)W@!LO;q2ep?0YvJCXRhjw`i_9TKHnupN+lmsYu29!Gr;;;+I2S7YT zLVxiFJ!QbpJ;46`p#L}MiHG*;4SHz&-2wWy{IBa6{b~jEjev4fK>s9&2W!y36Z%mU z=>G!xZvjt(c4+|mX&zo3{LmfRD+kCI1v}q?o()E=^uG&x@aO*|jDKwhdn}<}m>K_j z)>UJWzXblgl=Yv+Kjy&v6TU}eh=Fnwpj`M~jUhYu;VS6g4g4sy<3yO3CPRCT0Y5we z{kOoLJiyyR{KNMx4OgMuv&PMrbrlN!`~&TB6zr@6esBi)~>RS}r{Q|VtFK8Dtu+s(Xc?kMnf&5;u(-Ztw8vHXFp}sSrzQdqgJJ8d^CbJ~tzdb;ID)4+zuQCqVut*gpp1Cjj(#6)^4(nOA=y{?9?V)4&g*P;L(BzmviL)^?ee8UJk$ zehY?rrGPzO!TzgYXEKaOhe7@!=+6Uw-UxbLfqW&9&j;;QGV2Qs#{L`yd^E(BIkd|z z@N)vRO90q^7RoIH<-P{}0g@cO{x!JcrC9}V^#0Dc+tBtpAv1%3zg%m+U&h5VVT zuyK53UfF^kD=4=U_-#ArxdQU9K>uRU6AHX>q0E{X|7{BWr6_z*yFKWC3jS;d@=Ksx z3*g5fe#(R2T!1%&_~{6FrakoQg22Z?-ZOyx%OL*;fS$)t?rqSs6yzPCzJH-yn#a}w z`4YhM051yd?gjR5gK^Lm z3jDJi?0*CMnS(%2ebCbo{J9MDzlMFk-ylB|?oVZapFzE00@%M0%54bcc7*~GA$~T2 zep9eN8uZZp3kT4D1N5YV{i#sjg&;o+?Eee$!@>Wv!A`pGSpnqJf#-(%hRwlmAHfe- zLH-leD+lm}pnnv|Uje=o{JaGCd}yz0Am0Say#n(3?S2Ns0g(R)`g=qE*#Z840s4!; z{fIIkPxrZ6LR?)1{RP3!Y>+4CWMy#UAG@Hvnu7g}L7wjCzJPiKf_}R1*$vupG1$`v zcsi8Z9_&m7UKiTsAmo8tpl2MkBRyZU3goZA_50 z@Y_Nt_c63rS%{NP#=}b1l_%799+V5)X@*IlCmH->3;lW$_<^1eGJ|rvgZ|SH57VK( z3DDoqfu4pS-xTc33*%ii@LM(**XVg$d(g8R{8I<&bv`R%jDNfa{Zm0douj7bJFG!J z<#}2cbbxv-g?6Fy^V>mwKG?Yj_z;LU8V8F(fA0s}9Q@xD{BQ+$UEqzNUhRR?^UGDh z{!Z{*)ivax{AwMr{}i;#YtT>MH@AWM<^cOQ!MGC!<(2|@ zdLJX@&kxXE$D!TRK;9GT8xNe$pFalq_2369@Iwx;Ga1^qILKRpJq=(!-w5oa{l+5T z=V4GU1C-ko%8dj0XsA~KuxAqJnF4-uFdl}ouI@m+Duey)V7$%+d44U_i=Ov<5A&H1 zSr!}rNCNrG;I~?k$Buv>s(}13h+BGoKO5Nd6ZEtNzr}<69ccH75GSt2Zp^wW3VxvH zM+$+Rld?1#|M+cunRV43%BAQ1cY{AC15X7$58BrN`w5jmenwVJjDK{4az7i3WnE z=nHmE0RPkdvg?pn;kb?Ajj`LauDrm`)xaNvAHG6+y@2|51wI4(a1h4vx=`+6(32PZ z_7L>61U>LI1c_43ifgTGOH!~ofpMpHS&*}^Kvk&xBC+HWIK~Hy( zPXhTd;D@0gUn(o38UHu}e%=py0>REJ(2n$;x-ihw81#$>KMw{y{h{6IJ?AH(+*jZS z3)p|4_d3!#>m>NU50twH-g}t@_J@G}PhkHB(6biGoeT0`KtH`db{y0<8p@pv`(4dI zemA^7HU#A9JLc7)+rM@O`LzU}qYv4}f<0#7 z|Jl%v5fE>mfY$;&7r{<%@P8GMr}t)WgK}$to{muNV~8s=kZ%iqNCJCIL60T0S1#cD zpxg|QcYt^^fqBs%kUt9Jiw)>`0P>ZC6G8qY*h$~@C=c=A3w|37`hS2u^xZ%c zkWYYi%m)3mI^=;JP_N~nKLhL;2IbQG_K!ok1;C#*q1>h*Zvp%-)eG`x4v4EKpvNEl zK;Nyi1o?Yl|4Xnl0^~1%{Tsob^nJ-Apg$P&w*dL!AWz?Y7z_Eq1Ns+z7tb2X?FoAJ zL%AeR-;JVqjxF@ZfzU2bAx>!CUIzMCFtke&=%@ME9ME$Z$~^}1uRy*7v`b^qGZDU{ zR2Tf*3-lPk4<#UeT0p z{RZW_g8c=+{sRy{@4(MR!2W7b?orTF67~~l-C+Ui;+5csV6c<3C!zWfuA3Pf8Ig6)BU@d;D^hg{~Or(4fr)>{*t_44Pfc+Q2KUY9cEyyQ! zaDQ_#^t%(_htc3qbKs*O9xR}~{!p(rzztAtC-6Ug|MUsyX$1D?0GqW(qaW9hr1 zryxHp0Q`b}&taZG{k;U(a{>DM9>DIQxliD}%xutK4D2z0pQE5& zy+Hm?l77NC2J9&d_SXmfecx&QN8V~~5A{6{dJItCA5bq}sMk=i{~6S`6Y%0t?ryL% z7|J~kapezs>H+@?JR1CP4gBu{cD@JsRPe)duxB9D_c^rtASkyov`aN8_XgOR2zvg3 zp8Q~cJ>cPBe@>8p2>JgWw98E39YIeSkavLbHv|0R4EpPUo_0{*<)Eh=@M#dwgQ47d zAU_AjomeP$5BTj7$e)FHz6RsPOo+F2Fpf8Xa=U<^dxL)-zSjBK6y{4cK>uy9#{=dM zY2Y9Fp7K;EcOkTIb!gx2pvNEjX;IK$3F=Gd0WN}kB*fKsD7Po*iH3UJhI%yyJ;lLq z_Fzw0;P=6vvk>QrU}qforx4ih5B7LLxio)H0r_=Mue#8`4uhUHV1E^`zbWWXg?!=) zdhB6d-2&`f0{LeW*zXN?_60rbK+jO9mpSOE3i+xV#Pb=@^9$neCipEH>RSr*mjwAs zzz;&Xb3ncitSiI7pGBa)ok0Erv{xwTX$yM7AU?Z*emdVW3iR}WcBgY?>%gDqK+iw0 z^AG6B4)XoMKeVp&1^uMQ2JHU<@o5hByoGYFfF5s%2OqGf0F-+M{I(LxO#nSPpxiQ0 zuaQu0B=pDEpl20uI^Q)8{FV*+bv~#soi~dE{SHvCn_&Mf@c#kOL;GXiP%kHFFDuyZ zeFE(@7xaGzJFmky;sAPL!9Pbp|7YMIfWLKzz1D-CAdue<^1H##df>N>AWzRnJOMpjAkOK0h%NLlJIJ4x zzz-&{PTvN4yrI7Hfmeq-Srh6@_gRL5{_>z_FWBD=@&noV8~P*h%^*+jH(LY#xdZh| zfw&EVa<@Rdd4WH#LtL!~`HrB!EyUGgu=5<0+Z*)I{k~^#ZlpEDe^0m%egxu#<}JOT z+`kZq^d72YD0c(!m2gfV5XxNz_xJOGpF6?*eR?i60Q~6){%H#Gy}{1&AU_HGQxWvg z{K^;f(09oTfjphl+YWKQ5&C-{@c$Yp*B9zb=gpjt#+o-51_<*tKrgF*fg`0X~x(|KchkKa>>+tJ|X zQ1H)8(32PBp92qryyp#h(go~%2KwE=Z+k({1<(@!^&JB8^qkR4(31e;U03MWfiRBK zb7z}CPbJV}3VEz2^ovOF!$t6afAGUu7Vb~y|3zrmhxD7PfYw*yYk**yb$ zjzhVA5I>`#TzbC&@pWKNZ74Sn#7PS9La^Q$3wgUV_<`2Zln-g1P!;wWenYt?zz0Bm zy&+GgLVf>0+>QYKuFzgLz|QT^j{QLYCD30S_(ssv5d1J3?4)!1cVK)O1bVIlPlk1L zJMcfPH=Uv1jQ~66gMZ9me5C!BBjC@=Fz(ayR-M2<9uOznq1;JOFM2M_0{nIq;)>?y zW5Iq}cT9oy{Q`P=fc!kD?_2N>&0`%vKdoCkfSuG&TZ8;b@be64_nc7QS0En(`U}DQ z0iPFxIOz(0dkOWu1NPAKVpE`An}L6ae0~n(e}SFmpoi|)%!2;z4COjQJ3fVRndVU? zz|I^{uboitYsix{Po4_n^%AgW67aF0XBqe{9{l46^{Ni_dI0kD-H=>x-=_}Pxf;%G z9szr%jM zXG$3VeRf0J-)WBKqaSO&4*J)^Wm?|!uIA5RJX!&MUIyb`P&MOvW?t=ismq-L^C)ll zPI?W9=Rwd<>G|cIPqaOaie_4D{CB;h@pb0ap@&)zy;r$Dj2GRZe{F{O#$x!6wl#du z-4WIi*Ba%N7h1|%m@Az^2s>J8>`}UydAr) z`AQgnH^6+}9pW|x%B>6IV+EK;wTJ#P8P;V7Apie_^>Q+lOYiS}3;s!kafF_W{|ot~ zEcmA*jQiQ3Ul##Ce1rTz-ybgse(MR}F`@T6c|&|wgE%h?@&<^v7BJ785B%pf9sg}W zz9htRhbvl79L!e--qZ4*VZQn&LCY74*Zc#>XFyzqz;pfO;JMEKpg-2i%7Df{=p6D4 zc+Zjn=I00D0~J4E9ylbgu^pLL<6vBP2=Xmqe;^X{e1ZAxdRQ+TU_ILv#=#vhE*FIH zw;RYufc^c7WO~Z@FMY2(4Zh!c5AxMIIKNRA*30!EKm3AyP8v6-LBA*qd4}GX-W%+p z_jTlee&h}BF?a^^`4P}h!(rTUhIztLus;LJje&J&5a{^}^Xg#88#N$KmcjVd2KW)Z zt!pR(`qu-e^Lu4s{kRP{eP66K9zv#zeeJo6Kb<8&@)4m_{D2l{D2 zh-VLopNXJnKa`sU^YhcNUZeNaC4hexL;PIJ(Bo|TERP%is0#A1ooRRj<6teYa~I^> z{CSM+$h;Z~+y>T$Re)<&hKoZD1!MyY} zj3aMA|7*~n2e>Va%Qe8C^nRg*uy5%J>r*q3r|*=lguLwq|TS!u-5C?C1EwxOo@ytpnUg{s#WEgMOU?yguaZ0^tApV80XSZwGcl znlxO7eSrHASM?zO9E0)h0N67I%AEuG^C`583Haw0#EAj?mJi~sJCthy<6|F7<2;^u zRUP!Fz`Au2^rJ3Nt~Ky3u&#UzI~zm0_a90cQLX~-upAa68>JpVa&W&|7mjRQRq zklzYH{+S1QPC~iep)`+5(2lEt*9JX(@9}eSS7_8S` z!uWU#;`|n@b9aIK9q1SIy|!tPCsSb`V+hP+7Z`_Y*3~o6vk&}3`^NM=_xjK-v%n8U zVZL_*?4)!10boBp7kLcg@Bpl*PQbpF3-H{KKcgTYhC_Z{593+{$lrkbR^~8%)qrtl zB&^GVU|jPB{vGxqU&1=^6^v_JLH|;)pY}gfpj}o$eaFE3VHW72_hQle=bJ&l_y*&n zHSo8p~6;(=d)4gL+*8zfA_e z^@4HV1nh}~daZ%H)C0z~*-)AiW|VLZ(a^PdaghyP$c za{$(Hf<__Rx2VUBUko!2dB&uV2uOy7F#`NR_YLX2 zMh{>Vd`{zA`%y@B~^ z1(^5Jc`8e=#|`e!j)eZZALiB7V1By{=GAY({!>uj5ZKrH0(tB&)VCqT{}{+W$uMt8 z1HJ{~;RfWTHlT;TpWYVYb}s1mf&5Sa^xQJ;K3P}CV7xvG^TUtOPbY#NnwOS?dcA{s z86Y0${e-K*|MZ^xJTPAPLVpQ?xUz$C>AiXM9={Hd-&%p+7DD{Lg83eOw}ReFN%<-k z#__i>KdAxsbb|aj2I3(I;?oA!L9Vd=S_k9ludE(o{G&gNU+K^;#i3m$fc$i5_q9;3 z^)Rm}2rpeG#S#1#Cw4f1UU z+y}W1`D6j~J6G7xfyZ_Y|DfNkhIpp;y2oVoWaA&!khkG@mmwDN zPe>@K1g4=NE{pSg`*r^p_qG&-O4+eg*yXFwDbyLq4JJ z?9hAiw?KPchWJc_c(#W1FMU6q-dDB>`fo?z*5J?Xuuf?NaWVng_Zh5n|G_w$1pd4S z@zxUNncJa1hCsc3K%V>y^QhC%@4kTj{b63z3EKTV^o#s3UVMOYu;4>I4j#Ivx$k|= z*TVV3+0egS!2f;05B*^OKNR-olOTTfz&NrO=7;IfzLmlMeIPF#f&S$N@%9k>V-4-Q z6YT5`>(ga0PnZY&r3b`wD)^1w$NLoYlmzYx_S5^B={;|b;GePJ|25EF^xYZyj!#`^ zuMXgUa~L1rLjEy_epd?Sw^tK%|E1?)n?v5n0pnv?us;Uo8`U7c{ef}e4Dg{4CpRIU z8$n)*dZPUk`9Slr&os9H|N8=;3HH>0`1}EJ^$zqn!uUHD+Qk|Cc?8DUrl5Zu358=??zrr{&8u(6FpAG{*RFBv3nHTsk z825jI|69X&NAC^32;=W<B&{u9`ysje>Y90P~8@kT~-7?X?HmHz$;P7Wzv^ zkaq$3T(F;(1o9JL-82FE^)bk+W-uQv59^2u-LU)dl($HD$sXNc#2z*|E<9sWr7uWv9vbb@){aFD<8SnF^8Q1dY87puU} z{;+T32ArNZUkB$}i^DkR192Mw@$(k^Pv3?72K~A^^t)#eZ$n}I>j?W`RpA`(Hken3 z!T9nM?$?+CFAnp3A1F5p+Kax+;|TIQ;km!XAm0w`gvZ$p4zTW^^D4(-o{$XliiAph_n3qOEKB4cMFNb_P6vm@(Fy9V@d{`Uwp94L4A)i+Vd-}n;W(SNflR^Fz%mOeeKgn8yY;8u|L_CcO(2K{s% zIil^g8rP4_i}-JDUc6@{{8^$JOTc{1AeOkc`pj`CXi=7LO$sN^PE7)8(TonN2o8Y2gg8M zg+u?k1M#pH#@U+?S81?*9|8G<;-L?;S833*2iE)E@E)^)@cx#+5VxT)jxPbf%>e)B zg#Cw8Fi-vl`Tr4&r}SN_r%-MV;9<}o_dykye7=d_cY-oIgo}`Nj;0Pbc7?!EbG0J$uq2%Y{ZimO=lm z4&RM>1LNa!$g4SlHwXXJ0A3RO)*JTU=)2qPU_Leu>Schu6j9a4jae7{ftMlj^T zU3`b}$N=-bJ&>=mJ=FD$h5UIO{NEh%usMwHv#MoP#pp*0_@Pd1BeATDK-a9FMnA?m z8C_;w*g|{JKH+5OFZ5hkD9mroVg66=DW&;*M6Il<82tzUJ{J7&w!G25XI-p>@i!9Y z$@{YY)A+|;*oXNA^HTaAia)F?>AjA*Vcy~c`Mi8NW4kl2u2#wXW&Ag)gzhDl`=IN|Mh_N?2qcka+z1N8f5-5{yPiC_en5c z>QUGD|1+-^HO&0=fBwS0L=^OQbC}OGgYo?f@ZFGSPDB3e0pr36nCAp_`#<&k|1a-1 z(%id-=G|bPPw$QI0sD2;;eJhAf}Uq4!+!E|xNo=u_7nC)9G-)?Z4CZ75A&i1kcZRY zd=!1R>&ye~heeNo!#v6b#+|cZe;Mc(_uK1uSPT8`8swh`kT!c(JY*!~&wQ}YP!ald6X?IQ!2j=i=z2Zrp!oxMq5RL@TE1K#&21r{EP?q(3D|dv zg#DZqF#rDo=d{gWziu6z$G!*iL;B9$2I%jFV0t_7BE!ckoYmbM2o=pl3A9tJ}gpZ7UeZXF!~sd7}M5?-{rY z>)(oHbiEEV(>%7n=EHn7xAf8c0O)DmPs<0wJhKMmtGFgwj}MH?A7R~e1oGrD$S2F7 z|6YfEr$ET7JzyUA4dz$xA%A}I)P8saxo;%(O&jB5R`={k#-|q(G zy@9Z=I2`8x(;)smVP3Zm<} zVJOT$SAsv|;J&jj%$J;8w4E(reOeXluLJXeo3NkX4*FyJ+}fTXxL;We))yJ~bl%<# z_dBXXp1%V9t`)>jC&-gOpkKt9==#!gqf24_6Akx$nxD~rD123Oi`$w9z&`UV@I!hw zU9T|c7vDQ;`DBQfZ^!F-9wcm!X)V%k0&10@;J|FhG{=j+flJLHTPS9R{ zuy61g#-n|Zm;S(f#sb#+8zXgn2hP@f-Z;(8H*5X`;x-qI@8{fgoD?3adC*49O_yt) zyN~7$Fn;ZU`Pf7lM-BvPKO7mVdD+#PpFXB}F&Ixjz&yOm6kXqxg__UYsrhxt!zW!x`J*iZfn>xE*F-`Y*p`h6obKlV!VMfWt{1mpYMHCn#I zV9jI8YX0_|j<-HNHP2H+^LleNe+=VV$v7=v3i3e3ecJwj9h$og)cgU=!(aB*_N@Gt zE)|7t(cIrh^8!wq?`xs?#8a9NXszw6wo&tvmo)!lFRNwnTcmkpl;*Z!nn#3ce)E*( zUJ$qE@@RRpH@aRC>oxygN%IbaHD3?w)_8cn%xtE%^GIzy;Xb%q^PH)g?|Y?rrG=VD z{?qonhyGFx<_~3uYyUKCs`-i;n)leF`3D$J@58yi8F0VP4)S&$*vFUz>sbrf=QKdO zuPvtiOy`jMLw(D_K1Lguzd6DF#y8lutLt?E{BSUv?vGX!0u&(sUr`x4&Ys~{--Qf>> z?ij7dYm?@Qt2A%!qItuvniqrhPUTBl-W}$jKa1;lF7Kv!L-?>(e<=6*Hf>LG7tQ_P zzS0%gXJ|cE>q+^f`M!p_UKwRIZ>z)K@C4@hy%y_o_riVNBA<0XE%Ze5M$k`B-O=*H zt#t+Ruh9HIuyYNp<5~^X^*z%>a~H@PCi}EKGY)C~ZHeY~(=`9MPV zX&$&z^RkaMU*fHK)CSFewASslzL@6sLC>;tT7Og654;HT=XJ1O^ftS;=imulZdg4n z|H;xs{=@5yT0VTa<{92v&wBXahc)!yF~_7i2CE{vTo<@sFeXID`JzOvzcKJ^Fdyi= zLEFG4EadUnTy}Enq;P6oM3JtZMv;@r!2ekdQn`=LW!hP8M@3g%CIvqbfYia%g z&d-c(tMwO$acv~bhp)o?^EvGEOuwh?bibtYL$`R%&5CJ$J3;Fo5BpJ;hqQdQYMM`h zJY(Uh&#U>F9lAfhxvcq`v6}D6sd<-B%`=W@dv?M7*`+aB{;0W*hkf64dtHb7Vvf(W zeBI%icdMoC={;Zbe6gCRPuJX~rY<+uMAvu0Z!MoIkCrdrK=TR@w4PokHSd2%^Fm&l zA9vE+q>bjg+iUK$Nplxir(Bt!<#%=0yg8i9O_{9aFTgq?ucemXTwU|&Hkv<&^MU>0 zd_r5;H?wP~^`D3Roa0_PP6C@~UTmf2ens`T^R2h$HT*PxHeTzW+(XyvCaiZ3!8~e6 zL){-QUevrU%(vUE(e`wQb!*x8x?bMhHMfF&unf3wk^ynGpuDbEyBj)hH?q?5jo{pf zEzC=uV4V8pq4hV1d^_NtwlfTPgDYCT!(q)Me`;P8?zei5(CuEYgXYVj9Y+Lf`No|z zp9JT5>D)P&DQ_M1J`+_IkDcxrZ0%a@y^%RT9@{c|1egEWKl4>Nw~_1)vy z+CS&v{#3uIx?MiFYCFq9-tMtm%a^XI{b1&#x%()s=MkJ|PT#8KCqLCZZ$4daj*6Q9 zxvKS;Y}VW?MDvYd+RqJP|KaUE-Hxw7&y~))+^CJ3f7zz%>)TMrbG1)ee#vdk8+FqB zV}|xaX*eH}cZZgr0sCDuA8WsDhx2>?!TkK_Xze$8-nI?ssSEw3UPoOoLk`W$!n$w7 zRh~Y_v<)+zfg0Jky?)(+CRqLOBR`WPGkI~yk$H}zWn&&>C`C!<${15t(FU-TQ{MGT<7}j?i z;oQjKpIT3?x7z-PV1JFPTHf)c&WEdP^gOehzn0H4O7p=}HTQ?S@f-HNOKsJD=-E{B z=e;!l5AJv89H-@D-)f#{ul@O!K_HLurS^J*}TxWjps)gQE-pJBc_E>!ogR&d^O zTC$e6g#4Kw*1!4vw4JS%YW@!9joU%q9@aIxDro&vVSoPJeqCRmy_$~!KQw~pkFKB8 zdOF5yetd}L%e^(}zF%xE%-kz3n1&TwQ{BspDNO|Mr&VM?Ey31oy9>7t!)5=9>S6bCT}Rzf2*& zJ@(dl%y*RL6N5GXJ6iKzjWr*6T-WRSKOJvTi#1=eRr6`E?q~~natQD$F51p3>oxDY zO!K>iHFxvX_ItL_yadEgOfN0(yFmA^&afVAS6J(@TB7xg9jN&~$OEJP>2+n9`dW|2 z1T+Ap)4b>u&G%2%ya4Qr zMo-c0eyFPED>iEVHG612rJCkPGPEBaoX~usyXKuAX`Z{9w!db$=EoB?5ALG-Zyz`x z@*3`=<%M%8`5S5dUtk zKPzkfmCI{>?YfRPn;6Z$nX}(Y(kw%_I71e!)VQ z>+n&_C-u^N?lR5yf&I0nYx$eGG=KarO*Z6Edo4e^uIAS#YTmMf_QPb@=UJ4h3Xel)AB3dYrX@X7ns#a$A42;H}yZP<&V%jJW$IogZr@W zA87lVnrl7Vn`u4{)-OHQYyIE1YQDlj>u+99^X`kZoqa)g5dvirL{dX zz|KG5pH^mC&#f?R|Bz9d*U78(c*6YfFU-4M_0f8K!4Hk#K4X%Zj*|}SwEk)Pb-f-I z(DJ9&YMx@L`LiIce^nzbpBke1v-X-N)zsWNhvt*=Y2JB|=6?A#FFQ%s>%eBsO>DHD z&doJGlHzgF`*a9(a0+#mb{=lX)0%4xFU9h_734%PC< zy6Anm2V*sF>8tsrNX-vC)!g%j=5tN-{if@_nmaGieEm_)-#pNKuC=~j7Sly@t8SW? z>Z5sLC(YAAf48Ap{&%qEu}d_c8lw5+J(@2VtNFl5n&%GC{9#+ot!ijq$x8EcFLZl7 zhv#BGAJg(5&uN};Q}el}G~u#`Dw@lRX1t*+-EcoxuyB@7n+~3 z%pn`zr@ZD{JTY7g}q51Iqninjrc}Ms__>DyE&%&2A z-?mxv1Za2jhFU%#yXN=r=s0{8rg=uN<`w&C9_^(0>My$A4T65U9iCI(3(s3cf0f~B z_;5k<>~JpbBD`Oynyc0`v4-Z?ifis^rum&zJ&(1zthw6;&HKar`SL_9Uv!-2pC)K- z@}K5+VO~8XNy}gPt9gY&+CTnqKIc_eEq`>H=6<_1uL9@ByB5-Md%K(FXW;(+Ot`<_ zbeGmM|Apr7;lqB13+aCMt*Pc~p#K`?Y5BhkHTRyP`Sl5!yA9CXxr64@b8EgSM*FAo z9?ie3(!3+IS4dthfAY1CpBmRR{~D(GnIW2&FQ)k=xc_(s`WL+)?8p<{?>fRcC>yws z+15ha*&N>c_x*}4w=cZcbPnXnUio#oEq-YIZn?GmOwj-Rx7K3^?Xu&!mVXHC;_apF zv4rQ*oa<_N$9|e04$%BoW6k5OG_UYZ*UM*{=2Mnv{tNbJ(&4_?-f+E-GzOkKbNAEo z=YHyaEe|+1GHkwh(1*9s5J-8PZep>>IvI`EwSU+rQHf zxa2MQFU`YUHDC4my|m|~rIxS1Ps`_Bt@+WNnr{r$Jm8Dwb78id*0Ryp@{j~{w60i&wpO) zIoem3yKI`ab5?0xuh$hz$a;mRYI)~tTK||bg{7V?4GKu!z&o$x4=d`4UEvmb9kG3w z9>)jA>T$~7Nsl{CF6;54HH;SpcIy1!D^l}fIW)IFqx1isbe-oH9MO5;Ko^})#yjeK zWpO=8`oF|R&A-ijC*_B)*ZJ-5I&EiEFoT&5I#B)0D z+2zyrTwb8_=jy+@UUA#C{Duiyf5KdCXT^>>-zMwyU>M(6?;rLpm{Ydnxbd1l>8JNg zzsKo3e+HiS?B}TGt4}BB`pzhz+x^sc-Ci39YCUybb-5#Mr%OMa-mUY@<`Sk-{^CEK zug2ESE#=Sk$|L!PaLp$U*1TQ`&7*8I_w22Csh)cLeUw`-EM1)R0)BjejjUIjezuaA z-BnO>->P~XY_(U*-)XJ&_v)nWaVntgpL$u3N5ew2-`rnXNc$i6(+?nBcG7V&r z?R=*D;|>qqA1^o3al31lUe_0|qw~q8DY_qx+@;5_<_0~_?3}9Su_w;y@#6V(Jx)1y z(0tE#&D)nvk?pc0Oxv@N~jVhXtudaDgMa?VQXx=GR``Pid=0%okzIm1A zPhvD*-&EU^2!6KOt=lDLna-QhOY00pV~kFYG~eQhxY%mj+!^gp?T~5x_!45)qJ|E?(gfr==`v{hMs5EFQCV@ z@Ev+wTVt;GKacd)`EUiS`|jP;d456#JucMFt;dlv1NFGG##QswVVYNn(!70nUGAT` znn$H-Udl_?tK==sdra2;N$}I-TE&fe{Ibul=lN-8bbEzv(&N{t4SM`qwn^_B_$<(I zm3y#`!wvBMkdMoBoY#D;`$ZWu-A_F#=>8sFSLX*eFP%@y4b}Ol^$b8`N%NMeXDC;f4E$V2#@`v89h)veKnXT3{ zu7l>4$7}v;spf8zH7{RI^VE6T&bDyQcI-8sPd?t)^XE~zSi@Ooov+p|)%zPE2F;s~ z*ZFV|?DMZ~p~u;s+jPEN`dN>^*9K|sm0$C6-*le0FQMfREz>-IYi;L_%DP_H8*2Zg z577P`59h3wZq@C(0nRyJ->K(CKjEBt(Rw;iiu}|3=V9G{XAIDJz`nfB8_mCKzA;Yc z+tAB8KUd$a^SNQJ&i_Fj^>}eEUh^0`J?ZO`LN+WycmUEh;yw0|0J z*8W^@UAN1zlA6z*sM~kRdmRry;N0(=Ejqu|f#(il;GF-h$vW>jKhyo9VL#2=6wy56 zlg@|3;C(f};k`Fkb+t-%4u&f& zwLd?v&^$Q1ZpZp??swG{EpJ*zZ<}R}|Uk1;cZ0xM%cmB}!JYJyr0XVnpl%oAJ z<)Y>x4>hl2t;?+d?`y4|tmTKnxzP6T9h~#$u%hS@YYIbboP%_qm;b_uYM;rsruJa%=t=-XHRI zqn-!G!#TsgOSF6ec&@q5T`hkDo*$2O(Dv`^s(GPc&ErmL{utg1H0QOJFZ4_Ef$&{d z&p%pz`Af}%fDb9H$GcO*HP5?C^FlB#r`FMNICiY&kAgLCG(+<*{+e%b(A@rxw!e&z z=A&|IZjrA2Tsp6o@0UaKZWpzl%N;d8azV$rMGMWBh3IuzoRj9EDSCZ3@S)~+t+bwo zpuc@JE&s_@^U*7Gxt2+KeVWfj^ZM8H`nS$7&8M1bel@4&dz1D3-xqZ?Z*yGl$F8rc zc~FGj*Y$$)y{(Sx`BTA6HcKJvH>cbner7AA60j<_-Jl{qVmP(s8wXgpR}L zY&yv`R;8*J41Bp^WNz31?}Nhmzm+`>-plU%-~_h(9)=a=#GA-#a)Tgw-c z{KSsJlE2-lx#Kmh=S_s(AZV7opw!>~h>heYpIJ+uGhE9LU#;s~?w_sHvuTL7v;HPs zFOv(}52Y_?`P`AZ+|uK9y_&bqEA1@QT<@oC+@RMx|C&fO2HQM(zVRbikG}&#e@R70 zH|u`!8^*h%NA)<^aJlAf8|nU7ub%F|c=30!&SQT=J2)p=|H+%HatbD?W{==S>7Qs=8SB{kpvO1JNb&bqyvJaxOoAJXk&@k!S= z*;LCrx7G6vvnU-Wx$bH|1YFelIT7B&7Bg4R|4+elqs71I`TzIJdY=5ZrS5l||7rhQ z`DycO{gYvv^agR01U=q$vDNn%f}%9< zR9xSu$k|$R>#Lf#4$$N5mMNC9!uf2hB(DV@-g_CS^MAxAJ+8gmp~p4LtD1YcYHn-L z`Wsf$^N0OKb-k|U(|)i`)9qqup~tUlOZ9!9Ju`KjgznM%gn6Fnad7Pe9fxn=JF`9i zlg(%d$)@{tKRcaI0*mPUlTbzX(|Pb*jDNBozYZqpaU}O%%~LG3o|15$*{YJx!!PFP zJY3G~$!(RryyfX+)zuV{Yxk>`3ulpZ(l7Sue4LGy$X zn!CffwMd<=432Aby>?d9`|vUQG`FzP`~UyJeW?A%wR|^cotOST*8B?G2l)o)l;WLr zUY&DRkF(=lblz@%PLGeKW;*|GH__{toxzeo&wE6uAe(B=M~t;g$Ly|w*;b##3T zRM+EF4R`G~heg`Yw?F9)W8FTc`2lz z&Tr#B=)4+dqw{>kIz3*jU!%vDKwHfZe$eAoHghfC#ZB{u3pLMsPxB(hwEgCTG!Kc< z{II7UAH(gn-)7|1eje(g$EhLP^f>jpq8^XRUe)dX$3>4j%i+6ArB>^B^MLnI<$&{n z0cJXX2Ep@R&EY*x<>B1U@Nv2yZE33e-PT6BpVsZH`}NXJIzO0|)A{7=1Adt` z3C$DkYd!6{YhLe$wli-l%`Lv@`i_CTw;B8}J)gG6<%8yyA9Q_JJka?(ZnMt+;g$4w zQM;|?sSPx@O40fq7iylzQu9fRwf*BuXnyCc_Jh?x%?JO{{;afI^VB?=cj&L6Af0Do;5ksQP@Tu}rRe!~eIL!||I~T%(i+WQ!ujC~ z?{pqMwodbYZ8Z-v)!gra9f9i5QXK4Nap5xftNY}T=YVButgXSiIx_#Rf(tObw9VanUH6P}#`JIZI zkA(ftQ*fT}KX{&^FuWhWaS0v&r#|cca^$z>J>k8(HEL@8`G;w~|FGu47TQ1eD`{>8 z?>$}v?<=;4bA2VMYI_Q=(tf!4SC21loivYltn<~ak(zfdqxn3o-f$7lY2UQfdTJKc z{J!p925;CG3cIHFTkfsU+{H`t0r0$P+HXDn?)|Iz-5OfI8`$$gZ>t+RhiLz7>Y*Fp zU11$3m!dT<3Gcfeyob5x|W(BJE#45E?wsVzjm4@oYC!@*k1FaPjvj8X`=ari#iV957vCZ zdmaBy9-3R6(f#N-e3xq45k0^C?5z2m!+O3KHB9rTT{RD`skw={<{mKr^h?z9(wS|w z9zU3$zqzmFt-5JH#KHVFb+Y!q#WBtI&)0m}AMXX?Xu<&I|8dj9s%JOI9z zv77`>w9=Uf+%Io;{~fy|247m*!!G_5Sdk0KK35zNh9Zd^Mju zMRSizn#bPP`{C2`XnDgTE#IxU-nT#fRNtrmTSfEvul4=z^s<_Fwf`sw+R>#npWIpV z)eANM&rS0i12xZeT-*7yrLONv2hGnoYhI+G=7|}ax0$HVWnI{%Ft`=-v) z@vu8W$Im=?PxXCk-CwRX(EYT8R(K zgZk)s@4yjyf5!ixzE8T-R4@u65BOli5_?_Wk{NnIe*BB(joNBGef@O11Qyo^8gh2l_XTXS z>Gf2PE;_EJhv{{MldGNwZfm6HWBrzD?g00fgW>xK=1+CGSITJqu)Ln99qz9CHM}Vhvp_XG%pPA+iyNv+xh*R&Ob|s>O526k@nBf6Pmxwul1OZ z()lp4n)ciL3A(v>B`pymm~HFuq< z`G@YB_k;IWR~w?+H^M{5!=;xxu0E#eeZ}ZVy&sr!gdTq{m(u;nwT#XuH)3=?srE+a zx4_MspM~dPkFL@B-!ImApmRTMXLK%|CzFCScZ<{f%rVV}6wo}agSMycI&J@>2wmTU za2`0UwD#xsB%MFE*=YIOy*0lG&taux*LM2BzRjLlTK;-F&C{N1dyY-hJjO}$(uvv+ zkKz56Z&I{;clcgFu#dLivZrp}d&6}+_yy?r+0a(^$0?6AkG0qH)mKe4FW{^BP}t9} zF;nLaHyCF-z`8P|o4#){1@7;7MC&|RCQ|45xC(k*=3G;cBdrc-o@15fQ%p5qQCgRK zsGc6DCc}E_&|E!^95&T_$vy3#AUKcb{94OLKh^xxPR;i;(0uWDJ$}`htmi)`n&@$D z#}hrSwOp*{Z~k@kcxNaqr!$6|Haec8VI4X$Qun)SEj6E(P4fp4y1(1?(|krw&3A0p z`NYau^Z3g;FU{VdxzlFNt0rikT3wf09NrIn+fmo+?iS4>A8Q_$thwVE&DZ#7p7283 zf5S=h_j9!$Hk)WZ_n;mx>K@g+d10-m6MTPga4lW0#$RAd&ilg^W#ZaS})ov!8oo22zGZKCzK2q0fTV>5>*V6t;xvu@()LD<$Z!YU`v5qxyx(cmbUlxn^h@`S+H={G@pU;H@8O`H&-;PcE%_twy?CLSetx4&Jwx*j4K()Lxf6 zYp9-AlrhosldfE}Pryad2&RoySTY(A=@2 z9ycrdY98sY`Q9O#w+PVu-D1rx_h~*gMDqoEG|vnAQ>?XoYG>`A%4f8nojYsZ_?~XB zsjW1BdRw>qx9yrwouv8GFFLNS+i4zJS;uX+BD!CEI-~PaT5Fxh>cr_hKQl^?BX!~Y z+v@dt-h1l0=4qp}{vutqJt<}NxO4f6=KCh=`i3WJ{^pD3J9YRNLj1L#9nNVE$CeH0 zt#qC&9HIH*Cc52CCTU)wr{)V+df2Vl`$mg|6>iDk!_OzX@ z^`EGv`La*i&)27DzWSMN-wb!n!$0e|I=M#kZH+a*`b5Whk#(AHnWg#QZkoRX{&I?z zueVrp#}}HX2I_i!chY_vzDM)TuQeZ{kIxu-I_h>Ds&7{sM#KJ3gKpaXvyXLsoyKdv zJg??4a6aLgyUvG`XK8M|61bb@E^uGi0`{FQ_t$xQ5}YrM4AA=$5z%@dW0Sk)tuE+& z`+^lUZ%|ot2S?2_;JvA3$LM|jDn~W<{;K)!jhdIvueoz+&9}yC{s+#BT7J^^Znd31EDEO&DyyUZ5<;qW~BmaBTdqIx;K|ByeM-e>4vTgRavoPYa%O|Pe_ zZPUC@L(O9v>G?T)7T(Z3x9)cyaL%FRZr!iHKht^OOApOw)zaJn=Dp94Xn8+459|WZ zi}@eX_D5XPyd|7p@_erIq4!IjKhsC+JpAdo9v8ms*W=5iPkNkceM0l5HMAZ_TU~Ar zJ3St~aMSkZS+DDBzEk@r;GX8bo|;dFbMq6&y9|PbNGcKbbd(RD$};%^l_bk%H`1c zaN`J_KbOOI8(&82{JeXX9>+_>X?`V}9`9ZlG+!U7^(1!G{9O~x`%cq*z!A+O;eA<& z+qIpud+71H+at~In(6UzX(`RO6wo|7eDAW1gD&^N1Z}?=wBzX>y4~M&(Btw7UmaI9 z19cp>-LA*epYR?4Q~3UutE<+tyT0aOzM9vE`*dD#{wfcg_Zyc}>%Y8J_tQ=GnvV$3 z{XOKo&JP#heAk3tdj3E1pw3s$B{aW3Q|H4{@cc!Xx6Z2vQ*<8o8>9J#G(FyhuGPF= zH_a4*>w93hIw5vcyF77t&Y#oo;uEx$LszQHBk4jXE2}t^Wt>Ao@j0g@1e@>sPpa237Q{!t$71CozL?JYyS1N=I^rU@uGQM&0E0tD|5hm zX?l8SJul(@^{Wk9K4Yoo^QUNjcaY{qT4-)#q50x{+HYRnHBT$9`RX{`j)zui?%qc8 zj__Wub)~huzqRI#vS~glRmbz7G|itSY5pAE`<-iymfsBLbLPT(abuc6e~;98V_GrI zKTXy7XX726uYzl9o-JDEJrgg@Q{X#9RTA|${^g;1a+JvFZa=Y*?=>V3#VuR>T zuWJ@Q&~deNqRzL$@V>`BWpw_TdQs<-=F2tD2j>r8C208*`JvoGnp+moyr`+>jZ10% zroZN&_Gq4~zaAG}4bpz@UPZS{w*{Ktf$=@xbS?j-s^*D{wLJkFwEgX4b$#hPPt(a- zzCFBO{q-#^zu>gCr}}bj|BpACS30Ws*%q1)*{{ppvrOB$y{?X1@76m1uhh+AFfF6y zkN9dnS#KX2%Iw$nREKkkW)T0@j=H|#qcpe8rTum^QS;`|UNuVSJXU0q9!K_%()n;Q zJa0JeftLRa&)@AjqvaPyXuboUvzrI+Tb^-P>+uTHJeQ~Dl&r-Cr7?)&1^Sx}Nto8Lj!J zT$(Tcr{|3gn`-$Nmo#6nR@?b$maf-9IHziQPWx?RPVMJoc{TSgqWR0>ny171%cr`Q zPw1`rx+$99o~U{0W|}XE*M3+E`=bBgK83rL_W#YXy1ni<(|mAQ&AqE@e#}MlID5^f z?$L2I8lJClG}H3Of^|FxHr9OU3%#D|3G2b%@mjvhE6t-{YyQMa+tZ|m=IdK){$-iw z7e8z6H%R;Kntt5S@b{r^uRbGmTp6M?H!G;)*#qXcIi_j(QN1l`%C1NR@t?$zy5f1>8o3Tpm#x{j-hZ}dKc!vM|C#p?SAe;R7O?5^Ht zj@+a9pktbsgXhF&bk*|aRW$Ept9k3QdY`2|+8T=Q0|bo_X1)O?kz=DpWyUT2KvIfiQPoKyFgm&djIf(x3@ zGw6QmP*d|ZzM7wWuk%B-)jFT-Dxvez8aT)0e@o}d%T9Xy_3_c;`;@wRUNNnro}a|S z{hC)j^g4I=P`zHZhv#8?&(iDt&#rpkIIXbWmyW-p<)h%ec}w9v505Oh{@W|Ge&@DY z{>m54Q~mWmd|YL{pWoP3^RC%7pKGc4Cr@4OnHJj4v~XSDODA=EMef!6Fc&`S{g$2O zHD9+&$Isktnm=i;xwpOMNv$>a$f5bg9Xie*SJ38yRZ3Z3+4$>qN*_y|4?8{9`7@-Z z=0UIYd~(`w%`3tC2D4@8Jnx>Qd55W*uR5W}kv5O?xHF-t=KW{t@vGKYJ)V9H)#GM7 z%m+TeIJ^C~)-wUV3tY=e+nJiAxp|PT?}L|`kMz<0ypTuxKXr!YCGKl}e};||+gUo^ zI`7i!rlp}eoioa`wdVJx>hWdhPt9vN>+vxtK=TEWn%7U) zykBEIUcZ>Gx&1ZGN5lPk&%Sz|uo>j@A*~J+#KE~Qxo1}IlZFJw>>R1Z=bC5cF0N17tYbVXd}%} z!uN<<&er2dw}P5CfPG8zVS1eU+Ew#Gu+O$@pq4ie(fs^V&D%I?`|GvSyd^wudt!=~ zAL6a~TF`%>nwEb6&n4}$((-Wz%`5%Xez5qVd6mDKFG|;ZxPvaYY!l79jL_UFOmo+C z&0E9%@MU=JU=TcqSgoP%*ZJXnCfSp8-Y9ui=b7EpbzWLqT<5W>TQm=Z^;-B~ohPTC z(EJ;m%Y6rVxY-?@pI_G1`P>xF7Y$3*^0(mp_P}L&9O-#i^94Eec;p7>F@E&d^0}sI zervks@xwIt@zuOsTg?yG)I4`J%`Z04d_Y&tZB}XiFuNZ2{os2XyN>JmgL_XspZQZp z?-%u$sh>mN++ROe9v`FmkCmD`?9=*-cGdP=4b=Nr2kL9yq?qQmz#Glf@)fPLJ=Kb9 zp3hI~Y3-!_Uj^Qu@GVuh`!x7IOPg5T@6OiLe9&Xv-~SEKeCk)7XB@j}9&$kEw|sEF z-m|yPt3fe3KdOW^&tt@`RXdEX z-x_QFr-bHB;CYHAoArDk|7gwq+G{@Wr>?JIhURr1Xuqwmq51cl+W#lIYCgtN^C9^) zxA>*w;W>-c%b7vV5a8Ns%RcvQS*2o&C}tWu=i3e-vyq7h@7G2zx367 zpo`{B>uCNB@<4a+Tj@O7&zqZS-n@?Hb-rnPnt~r}Y_z=lTAkl&HP!qCJdbk-&J)gr z^No{-={)Zkuk&+85zT`<^?YX6JiT6ad#=~rCW|zmJ5KXn;hIM#Xg)Ma^K6#dPAfaj zC#GpV72arG49?S@HE8{H>uA2$PxBHRG!K5Md5WEGuY?AgS0APMlQ_-m7SnOE*H81& z^EKZ*Tl1%Znx~Z0JOk$8qlakw$H05V-KuE$QAISj&CveO_D1ss(VBmN=YQM4`*ok> z(sAgqMDH^vz2*y??tJ z&PA`AruUim-_-ZPZR%;h;DEmWUbCa-_9yjy{OmvUd4QK&G~XSld7jpqyT|Br5!&1;v|yk$MjM>f;^>^#kPbl3L#Z`XX}0?n^X(fpmG z=3B>Tdn)eG=Ut~K>w^VWQ#3cvuX&^1`n+*xgXWI8HSe2K^R{n4%7L&=g61A2wI1{S znpd2vxz`fS<6<=TEU5is=c)O{Ntzd0t@#W%7yV?pZr`~pbv!hNxGFtf_tO#Abbl}8 zs`F0{cn|!TfjWQMmezT@>vuiwGz`-7lQHLIm>3*R>2*Pw9(q0E_g?eLmGpY&T070> zglYZ<)?b(M>h<`R+g}ZSZC7{? zb2E7Ft|y!WS@TQJhtqTEaUrUf=Be<#^ z`FykfdfXiMQP10l$7|j!pVo76x#rItv^{^}yB_P(wR~}F?T0?Mw0w9M&3B#DcHT18 zyysx;hkM`j{KVm`=E*c-=eJ&s^*n9c70n$Q>b&}L zo#r3oH6IMmvlyo9JpcUvqwBu^a(d%9j^C8ZCK=f?WEP6dtjw~dgk-N!W_BsrdleaF z?-kjRLfM(=TPizbWR<@E!0Y|%^YOVq=Q`Ip_Zipuoa_8y&soXmmp#S!e6(*J`{Uw# zUP~X#K5RGpoQv#5&afwnx|(CY9Dl4idt83@=i<8w39;M{D^9V8UuDlHo>vae<@mTt z+|Dg^*gadYC)Z;47T@FUAllPF)TU3pp|IC8yY2rR*uc+f{ zDZZZ@zk~lTJG1!zmCu3QV-)|dQ^ow)^~7_i-HrLU^kFj}$A;Er&wq=LhbxD%fBMeH z)hCPDCyMziJpK53?`sAh&!fAs54p$Zg$4cCD;u*{f6V6{&l~LR9MDjQM=ej9AXcNWIuSD{r)R<^BnfGCcIq^nzEn#&Us2Cu-^=0-|ou3 ztU9~vXTEMZaEJZOP4?$6*@G+ba{WEo$6RCoZN>fecLjT03;utd70g4;_-)|kL;&P@VJCuILC)Mu@4mWIYY&KeMKC3 zxw+y!`t@QwB+-$_G4>x|?=gx!`~#1BRG-a$=o62J{O-lxt}y!-@m`pDQ;t6*@(dO8 z-zJIiuF;LT|CfE|?Hh5C-AK&S*gTWtEyVujWy0;5c9-+qUC*98iQQ%{d#D)qa~{X- zIp@LK<=_zBPkzcU!Ed^L3-|Lp}~~^<+O=k-bMMALsqnv1f~UCYu>^ zd`VI7k^Y>|JNrMe->A;{w|8Sdu$cY*LiWl*>^F9^PfKR+Gl=`S=qvU&TX_3g4&?Lc zwO{O=YV&>-V8uR1d|%*^m``KG0$%Rss_b6k`7wi-5Ayns>BYY34R6Q(qu3i>;QgVHsN)?nnfJGwN<vT*yA!h5c%O_EBOU z<|^WS(o#n_Pe&1dcqYfs>&osZzF%fiisLJbc{WCg_qM`jah|1{*cXfUYo5>J_&)vE zEzH>mKj-7>kTCW$e(VD~v1eCjpZJc?ze5kR_ny!GumyXj5&MRVe0?(1m%Tz=cFzlZ zKVHR!J@_%-@5hLFV%M8+eC-$>Px$XJ`-2*!rn4s=U@v@y-Br}7wn^mp zY|(E4qE2{DJ?{UGo!L`8*uRPK(qLbXU*DCzS#9<^W_y`9G`iTJyv|DxMw?#uW!wMy*qo-2=>~R z?B7!OIeSnH`>9#%<6E*P{@{9m>}l+cO0vf%a2-Mud-jsiT(>!91AE>HMIU2%yf z>@k12zBEzHtDHZK;}<%y-}YoLcYyuXcJ>}u*w2>X^{U&I{rOXNGY{_1@qX+#pRzY> z&D+<;hrQi)_D09qTjjDp+RXdmoua&-PnpJEU?~6Z`b^>D>Ui;e_BOVB9(li?J>MJl zR`z@z9BjpIbAj_53}7!YkKIemPk8hn$6xf}_BeFo>x6n;`TBG09rl%C9Itc_z8?0N zz}|Kod(1%g2EEvg#CJxFyYYQN72a(PyVLpprEC?x&y8uz_r*~*e1Balf&E7rzJD(> zjs1N9`%*jhPKDS_O0u`B#Xe{_yNCGReer=j?opy5kK4!XU~iJeo+iHAzPv6!FZg$x z^OPINe&+(WKd2r1j|}dgRtwo{3}*l5AzakA%)id@>&5uez*LSOaDsii_^y3;2Jg?G zhOvM6!2g#|+u3J}`6%Xia{M75_AmR{_k3qRZqDuhmc#KTN7z%VvL6oSS@Q^?cl$T$erX2_ILFtY`l%z7KBQpW}n-vG)?scbbWD62~HZK5|>Z=e2VM z*t4hc`EjKgySbQ8(h$h!-+hzWUr%H|DbD*7mT>&Cwe0sqo+?8){x`c4a~87O zK4hP2&BvJ}Q4jgwM~=^H!^gdx0QP=j9)^@Oj(6hIh{3xiALna0vG*Lu9=419Z4$em zC7+M1#Pb64WgMS+h5f3SPt5lV$2Wh+UPIL1W<22dPgmKkF0qG4v$wg=p7WW#jF{JS zS_{5TSTu%x;41cg=h@plXTSY{y=rmZ5eJESgYsg>tv#6Y>&YJJ&c35DdyBH{-^6>w?l*Y5go*e29*gf~@0`GSdi7&p*@L~4J^T3z z?5DGM{|}F44;0TUmk;CkC>!=W#n@l)>DSOJlaG6^-m*s}v$uK9o|V8p^CtVG3+&lZ z?8dR|Hc!}}w&eaQJ(WF2%y;Kfh{pje#e8}plR3Wq9`;4I*jwe}af}K> z*lUKdKNs~>o02)cuK2FX&2Jpv=rjAWr|cf0t|@;A$9LGo-c`IWxoQN*=ZWvppJ>PN z`JCA;TCw*N-%U#{&ha^7`vyGc{o&nScDL#5Ki$|H%w%7;l>OFb_Owgvqhi?SoMm4n z+J9NRSL^ka|G%c!*-so~KNQYB(D1_!T?Y ze}=J7jAV}&_v2F&IX>VGdtcFS_bPIK7B0))OVlymug>v-V%(rvLynJa!=Bfay>eIf zo;}%bwPW8S?jsg7;`qQ;?2E>;_Yw8&Lq&aQrl{xKu!Zv<7xzu=)^PmHDePl=v#Yw$ zMs=R)FWreft~0y0sMl@l&GCN2*;fr^ z59-T)QS6_|;{P(nn)4Wm`{LC1d^~CNAN#25?AQ0OADYkJ(3jod!`{9f`*Az=8(rD& zwP9b{fPF=I_Qs{ztMlu3hA(+M4!oZ)4-G{{eAmyMC*TKrg>?4tr|jkz*t52JI<3^ zn>|#_+ng@mzxycWXSNUF=OeFXvmcnq{;MDRnE~vlJlQi{*tfJ{x2?`Tpd@=jA@-er z_<7T4F)#Y(+Z;b6g1z}%_WrKylSMswN+XVs5YOX2KIP|niPzZO_p#qz$$r9@-M1He zP$%|LcI?{>>@{BV^Ux+@{^xn(xp0}woM*UrUfgpS$FKBa&*;iNye|8#s_d7{ zUb`C~_=2GDP4=xJ?9pr4t){bk_hR=H^Jcd#!SS)FTu1uoD*OFq?1x;~w>DxA{J?ds z2Y0iZtY)v~&Hkw~`$m7f8h>}-}-?)-I>pif48&08^J!zj{UFr4#H7C zZci;yr_|yiZ{M?`ZY^RX$J>hc0k33nyyJLo=a^Xbs1n={R!!Kab!TrQ+(LYxdUJKo zbF3`;NRhux7{}jFX7?S<*N2Vk@O8N9HTI(e`TlW&c+R`K2H)4;3}jE3&;DT$d$1Vy zuy4lk&h6PN)nTt8#uW|qIDU&5=NT>LH=Zow$BXCSuf+J?jQZT34&qPfA%}ggB|raqQj$IV2j}T`f&Fk0yK`6eY9-h$#Pj{@ zkGP+0#CJs<#QY?#mpM;mF)z*IOC0}E>?h+y9ff@t&NI6{``se!`OMf$i@KEl4LH7} z7kjVu?9=1fcW1FDn(+1wHDix?%Xto6V;{eoeU`EI>E=`pqcFJtFh-7^K`|C@z1&9y}TSpzTQ||f&FX=_Gecj7qN&WrOj7Vphf-N*6y#B;Q5k2!wkbM`ypdEd}Xj$iyA z`~8>fZui;izGj~z^5+xJ8Aplu{kfb!t|Ffw_lxJVYnyX?sow01mav}?_i?vUIetbJ zzD{`H&K@V~JsjgWzS(c~^y+-QR8w3}zF*Gq?g!bAi|hHy*&Odti?1i=v}gY-zQ;Xk zGRH3w?|nSm$nmE{{a)%#j$fS2KIT394RL?>M|^kNS=0~Ttj_m+*%jFjlw~hcncb!W z`?xafhfLWgn6cM4X5U?a{is;4*P_m|Tzk&r-=BSyANvkbH@oH($FECdzaqZ#^)Zv< zr;7K}H~r%H=)znGVpD+qQ!)0~JkGyH%nw=SKaTeib?FPDIo`07eeo*x`{MgJJBDz4 zZ723Kwb%=pv)B5>|7-IE_DC__V!wssGgq<)Ol4o%o&A;#`;>z0rsDmwrMLLFJxPqi zG(5xc-?y;d9Esn(M? zzKnQ($Du99f3#w^vt-XOX0MjZ*A;s|u=_q^zn#cFUtG`R-r)G*;yppbb&fZUVQ+Yi z{f&4ZdGJM!-z44_P8NCI-r_vx?z0cN$zJXuyGsK5W05B{p5v>E_P-L_>x|f574C8V zCn@Z?sqCZQv-f<--c|I^j5{2^_%gfmDfU9!*ezGEpPj{CY83mO?(D9jj(3x&+c!7m zJfa-Q5G|ftoq5goHQ&DVd!TsFcbRyf;tzjL z+^}8rTXC^mC*gm@^SkaZxcz;_dn>i?bG*eJ_K0ijC2zA=yTIOE_=uAn|6~{Y=`i*P z@%(i9LXNLLg*{>r`@&xACGFWSS7RSuj(r|qei{P4@VLkK6!s+v?4vKT4?D(wNIXZl zF6yPn1#_M!^VrMHW}h&gJxh$U4HxqVMs?skxlP%=F# zU?0DoeVsph>&fg@oZ0_$X1A=#KDiA0C-I%uge)F^-X_MS*WKax!k5`U9b|vAfxT(~ z`*I)lYQx$0yRp~p&t6p25v4nDe05O=wY~<&pQ^@wUd)@6nvdgMb8_&&^z=2m-y3%O z7woz5>^0)p%Zd4;oJF1CuJxR!$6R)&aqLA0vu8T8UundiRffICd#YfV zwy}3x$nH0oy^HwHX1SgmU)GU*S!;IpChVVu&uzi+{lxrc#jH5~W^MKfV!4hs9N(`x zd!Z8S2mkSd|Fya7Wq-1VWU${6^Y48W_4f6baUMT!_83ub-@6&dKPbuW{*LRD2VP)L z*~8vf)H(m$$nnM-*#C%n{+LA^e{wo|iwW#ohOjqwV{g}qeN{d72c_7p3bVJV%3i+( zdoy?T1o2&iDAAuz`#8_$c=pDx**E5}kFL!7+euq?&z9`vJF?rlvHx4a9&(Aji1`0{ zmg3_^hZtO=yU3ZmD9DnyXdk<0XeM@|odE$SZXV6D>pAvi?Y}tf8+l#%KcwekQ z6vvMg*DWPW^YzaQNA@YAexvgij*mLazT*kI@jLdr75RF*O%L{Qf$STuvVSn;`<;K{ zdya*daD34#>~`Y);xhH|GSlGSojq~}d$Gmr^Tl&{&*vOJ#fZnpE{X39MvC|D?*?+7 zsFUnR#Q5hk@x8zKjd^^&m6)$@_ymqO4P>9XhTZNE`z%qf`y_?q4~lw#jiRnNPdv{G z?q!4<@`W$^Ofmmb(7k1m;?0v;^c?Z$XHRAbf3-Nr`N7N78%;tVJO=mCng8h9wdpEH^BwXS6 zielcUSg{{^tl&Ju7qJf!buwSOar}oS>~`hZf8=LhFaGa&qW(PNC?6l*A7Fp9k-d>P zj@6sZ@e@a|-|NF}EZ%2%Q;Xy86l1Udosa)H;(6%rGaR3`f!#xVw{eCW$M+EP*c_?K z@g9ZQ?LOmS*icM7cj$ADf4vj z;dqz%?ANCYU&dZ!Df@&S?5~co_c+gf^cH*A1NMPpo|e$>BEBH+CwI%SH)zUUr6>Ei zQS8?9*~@KYe{+!i(GB)pAJ~J6@Npx%3H!_;>}SP&<%)A0|4$r;Q_T2ye%_Y7lRNvn zAol&I*}Yz||Ej>}%{@KXU(aSYKf&(un0>OC2YaTNr@h4>zHZsDg1yvf_7ShxJ;e6{ zV#W1m@MylybXvn+KwNL{dBgEV3iEx+S#dwIvIoaEoW&l!j9tygJ3N--OFU%{7j?pQ zMcr?9MXvkpD85_g>B#XZVt(UuVt#42!JKF51okrC?3t6;N6%o-C;Zktj{h~A-FiOz z7LmtFEO)dI=P57dov!Q3@jp7VuWrtsT9ou#uwS^iF$j} zwH$v&{O{}sbG&&Q_Bu7#6Y{YqrSb7(xEKehw1eZP`LmB5#{Qx+`vfcYA*Sq$Gx+%I zDc;w1+Q;!5m$FZv!oEnHU#vQCd}uv(BMbK5|M)y;@tWOP)Y+bn;`sd$>|4bA7@^{R zy!~X(GjJIDUvZsKLCmAFLd@f8E#5mzFUre(ZeTycpB*-A6!XDuPvz^PLXX+q#P?99 z$8mg%OYC>fuwM}G-M`z-@%P32v}d<*{FsgG#W%AL5bqTRuH<;j?2ax52Ug0e#>qm{_pm}!$n=R={wFp;T!weEOuiNKSsEd zIF7}B;rs=KR}ppcmqop|cRJ_y5c^N8@WdF-Q~N4=m>75U5dW_xhd58bes)K3{B#oI zx?yWL&#(Y?v)SywhqLeL%l<>W_kFA($L}>~zsQ#%1~2h`{X8*mcJ^%^-#B%eJw(hK za6`Y6YBrBk{d>*ski@<} zp1t-J_Ne{rW5xUxF2NjM$&Woy%#ZzLFvl;D>@M*>I9UHJ`R$&hjznflBOyOR;aw&t4)s2M<`j zZ`m*0WAAs1{q7m|+2QOdTi8d7dhAn^IsWA!_KITO@8h-{|DY^;M`QM1Z@Hdrrl^a1 zFXqwh8_sz;uV=3_huv}{d!gR!eMOz~LGj(~6{ei$k@yaE)FZBYymE>?c^mtLCG2e{ zvDX8)o$@kf9uCUKL!oDVg-D5NRi%snJR>Wlt*E1ZK8oYrL>=|X{v3ay8~fny>{jjB>vm?3>%#6T^4}NjEGN9zaLzwt z1p9VxcDLE=;d9x|R*jsL9-xbB) z{4M+8e0-d=uEjp56MJ1x_8$T4_7UvWZm>_zW{FQ~xRu_mGpA2o z8T(TUygW24Y|7qe9DB$%_AD_@+rxy%lP8Jqlua7L@$OsM+ll!%etzS4lhS+xAJ>N6 zN6eE}br#2W3}wF{>K@I+ywh#cInUm2>`hA<;fC2#js2APZnAeDj=wCvn|ysb$7hJ= zT*;d_{@X5gr(^8BF0xM)^D>O`MKfxJdST>#PMB4J##?= z$L|r#b;{-CmJ;*Pz4^!Sk)n<|OL#5OZ>8UH{?5XOz2x{E_t~%AW-or0eT4Yl_skHE z4_U@uc@F#Rk?b3Xu!lIYhqYpFS)YAbW%lP5?8!##)&B5t=36Fveepf_+7CJ2G?u-V zs4wchpW~lyVDA#ZZXupiyLfVZQZM%5;(YP40ms)V%YLZ<`}{9_{^}&^z9vL-{D^(* zFW0b_oy#8O$?h-aDe|}F_+FweZnH7R&lU6ST)2y;J43Lj(_6ij<4=j_4u>ale7iyH z8``rUwPp{gz~0xC{qI-4t}8Fr?8vMVUJtE zzHt|O#!2=`;(21lRF1Frjr~bcKK|I%WS`WEecC|w*52&jMP14nQHSGjf%8;LWIvM4 zzPUJ`cYcWP(LZ(O_}mHXfx+xfd)QZq^Z43V9KSn1Uq6(q%x=<=J;H;1?tJ#!JJ{!n z?>D)N_XL|6`1&)zl0Dv@eVQwKk%{ar#PxjOc8(u^hP}Zp_PnR;A2Zp@iTko{#rVGO zTY2^@D|Sa)_G5PJ4vy?!g9 zk*||?hi{E{o>irUt_;`yS!=io4mJ#QP4f)^dCofA+JB*q2Xb-{8wWc>=rV2=;PA z*^NY9@u1EepW24KTx0fwHQ09u4-(IF?^|*n^D^wcOR*Og_0RoGIKI|j9#5Dg=C4jk zd0yJOKYoagE#_Pj{;rhD11i}BBMV%(;w80Xn7#)Zav@Nz%(Wna*d{c;QT z0}a?uRAwJ*$(|v`<^G8AOt&{Yju$Gv$7e0RU)lZ|=lOe?{iOIlV0akEw_44Fi!3*e?uWw-t5TGrMwp>Gtfs8nM?FzPd8U|18P=tuXtvpIle-GLyYT5_{K&>~7+_ zmRYAc{?~r?&zsp_tYd$_nEjFXzGwM~93MT5{YZcIQ(f3+wP9}~>ZYbQ;`pGt>_f%; z;qOFU`XWotV_uX!s{niHUtA~FE|WdqEB5;L*;n3Se|w(Y>@>TBsBgCk;rIt)o>K1s zjyD$db?1k1{0LDGKdBwZHx=`&MvM8$b45LT!Uw*wNqN9-dzt;k9(I=v?4A7BUB|Fn z^XA_0_4{BJ*wA2*FX zL*xmb$?>~pv2PM}&H=q6OPWG5v>?J?5-xTMON8)=KV<+-? z>f=`SlX2`Tzp)2b=j)B71K1-Mv0pyUo+_?m8x`g2xOo#q*lh?Kr-Icph{|%o9Fs0q423j(w-7Z@(nI4?E!j z=V|_u{rzY5jd|>DMT~GqsaJ))g*AJfmh2rmu&)wz2t_?O-fIN=UGdzrruZ)KiTRvo zs&IptM|z)_FMVVn=ik4AJ!3WdGx5FSa;rE#b1l2Ah!0!N@xw)XT*Z0~58yma{n)qq zuxEE`0)J(`^U5FzNgrSMzHtX$sR4{Gw&znRa-8O!%Mw6f7WRB>iyY&bZ1{F zzAIf!)VD9G%6X26`hm`Qe7?&Tb?@EMI6l9qhyNg@BG;t z`mm22!QQ}weQs~|-A?QUMLob2@g3o6bvciJWp*?1T)v~I=Xc@TGD9En-1c88p2iIk z;`yoLeU7)f#_oTP{Xa1;S>wGN-)JYh)du#@E7(I8vIos)_n5(cQ9LKzD4vJLkK{b5 zqu93(W49a5Uc{4qj>z*|#3y@jo=`7#gLuxnZal~Pi2gC2#_`d9>~jOzO;@tpiT$L` zZjRqC_O}}+IX+bE&!Ja2{#h*hA5ouB^%cjr7j+|T`1ajUJzqXd^v#03QziB__1TR& zuzPf2w-@g{^&HFb>%{z@7Z-DUVhDTfgY4zbvENEyKlz9~DvNzqHv1cMKEH1-!yeO+ z-BHvZZtBeOFI?Fhi1+no`Ek7YLiTIoezs;9$GscL3-=fI;|uR``(2)~hluO#JmKx0a~{J}_GFP~^dpX+DBeFUnZWUBqJI|0aJ*ME z`(yDQMAMTTpK^@-$ZqzoV*j)h-*KBF?l0<= zUBrE~>jRE&AlygHW1K6zsJOq_`;eDwA?5)naGT?Ai*bO3=Q%#}G<%~{>_&&!mx}q5 zCr5C6A@Q6mQQQv(i@NJo>o|XtP3*ZQNm<@mff_6_IQ?~3`Tqa!%} zpQx8kTf^}ti`ZX_=h3MnIDVZwdt(>&lWo{nG-1D9jr~)3_9G?Omxy@`Hi$avv0}c3 zZK?d+Kkx~A{yXgd#P`9Qo#XgU$JyO>vA5mMequfQ{3Yyvma^}h$Npv(ds$!hR^!=E zPGUdm$$oe^d+A~9$NRHabYnm4!v06plNaj3@uNDi`*ddC;K<&%1ADL?dxkyxV^ObO zO}Kvz&NHO~`)%RJ%5eM%3-(c>9{xiCj;~#ey{s|&{(pQySx9_WG+NAWnJd0iS@{*` zFD<@LIz-gxPZ!_KG!@@7wY|HmoyDejH zH=F&Ra9=SmegBc1r|BSeGiUZ_NA`p!?1yTz+mvSSW6J*SCqDpK@P@rv68k(cUw!Na zjxT(I{qPR`9B+yR2t_aFD%79DCkt_Blp8 zJ|9(`eVv%!#=)KAeS}wC#PM-+*=vZpi(A`_aK&uIcawXD@;qQ?(>YJPnD4q{WzJ*Q zm%Z&I_K+y{{%_f<%x7PCliNR5)XA?~&+#|KympgE@N&y1a2^}+yguBKpZ{KZ$lE<< z7JH{1?8U_M-z4$;cfe52)8GT{R)%q+-YiPgPks*M{2Onu7Z>fhD(b%enR1>>;yGj8 zF&tk$o!wr{`@K@sjWiea*yfhJ-6xCpZqAE&+lpE7{uUtKD;ZRX;}5*$_Vm8V{%95Z z3^89^+v6Pn?i+jK7wm36>_^4^Y%HF$Tc76bTTXa(Fvo9O#=cPePm7A@<~6?a|7&GQ z&i`;Yd%!~Wy;Inyv|)c+lRdsU`&3c4P&$(1M~M2Cv(J>-{mI@$eE+?> zGw1I*n|<*L_UXOZ-NkZmi+ZHE_MBZ^%My8^KBK!-x3~ko#Q8eX15pr zFK=;Pd!NI3CW!syO>y3@Oe(T>v1Si$&i`Z&Sp6{%8~D`MR7vL;N3SiSz7t@xPca zjt`54@7v7nu?c5iw41$`h+i+ZOOFejr>giretE(1CB*UbySN{;O5{8l;=bV6HI6TO zls!Ql|INgHyL~_B`MiYvve+M*AK>_hVtY*&*F`}yI8SH*`w(&7@#@a;HZJUCX0opu z#@?6+`$4_d_p4f=}T`l$+ zwb{Fi@w9(cIR0M|_Sg#Sk43z3A&wtn$^OTbeWA$T$BN_gDzUe>VE3uPUaKIxuW0`* zG5>adGtM*hE8m~?E64HCVtv2!aI&F_=zk-z-8-7|avzKK?-27d|Ch?^HN%ASJBshT zluYA1TVJprz07VS>XY|~{B19Cp2m^v`^C82gm{kMw}-t+2z%+H?Cr0yheWg6gt5C^ zWe*hNlMTiCUP@_#DA6m+8 zBj(Mnw~yn0&1QclzBA}MQpERRzrUD$UpMwNG2dE3OO7umo+C#J?@^lblo!vb&5b#} zrl@0YBJu}{?+JGN!OzVLiuuE9iMsd0&pFRVQBPi7)T=w6<~;sK*z2tmF6zU}Y~uJ+ zV*c<2UK~Hlm3@Vn5B#8L&!{1s=ZdKJ?pu}PPnBoS-;n)hP4>mr**6tuPbkMeQM7ZS zs56u+$L1^d{S zgt7-6WpB8eeWnk4k?HJz#QdDMW^w$1!NP~KUvg#N(2c#Xn5Vr#SB~G-ls&IL`@t6M zC#>05o3WoS&OWppyO*dp8()XxBP+A7tH8d!Bzr~C&PNS6equp(S1})~x2Q{BBHBMe zv}e7TuijSFvH!{Dy1prY+3mivFHT_3FY4R7i}`X5PdU%TX!dFc*$;_%@=u)N_{O2^ z*-P1fY-D#8^8=3%`Ri=sJnO{#`~jjpCpU2(BhgNyK#o5qJX*Y8kZ(KZnY4<1uBcP3 zx`^Y=#QO`8YdF5R_zptL2Xc@7cYw*e@CQc>B|sJyIO!Ym4uUG!@7B3!}ADsq7q}cj;Ls5p0MNXHTGp+xXwJ_Bzui~oF{S) zd-xXi%s1?nhnZkUjQ3;DDal@HJmv5I3nudpKs;;Vaot^pK$i!ZFsqr#P<;#CvyCw6YLIK z*b9E=_SD_OUQ6u%v0{Gy+G2ju6wyD=MSbJFy1X5Si@K45qW)y1sJ9vK#`!mSvYVA* z|GpM?AA`dXc1Q7E%;)(W|HhyFhxktPeQ_LkA)fO_MsWTBvA!mvzG&ne?jQTL>}KKY z^*z`ROkj`6VE-oO4bG{+`?-mzXZ|MMJLr@%0!xo->miS6vGdb2kab!FMhIo{Wsy<1iG#?9CdHf5hsoV`G4_Krd9qt~;K5$Egs z;(fGA^*GNzQO8wQ)ZI-M*ALT&aQ=VWN$VX4|@!9Gg`%5to{L!L(oavFu z?b+LheVo{zw~GI7a&yj;GoRh#BKy&Q?Bm6IQisp+^-oM`zW(oAgnei+_I5?tJyx(k z%Vghto4t;>@4Nn!7ytzt$v(^9&OAgEs;>{$4$H_wjtcwre(Tmz!UC|C}+7 zy{tH%#EClgrsBFqd^Xl#)`kCHOAqt?(L^!M1I`~L#*NcQaeTH9d)ILG zfqU6QL_L*DMeesaQ3rVHEyrKZWpCDwxBF~s_8v~`J8!bP)aU*1l(=v88^rOpqu6VR z{d~L_hv^~aQ4g}``~|DAS8c)mN?Z?b3g`Z@8^K=0i@o`9_H&}H`1ufy?_|r~_$2Qq zBV*W~S#X|eVqTptpE%E~k(_7Af9&^nv#<4KKYyD&Rg5!uiTjrV2YI_s-ND{q6?@&& z?9;^c{OMgBe^uP~tv$){2cNTl7uVZ=t8;wQkKCVywy@`}Vc(L%e(^s0gXQejqu7%h zu)FeQrr~rUj_=Z)y+wKnEyHQBVTv*%w>OQ$IBfzgT3@>_QYxI#-e_E zl{Lp-wql>xl-;Q;@ptxL0y5%tpbL_JJ7(a*QU_IhQ>%XR$1+pDISpLyUM zj=wsVz40*iZ%f%5s(G-ZIljNBqpmWQK&rK>z


AA5Q~_VQw0O)ufg+i;$d-t4Omu-|*a{`4vPY_UIF>c#QT`?5PO zV9yL=zbocH?=z3%v&H^dO8k$SH{v`GM16ZhF%Nmh0M1jP8T$cIC)p&0>mi$q`ty?F zJ%Us*Py0i$U98)3I}0>npCjrp2gP#xWA3r<7wdIW)NOVy!|nNP!ah#a!?*a&?dc}! z>OG!ue1}Ku`$WB~dlJW+hgX0V3vfGO7_*cAlP(7XV?77a~>^S=j zQD<%z!SN1f*l&w|SaY7^TZ;Pdhi5r{brkznk>4|hUf`eC6ZpGemu?gP5f&o;U)IybL`e< z**iaCKlzKjPAYrftL)bSr;pT5GY~`r~-H@z(6QV%{w~K8+iKgE^1Ar~?e?%<+rF{u3nX z?pogEJfj2HUB&u(iTM>Th`O)tW?UB(6UEDop2>db6#Mr(>?=iGYlPT;y8Ylhmp5?x zdn{+quFd{Q%wwEi)FtMKdg@K6&gG62Eq;tI7^hNAl#rJ4_ zP2u?Sq91Pb=J=;mc{{$0=l!A7cy@oWAI_i8@u8R4ldrQk72gM`(~ILTmtpTA>NI+a zI?uR){Qvza>XBB9`lZVroTp4Idx|l)e@cG#yP}>s_aMiw7T=M1(~#pcBDkGtVt&+8 z;(n^Ect5MLI1kpFz{|Dozih@F5GV+;=1Ku6z91T#uu6nmDs(zu*X<&{uNf-&Q;=n(bR(X z=TK1x{j%VOASKwjA#u?gvBL^8fCQc;CuWoHvV$@!m#a{QRpJr|Nx>_p1^w+2h4~ zUbCliKirSwJbA15IJu_*d(Bk#lVUvc<~&|*fbjI!9DiKw&+dPCeLK};&so6vyMJak z660fbBRT%&W$vH;vFs~hci?-&2w$m<&|>X~PW`rD~R`1x9{cpkb+TvzNK z#_QE^Df<#pC*1xa_glw?oM+Ahj&CL2^GX%ZEA3LbAFf(+{%#`va1!TnpU!za6WE({ z<@IeTj!UlMcs{BF=P|S3cHW%9^$8!!=3=59)w%s6MP2%LaokHQ&HHoBtGHN0n7ICL z8^Y^#Ud*d`a3jBXX405_b9wHcKNWbngT(df-1WR(-v78iUB!Ed^K0{Rtz&t6)e`do zUTMMW72TJ;<|xkJK|Gfa6VH!&i}#D~i{qH(VeX$VqQ3f;s3Toei`T2eLiThqPj!lz zFKd99C*SM}x4)RE=l4nD?b}7ve=d5??cZsLei4)csyO!Tr$r zHvcaciT5!*MICQM2)8FalYObEBaPX@@%wMEZxVIvJwEex%pA@A;Ox(yBj(e4u%7>q zM~bp974@`6<2b(mLUxDq>@8dI`quSh@BWMPq>6c8o%ZwbdD49L(y8osM15muJ8sVu zu|Io>I#@q(yiNMT`_C>h->kD6#~(1TKQ7L0)SbQYV)jZUxF0@WW}m-~-QgVP-`0Ws zh`0`UEavH5E$T~49pL=;2eB9Y&ihHeH1^D&?BDORkDSi_#hN|ElzrP2_PDaVUYEuC zI*auUFU|QKyZpfe^xE9t=y&FG{6A05Z;{9DP=(j4{4I`eY|q~F1h*$OfPL~}_HVD* z=Pc#r`n_P^7tUTyOo(t~1;K*Yw-4Jb(wvOsDJhr zb=|E#^KyHSWbZnOz4C7MB462mkKp#75c6PH64%L2oB24oSj5Nt;pJ{##UAU$zDb-% zR;=Lo2cpjW`g3l71@XS&SyBId@G9qNCJK_8WN`d2QAa&kykBYln6E>|n(}qm&+i<6 zRMaj1dCBpQ{;=S6^L*ZfUuA-jyT^o*H z(T@GbAoeby>~RJjPiP^=+jnJgo=8zYxig95lSExsk51g4N#eO@EiwKX`yc1oC7x@q zAI96=b@o@G7 zi`Xywu~!h|(zcKJeDO|<566o6^Jj>8d*-_GcKJGwy`!k#wj9Xo)!dKUpEIA&*S0R~ zjm7hk_w{+X;`YK&vshe5b*{_nyZ1bMr}>;e>puG!QD=2r)QudgXoQJI zU*+@85AnR%T8z&x63=-L=I8!=B+esE967%ICHDDY-2P@_e)Z-)+z*Y5upgbx`3qd( z_S_WLb+yy6`wgvg*fYfQ^P)KZ^G80;yxqm#=oshe(~axuU$i#CL^G>!yk}8v z|B%~!T>bcqJww!EFL{N{G2}1Ho*}O1YZv3~b)g8aZ;4Xu1>bU>!lIskVKQGQe9Po< zt+QgBD$|y?WASO+o+7rqU1~St{wcWF5H~^Ve}KeKb`f8k28r2xt#?(c)6{vb33c_=k*%hlJkE( z$J@Qc7T#W6=W>2WclIQ4-w`&Fmz(&D{k?eKXLv1MuB&(tVyUQ~-}Qmlx10DLP1_WX ze`w(LRC~l;t_$x!o0jta^Fq|g43FS`J1@S^b@Lmy$N4a~$4iXg&TY>9u$S3jCSJ@g zF6ul-zUF?|AnNhN^hkzbKX`pF1oHoD(md{mJaL@qD&Bkg-iNn~&vag|95K)8-WmM= zEhp~Z;v9&o({r4i8{d8Mx1|H zfA%CX?tNd(V-py_?X;Q8-aCYS)pGW#P1rw(`JIA>bNsk4Uf<9({sT{X&93I{X_v$M z`N#>}9;<%b9&hnofL>x=<>KP_Ij0pb_m0?(u40`3<#ul8z_09=OxYvE{H1fvxc=d| zsEgPto{xuK;^qF_$o=3V=36Ud%-ivwsQ-V`nD>)3ah-W~6<-%E*~$ZX;RQH;ycheE z?(A1Z9mS_w+&}ly*+*9)Z#=lyEDsO#9g zhue8rJjYKe&HXb<%uoCD5pS0(?Rb52#k_)P{dm3JIr4;7w!uGf#hNB_zl{>#d-ZbT z^JB6jrZ>2X`7on?@^Uu};q~ey>IpN3@cv+SgY!)FW{($jN=4uCc4-yHJNn0c+&|V+ zxqm`FaC>&Fp}-%KQI(@&3-Y4BqZ`^>}@6 zl*z`9n-j|3pf~qJvn=lCQ)1rK6&Bn-(<`uF8Oi_a{wBQtxSMmHr)k^|ckFn(R}N+0 z(}nw?WGn86KcXLu#Jury#5}9*n)7-M+{)WMsu;KP(?MRZLY>)2JGJ-a{G;*v41H@OVs=#A-cJUpY|NL=2-)-*4*JD*@u%8v*J1!;e zXD?3X_SkbdhT*H2x8LsoUnlGm^$9OxIeu{$?gzJgyuPR0*$sJ|r;d0Yu~KZ`ePaIM zRbn0qFHw(uZ49@^#)!RW6ZSvi`O8ul-j0<-y=b$;96xFzZm>1=vc)sI!o!fJ9G#^hace0PU z$(|z5OIPl=}{lMMNE1s2JZ~dzt(5zp|Xaz76|+vD`a-IDYR> z_K2O_&sQVZ2RpNG&F1`fHnE$C_XRwAb9{iP`?V5v$hXULJ3kCy-!JCVUOb!QU)i&# zxUp~i!oJUe>$MiH;P|hio~rU%-mhk*vLCO)`Qxi`dt&}@e7^s9dkt*P9(9s^q&erW zzn0dA-6#-Tv;gyk6y#*?)*S{~Kan+2|sC z{drD&S8>~HK97eE=Jjf6Y=%Fuj^zHCu|wo(!TXPQ45l~y70=yXb>#8k-lG1*TfEm6 zXi*RsT(=xgv}bag`@u?lAK~IB-amhex}aix`FcC58*g8Kaouh&>hpgz=KVaf7H`Lx zV;ujc25;Zoj=X)pl;Zt7F9^He&_{f~xRwKt{~H(Oe*2*E59jv$*~Z5QlYQJjo4)b> z5ZI3Ut>_WnANp?N_P=e&UiT2Y{e8Yqd{v&ei?t`Wb5b6AdMkFn=j^^;xZkGi4iQ@ltMgwkthBIadnBryqK5oQ4*iWpNj8m4|&A>GkG5Of5<3auXTQWyh;|=b@|2fh!xrV|FsqK zpqeN14iW0f>s7cZ_w(>=yuN?L^W1C8InR~S>`U$W_%Pu(uW!NwUa#(_Ilh>v8=q8& z*X!a2_Bao2e?>7KzEjMnQKuWPZ?|3C{?RSPetU+`M>&N!Po)jq{!ik)$oen%xHRG_ z`&sc^Z$>7sZ;gMv9WU^_aS{|let^_}X(UgtQsbJA&cW3iu@i}@$t zKjC)v+04E_g4^lxnA`JM9QT$va-Jr~*n2(W{6E5Y``TKt*PY5*XUj*ma*)^k1T zoNeqiKXaZ}^LTxY$FeVtTR&eHq6;F2e16)1KG2a5BfQox|-9 zFUia8xRTqsuqwxoHR1d_-?H0Y;dVOQ;`Q3Qp8t>W=h*Z5u-}Q`{3Y|VA3DJ8{Ir+7 zb}7ztW(T{osMBti#K*C$6a0Vw_LhC^2=?3?oPVPOd)s^5pZSy6i}mC@3#_<3MeX@K zGG4s@vQyme+!y0`^LO)gg_C$+uY)IFw@eY^MP06Q{-9ax1=q4?RpsUWm%v{BBpyx- zuSLDw8ZrOI`y+h)KW72^(S__A#QbmV#B-TSVm_sI1^GT}@F4and)Z%!_xGnZ;PHz8 zy0YIK$DXp0eeybXe}DE%Vm!RX6OKXagHQBe-V!vCK{kX_)>&o$A(d_%G^Y~AQ z6Z^SF>{Y6;7c0d6Ba_=x{4jgHVeFGDu&3qmc8U7Ue(*edYcb!QOFNE#QG-25JV##s zh5r`^MIFnWT#iqB#r`pf-P45q+%7(DM2qiJCsyWoNAW$ut))4BsTlVzJD%g;ig~(1 z#k?6gEHV@I=#S2530zXJBfYH5%yBzyHOcOIsRoNyOH<~+SnwHPrA+CcsqOgbawyc?58fW|43z@ zlfoV!$KFTu+qfqjUr+4+{!@9sauolg`_DPPxR_^b@dJ*}72}iH9r=IV!G*o)d(L0% zFne7wk7BnLoZn{~`yRebFys^O_kHKv5kr6BFC+LkdB&A}Uu*XDHthE*vsW9yzWojR zlXZNa8vC0)rV*bX2a39m^2<1Wwz$7|Cf?7w+LrS)xyq7J;!Fpkd^b=Q?P@b%|AKfZ7YEX{ws zgcltDFrD*<$8kH4iT5a9*X8&yQCB%my#F|95w~YYJbUOkUatx-*$eMwzhz)=FpQVG z_%E;T?3?V}#B)sJUmQPN+~@vr<96okVRy1&-{Q*aWg?!#7E9)K7Olg1W(;M2>%%@m z)O&9i@59y8p&wh3j`vhC|c1yWE z!(Z}t{2-2d7uIlmrl_xeDC(v>ZgYD^*X8z~9m(z{_Wxm-oWI~;_P1hx-nE<8_e&4< zr|0>+cI5+mbvtfPpEK^GmlK#O)dWjD2Gu?JI~cEddGw?{_od7Riox6uo{zZx=X-r_e-E+0-Mhu@_Z82%=7~IxV*l?un%8S*A@)Qu zPh+{#+|F)4IZtLf_rv<`+@JYNaDV1AXFpV&^Bk(e%dH^hja(?|zWUkla(gsp4;FQL zt=4e-ln(6iw(P@9*|*wrech$$T&MSSEqjTIoabCS_DSW~!z!@bj9@P>>W6K`e7r@* zar>uOv4{NTI?Q=z*c0Zm+h=k8=b$XE7ah=!-E}*AqBH0Jx`BPP4|{>vod3#q{-D?P z1pWX+wXr-gT!h6JJh2Uo`Ha4O3C9i(f_u*z3vs_?R)nF@1Lm;`2RKXHXk?MEM^}o@>p1N{_0{r?OS=={@7ez z-x>Ki{^>mSrR|K38pe{Cwp{p<#F zdt6f3E1lx|=$s(F@80^Fy?1jS_q%+I-6xfOP!#*%$?UED*+*96@sst(+21Czr#0qz z417Mazdgm{Ii{KH_hQ)V?PWjug57Ee&&M)rE4%%4_Ux|g{kE`QxyHVA3Hx_T_S;{1 zy>ippKMZ3Z6vf-6aBcRi^Ss^T#duxGINsl0w`T8jo&PU=yxEV{WpDbL|EE{PJZxL1 za-LJk?CZt%bJv~a_(LJ=6~(*(_aAZl-&AKe8pOw|r#JZcIj}FgQDOG=5qMc=_-4%> z^O?^t@nXJ|;n{pYo@c@S#D?!fPmBB9j8lBxwC%w@$c;TQls(`j`{kN^U;JYjd(#>0 zCHk^gP2}Z1w`O-a!q*iEp6q6J?9+1jy2Ypx$483yh)-1HcK#LHWwi~*Unt66@;SGs z{TBAZuIv$I+0Xvuez;zdmK)%<8#G)Zl}la`R>s( z_MKwB&4Z%;Gw?8>b2=Qa$VQ^^d71d+Y@EdDGdWdb2-i#lAq)tr->J z_?n_lb(45sueIoh{^EVT_GNgvpTu=nu_W&Qg~F3>a=cG4`@H7tZU6Cp@+pb^^mF#d z;yty)Wq7&8TCw*K@6&Dg!|}C6z3z`7?*H>`*=>Jw{-8wmV;9(Gi29$Z;=9`~#Qetn zOgR4l@&2Gq25*;pOWCW5`or+b9N+j1AD7x&v)8}R$HRi}*&mBKe+Mxy-$XlJZVT}~ z;MvCx+4bUyHiy38MbI(K6n?zTr*ivWZDfB?pZ#rdc2`gK zy`pZ@L)^DE+Q4}(cV%DX%3f9M&s#-3)kje$cDw-RU)h4a??v`S;(z+qg}0;64fgp1 z__!1n!TwRyE&np*_&&whD~RKvuLH;bsLWohD|@Te?6*F#4{gEYGwxH^-yL9Ya*};u zFZKqZ+@6f8?3Q9)-`Aq<`ss7dQ^~;XnOlbaTzmG}^Vlb>Vt*#ayT1SCc0St5-nKov zX;Jo5;=0lP6~|Al%r_)k8uNIdz#wB+?lYRl_2Mto0XR2@D}y8p-iP4rJp18z@5ZT2|v{e{|l zxc#wWy-thoX!I55yIb>ky;j#?zuJhs?k;wNc)wu8DqgRRv)J>Sv3Kdq%bl3U*FQ5K zvUe5nHitPrx)1w3e|FEm?488*+uf!dzrca7Ki3}lpRW6U=&6eXIQ}InTB3vqWlOS0 zw9E$KF+xT%D>AZGwn~U58AV1k6v@b*MHvwxA=*naBhNqZ{`~stbiVhVd+z6)d+xdC z@Hj)23;U97?DhjW{}e+$9_JwTSYdoXyE~_EBCHFPc#PAp8O?rp7$1LnTRz{7!aC%C zIIJqdv^am|E_^&g(%9F(V&6HNef9+Y-P&<{UTvy)eC)|b_GS6(yVBWpec9`2up55m zaX;IioPOqbKHojUKAYqHxZE}h`>y6L<8nJM?86(iiI20ZIeXg+e7-k?dFhqAIsG>q`7X42O4?-shVS1e^u4ri|$#_rIO%VBRDF1K=F-}by){61*1u%G+s zJWd~VhkrNf3Lj@o0{drc_On%-|BeOhO)m5MwYQIXo@aRmyJJ4j`?7K1{9Dap|Lnnj z!iC*anBQx1ijT+P10R3ejqIZw*hltcKmLhd{EUlc-yFrhF_C@BE%srd>;n$7@BGFd z*^1BWys)lsN;c0kj8bM-Tf_4+i;8((sP7MULsibFML4HF6UY8{9OrZJ0{e?#_TlB6 zzvg!K?V0QgbJ(q{c^<6)Se_3&U^%<@B%UW+s9;~9&H1#8sK5?Ess*P%X2|(366QIZ zICDNecldV?FXr^)F7fZC+p~9#}3r&pMCAPzqBlm{e;k8jeElVM&|;&9TgRs{M__G7+;dschwfgK}#{|}dQff>7<4i9YgP~-Z4dIsN*lP~djY|Gs| z9_u5l&oE5bPt7ug$1A>VX7}MRuZR-nW$F8JJnY5YH$`Pz{$1T$oX^)j?9)m(KHrRF zzb$-MuG@^;1(WIAzRWJ=_UM=}-*sRmKM#)B$Ub-=dz*4@XVVw58`f~YVp9zJVxfQH z7Q_|eZWs3ZW!&Ew^^JXqDd*#6&c3S^du4O>CF9u7FJ$)@zV}>}%ExbYgnd~gd%t7s zUkbbP(6`_T$*s2p&3y)7yHo zUlaD-IP;a$k2m7`eUvbdz49QZf7YDi$p~Q`<9WjVQ`Iv$UJb2fx6I*q_*-~yby$<* z^U!_lIYN7ML6}GMDUjQ>NMYT-7e3rR4!h27_mMreg59Bnz32^l17Y5dk+6=a?sv|| zL71l+zl{3{?}YyL=2qO_*y+KZDtz}8kjv=@7O}?&-_2dgl|HzRhN$lF$9G4a@Wgn@+{_-aGGutJxw>-+e?Z7va0YcKx}&xt4Lg zQWNIq|0v+}KEi$|i=4S$tr^1S`(hURg;@3*bJ&l!XV-npo+iwvN_fiUYFfPv*YuKx^IRAmdx^14q_vX>zTp#W|Wls{?$G^gN-#>11oUd!j&-<@}IQ^3b z?Ed>WJ};cZUavcQ>+5{JidgoF6`aq)P(IGW`h33iKXZD|9Cn*mf`_q3ecw-CdYhj+@h-I8UIGo*L5qnxM_FyY^Rbjj$F^kh*_`yEZmdoeeBleBf zeBCw7*`L1UeC7nO-yg%i|2`l8l#!g{S&G&%jnk?g(ZvcC^z54*~K zCYpWIO7?q$*-v+4f6|M+O>6cDZhjT5`L&zEb3Er${{?&g6uyp5!g^NQB02pD5BB!z z?6V^Hcnr+h8>q9t)njig%p0Fw$m5x{b?i3td7SguJoc?x?6-vZrC;9i@7|7Jw`<9fn6u`4|}y{{ho;Lkk19sf>n1?Lm7k-gz|_NBr+kg`1f-TqnZjrOn) z7S;)|-_GwNOoe@}k2rorvByldESlv{Zw|%+3bCVb#5(<_;}vL^7(r0Hp5+;|a>;KqXIt1qT-i(Sv-j@Kzgy9e{e24OGhqk& z#7XQ8A96n``VBufb?nN%=@LJuJn7EvFFfDf^Wy%VQUUw#S)BiUKX(5Z_NZU%&7Aps zug0@q(&X~=xX4~~lCR5?Oup{g@3}sAZ^ie8wy=(9)Cs=tUJ3g{nXc!4-PaQK%w`|IieU=O@FspP3oVdDZ+Yg4Igv;ul>RvFp%^A?aY2?E&C?n_>Jds`q0Mgr&scE z#t7@`SGMLj;3=$g*lI4vpZ4AyuT~{-eCvLj<7EG599Qdo;ePD)R_xg$xt+S~&;8Yl z|F|6-y_fyaKz7qS?oWmsV?P|qem;SH<2UwnH$I+UHhjK+^0|C|8S!=5mCe^tcOzf- zD=*nkxN`kDt6;w~mVftt6F$x%#_VSLB=D;roj$FP?Ak!G`0Q-)xS1Ho|uS z#Xj7QH15vr&d7=E7YDMpv1E^lW*y<7-@GY&zJVRM z+(s^CS8`-O?#q7REPDeX{lfm7{?|V~{;>6x6 zldo^kdyXfT!n*wjXL0%~!hFlf!<_!N@H|x`%oCm;%K7{f=5uxs=DpVl^XE-mINnAq zW&hZbJx%y-?sZ>If6$FRe+hd;2ljpX?DH3~-+RTLDXe#GxQYA211;H|YdQaVN$f3u zbGzA2n|;Q9Zm*U6*?;@8KQUzwJHYL}l_~pbVSPv&2ksY57sh$!zvuo{b9>Hb{s2Cn zu{wNST8G$oH0E+v66Px&68bHA!g~Gz%{l+g!`bH~u@`G_{c#Z1k8K&l`79mCUT}fS zM^*R^=xuXOAO41~%hG&yJK=f_n!));2=f3{h54eF9`f)0NM?6WWe?iHe#)NRXCiy< z8TQ-4xZj%boZhlK`?^`|efO{@1h6-L!rpK;UzZBudq&?PPCxenyQ454c=U5l|M56` zgg$#gB%hbt9QM9O?A^RLE;SG3IClCCk4s!z$Zk>1&*O&k*{6Kt=lYWC?Dd8H@(#yx z`py+Ro}jUmJ#{&|m9YPvN;s##S;6BQmS@?cf3d4*bNxxi z>Ep*f?Igd)>66IsgWhgnKYg3s=@NTGVIJd^3Vtv4bqjmM8}?}z*-ZzqZ`{K3wf>Id zfsE&#m3Twe2=4kHrysqs0`t+jQjUJ`A$wUY=hN>6yZ0f^XLU&#{_e324!2VLT`ee+H`N1VdhwJkZHzo+$8SZa<)#Ltl=pc6O zVcgHpvE}E@?-$tnuV$aToqdBaUh(iAkDnw)tKj`I%bdq;;`{RW&&)GC?zFdwI_95Q zz&>Dw2Byzntck9+Tnl}QQ4{pEE$r3b*;iOJ#e6L0H$%U+i~VB=dy%pZ=Ce$dJ+*|7 z$9fTkw4p@*m%KcI)~6{d<7#ca!HFA13tT_|t7M_v^OL#O6!UcM!+DNq^WE zo#Ou9Z7YtqM}+qjHICeWdnl~$w{;r7KT_?({W_g4+`cq0;PyzxfZMyk-rT-BwCDc7 zmkaFSUAbTJWCweBI=jXr_OY?-=l8H*+RpB`i2Zyg_WvsReCwsL*T%3<*vy{2fxSZz zyIwlGl|CQ;(Z%fc7ujD`uzc5>@eTv7KbrU0 zQ$}(<)KBB|si|BK)w-}hTFY*@gY$nnj*rK=7vEpLefWMfU%>aZaR-hAO2YeV*IdrW zv#{5!klFZQ{ExP2U&z}~`>+gaOj++O=P=kcPi!nmAqAg9lbVgEgvz08-7 z$1aJFztcqaJR|lnp`Ug!kjt%N9lMP$d(bNO5=-`@ANl(FtYtsglifO;>*4<2T%WVT z+0(t*^;WTW8_8~|#;zLA_uUv_-Rw~(Id1F}*3X=_pW~00un&=T5~t4{&Tb^E51e{~ z<6(_2`~L47SHBAD_>C0i%f$-s9cqQ~!27~J;5Tk@{NHQAu5pjsk!iv@!vn3kUAvXV z?O@@?YjKjwT^-eDhik-hE|`;XV` z(`WGUSYKt2Il+Eu9ebHQ`|)P%kA?M2qE$J4d~f#rwe0QhvHQJe|17MlpHs!@C+TuL z3=`s&r#+|F7v?|TJk9Apd|-c9$UY{9Jz)*|b5C}oh3wVC+3UAp&+f$TCA1d>hq?Sa zcVj=7&h`KAdiEfD_Lk$=eT6vOEQjOayjb?2iR`YzI-*_ob9~hHh+q8tm=Me!sLyWuhM!NL3hO%NICA=x-+3ISp#{5_FrVatJ3sF?4CC<`$3$*` zQzx@`?9IL|md7QGl-b{;^0>#@683cq*-x4BdztH_`F+*{e}4aE^oQT0J=)LS_&&dn zTit{`L|^dX?5!8@dqeO2JWubUKl@%Y_ExzScmsdm%)Vs;yMA&x=Hng5K6w=9^Zhob z_pMik`45aPLAQ5j&)>vuHIdyut{C&b@5dfu%=zq|%ARnL^I73jgui?KM+bDTc0l>JoG z#+d(g;k(hVojHAgg2%P)WU~)A!Q*m^%QWzKHmuh|KP{~Lr#gw}^_BaxFV)e;{No<6 z7wv0`>HY1Rq5mmhf0(R;=>yv9qOab@>7x=k{{>!roE`;S4pZH^oG%LNH`dSN>sx(^ z>)S|S-)hG_JRWE#?AH^RBHUju_KCuhO&)1F|{|kiug)=<39WjpNcE_|M`*mS|*k32PKi@is`|bW) z*gF}p{}#UMnIp^x>n_ai8gI`1{QG{~Uf($P6)$9QCHLnKc4Z&gmHP=_h3{@+PjG)@ z-*4`p_;|1%oz6bx4g1@b{JSHn*jHWU=ZllIe7+UNT%LdRxcmp|@%0+En4ja6g?*E^ zj^g^cOIT;pYaT!6{_Dl}#ghbfuMvFT`D*j?d-n_M&8P7F{`oJvRy4cT!EnSH77UT>nX&fc_aZkNvq>pb_n$?f}r3*3MEevSKYd+uvuxh-(!{>GGe_I?ex z-%>Z6eSUlP4re+4@$=c;`muM);q&@z#$FiA<#Sn!ee5JI=aNNyUCwOh{`uc)eBHY= zVwavrreEaxT-A@gTzGGL(UR|@-@^Qme|PvkZ7=NKI(9eT@0P;8X^lp4|84zDjweH$ zIbL-;fz@0wn~O)GK8xdI*aeQai%r?XpK{!Ga$~oz;&#D%4SU<)-0oP-WgnZ#?N@&@ zc7sT6AB)qtoqblu{W>L6_VfPSzPEbK{ek73*;m};enp%cyH;cN<0;&4xweCSf-8H3 z8~d9$_V=oMJomP+KQ!ZVNOR%xeAbk&*P-2f-ERr&3=gs7`>10pz8`1KVvH?o-DeFr3{rpMST9uupx= zYfk^}1s|tR9RKcuIButQY~pt9oG{EI<8IN`q}0h*XMWj*at7;`(jZJ-|tq!dcR}Kg}712@$Ip&zvuH+948$g zalfVN82g}a>?xf&e^p2JWAoT2nzNU_Pq$*-t1$9`G;y*d|pj^3cirb?YB3VzjX%p zht-a;56omwG~)bAtk|DSVgDS&o|ne{L8xzd-_zL#3=Ip{WB1Kgh z-$xNfoX?db?C*8B+=ke(8*gSWy}&;7B72A9>}@027ffLvAE#mQ$sJA>$GH)pR`X4+_ zGJY((#VLMXel~->;Slz-?b#c<@p#KpM}B^9)`(rtkX=>SSL<>Sj~mRI!M>{x`??VJ zpf&7^&hYrgbQK;ac{iKAxfA<@*Zh7;{bCi~81DY;uimg1)UiKq&YrQn0)MwEq8$Cj zQT7S?>}vN)F&_sV_M<$K>F`v|uPw3rTIlbRd&VO+^d)RtDFDs#Z&VJzQ zQqqp=VRULG9{=3_e4nO;a(o!|isP7v@V)u;s~qQ_7;-yOzJ+~TANHjw-0n27=JZ|r zaywXck6qX%TG6wb`w81d^81&0Iy~+X)SSmjHU_gF>)!~kRqT6hmwvXS$7JBW|}XaW1Y4O|X00@;T&V4pRX^WPZD$C+Np=j$)5 zcb$Hh`|bW^+^<%1XD{!-{!p8Jvk{;ly}?wzzO4-TKB`^J_uZ{Ber_%6#rOM6VLrpohupu4&Efvl1Yy6q24Nh>`U(4$ zs0s7aoThSIU3!oET`z=n61LpoI3MP~?TAGNw>we4xj!&#GxrDHE@%I1#{NmjfA)U< z-IzA)=g;u*SA?+d-orlBpZ)nm_KazKJYT-Bw-ULtvd{8GpF*Je-l zWtrT+inC-dzs~)x6CK!h2>YFRTX8%o{>lBcHeNj5dnt$eW4`@4PIkJ@{jtTHI6hm? z<^EWdux{IkU~U&uK5#ptzKVUxNcLgE{IPA-+{)7jzP6Q|-d#AJdYd`@&oK5!dF(r^`FKv>WLKHN^(0uR zZ?A-fW2WBYdTTX=`!kW5?2CkTbbYt;{dM33_j8Vo<$lXy;XRkS@V@x!D(;_5O6GVq zUcqs1WJC7wC+r!*y0tGFas02n%^p_;H|I>}cyir`m@-dsKakJ;{#q zDd@q+lcT}MUwn%_eGiv^2!{cMrVd|6M>qD9##|q&g>_k@zjD1gGl}bALLB=?ph+0Ra3AF+r%%YuFXd_JDx>-fCxs<8iQ#I8J+ zy`wOnbKHDRUwnkUm$1LH-8fEPE6n@yU(EHY%?S2(!ala4LO$O&aXt~kyrz8NyQ;Ps zd|p+(_&QcDV4oYp{_-|^2Vq`c(h*K?<-u;=ll`Y2dqNeTZ@*Y}hqdh4LVQSR%;}wu z@b&uDhP_iT$1#PlUvQ;A$3wIB>?*>3(|d*Q;HG}%c%HkS{rdp+&#l-uXL0)ydXPQQ zoBh=o_5U?n8?0YShw7=oYU9S;^R4{%N{?LeZm#?$KTlJ3jK;1 zBlr%#uX*)=-|tj*XTO!j?~i)4WuLW)-%r^J@6o)>t1v)ZGhu%+h<)sr3e2ageL4C; zYxcAc^hd3;{ieAzo0aXx?E zm*DxP&*kF@y~3{7iu1XjQ;7M83iHiAOyu+yDn*#jC|maC`-Oaj{71xaKEJx~d381C za?t3)<=irZugj-zd|#{^$Z;V1JjWAHVV=VRV~%@uAsjz9H03y)KY=|mf_?r+_JhLu zsLyWk^Igm(?$6jP=6>40Iv%gM{gTH+%!K(lt%dJZ{l98pJ#3-N<9@$tc--t$G<)1r z_G1s&XX>!W@8jcqvzz_9H+$Rm>?Z=$u^gUju|HO4zc`a!Ti9PLelDlqH=F&W@Se1C zGnd<)6?`4r3~YkuYq6Pq&}sIlQ|tlO?BSpJc)CwwKQxrj%d#F{$8N&F4gQyqH=|4EL z4-n>M`3wEbO(C35r(*U)gZR95MX`_j$o}RtdyAj!S^8Z5bw=zBy0bqV&fZ>FU;5=j zeqIO&=l(|e9j;edvD^>&@E_OD8M*AmtND5AabvFkD@L$u4q{KyWY2uezq{ff``)AM z89&$`UE|-?dcya6;v?>lJrmY{8=u5+Cafj*qmHk{+f<<{d>8-bGmkHw62`~IY~pd< zSy>!!llpLcZtc$TeEDvU|MtRuPw$s;f52-5w}Z>RvClrv?P<{zZhs4(viE4%1TVlw zOZLx)*tfUR#(er+WB+N>6w{wfX5V{)J*+XiLr4DIJ%70zw6Ae_+O6mEuQTWC_^U7X z6YLjoJ!$%i>y@jpkGyqDP9JiF>+RrH?8AKced~GQeXE-j-!E_9@%`1nmEGwj_h)7e zVD}H>@#iVuI1U^SVJ{N)qxmMRThg-^Ki_q8#cHcKafjpE9DVjuVVwD2KF7~Yd-jPh zxc_#+l|A$y$MbW0*js+(c453dd+`=-U+jhU%TCw_{Dd#J<4%d(?oTY>e!}ps>=|3Q zzoAo~eZ-Y&yzon&uy<(0`Q(gd-?NAP{www^?fAT2PGS$-&;D0~%k$!Sb~`V=E`B!L zk5c)~u6Bz1C-a2w#~+O5`sUo4>+P!=_F>KVK58w@bLb}Q^VR%2$E#Ov99JE!IBo~V zaJ%5(&F#oOKlb~R*b{~QzHgau`<1(h+q=WU{+pW|xjjv9!Tp5pf7lmqgR= z$-kR6ll`Tzj_aY({JYPi*gN>KFW$l4Zy|f)Ha;&kVf>_CEAF49IP>*dtzcg|i?6$f zu-~ZJ6Rw}{)7fK${baR{a{8k7>=l~q+k}1Ck3Hn{j_28r&Sali!uM&-2=*gh+`rm* zfaAc?J=~9)E36AWu!iHzJ7f0O%ecSfTgUyPy?N|gh3Bl$o1DI80sFlu?ni|OVsonS zSi$|J>~s8{U0v7*?Z6yPpJBs(w-|wVP=E07)=Hsyz*7uui!{W(8QDdk0ZPPYW85^{b0x+PVcDC$FC&Ji)$g= z7pG@(c{UUF30-E#>7Qz_+gI>${=3GmI*HxtBbP&_AN%du>`F7({|M{Lt#;w`(KhS> z96l8@A~;Td>B9aliR10;MeIq_*!707FMGxZy1|^?KZ4t-&l>Cr=ed39(t|zV8n<8i ziR`@s*lQQFmqxSC-pf8%*jKb=UrxWV0sD$i{2Ur&#_5l&W!Dw_Y6PdBG?U%>9v{yF z3-%ykJ^U%7c-&@z6T7`W`>*BvT<@#GUR22A0~Uf`7uLr}Gv;xL+p~Ba!zP`_Lw3(# z@7RcaS6?2VDf;&X1Hs`#?23Wx8Ksq&&ogUw&#CNJzgJ*B|I*nXeqwiD$KIi+9P=Nv zi9NMD`{oZB9bt4^Wp4Wl@2$GCI5>5|FrF3dCc>4C+jNZ-%>t{bzs|3BJ;$17r< z^Y}*2gU0y7KBv{uSKiS;Z=$J*UfiG4@7~7wkABLoJ%#g0O=Nd_$bR@8`%z&%F5^r- zuhWfqeDcs*PJdo_|7(!V$Fsf<=kvy&efbggb8p!jH00wq7{hL|fxWIBd-t9EyB@9C zBMZ44mIboc3iAUC+o)kZoHB^(`F1V#FlF{1Li*0Ooc^ouUf@PkKF&^MoX?==JZ|as zgYWlN>O4NF?#|-?g~GZ+SA})9KZWu0%VJ@?&T|n0934!e6AFwydV|OZLZ`6nHqZhB)+kfPKQJ}D|sC!?&-`zcV9OJ?njwe0$ zVf9ozYR%(3uXeHr>2g2nOc=XkOCC3Cn81_92x&P*=E5z;F?CJA4{=e_Z z{k<36xE+};tpCue8Mjk<3G5H;x&KyC%s&4#x9?34a6jRpu&(U*zD=;A=#;RR^w7ri zo$IrQt>%2H3binwIWFw8e(`y|+r(aC%zmO1`?GQE8MD|eh5lI7PQETK5BNGh`O5Vn z>nrzX>Rsh}_+Ta1+r=ha&)0n8`{?}#zVBw2^Zh%i1-sQejt}b#IL@3G#-&Z;v6?7K z-*VhL(3ri{nd7JO1CF*Cb7R?#=g8QyVhCm*FEdWKIkB~J4&_O zPJNlrzBQlQ!ONlS*Cw$yF<`eW<@P=8KKt{R?CpeoOY@rX@4A?>_t9tHEsURJ&*S5{ zP{{q6hFjTB^k+XffIUQ55BcdvPG6|tA0dCzBOi4{LO}KG*5<{WZKT z-=}@M^L^c*7srR@LpaW;yK-C_cb((diUu4fyHDVLMT65EZ-YN@d>&K7@!b9_$N!Cs zxV?C-%I(X#yX>!@ay!-YE4O!ps<>T#70d1WNgM7DoIS&yafkKD@j zHoAuEdDo5X_08Cy)$x6_`V{*R8}_@!e4mIQsYXf9-*ewIC@h~2aW->3civ)k&hPZjpr zeCo`Ch`@0rhWX4?k# zJG$&wZ*YC~aAkMm%cyu2&-Y{PDt1E;_A(dtLI-w-(d@@G9eb0)K!Pi6nSgk2HH zKKU$ra4dVZ5LeGl;`D=r^4Z&n(??$9=afOA?7G9)udA>JSMc-Ey(8>V1KC4<^7EJ1 zX?E-J>?y6;H81dU-`*MQBaPYnyyfwVi^6wL8-#VdC#~h@)7HX#EwyBR&fPeKz5W}1 zUe*g`FIdJNX2yOqpP%3FUT0T3$Ueu7-DW7e$8&x!lkUO3Y!3V7VeDtC_&rhQ!|b(v z*zMHW&*kxam?Qe^uD$qu)-7QjiBXrnU_hUFkUe`G`-tQ!%qRIgdzYu|4^OkFnX%vN zU5UTjQ`pb+qH6`FUld-Be!fE)dZ$ID=-rgqJKZnA^cm;b5B@5~^u9~j+cn^P28?Ad zF=U@^$v#Poy|X&|=6YNXi-vM}h70SJO|KNLuPWE`@!5P|+#k*N@0T4MH{ML;^jGRUrwZR`>3}ItB>OQ7Vh6ZJ;xom&j0a)Q|)UW-+2F* z$4~a(YK#Z8{06&rWA>54`Ux@4{JZLB*kAVK{0l4C&F}KK)5$;{r#jP;$HDT4u!sEO zd^9_=Pr1#@47pWCwQcVa&%tgEKHg43Vv$mf+HtpB#=ALlc|nf<3Bd;20Thd%q* z+Y0N0Wj^NXK1P^-rL~3gZ{3BDGg_!8D&4u_=)wM968mmp{Wo(xKK@BU|JgB_%fV(bmz%F9m;azZcBKsV zRN=W}YcIa;nwIQ}sq9;Cu-_iT^=*0^uAg5`xc`&Ai|hH#UwmJT=*9P!c?<6U91dcy ze#IX4PVfutKZWn?jvwXp$KSA*cj0)VmB4;V_^xnQAC6ufaD=62b96Z<~{Zr}HRVlTVG{e<49xnJ>affiOELt&kk+$>JNXcK#$HoL_FJ|5pg zeEgeo_+cCS$*L|WM`%O=-Ker!pJ^bE+z3))2&)U{p|KAJy-Gof! z`|JERz902d_`cTFVsEsa<3>j{_GCY-Rto=D-0$)>WWVOkakBg^$JNv?u#mGxpKL*W=Kog!Se0O1XbKuZ-RI4ZF`h zb`8P%{^s;K#(ey~w(J8pu)n^>UQdVXkB2RL^=$UW9_+Cp?1@j{^ke%@O^q^A>Z%zDjXjg9bhkN#PO%KAA68B$F~LF*!w1PoSfsy{g5G@ zISzOG#2&t#ib32=`o&D<_ z_8za_w zquCr!45QhTeb{HOV=vplzGFLk-X``Vv)P>nva6f2hv>5#-sgCmvYEZRu#aJaF{eMP zV7I%>?ZP*qz4+tC>0@l!6PvTwFXr}Z>|OT5!g_j(Hgo#r6WPN|*n4+p|1p&P_%Qa3 z*6d!E?D=Nw^?IB(l4oW!FB#{!{38ObqS zZn5mTTiIi#u=mzu-}Riw;SGiLbE*P4{n=gYJI1pQuHyFs^&YajhO_tU&+dGW-$$fP zWp7-^?=>=xus7|-UL?$C`zE|k8Pb8@vs}E*?_~yeWM8w1-yb~})>$f9#qX_59N2@N z^82q&BiJ(&`Tg2?2X;dPc4uK;nY|9bPjoxW4ScX4`}m>kPcnJ_nDQj{Q6=Trz*y{I zw=FHh^oN$S&-#!3QE4gW(>0ZS@K1J~Mx4LLGfqEyFZ;=8_WBl_e|b8)?o=+f=uj?y zziwO~S{&zkbvl>pt?ehS|G%>M{%UrT??;`t>>(|dK{{Bi6di^B=SbnZm7H<>oY=WNKSy5=WuLu)kmM$Di_}`bgSVq|K??wybwBu~}`1h1@IRps%taUTv^cHQ{N51F!IoOPS{caxr?2*djkVPjs z4%}YFabsBzj&FADc$~`2i^q|^Rr7Okwh{Z^E?7+zbwl|%bd@DPCpPK8@jp`7r{G5} z_va@+<8~)0h5Osr0=WMid4$`$mdfn8k=)L98^s>2&R$c@?fc8u>__t0&(*SDQ1I`1 zR&)BIe0Jv)_5r)uXK!UM3}OH8B73>CKUZHquMf%Wfiw6z`ss6hsQALZ;yKr=(#>2C z`{uFFSK<1suF2j)m;IMMyMZvzzn>$guTEg!B+?qGWH(A`t~W|9Irx}aD4l^n|-G-$4UE4_Abjg-hOS(aeGoEd)0S#I|FVP zmi@&~Nvg!q+9C zfUoabbygzL`)M|PWJu7|3%TyM?0vG-lT_eJelzK_-^u|IO>`}do$p2LyD z95-xMvi}*w{9u~buV~5Td2JNC@+S6wyV%!-ux}9ZQD4sKgVwUAoMIpS zjD6r0_OtQq8Rys=3BPOR#_5yo+1svQ@34>oZdEt zJ*9*_U5VpQuYv4-!hD8B!aBF9_c))cKiQ8@bZT%FULkk9SJ}-3H z-xP8?qAjeKb$%wN4{yT$Et%WRznj?0gn4c~G&ue5*W4eNcah!dHhaVa_9M60eT05s zmeBuMHjVQsn#`W}AG=0>_Bb8(CN_NPtRHJ|YDlnCpU ztx4qc7gE@pUuB;v>=&tbjMJ|PU=J1ckvuGXCsp!~$Iaq?us11SPYPq7uf%@BkH`1g zII(}5$NqLL`{w!VpWCosImqLj?t|HLb=Yf!b;HhBar*rY*v|yPz9g963yfXEt|GjjQu)B? z!>+R%`m<*_vR|y`_Zr8yvS%5xzcylb8^T_Y&F^0}2=h{odGdRl>jT&~ec<;;l?U0Q zZP=gP`icR);{f(HvDKLVy8(O5PM#Mut{uD4S)N~1V8Z@<2hS@D@#cZN4Z^xuw;q+_ zc|A>Ff8LGV^h4d-AIiHC^?B%D}7jNeCJ)O_x+(MVH z*UIjE-EVK_`ZIG6*TdqrT%QjFv%eSC@O^N z{2}l!`+w!^jlZ(*vf^==Zf)2fd2>EDda<|I#@;NA-DxNL#$fjAhJ2hxN$k@?0?$XJoR^AHnb4wrTVGyYIq2t#P{i-teFBzH;y>PTyWf9piT4 z4NhNU!tSrb9yLnvF6`U>a5>x*@^M-a^9p9hU2*yBprC+cv0E4F3-=*Dj9 z#J+MF`(WWY{f#Q$7a9MtkKD~Z_X+zkHNGFuS+jp%!d|dd@D=P$o!G-hv(H?^KKm^D zEMdL4cwv5;feFX4*SpyLZn1a&!~UT!$It1W?AuSV*K)I?=(+`)am9g79M4UJc`WbV zb3eRi5w|1W_qaWJwVKn&G0aQgn8*@p@HXYCE;@+@k{{yvJY z*EJ>f76ZASbQ0zj47kblwn%t?*GuSM*^TG>qDO5iackIjE@6LW!#=Dnd)f~!pVjZ!jfC}_ zqlEXrI}dU`KKt0K!`P?CueyKT&_m{g#`;{)q=>al11^ zm`9X$pVPZFQy;EgXNQ8>g@JVjne&-LyCR z$ad_D2C)}7u!mc)-!x=*SFkU8!ST6k1pC}2?7xL|-tOsh`oQPhj<{WsKXZa ztHQpG0>?4QT8FY;s`ah$!q@SSOVDUbV&8Nz<~K97HT zUtxdzi~WMIE_cuV{JSHC_vzP8@i_2|d>)ss^krXphW$eg`-ob0yJ+@#y6ij7^EiC( zVs^8ZoX@I`?EQ_|*9!Bp?hWSO9dLr*BkU38S=Eo_^tT_f=cch=TE)Ibo!#OQzaQzd zn_bJ3-OY^Mp^o3ztUt`ItjE6kHqT>uEvz$;--FX%h~)V*+O62@$MZZKC2jU;GkHFb z(np^E^LHhCQ8CZs3hu}5Ihp4j4Svq^l;*5vw{Fe8su_E|%RE2oKu`7=e@d}K@TZP_ zhp^t)v0&?JwqL|o$`{zZ2xj%njnV&C| zwy~G~V>chm&(YEQ*z+3j^ZP4b_C-cKo={I%FX-k@et*$>62BjrEv##_coM(IF>1lC zbe!|w+K&C-IX+JJh3rG8vbPoHO%*3|`u0Wavpo1Xeebewxy-)Ln|-e(`)oaSQ(?YV z^9VlvtHQnvkH>TVTW+zZI`H+?6!s@=x>XHt$hcqZV~lxz*G*yH&+oT5pHv6-Wy}FZg#9<4zvOZ#ddI#no;}u*eeNYL|K_UfRh{^{dueifIFrlqCoqHKSpNqcC(k_N zxH|4Pk0)Fnz5Fo&OOnul>aa$ESWBw`Tv=kMxq`{irO?cEFy zZXfMmbAPp|u+Mv6Lr%X&SdVMv6K>zn3+rWliQ)8J_p^WWVZR})>zlum(@zaxA0X@p zTK$95FI>gtW2M36Z+V}+&kDYdmF@Yu&l0|`xigXL&&g8u7%T4o^z&z*^@-iOE7x-u z7xs!M_E2G8tvAB_s8cWbzH`>+ags+P*|)D?*A8G$+0Q;x*k^P6dQQJ)GyBg__6@@R z=DQ3zE+rpe_wCH_t&Q;AiJ;KE-zAgzX*c%sf zedsfZJ@*LLt7rGP9)3_~pC-)L3h2xA|JXdfU&62R{ixKFefC+t-}g>pzpl%!SIhA# z?*)68E9_m*us2-7?%az#MVsBYlH;vrHv69%_FCaR%gjyuyA~Pj@$I=h_j|H0JHfv2 z8M}HZ`@{nF2|SFXaH_}kXQCdvhp;YOraPyA9Ia;!y)$UdF-3}v$xk`KVHS<`Rg|O zE@6K7UKdV(LD;`i^%7tAde-c@1zg|Mg4jooVh?W0?(&%He|!YHofo^;diF7{?9*)7 zFZW?jHei1#?031Mfa5^_&+PGe>-x0JE){9R0$Z`HyJiGa9_Rsq4eT4l8md0~CwO|Q*hhFRhcvwhr>;$*h ze!}y(yU?#LFW`RT)l&A9GWNk=*n_Ir`w069DhuB54dT zYknA~zjuH==N$VrVc+m)!Ur2S4skvoh4Jba^Emx(;W^?;GN-o|)~|3o&gu2+*(2Wb z^G+9G-^L;PIlXx#yWt7;QsMi=P8OX0`gIGt*%H;9S zZ;ROd+p+5u^LXrk>Fj}z*t-k+Fh-5x^mDR!JXyz!-Bws%OXE8~s5DGvpYw!$#vS%c zec49}@4)h~8v-=9`R^>P5^joj-dxz+@?0&)gUZYVL_D{ll6IWqg zQ-dg;A9CB6JuZ*unG{T7KYx)28d6l)1D5f;rkyoBPv(vpd#AxXuW9c>o`GWMvd0?g-HCA-yZ&Zle_ z`>rSKb#M5*>RWMncD=&o|9dE3N1MZ3A4U)4`gSmY>u1truIFcp*nb`8`)I8&|8Vy# zzONhX5FH3g~^uB)V_r|fWJ;V7gn$5mO zoxLQRkALP%_Ls-lM?|r=X~)0oa+!VnEA}~g>@I=_?C12V+U$db^ZM@spO$nE-h4cfSNZtQz2)*bDeNCqe>LA< zn{V^|7$WSSc<=XKxZS+0#qIA81-I8VrrZy7 z`pNCSx;m%-E9B$p#p!Pqv7ZsvS@jL!<4@|$=d0z#UU7>3`DymLY<8=uT>gI>@%7sE zlU-MX>qEy0Tz|f=;pd~2Q13OL#996~XOhccDLK z8N==M%LH!UO@g^UkZ7xg7r4u9_HX~#D_b_fe7d(|x2oZMT#m8dv|;~T#pmUHh`rH3 z_Tal*ZaK#6N0xH=zdz6YrTUe8eN9c+)2zAvBn#{ACJ*I$YbSh%GWIn0e?p!3zO(AX z_wUs%e80Eoh1EgPcml_z2b(w^&b-9&b6X?!kaZlN>wo1qKW-ZP$d}w6tqNk-7WP3n z_=?l-f5SfdBm0V4_CCV?yw^4Oyn+SaZo=uW+OQYyV4oAiUN47zM^C<9Sv%R+DDib) zZpm)s&YqvlzFv##VTANv!;I4(?8a`;lHIeCk7wph_6p&B%9A2azf?G$d-M5tE*@t$ zFJ>Rmhwtl{aQ5@mw&E6)E+Z}^W+N+-~Y6vJd>rzF39Z z>i}JLcO&*VA^)IT{JYh=*;m=IJC$-dSZ-ne+?4&!WiIC(!oJU*YMlN`5?^0mS9TL& zU+i>YAMK?7xL!@a#Pzd8pFLzX*K?g>?w=15);D_~tcUh^Hs{m8f_<$pUS#uy@9Xog z*iCP;&ppbn6U6@J2>YaX_IE=1?J+fw+r9J1O;-xx4E#MXJJQ9?|hfryAdwz)A=z-vEc%@vqr*v zl@3~*-t;54?>(-wTkU2ySjgUaE&HP&_9sW#+rMOQ+LX`h%4GJ_@$6~BJgX#qzAi2M zu>Ts$9_7Hka1Q&=#q7g&u|E>VZ9WP0t>+caCp?n9!k>NiYWCH_@f*+O^aGsPcl2h@ z74}cR`joG4wikP1bM|tf9&QxYZ$Dei{qU1V*$+=;*A@1&m@7O7=|u5!Q)5T=qr&so z78OqKsm)&7gS|?b{pCk~9*nxpp1GR6K@WB%;k#PfgZv!*dL{deG3;BqvMXz_x4g#V z-nlc_eOt3{i{)|kqNeOtuX%hv_A+}`Esyg*_`&Z5I;>>Z7rtj#)bM);rM~P(O8LEp zmInLi*Zf|ld=k6WkxC3GK6@(A*IX$_Z~mnWU8OJkeTz~|Uz|{a9-_m(ueJ!&Z|u$< zcD)eOKVQOL)42fCf9d=gePlHIm%Hpg&Db}uWRFzizN1lONUsay~L^yl||USGKW_si$|DDEV`&n=q4_j`k(93LEJu-gjjX*eF^ zI2I7VaeJSzZ|}bTSltwJy7%ONYDeeN30r?>DPO;wG{C%1&pca{hH`wRTLOPtta1fRZu(_19)`5tV-zQc_D z#d`KxPuRWc^ZEYp;d1j&W#2ND^J$yOzw0KfpYTT5kH*NHtO*MP@2 z-Y@5IhGD09e4wH5z4l_^{hD@1etubB!p|4ULjT`n1ovb8e{w(5Lzq|pCyo1u)4Owf z)OA0%YpO-ue|r;HiRG`_mVMzq_I73Ln$y_L)>h!}#vLq2w<|0|_c+aduqEen_$~X` zcs`z^9(?@chI4sdx8eRqrVn2i^#|PFNI%Ngx3r9X@jvzn=3IaFo@3v-f%`K)+qmCi zChSxEy*c+={-(2kt>F75z>S}OD{u4tXnU8(wZ=H`eLZ*`dmmHwcvbe!-Prd8v1d%c z>Z~x}z^3;X=*>>JA1?{#T{`9Ivp zURuWfTTL7Dd9TE7R*zjbpYva~js5ChJ}oQxJujAi*u0LarbA3}6 z)>Ca<&h>oMR=zLXgzwg$_2&C=)lTl`v@hiQeTxnIujP1o6_Z>!(5xBG@w2xM$J_dv z9G{yR^YiJOjU4Ca|KfIG?g{pbUhKv5*>^g!Cyio{?8ZJ;kNtNW_TXvkPi_g`hs$T} zF7~o`_No``@j856s_fY{x3RB|V?Un8zB`+J!d>?2i|n}N{Y8#m(mscgd@wV!=i zEqk#W-xvR7vET2=_t!XAcB3ooj&3VY{u|j%3?&f8&BMu4O)h+bP4R z?1ehq-fbSsetH%AxC87R;@F)d*&7M{qOd)jK6(>-x-I+LaxRB6!n~kW%{je&5?`12 zLF|uW`T9O+#r`&c`wu_galHx>)~Oy7#PxQjHv4s9-K`UI`M%iNk$p!2_gf4uvR4b^ zHa`T{zsC7Y5$5>}6xKEED6C6n9nSfO`m^uyVYd~&gZL$^>kA&SCfVHn(m+A^qYLx{iOb_us>bXT^#>AHDv#~f!mSis_fr{d9A~j zaXZz;f_?L6ZU>$Aum|*G|0k^TGbDlA>z5JiPlfe=j^%UuXaCp}+VXJ*4`omPkKJ}0 z`*$mLtKsY?XR`0!%-%4W{Xj1JGahDByyIalh0#aO$MgxieGYpcA^#6rT;F^;u^Vf! ztEBPodik&?v}SMqi0es^u>ST_H%|XV7{H3k&g}LJ*-r@j-?@I^=c!K@*t^VT|MG>O zL+1+L`}AtV=^w@M^Rnd?_A-C=DTCQnblCUK;rBI%T=>RTDd6$*eSYlGZ+INOU4M3s z$2`vew>f*u0UY=OPx1Q*(>whBqT*H+1`gYy>>iIRF?~$8UibH`Sav^{SUP*YjPGd|%w&%=eeFIp5cD z3pqX%ns7YX5YMhWihX1R``6hVKidiW0a*{iYNcp=jQipG+m-Pj#{O1CAGD31mj@;A zb9cXHJPy#*j>rEym$Ns_Vh_#d{0sZ>xWUu?e4J4aIQ{;<{JZIc`MpM`0Zp*nZoXtM zIK{rE4SS{Vy9QUd95OrcdCl9+n-;D083{GMajgA3RfEMd=7;rqgJEsrA|&tqS^ne*vv!@oN;m;J?G_RibcC$Hq+ z?NpDC^Uz2Ytmj!_JYLbXh~rP&nf$z;{{pjDboJ%ul;^^CE|#bG`QnH09l_Qo9B%{0 zb9`!cNqnDVo>rQ2l zaA2QWT88=0jbr!AVBfTr^Y;qm^GY7i<*?{2yY-DKJkCw_T>h(T`Ficz$@SsJChl*< z6tgP{>#vTo=l;o*UR-a>kMr|UvKK%1l^O7J?t%*TAwSs9A7Kv_)*raKp6}lc-W&%` zF2l>ESna^$ExVOD{xk?*Gy!;{+7M>K#s$03fV2U zazC)>5qr~5>^j1FK}IXNKRH&Iznxgj?bP_88hC--3)ojT&aKXerP))wr3DSSNMjoHJU`FyW^=5qcP!0tGVz5ZG5zZu2z zb=MQV(|=dP_3BnQ_fHaixZXAt-pgni^ZljwkK@CFeH>>rDmY%Xn9cD`OBlDT5WZV{ zpTKc@wHAAG5ANqoeDgnDcm9@B69#bnp;WTANR~*1B1K8EYavS%2_ajFBwLm&+4m5N zvLwnp9e3Zverg8yOaBRRi$inn-;95uNi)N)4PUqJuaKUZakd5uRXh8H}=d*9*=V4*cbV+s|x3C4-xh$s@IhBnfaZ^%`0En zD+E9Ek<;1ZQ|#VP z*puF{duFn~No2phkv()MyMu7~u$x`v=TkS~yao;7JD_1j z{2bkX68pwdo*z)^!G2;R&#Rxw=lS`M>g+YX{Jy5K7W?;Q{9eF(Grvbje$4N2-VS9q z46nux!b_9=>c%Qe|2?k~{b(b04~+^;KT@Y0y=!n8x~CbtzJDpEUzA&duGE)ZKcg7a ztD3PtDlWqG!-Lt=JF$0s@)`5_Zw9-c3i}H^_A6oRe{Zv=4CU+mcZL1R1NKHbTyFWT zx%^-L=6c-TlH1jMdv52iI`VyV_defumV5Yqf1=?2B-@MUf32l3h49Lw`ZZw>bMoW9X0_IXSBcgt?_b!wXM|N6Fs z=UYmId6?m)T<^-lzRFvc@$b(6#n)MXB>%5oL)hn-b9>P5#QD$M#MhHJkKILRKWSB5 zZoAfU`AogY^HD)N*jpcFUuMGjo5ZlU4`hGeioO1P{@t(E+z+hz!~I4;D$h%loAW$F zT@3e2cHC_%eiv~(?|Y2c}~Z^+#ik+=I7moedCK8a(_F1F?-97+;4vn_A`0qp^61DDS&;qaK7ZG%{-1Y ze8l6myv~Xf?A@!_lbkrNaK6u8=g#p-Kr@ct-1o4*dceN$HhWks z``}>qzXt4|C-e0eP2vCBWEz*-=`CC@t17r2_xE8paNzhPPmkM4>vC>~{cmtPf3$+{ zi#yVH%~5>+x)t&L?pDkFLs|(oPsQE>?ti*|;{GkZCHwRd+&^cnjd`N&g@?G+4l?Uf*z0J^rOzP&k*(%Z?u*F*Sv@9uC2Lz!hG1PL)a69eb=Lf zeB6X{Ig@fZf2%+2ji0mYM6sV2JYM(?^olmOE7!s7RvX#-maq?W;`VGZp1s#}c9Y}m zErjog*9qSpA3eqQU3D7!q&)U$C%)f*d}Y6}k^7AS8r;vEI>mn3oBOM`X57EMD`#(V zk>i#^Vc(3@S=Vf{pbVsUP4@SO}I|ep`1@mIhW6obL?+tvm13}UwxVD<+~>PhIw4S{j#~8 z)OTmkd&uq0yB)jb0&cfwi#dL%-OFBo1p8xQz1+Yve1ENTV_#~)zRHySmf)H$oPLL} zZlpsjr|+B0?zf7)ohADk;X4SYuAIJNDEnDqJ+_t#rw_>IelPtRyVr5{7*F=MJ=qg# zxPSJ2%HHNO`;a5-b%)sh9Am#O_*-92|JI0omat#tzPmh5IbLITImX^{HTwxC_Vc~i z2lim!>d1c7pS>=YeXmdse(ky3+=cZ^%ATCwM%eH7MmndTrNr&fL)eehV=$-Bc4n`h z$v#8a_pfjRr!R41U*C$|`#JyL^~c$Vu48}i&i+d{hh0sN(?9ve?IA9YJ?b?3FrmHm zapm+kjM*c38daftnB&a16WG7-@Tj;{!Ex->RQ6>@+3$F=*OT_y7WU`R4nw_~SrdPm_L;nOOdzHKT$zZ^WuzCbwt<-a<9&KfJM|C!a5(%ZjZYlpGy(XaWr-bvU;w>*>Qz5RrJdo17Z{P{IIcIC@F55K>L-}}t4VBaC^=bzJ< z-wS-P<@X4_A^hH9jX8V$Dt>=awU>R54!hCtYU~KkFW~ntZ60t((`zhy($Nac-!Y;b zeQRzRdYwA^#)YMre%djfm@BkoPdQ$U`Rr-W-uZeFrhhE#^V3_O)6c#48T09x%bsA$ z`MjCUeytU|S!4FlnYho7UZt@t@T zsTI#Bm^ktKf`Du6uRm};jfC^R)XjLFVQ3;>XL3G!#9_|o{(HWjc^CQmo&5Q|$&G{T zlb5pZi0Ay{>iBwMzwq^Y-{AjiC44{S>cjIbBXl?)%`|q$V7{ILf4=_3d-?w+3g^qe z7WS8(5X|}fDPX^=;PS5)uBY!izW&pF*e@4zIpjpKhY9;)Z9dQGrFB_vbh%!R9OC-j z)|LJDRPF~Z2Mo!Ev(3D(-K`Z{mKw z^f-?TxBl`tV%U;BCxqj@C6zo*?QF^3X&%RW%6E7ijDFAYTMI+>7ms+H)$nHjq|Ba? zQ;7r8^fsLS`)&5@AihouFaE#QBe;ArRk%Fk=CC*X!hZZA*W>bFu6K)<>~>}BrhnKc zIrH<#OI>cC8DseQDDgVCb2lMwxh$ObvB;I56ZZ+vo9E5=e*D&l{a!EjBg*WT_Ve}l z3g>IT8_Ma69|5dEo7$xFDQkm?)h8W%r)@&xvO^4xBog z`{DRc><@Qy+!!eAmvS~w75`X^@jUKi3H#dZwC8bf@H6(&o;)sZ7xtNKa*N}H{R=ow z*j>l&Zr2R|@Aeh!drq;p{lp$tz}(Lo&CBw z*W&^ej%S9P<@lt98Mn8}ByP8+!guBNEBStzv6k;I=VXpgj@h$U=(6utW`Dtt-HNos z*xVGRTaovl%dRzyz0(nP&qn;ef*sg@ zE@p4$!JcE!p3#9_tpR&c1z&&hQ}zj=?AHggn+WH)eHPZqS6=0Da9uEalQrz87P3#U zW>;2b@7$QZz>wXp7kjHN>@_XeXXwP7#0!#-s**GmT5h`p07E* zzB0GNRl@qEf^M8XOPBqcus%vVlCNi}H~Z>0v-iSOESdQAiN|Ac%@TX6a*YV0;V zovG;ZgxgixQT9et*%iY5(m02o`+A*aU$c`vK7d_o7yC$IosY^DP9OA!eLyk0rQkY0 zIK4IxJBnq6oPKx^d&yjOPY?F(W7)5MLkrR+cXMQaDXa@xGLz@k>)!D^e6JDg^EdE( z{;%fjM(6qc!ewEIp-zw~YYMt2~AM(I?-DUjZ!Atl%a$Bpt$M`I9h+l$APjU=#UGe{ zMGd{)Ee^z26tcS?Wbg0JKFW@Lw<`O9e(byTcpjtb4tqd*o^J{9VZU{o{g|-tv9d5< zq#wc8b48zBLs-}0@`LMZa}N8Qj$CeqZ`qxX^7Wh@#^rERC7s3z9n%z`UvNC z6&i9o>FdD#!^z1!FQhK)N3mr(&#N44$^BJ`u%GH%;r#0w@x2ent1XUke?D7>`~U9s zc)aL6n#Y%#BOD*@5!REJwB_+@juXd+uIW4uDm$~+d&qHMYCra(`#k=-9A)S?rc1b9&a~xvY~qw(-J034w?54t)`9Pf-|N_Q&#-~KMx0Bj0 z+^z<9XMbwX?bCENKOb!q&ez*Bk=wscNA|!{zK=5E*i{#>zZdrLI9|s0@0|$tUk>d1 zgmVErws60(c_{lA;XCUzb536=ydQ}<#Obdjv8N=mPe00jRrs#_^Kecd&%=u%ZU^_b z_Im6N!u^bhuf!a60>-CS-jzp&d)-XmtZV$%Oxm|r}%g#C6>O1Qo@ z)v`M@;ryGLvMVOCk3G+RyaAWnupaE6EZG0`WDgMPYwZY5pWTQ3Y8Q50;asy0~Nvsjh7d|1Jn>Ot<_Zv@y^Rsq-;C^Y`PIgCO{g3%) z?)Q2HvyU0WUh|Xt)g{97SF;|Re(e+P&+|61_qJfKDdcgaEP}meHM_|Y_MS7@J6f|V zar069_npVVXMfnAXmkEc`ml$(vxkSWpA^<_qzmz(XF2C{;wAg>`|MHY*sC_NcW`1q zWyY>-$lgSkeX213ur7`3#eEffk}dlH;hd>8!oI2Aw>XZP7RGM3n>~6R`#2#VCt)A# zM>jd2<*(WM*09I?WB0CQ&&p?a6FmGKr{D9Q{jIRy&eJkZe@dC_*S|gcSVMM`PV9QB z>^*b&dXysAW7e?SEnvSXd=E0F9j90O%klsDT=sSs*k}2$N9eG-T;%7J;co16b=V&! z@N?5s;dyX}u>ME;63@Fj&t>1C!LGZRJKV(`**oR){C2$=?Bh%``&)M#?*ID*^Efq>e^&9ulH>nlv-$Z#DS@ABT2}LOQ@JBQcOP2A zKIJug*9YteMzHU*Wj`(CAE3?;1})6l{|NIH+Dp{1-A?_={`DgJe&IPixhbb_-i=*5 zo3Gz|C;ROn_VWGg<|h2R$2;(QmYW&u9fkKb4JYyYol%bb{>a+0F_!-bVIS;65*xmZGH%aCE2lQgUJ(jPt`!_D1g56x6%|~(hH&W+% zoKnK=WaSUOANSUBzmfNz`dl>Po4jvISTVZZdA$5YcQ?EfO!H!NiTB&>Vy zQOxP}y7P68pUvK-JD0cB{SWmkIDP0~zJ9ZL><|3dulcg4Ik9hP%f6z3uQTK%yM-sa zPjB{wM(o)yxSv_Ok-c1>y?r$IWBXgPd${rQbyXbqpBD_-eWUO(LgCbg{mx$Qw+)1S z?}t3#{{O%E>`o;-j$HR=&;G~p^TQqNbFJ8KzTolBHIjXm5TCcZ%;{C~*+^Dwwd-&wV?I%+>_aV5P+vloN+|JAU@_lhBiT$TC z-*@RkoX|+vZ|&$a&c{tSFKL|y_Zv$r1)t7-Y(M+K2=<&4?EN;g$8BWy*~Xr_ggsDL zk7_OCKkO>!v-Uss@BO*|FY{)1I?TRR*atYSnA5ir_S?DDiQ|D@L)o>Ku`f?%KlPLS zm@&sKpU1K**06h@WVeoEPmN*U5Xqi>ls)Ab`}ZB}(^s-P3hRO%8F2b0U%5O#C9ofx z#cor??d0SN_PBrCo;wKpl)ezoO~AvJKjg4`3;D0l=kz~>{6p?=`iyw?0%6~qm+Lrv+!XfKw(R@5 zusaI-cD8%L<8{n&_6JMZzuK{P)?u&B<@n)4IJ@0qcC}&bWv$s$gn0=^;k?xQ@f`mY zM6)Xk>ur2Db9%p}?B|5@UQLDlRn`pWd`1ppFY3*1(~EuVQ1%AG?=~IG={NLepVp22 zW^4BETI_=azoo(HYYf)Ex^*d>9bE#U;0^DH&4udkI{ zzuQJ~yZX0++jF!r-!F<4eBV`8az79_gZsBGm$+Y5O6UH3buf=Fn^toCQ#&84S26oK z$BhlEIG+EzmY)~ezGvST!p|v&o%#8wr7(Y@ahdZ`6V7WsRFBh75uTgeZ8`nOdF;Q0 z^Ql+GaC)U#{C|VqvgiL{xBJO%J)ECI`(I$cUB>=rBtQSUUuPfJiJ!YWA7|fa-w+$( z_hR-bgZX`s@ey|A5&XVsY*&7twK;=bzXz}9NxIH{`2??%sSe{~3@8>q4u{N;FNZU%e90QRiD?Ef0EXQc3RM81RI!ah`Q(>PAMwUzz&aQ3+V z>;@Cq|7>R;@rJ#Ra6X#zAO63uW4PSj`fxq=oWkv=-URMv<_O=vj1=CJcD3X9Gg~+x z#5j!m&-$4->?^(r`$M`7=XlaDfcyEW;XE!h3*>P`X)KRBl{M_&HgP=TP|6o$m z!ak5)M{)X@ec3-Nv%iYx>lx+A{zZp<@+~e0w?*tR#_Srxdfmyw`uTpZxW4+lV;?HK zmnmw**OPC-erX2#Nk8_!%h@gWu>TOg>$iN!=}XJl@2hitH66}=LfHRdjBxJBttQ;A zdJ5~b|NZ3Oos!KSCA{yuFYHSYc8$xSm2iH_T;V*F+roDuNy7S~nP<2^39@2W6`oIH z9J#-GeUq+LY+<+M=~c!4QQWSMrLdQna=Y!jhkeLB_Qns`n+fl!GlcVN)@E`(i5J)d1KC^d zX76x}JtmF)zZdN4)$C=K+&}Eu%Kl1NAC)GY6O=fZ`>Pv4?B$j0g~D_CmVMlR+B|1> z5Z29B&f<7L^ALOgG3fZ4FKfYmLHN$A$73#^vIFdog>~AcZ8&|)e6DxLW9(Vh>|KTV z+hyyyJ(qT1w|vLz8jh#5XpD;hRxPo`^v8wt z)9-Qm&6n5*9%LW0ls#q=du%)QMfu!6XA9$nN-s`7TUe*0=Fj74XW=}re^+@NZ?%N| zu^Icx5{@4V64~bkvOk{9{&^7li016~o^$-;bCG?^PIis8?0TN;%iP$*$FpA+*27Gn z$mvH2>qbUda{9AI?29zny;Rw=ia8Enl)|1H&K?-dp0S0!#DhI!9J}WzcCX>=k;3`T zt@?2Kj)v^f-Pkt^`_+uB<>!LE&)G9SvU|K{SKiA0dk}l?M(k}1`F%wF{p<~`*e&1j zyyDz5>{dbS?I*F{(P5ul%k!K&->`oEqlyqp2tod$UY&8*Yhaqv2R_<>n^5iuoo}q2hrrUyw0Z} zz8VKMr55Zp?p2t6(n4P6)6ap|pQJdHV?N6xcsm1!Zg4q_70!=VSLNry=SSGL zPU7d#PrunWuH@(6%YWFdh53Q((1zHbyz=4o9+}nb6NK-h>EU%Zj8vw0BzU!$E|Zr823{GSQu z)1~NhdpPrf+m*Jk4(-GSZs+>K`np~3`To7Xjr+rPy|CFT-U;7vEFQxBb_XMltD6qu z{{N;Mj~6cmmo6B={pu#+ z`^5HE+;6+-a~w6fF~?C=CG3sEcpTB~%W=^#;eF7t9z1@{UCiG7BD?-0cKa*r?q!U~YbAzJ!bDw#6GJ%U%%}-_HEhh z`W?AEYlGRZ2wOp zYQq)w$&I+dEu6%zD?FEN74}aUCG5{oQOx=KO6LGx;q(><*mtjH&sxTAzJ|SF5PO3& z>;>uU4H|O4@zb5Xe++w^3inqp7O{W($bNV(_miu?v9}iX3$haSm%A(M7ia#9`*ZC% zJYK(vU=OKgpKQtFPHQiA)7|Wwwy}Q}*59fN`|W%X_SLy`fb(~l&0f!leg8KuhpdzA z3C`@M&DnjQa((qqVxM%5Jz^L8ft~DDd)dDT`$4&cbNa3u*oQA?w{l@0(2xDA7Q4T& z@BN}D9Jg#c$i7QB*FL^Kr=Q)LUA2tw>&0>GRcqJ}3hSR&w&3(0@3{X-4ri~L&R%Q5 z{_qd?lk0D?f1l63z9W0^C+^SJ3**jkdrrTMrx_H=S9x6Sy`0_Gmi+~PHmWeq0w#!|C&SvM&<$6gvGxm<#*xv^3-NpS9S33H!`sJmPupF=6b{3)nrzuutjCUarEv@fFWsWefY&_y%zL zT~6$Q!n|>0Jx>2xn6Ex@iRb0=HnS&9W?yH`{>VuFBYUv>l<@rL>oE4~)7d8sW)I5Yc~?te9nQFa+~I2OX78=R?tGf(jRVKBZ!P5c zXG0%$&nE2WB6)thqbB?EFrHWMKZM;ip4Z_7eCPETYaH0Kp71)HwFc}eJ*#j4TQj&4 zz29^Cu>hU_0*=yL_U1G1F$Ue4~{h1T5dvU$S zUi*T*N;vmwS3alj{+#`cu%FL-;eQ>z&+Bjw-r@4^d6nyN={2tR;=9~V)@E?K8g!G} zq1$6_x7B4lKj2)%_eJpzzK_1t^B~=H`nC+2liwCyPUmGF?*gL|F4MG?62E#`K%hvesmjqR0g|M1^W?A9%mbW z<@CGuup58k|5eq8-DWeFn`a=`*Yhd-yl`SN$04uRa6CWu5XUn?NgRjgzv8$kQJ4Lq zupZvy8^>K48`wYfVV~HX{Xlp2E(h36t@(K&>o2?B2mZgY^|(A!`*8W+^W*w*4dMEY zzryX|jPO0nPvLtRl{wsQhqmMPzvex=%6^`=F>vGl@N6sYKMT^>O_p=~Horah&kYjT zhqvc`KJfti!LRI1hx0fxWj%Yy1NNnQJWjP4!fq(62Z%Yq>6d1*>lU&n)Ue-C@Ho4& z1-ngWcH6G(mmSzG=dd^TXKx^UNAI7@=`DM5TrqVfdwprWO$Dbn6uviq`X9$Rm;5*` zn$(Qrs2_>!9p-a9rm5igEk207%MbRG%{V^nr^Nm~h4bn`{hJmzTfNHa(|-k#QoKRrQGl7g>gT*^c(lLj$Z6L-gCcw zDTqDFi~Y!C_OhAm-GuW6bcAya>V$PE^X&P5RjpxPeU&|;nq8+0mvhN*_TYi+3ryLU z>#+~{!PoQo5xeSY_6Xs9*5U75FNW#thaR$TOJ?7Fi(R*beYh%L|J-iuZo>EYPbYKw z*S_pZtJs$a?+xocX*?0e7*J;Y*+HVc^qhC0m9cS6MPGArJ!R4d6l|9dd{YnAX%bhLk2||20t{bP< z>Bt@=#H;1aIel*-UiBEt>3eyy&soMkYdd@D5%$-2*~5kT+f?CPVB_9gFKdK-qI@QE z`kdM9<>T46s*|);QxE|4fhWfquFQP<^E?#clP1J^Wa8p?%#}r{nNG?a(`=h zlKbthHtgpbv!^`e@#4i^c3W?Dm*MPs{n=j_vxjT4XZ_`I)Au#|;xzXBSoS($KOfim zoZfjLdm~|;^F0GjpCf$#KB$`G9A_cE%@o!V^$X{G{DioAS{qKU@`~qe)*fcR?8&~> zoIUav&m%cyvTMe(Z@tF;Kv+MsZXT!K;LM&RtgAV0%js*?*vDn@{OzVF_Ps~h-FC7s z8_pi8$9_PAy}c&8-XET4e)O7ssIdQk&-0vqW)k}bVPBor4xHY%CHn^x_BSoqRYG~b zG}xMbo(}tiBA$=kE6l?`eaG{h91wV@aHCnKBjxUkBe$HxP{JTB`C^A#h7_)Yme z$AJ}RInE62&hhFM;hchNft+6F7W-{GcGVetJu&le!!;# z&$q{RdtN6~HJsP0e5+%(_`v?-F#DYX_Hn+=v3$}z*u!c#pY4~~ zE8^MbZ(@Iu%jMJVGnZ$t2JG9lxxPwOxPCQ+_e#ln+)m6ixLq}x!tHR7aQ;Q14!7r) zt+@Tym-hR8&G%jRv)s?@v%qRs)RuAo{4#|5^W`(S|Mxn}@wSr(`<`L!Yku&!qn^v& zWEJPLvp-+w1K~S@7sB}hDM6f1Sq*!R;QO;V{oB9nzCYOAF0q>l&xxk{Ieq81TyDKG zxSZSk;pc+h!`WLHb6hcAIIniyB96oJh5afcLpZKJv4G>}k_e8I542^^n#XZhN>LTw zNCWfO@9J?rgUs3U53-+1=Ii|PoB!`lEsg^_*>gD$d&Kc!u_xD~)-kSkmvh{Hbj!KD zwfMm8vt}FjKLNsbRmpYSj~x)ssSnb_YE-0MVqf6I{i>4?*Ok8D^g}GT-ySiUJwVup zd{tLYzij~f(}CP$hgHIQ@-DAA{Y5*DPm|KQKbjBRz^lDM;Q&zAy7WNu3m`>0Zm2d?a6_Z-L`TEOwf;#BqlkJ(>5WY@}Nw^#7>JaJ=x zaG$+gh=1yY_iMXGa{0U0u+L89`mGlB&*`Ga{l-<{d#+BSxc^!HhCO>c_hW|=+0(wW z8}{IS@~Cj`kK=1jzq|?e!^Y<9Ustm?5#|T>>2v(>YB+n*T=s`+*!2&yJIAmGhqKo% zWmg-+KEjnf$Ww3!_JhK?rF+|R`Z2=(fo+6!Ad@?BK94on>uR}vX9(*(G7LGNM+WR~ zh4|CRg3~K|u^$!ceN+agZ<);={F{BN3CA-t=djzXX5Zz(Zq%PWS=cvei3+E8InUQ$ zzZ?5K;dx=LGS~Zi;d$iTWA2xhYqEEC=l*bH7WcQ~g!4wn3hN>3HgKG9LWlj@6CM{% zpJR91#s0{dJ;j8*u|9h{VLr2LJf}bC$?m;^-S`;$idXD)JWZmw%+n!?k4Nku z&$4^ZVgIDX{zEu#bU`nU2mZX|cxK}#d%W;n+p~3?{_bXW&BN>|ne6F_?5=U_ z<`>wNPO)z}&wlI>`_>uk^UC?gdmF<(A(TDZnf=sVp8tF{pWSy7dx50*ehHwZ)bBmnRp> z|J!XLKQH)&^7BP^;kzN{b^IK(I!g^NC_bI%y_<#cJo((hMwriZwvg0Lxsync_Ejl-A#V3S)j)CRqMm`YnR6D!KH@V&)}$`m&p*XJQ}~|UatWuOCcOW366V1cSMdLB{FQx1 zEB@U(BiI|=WS_YRo3rA)E60KJg*bVO36EdpQ+T}7n91Ygyn#ILt*gaxV@WN$_Awsc zJ%sPR2l;UPpr_99M$#Jg%t!1A{W+dF@R0q88OKFQ!uhA`?sEFw!nvqjg#Bb%2!5@Y z^UpiOUVkL}KPC3l7q}dL+p*uv;&OJdWlz4u^;=z^{qbCGKZ(NotTV# z_CNF@-!Bm#`2LEpXHU)KxUuU9c9&Sb-{XY!BoP6e-Z_vxdpmnfB>QD0zD`5oJyhyt zPVd{0%jdnYU)iP(oPLs!esc>>fBiIH&rspqB6UYDhvK)~KkpjMK6NVh^R8=o9Ql#Q z<8_JydrmaRv16(@PT0|by-GMgeY*?CAq_0q1Kw~v^Y1kKGY!s1E1P|_@Sf#_g3BTN z4*Q0eT%NAVTwg1>TT=AO<$Bi??#C0h+z#sr=WME{b9!&KlVFD z+#jxK%HFw-^Eso*>7Q7!9~;R2O88!;YeP=|q?6#T?C)LJR|@-{1zB+V=2O@+L)c$N zvo90Q@l~{I=6D@dL))V#x8X3XqwPM)QlGx32*jMMX zUn*g5S)HwE4%IxdM}`HTz?A_M`^vD?V`l-#wZA z-Z}OIDeOv>?7{!BdkEKK`;OBm{bJW|!vD8-1*cyV%|2ue`{L2;p}#mzJHC)THhJWIgQ=cie0mmP6`e>MnaZ*!VGVjuf>P4-Ebc|JVsJiCe?`?WVb z-#%tAyWcl{PjU1b`&uRT<4QdL|Fj*yFZkue?;Un8BEn)M~&g@DKF#y6`#W8^XfL2=hwzuFQKiu z-t~m{H5rwBU+>H1{^7Z>K5*-E?r&EM`w#cO#_>a2;k|$thp~#78(6)H(5)Q*=vZ)zv;P>x*Z(z!rehIYg*N&8ypa6TW@*`qtNw-mm2ek=52M|oIK z+!FR5`zfpw@VDare9jW?x2FoveX8B~xnoafevatl%g+TzVtIUjk<0Nw!hMdzQ#W#) zylNQ7y*C{>zExOo+;SzO8vBioksSYwRAS$Kn&Z`zBiY-|Wgn@``NutF_qxH?KTFu( zGHL{u&+%+7&kN>UF9u7v9_t=)y_aio`_VSz_Euob@k4$cdmo{lhYRyRZF2a&*xrQi zqs_UTK5#gD@MpfxxJlJpL=249}d!BA0nLRHT);{^G`dlXHVeqdiGHs-z$Z6w*OXeoDlJr zPV>dx0G1$Nl9vx!GCv z+HUNYXE;9ZG@HHqT=tAb>;_Kkt46R--@{&VmAyQY-D^90vLCyNuz${xo}7N*FP^{c z5XT-G$bNbdyUPcjH|}tg-QXnq#|7-;G}-mSc^*4RINvJ$6Tf$edBDCw!QQhm&#Swi z<$3tgOW4<6=l2&2-}8DKwO;JX1NnWy%wGI{A*ma`rwFs*bt8Gfsp3BFunx6 z%!vK|K=wn2i!q;tp+)GE{n@QwvR@s_`7i3j*W+Zy|94hfF1OxixSW$Ga(x9laXaZd zhTH!{Bkm`SdUHSgScUuTs6y`lFT`^kGT$7FUtz#upyH`;E~iIt&c9+Dd$A4w?zV;O z>xA>)ms#?-xxR+Wp-(J(RUnsV_;s$AH_f?!ZoH5C)#!ihV~21)Etl}`T0Z0JJl~kh zxmg>IS9kQ`_&H2C-+B3ohFCGzg?avHdtN_NwXiAX^Ub;$da`?S^yc$<9n0c@yzXV% zBKC+coXspUcmk%nCBTPHuLvzB5`*)EF`#@!W{wU;UE%85?1~w7ClBqp0D0 z+Uv2W3F}BNF6VI}el7R^wKm+ZcD};>aI#3J8clhhc&|Y<5}zYdLk?<)drP_0o1Z z_cI5DeJrD%2yvZoPFDX}-2dBs=YW2NH;+een)5hbIFsXtLg8G|o_-vMlx$}A8o>TK zg@1SVGWLr%dHae8MP z_Wq05zprKAo5yapgv<$@RG72Kyv?ZV!3F`m6O}oPLcn zyRkO=%WS@$HGSB-3E$US3h%kx3%Hz{M6;I)-(@RVbNc(1>?Oi{+KHuHj|sx}8dY<- ze#48|&z$CR%iF`{UnQ)onbeH?lP3x6gEw)%v~w%RS4X_LKXen;c}589XBvFsetWVf zj|-25{ZblkU$lk&bRzq@9QJ3zzB+@1_+;U0 z&gX;>uO^sryB*esy}^6VKPrJeIEsDGYWALO*l%3oc49N0-LF1-mt5{oPKL0%^Qa#PfbR z(d@hXuy0<*^NO!h`G((flD+d;_FbddyQcBHci1>~%~tHTncM-zu46xQiTy@6`|^06 zw?CrIZgz!zVH3_jWi+RsW4Vym)x-+tBRHQ@$8xL6Hi&KIP}f0e#u8&cf!e zSZd49eUI{a90}UNJ`m~iJxO|!l`xH67;qtF_;rh+Y<9PC6Johs@wsXIv&B+zFh5fhx zd&d2?u_KQQ+IBpS#D=hkykH;Hoadj<3-9qOk8nPQpZPj3^k?5EoELdkSa%dTp68Rh zIW4GzhmNuj*us9qg*~J_dt<&$6%j_9Uad2G zICnFO4*XcG=+ukzSv-L~#fE)C2lme2d7K?BoOiiw45z>Tg6F|D3Fqy)29tL$M*`FaY3{X(aH<8sh`z~!c$&h@hIB;PO3d-DBgx{3Y3 zefAZtxF67-&0ZJG?tYH_(H-`nT6P^_UtHsv+>hB6zu>Z7X z-!_K5cpv+@3icB4@nT^hk1rGZ@HnM*l|4&|$KOMv*-wYE7ad`*@5a8o zE4!N}d$F+Yy0fs(oLS9WC&>B+9yl)arUyLLDB!4~YVhqCu^W-l1RZYf;P zabexmG;_}9sv3K}AKVVRl(Od}vH#n_t~HBY(}>;oE#EKk!g+ajg?$vWJ@|h7E%bY{ zJ@|h2Naudr%8z}4u&wcXZv?%_r1vD_4x7Z7DYVnhpl73ZNPp)SdV>1c%Suq62~WR{^NKiFM|EeLiU5R z*j=31$J()13j0;oICA=po7s);vOmdWAAN;=R~Y-Ux$L!O>~A0Nyw_I1Ze(Y*f z_9mNn{xhe9=iipkXCJG{e)1g8_dXH62b|EH(+{lU`NJ1N`jb|iPkJ-~FuD#^< z5uOTmhk3lNX63dj>{wmOD$tXY%F(aeus^LV#q>AkmY{z+$^K4_^9eHH^f|wZG5@vN zoX_-d_B@?3%xB+J{=bC^F1O7&?EB-mUdrvcJq%Fh_M_y+?XyEY?oTY&b3gWa5ci+Y zMzas;&i$uX3j2m29tTee^9DDZ_&Q6HxxZ~J^v~@Zb3U==>>uxQ{xc)FJO`$;Yov2N zmxI}dr*S^gdstru=i}3p|5vDRUR9;=J(1geZ2pR@6pn{Ygzr{@vv@-7SreYHJ9d}n zy*F6#`jbpyKO7@rKb$|_Jdqc>iSu{-z}M4RmD9WRV&729`7EBqZXC(wb7}_rv!3j; zv(&L74_k1(*c{~N^tAEps~fV13Fk`8687EQA$(VEX=QQw#AUOu zT*>v~mCN4xB>N$4cDKX)yAL+9`$n)2e$3@iu$9ZLX8_lGy#TJqU}1lQcQg4peV}k& zfZ1a1HwM4t=SoZA;HaZ-`1vt01)I5|yBYhze11;!?aJP(lE<$|e;ywnxbrwT_Zauj z(?4^6ZfMBf>JpC^?GxDN3G49x>(BWs_hFy;kn_JRtosdk!}0l#W9*$eu%F(>ar-M_ zUBtJ8oPMZ2=O4O-z1tIZ>jqp7*Ol0#syH9_kJ^1RbPXYQA}590o<3pW$RlnLB_HgabV7S4hFdzsU(*v-2cM zuI$I-dsB6e2X<$(>qK%~(L*>t^!-wfPbS5(*Su%fROfiUU( z&#))7B9+tueA`|~PxgKO*uyL10`qKds*SU+>6Klj_A zhuF&-bN~NZ*gv`W6{kO!#{O^`d#r*z`zBxKR$;w_MH-J67li#x&i&)^93YH4GgUbM zsC>@HMwtI;GI#N}gP%H|djnw}?3HlNTElA`w={pr9$3w8 z@rV83S9bf0?0vein?>{gU2MzV<{g)Fg)Mt?VI9tp5N;=`Hta2{xqrAkl|5WoKdHNy z;~7t3Jxux`PCqJ%{a!qK+y!=*+w3|2v2QJ6_uI$*TZrG(^*DX#5ANr?TwqTc!v3?6 z$DOG$?2A0uzqe&yn9Ac|gNf{8D>(jHA?%YA)`QdAp62=9CBnH~x|cX0ezc6e%$fb4 zGW+1uJdc!pjJ@I<`?m!4Zo<9+@xpsvqY|F)s%yjfA85#~w1V^b)|vfjd-m7L?3!^r zkNw4i-NBmunsDxw#VAg%5zF(0Up?42WU;3nXZKI#`N^{**cX_vKd#{U&%SHe2S)P5 zViRG%nr~})KGyL(`x_5--$OF*$*#Z9~#Z; zK-7-#`kcQ9DzT%qF<@7p!M-4_0`r;SQHI_)v=lwzDW`vRi@jm;a6xT#sIVxt-K(Yi|}!Qf&phoM6`pZkm1Z{6a2776beuOH!jqAqdy zXS?(Nt!l}hD7;sFExiAI-hr?$j>%7T{DGPNypCnvtLB)# zn;ZMCZM@#b>m~cTo$S>u`Fhfu@qGT?p8UT)=<~evl^^`vaQU13$Isnsg#D9qg!8iP=kopj?<7Aj z-$~(qo1^Z((^KFyqciw=9bFb^58#OdF);_DnGoKs-mjQin) z_dE_xdcouATQhe1I36!-9oYBxVqYwzcd+F2JudLLR-?^6&V|QErBOW2noi^A1>^f1 z|9srd{(1@fvRUjs53`5r@b#n$`^>~=ar%kz?6I%;cUx@Z=a;Gge!f_FgX2ciyBue> z%&*3NGHM0;m;LO%uAG1CD88OMKl%Dy)VUmNdvm!xS%F*r`WtXN&lJAj zNipF2@w>2IJ;R#s_uq%v_X^)VSqgFcUSYn-P&iNIi}1btjxYSbS_|_(AC_?XT6^~S z8`(>mayevNWDnWN&lj!tbAKBb%kz7OO}IaIY|rD}gZn%__7V2+I60rkoZ*n7?8 z7te3v*%KeIYeun~RPpb=eZl`LXd#z_cL~=^-=kc=(s?4=7V>+;!|V8dA6dZtL(>=R zT`V}CGgH~0j$qGj$=*bjJ+KM;ypMdH^ER@#$me+Yi!b}EDePOk*fR#OJAdQ;dHZ|z zqe9%iyfx>qRmu4r6P`zQ7ht%gcpSv8Jc(UNlU;W=k5d7C*bUmSPw&oNsKK6=&Ew`w z!H<0B^gWw#{=XFL&jkOY#Od`^*u(0x-%91{Oy9&Fx0pTkK6`vm{@us^>>WO{_u95PO=Yzi7o?oZ3>sj!9{dXt(sw{TjM%SNi#IUQ4Voz$xK3bRkc?0(0gUdrX)OxT|!#gNCff%n;~HuHLnaAAL# z_=`Nw>h|JsxkfneZ1QhTe{dMbOJjPouNUI99SNL&H{pEMtxx%X&30n%9M9#JXv*&K ziOavo9rn)~*=vWe_Y>A@bsfs-vsSaK9cSMe%$~8A{Zt%#_$Btgi`e_Suy3_v?_$b+ z$$-6$@ZH2keNL}i$@k;gT=u9)_W1_vho*7=pqtG7*o8jq|AcchJAdMFr(_WO#cCeE zdcR{&jA6eZthZ@o%;^)f*h~KMxcnlEeY!Wh`)8g{7_ySxek}X3ZtV8|cpjt23-}~I{9~923&C=xS>2sU&2@POxY{kCv9na^u1+v!(^Jae!@%)?lPoA%P8pIyZnmuv> z&j;!V`{c}t=6S`3={yhVX3L&s!@f^apu|GaH6 zd!4X<{`raw2>C**tIjT7&)LEcO&9_WA30zWV)Np7*|gp$a?7q$%uOnzKi5 zsK9(wzm}p8%Pv7L6ZW_9+rjChT#GTE$={05%hq%H_rp2=)U)iXb=XIJWFMbWhSzg7 zza0I&PbGTDIet&k*NNNP9WTBw21IfHFuE1@d!sIKKfHMck4N9Xa({cxkMsW#!QQ_; zdx0MJhhd)le{ThH`6R#P`zUY}`}YZ)&pTuO-RGg4e&{MrKTVham&$V<7upA~YYXdb zRP%Y9x>3mWo7dqQ?U*vo9gp}FI=9vD_ zRLnXuHU)BdzlW?xtzP6;Q96=g}i>ox0u_*2m>vwm%iHC=;Q6!13Pm*hfTS? zxtg<&>cQ8k6~OKANgFPoEe6~UU+(4d|0`e!;Ckg9h?w{l5MAyTdPed=i&KWz{Q;hllc3H;WKAH1*y@0RBNtpj^#^HmaT-cZF zNF(mId;j5a^X7Z@tjp}KuIy35cx|T2>A}>U{R! zq3q)|_;;`WV=wdM>sK%0dUTq=^{ylA2i0a7w;zwK?76~sF28L!eMDn+_c0vT-9O6L z|DPFq^&@`n9v#U3azFcVH}>tS>|Z*tUoK!b7xuZbe!%5m63FE?HH`ZQm-*b!{7=_? zKlIea0UZBY4GB>pBP*qBLS#jcQBjeQy`ro{Mv720sH}t{B}J4ZqwEz?q{s}Vr6?3- z^!x+w&#$jOo$tBl-h0lu=bn3xnHN8gELe-pzGBJ%ZbyE{a=qR464&#KpK-g;Ls*Bu zTT^a-^9HcL754Y>`pW&ck)`bYPP6Npuq%6Ue{y*oAMgI3Tt1ri?1x`)InUY7KJ7UB z&>5Wm%mbXyUBY+nSI%?!$2xQWs#hiV#|(shuU^p?|XTmE^KP7^_pHRQ4+j0IM{m11{ zvx@KEqGG<^Hwx=#nhN_+EHUPKKIAQrZ=6XMT-e7!MOf$UtTm_eyNKJPVJ_@7t=Sjc z0z=Ydz=Zk@!;f&NDb2w^a7}&H1?E=Caqn#a^k;CR>|T%9 ze+c^-{p`T?`OwFlj-NYwk^_75p6tDa_A%3*%OT(|m*?UK?B8y(Hx~AtjQYg!wnm&E z=NR?@o%wkGEoX0ko&BJ&Zv2rnK405yxP3nz&+hhs{oNb(29@kq!aSwc!tc(W&FM53 z=Fh(q)`Pk$TyI}O_`Gbt!sqwiSMFDA@nrvF!al4Yd+tp3zQV$Pquz1+abaG~T48_W z(v5t)(IePfzUANb4P%+C1**gpSd5wL<^|1X4_RX!>L*uxfA2pkOJ+orB zCATAqXSjcIsyn;?CGP(yFJm_v%Wg1`-LNhDV{P^sgV@ssvrlWpzCxIX^J5&3&rE;F zwvm1Qj@t?^~>=oa69BGm{yUiIMk1`5kw-eS|(D}mSbqhzZd%Wdwv&@DZzqLKP zQfv0_MVx;01@<;u+3S4RJKbTgGG)K|kH>Xm^Ld-@dKm_}VL6e`=<1Jz27p>%(u?IRB%H__YM$ounJ&DicsY#AUrE?^GGrR}ACBGTeoo7$-0yYD z;{LW$6_2CZHso>L;A9>jzVNyk-j6G~G)EtMm(vN=X@c>0s#MXR`|@#xWb*UWqXO>t zW()moA0>|e@seHZ9+!VrDCg(JTYipncH-kb`H0Wg+zniACG)tPC&%#l`m>(Tmy@ps zmjBapJildEN=uBNvquyC(?#~+d`{FL(ad)D=vp8&Dk3la(UJn@Oz5I%lLe4 z68536o6G0Di!S@dXMFukXwDuvfUm>YR_yhJaf~Cv`-pTO{@wUX?7JrNaV0e3`?rDc zzS8&yr(biJkE_FYzE7Y0N=L&-@S*q{+|)XUjIJ(jePcG zVZ9EuQ5?T|E4TZ$m$+TK+=Bg~AGeP_Tlje-r5m@iS1h<)o>0K;`}!32wfoptII`c> zVZRg0{f&q7*>AUH&;8BwTjr>9{PMpXA1$n-c-5NINx03vQJ8o1tcJ^>IDya0)Qx-| zi+{6U6P{bweCPO)H`qhBusil*Hy74r-T0A@H&Kbbp);4~`yTA7liBBeWY37=-*pY< z@^2^X*^eH>g3<&!X8EuVr_sMKv?oi#${j^boxgYB<>|^V0%kf?s>}4tZyD4qixAfusck0Le z$sa?x972Wlh)$_-d7f2aKdHk${2%vMjq};Pez7;(!0B5TupbxJQ&oS#@s&yJpU$(7 zJ;45aI{Ugl?1uX6joYyw63XqD1((|f558Z@AM*XBXUuN)lKaE4z1T+x^Y$kl<9eWj zHhcbau206EWzQ1Uizphz@m4Rm9*f@3ZtTJCY0ADakK3c5HS9(_jH=jcjgPa6{=&XR zx}&(=T%gK6P1vvDg|JVSwXn{NLYLG3J%N2m0{i_Te7xf$*+)KRACk_VmBQY@m3{Va z&S(8C?7e?+f5t9^U3n;b@eh9PD?H17B#`~`MfRwA{JR%S*MXSKZC|+5Lr&>)j&u z@+>Z&%iGu=&1MfbXFurAUQhV0>W47?8Rp8zd)}1Gtz4Vi9j$-tD?f6(_DxtnyrmJh zr=DBct*)?pWU!kivsZYqU+=*F+K1csm&JU%!A9)uh514+gn44iqWQecn8xnflzpJ^ zo#}YtdxwuHe4Tt2_Dx$jgnzf(hTYMdebQ<68x`!M+wpa%5ay?ucjNfJMV$VV_3V>M zxqM~}V;{br>y1dEUvyVkpYXq%+@Gmx%9dAog5ic5`nYCro_6<7}>E->&(9A3(s%a{+hj87W=_`_V3~BVYwAp zbF>@Gezo{3#y`IH1%3Aoevr$^F2nfqMWyHi50s!!H)cQIs~F=SKPyDn>&m`Oll@GW zB235MoPReWl6~S*&VO#>&zOFfcU*2!!v0(Xg?SyP?fHH*KE(I$wys=n^nA?qPk3jp zZ+9JGcYVd_XgP4bwEqU@bHENht~lX)=ZnMnI*;tlzP>x(M_V7WuhQgt#ZPGJpV47%l*&#hq(XQ@E7~!YuxW$`;?z+ zwtDe#dEDmlRizp(pOE@o{(CKWe7;*XkMs9gs(}~QmeVcJ3u@Sdo!AF$VUN^niRmwI z!#-pvr;}^M`TxF^kGFONms@5Xm$Pd=d(A8Mv|RSr1?*$J*$*2aKd+2q(u0{&$ z6qO(5`)FATU$>91^8M8`ldu1l!g{t-gn2lbi#eT8;kkaV{Yh?@8?XC@^}~l!Zr_IlvR~fK{!NL~uSsCn^yGZ%T66#5uqq$# z_C$8o>D;fl@R{Aymit}z0@%~%vsV>z`dx(Y9a0TBzC$1%*JfeeKSu{H&-^xA{{PCk zANbsWJvEP?k2HjSrh8+)PHvoLZ@8KpH=_yd2xHh_t&-Id_Rs5_LWPl z;c<^aEx8_WvE};Y;|#9H)^M|<@EL};uR`5~J#i5GI8FA&E!d5^uy5dIU$IYk-#23x zAFqq>U3U9l93R7v;|jG2+;1Oom)oO(!g#fkFy1@k4Y$`Pg!S%j*KvQq{uH0!CK}ui zdDMeFvm5)rx$ORR?1K`xzf?S!pF0}wVqblVebPbp20`o%W7%D+*gxs=g=j16qZBob z)0uLC%OPkZ`+tks)l%6dzryhgMzhaI;qzEe*au2^BF8JYV*mDlug|^P*cZC8 z&zR0W&XIj#0=s8N&S#M$dk{_h!Gef_=7-AG0uy?|P2iF@n8OF1xj`pOpGAuJ^Ko*#D%kR|)$MhU#&B z`|JpN*DgFBGIt02T4k>1H`}vs6V@~LJ;CuSZn1l+a(gt^o&84@dqX>J2etgzkDOuu z^oo7)d-i2d*(W|?A9j)b-UjyVD(n~6b2%iIa5-Pu!~R`3zXw`#{E>9Neted(f3{|y zxQhLDD0_l1?pG}AGd1rJr_)~8_v-mOj&CA-SGdN4%f~}lFY)|fj{Ww0_nEja{`=8(3PuLL8p618yIElUg7w*rLy0RO*=5e7N!oDX;^LX5; z$44Ic{wwUq@t?46`P5r{!5vt{uJ@0}&GwFAA99_?E$=L0j~T%pJ%D{oCXeq~o3Nh{ z)`1Dn;qgPa73`-h*CN?GjK9&4y=_Pl#+P+s zH-A@%@rFJezrUD&cR(9Ht{cVdCT+QVW^Lwj9(9P%Z-xusUw&h_-Ut=eu}^Es_1iq* zyHVqMTz{(H;dIsu>){s*`^q^A_q&O(9#qvpzQ0~PhO5`02TJEVeAI+>@mXrSvPcf{z=bA>`^++xgKuJ{w8z z<@+wa8DG!moAP~E701ta-CX!N?x8T>Z`flVzq)S6=_Hr2U+%#9*;~r-y|dXny<%_i zl08g#p4Feq@r(ZB<28Pdm$~A$F}DkCg#G>k8gu(HU!R|+4wQ4dUtGoQ+Nm?#KIR|g ze)}w8p1k&WZuhTsW4~|69_Y?)P>Wo<`|+9xZr`=kxj#@KjOYIq_P6?$!u^dnVID&1 zU7lC4y_)+!7us?^YVSMt9d_eBb#|z(6-|x=xlNYf22AH{Wt1joc-dic` zx3WWcUsEM`ucKTKzgW(m*oVEdF?+^h_G6{&yFc*pHhak4MUT@-;?u5}vyj`bD_QKt zr`h9&vNyWG?P=&(_BSuNy?(TxJu;HL_ciwUZ`nHw>*sX5&hf_-mh0Io6kLINtYlYmV|Nke z&Hf$6@g|QsKQ4XPo22sb&KJrj^aGdY%ggLpE7%VU`&|xllkZZ-OoR ztV*sQ?hj!v^5A-Vay|C`ce(y=aF9LGg+1S#eO(c^YuRhq+c#vl+|BK;X%BXdH#}ak z^Emsj+3ZJ^*lpC=ch6!E_GRBHt#6~n@v-}O+$P(PUBjK-?G}#mL{$qssZzfatzB{VVzQKy`BTeDG%mYw&u;zrxVkQ3H$TDkbCU3# zzE4+fkHVL5yRX+3FIz=t2llZ2?6Hfuf8`Ly{X^>sDwt5G7=FIc6vjV&ZgPB95~shh zK0kNZg>ybFg>^x_gmo0VWN`X6TAa@x!uW8f)tvutZ8)8J!Z__TVSdHIk34>U`W%nb z?(E6F$(+4OID0Q)-bmso9{=~9%kL3t?RdV*8b5Z2M(k>DIeo2Mj(4i$`7?+Auz$_s zblz0*@p_MCztoHKS+9oOe<1&^?rV-87skJvbe+%R`dxe-s*U06Kk_l(UxS6`#HV)r zJh=29Klf>@WKa6Z_0rbC9REZ}|JDi4kCWhwg>~l7E$81|*qz<1fb;(8R^ z{5*TC0eg5nKUa>P&+W)-VLxA&N&GzZ`#)}{uK(cvfMq(jgQ_0fAJF;A{bz@1>^6tk z1D~+J5&94RO1M8T>kQ}fbPjvvc6Og0>=nZI2nPc={=z}_Ws}*x>-e}LUbEN#!roVS z9=!UN<9m%~*U@ITG-f|Bg59SLdr}3T_sJ?8?>3V?FpfRzHv9fx?8?G*{!f@^USEsv zmvmvCRh}QmKij~*@ihBYGw#Qp7S_d$R^@SzY%8uGjH|gm@ipgq$x5H=vBPKC4a~4x zs<yHb$m7-XEV;koD$KWOslxr1e?xd4Le3WM{}k=x{__xP?njxNVqdhE z-Ccuyk30WvTYdJA&Drm^V^=HZ~r{e~60Qv$o* zady=O?84_tih(g)4$jW(`oca=b9?43wl$SkJK@ne|MAy=l`h_ zyTM!bDcrm$2Gw$WWqU6FycBke-FzP{>CX3QvhcjTTbNH0q{{U}`~>z5LVrm~*srrD zmD7n3zQ-{W)~T+2$mu*0-kT?dbNq~J?3F59ai}k6w~u1qm&>kW$o;*Y+u4T*`+83o z<{>l__TP!w#OWsp`w+Er;r1xFoITf?+s%_n>_+vtU4E{`?sc8hN#Da>aDe^jRrUv0 z*f-8+zgmy|-+3;dUJ2|Qg#DqqDsjBFunx?trF?$Fjo5<<`T9&d!*08j{kR!>yI$;v zy0V9NV!vw2es3Lnt628-!R(nm*$YFseyC^2KISvm!>cZ``vMucwPiQbU|*8P<1Ma9 z>@Bad+nr*c=FNVpAG_*X9v519fW7ZR_KAzw9VW1+w_yK!g~zW2}nsERFnvao*p z!bw8B;9iS3zV8VhAKuWM-87wDbq4#>={yf%ZA*6dEj*v+?d%Gy;Fh&!Kl0-%#v7KF zqc8uj4E@g<_G{zW_j`QCbjm)IqC5UBL0>HF_vG4^(;qjA^RuKm$A8Y^{H(L$bOvW} zxxL)N<*cN_*F(B9-!I>nv;Rrr`_Ahs$5(yj`XTTLd(ufx=TSWW?rve;U_e_=Uqe`@ zYy51!AA^^&?=a9kKSn_R{H#<=%xI;@V+HKPpuE* z@zot)c)Yh`IeUOV`{H_PSYLe#W6yPF_wwWPueN268pGa7m`~-A!sW1FD5n!Rlk<5? ztqC5lj&Qs>+MJHsQ1;dxIDKtxes9ubA^VE%?02&{{mm8Zw_kBOaYJ|>PJN^1SU%Hc zu`3Dlkw!1$`8*+eIG>(J`8;;a;`^eLFrM(C5kK$W6uvhpdd~M_{c-HE`CLD2jAS<$ z&c4fy>!pg1T%W95#okO94|F-f&!_z-v45Y=o^HwR=gsxAVkurein>qyeERtrds!^I zTWj{hKHQG97M>q9&hT?nW(c=;twsuN#9s7?+ta&gf(y@Oj$=6eV~05%%gNjyaMk2? zznwn!Lx!y6{!*tG+@I;No_)Lvdy`GJ)1eBpWaNj0Z4DUaRy8T;!de13mAv0oDQaX!7D<98fox1P;@L7Bbx4bH!FGW*0* z_VHag{cch0ZI1JOF|>s5qlk3A@9qredZXPD_P$!&Pj0uL{f)5SME?O?zfIKU`tXnN z9#G{Y$DbG8f6W-k^||R?_GNzDE@VyNc4WA)et7v+Ztt#*;dZlo1bc5`{5-c2x68M? zvug?83%nQBZ+|F!XWgri`xU!wxZiTakG*jOd*`j}hr6<$e9!qA`;UFcVNU1!Qtqc2 zDRIC3wy@99Ut#`<<^t{?9(vF2Hh}x*TRhkc)7T%qXOB!~A1|yY^IF02S(iBfKW4Fi zXvDtnIhXU)c=qQT*v|?3vUOX@=hxvYUk^)#{WVS+bG&6k_U5&G9p3zp<6E6$fA^f- zQCQz#+*FRQ74p+Ml=FE{_#UV38P_wl!uLLQ>p1?86MOg3>`oZbwc@>zN4a5f#kjc53=mcFpGOYaehsI534>JC^-{1A8^! zrV9V7+>S>J&rPd7b9}d6{JSGov+G@Ce_F_%TFyS8jD6Y{_Kw2u`flL(GXdRdh>>IDKyB%XsI?jIK4Z9r=$0~wU_&R?ktc$fzSih@k2&dz@ zo&Bot9gs^;zTXcGX8$YfqkT)5Cu!@(={!EdUVW3@qKtjqNUq;Xlh{{w%@f zeW;L5tgxPTGfz&(bP@Xt;k&%iCprFl5qq?7UIq*8_`lDb&Z{i;8By%Jrn7Grz6bdg z!uOGp@ccM_ILBWcz`msc`!k`R&|(zVS4kS|ql&n`^@(9mSj?W;n*F8Fj(7UX?faD~ z_S78q;$7@hT-e`uvuAB%Z)eATT3Ao-kUGbgX|Y!tu`8;1{G|7EcHa_iAp1XIfBlg? z<{o?H2KJ@a?CNUl2LpH(KS`KhwBs3%k4-9N-)6??`wwN$dCuv0 zyR)}%!@e|&$MulLmZm{b=hA7jrJ zzBlij%<)s7^7Z!7ov-JdDeOi?oX)r3>~CIhI#sTGe@*Yjo)E|B96reYSNPs}|7fnS zF0N%aPT~A?Z_D1_hrL*+KP#JYyC8J!v54xHgmtd%N_PU!t>pvq5M2}bv}FD zMs`;R_G01rw39W*yL4t(5}uEmjo|nt!t?c(#T?(LJ^OFr`}92FyNQSTJgz%W7&k6) z<@m>^l;dCte@VNIP6&^otx{bY?FmB%?o8v>9^7{xS9rljGcS)Uv@1fj< zeKb@wIX~WZ?1N6QzmH=7FpJ$ui+%JtF8^c0*xzOId3?K?{hgz=my!n#RQZ}D^e4q;qwY$yKR18vwZJ>v8eXR(K?uT+04xIQu(&c8dY*8CLA- zE7=`|^{(#<*T3H#PN)AP_K(-udnT~25Yk^Q^s77T@csMNg8hsu`@eYhpRd{7{<7~9 z)-hPsoa?dJF6{e-^&A3Tb9}Td*UwE)u&ZRV|5N7rKgW>W&x*ayll{>}_Ub0wo*G!N zZ<^13dK&w>k?hrD*`0-Ue}=HmVU#ncGuDp%vK4!Va9m6MI6mblyQT1c(?68s4ddC5 zzGUyzg8NZdt=S7a*k4AlAC6}?k7kcJBzQ1;7vcTmvBw;LR(S6=;Ty-__{83!klkK* zPipjn<5M27Zxr&cE2PuuEvK_EjlH$7u1Lcp9RFV^yN55kojv<~UG}>A>`R-lPZF-% z>%u&xZ=d-3-`uqot$f+5*Rp?E!2ZydT~nB6;@h6%yD71MspfVq?;HErf9#LzbNbP>9Dlr+ z-7=e9{TBO|tL!av*sF8d?+d?s_8G^Ye8QgkmHm@Cmyf*(dlyUgf5Lo&)q zvv(2ZDcxDl@lis%AL7FCe!{xDUYX zw<=eT-x$EYUg#IqJI(PIZ?iWL);mr6#_?AgbGsAVlD(Y}uT#tEs}!*>D`xLf!Cv-@ zeN7qrKw&-Ddl?+>BD6{ZGSEPN!iNdm~|7al6n@xGDIW_Iw`q3geBv z1@F+E)9EXuU(%Z6&kFsSR!up+c|CT`5-zuHLO-Et6315w&lj6~I9`1fyP-Y%=z;8` zblBhh<#r@S7>`{bv}^i8`*TR(|2#XA<1GfU zf9lB|*NVN15_{bX9)GwV$Nqg2d-iztbzRsmR`U2s_$~G)yV*5ou{#c6pCrt4iz(r8 zq-0@#UaKgMpX|@xM;Px4a_0DJQ`z@hvRjU2pEQ(x)-d+LgV{|C+0(VzeHyYC7xQ>y zPC9$H2=;aB*sqUgPwvJ(vpM_yA3XkS|Au{jJbR`;`?A^W!v?W8ZOX3yndeu0%3$Ao zo_$&byN)0G^9}5em$ExLu$Kz!t$7UO_&&n^R?}N@e7K6>UwOWY@l*CQN$gsY?1h4F z2<7mr&K@z7{nK#v4B>dU3G;PrbvT{vdh9QR`CVxP zIR2(E-)!S+K93E<*_D^G-yh3vrpG?1Bl~becH1fJyAH57{lMN_C{O*lTy8)1vRkFH z=RIH#y}>?MsK-tU>sX$D$LUly<$Cq|WcHJ>?2Wa#T?_DH|NfBuQw{r%@9e{$uwOmN z?y`k_wI}hv;P~-{gBhA*tgWOAMDHhuB0LC8-#cp;eBp{I{w{+@9b}c?>qKu za(;%)X74AgUw6oq`}x;SvA<}+&m+sGvb(Nlx81~kd=Y!yboNwpc5@r{y}s|ExNeQ`epWG=pZBwcam!>ij(_@r^An!JUU8kh<7f6;J@|J=d9YhuVRwAZ zKE9mY`Z;?C;r&aF@SW^kq5R`bIsHQ6d%c&!d+_S*oX*zE?3Fd_y@&F+mZ$K2<$uC^ z;W>vnozuem%>-e;0~O)D=kpVs{*rU-UQgJ~f3y1;@jT2RVZQW#OE|uj3wwz$|GCtL z<74}>4`{_cxiNd9upfj|TaF(he80S7631%`$K@b+&jp;$C1Jk0n=sG3U2jh3moSfg zemjoeER@gATE0%s2;cuk3iA_g3G*M!1-B9AMf?`7+u-JWT=m+ppBMHih!K2ZOHSve zI=kHuF1LY#D;0D6l5+NMmF$tF?70=}2`|~t-eBJr!ro^d`$ge<`DEdJ%HJ%mp9jXU zo9$pP6W)_v7v8IuI&eB?h4=m`!n`u~L7YxkUG^jO*lXT$f8gN__KnBbi-q?EjdpST zxx?%OqS&p^vTr%X-c3kf$BW}jt=Wh7VE@IBeTo*mY`NmXC+>fq6uf{x163&TXN8In z^*EpXg!sSjI6sq9*mVQhU#w!UCp<6IOyc;XgV|4vWA_%~y+?8UM-%p1J@%dL*a!aO z=cdSC?B?&-zvZ!8X0uNh=F?t!!SUAc5WC8hcO< z``bcxYaaGfgsO6V)xRaXav%25W7sb&VPCP6y}R%peA^R_uP5xU^ih@D*=k|mz4zle z{-6_kH{m(-)n1P8bC`Xs;Inpe{6%3LAaM!D&k?-!N{&zRV$a;o{wj?9a}@hAA->%S zj*mXZzUB;jT{8QdJM6ys>}!PiTJ?o_G9JQwEhXXmL1!KAKl`Y&zY_e@U(Ww{VP4by zLXNk|VfVPno`05oyfBZ>VGqY|4P5c4*Y}gwJ=zx_*9!f&NMW5%??Uc3c6rIZE1muB7507! z?8}a_4?52N;{bbSUv~E`?59?;M=xeioytC90{g4s>`Mo;_wBgeWk=bw)(Ad|JwTT| z^)C;QReWIY@tFOOFdswpD93l)&hELCy}1Q@U@!K0o!QT}V&AOE{=EZx@9ymTtl4!v z+5ZUh>y8Wa_Z&(%9d`wv-)6!9X!RRT=W` z^S-1d$EynS2G^{fYD}{NXD;zm~xDC6JFkke@7LKoXlYN0c-!I7_>;XDlpH~X&ocKTD_zl9kD?2-L z`)F&*{!v($!+ajcZxrU4kB;Q{?H}0x2^hj9OA&@1+C!a8+6WgPF7&%QW|Ju8Df zM)(fGLYSA;>j|fGzMNg7KllGvxwGp%We*a@^Y<;q?t?-poW1@Pc8`1P!?W1G6tlZ) z^YgNu@IBE2;d|kG{doLjaya|#20RY-dMbNZ7<BER|xwTOv~i*F;8aq3um`F#@=8rdk10N)Sc5ge#Ag_ z)o$$lh4oBc3+r<16y7WC8prkUsE+Iw!u;6T!h5$-!n~Izzqx&>sbRnQo&Be|F#84&!*=5cXHX{PqjWI9?&lw<+((@hjS~ zkI`m-$lGx%3WWHZI-E|fA^WNU?5ac9TMc55?a1D@8T&3_AJR-={>)##+!XJ5`*DSe zu-}>fXwFZ}8uqQid=Is&9RFA7Z(ptEc)O;2U_BeNzv5-!6_G`p{?|wB1{v&CkJ%dt z^HOqObNn9Rez(l$c=J4Vw={N_v+T>F*wqfRCq=UVIl(?9nLXSdRY_$Nuj;`>-_jEMZ>FjdvWcCCtwmBgD5U;&eU< z>mZ$Z&+!ur*x!6*ANYsez9B!SG;Yp5q#64z4R%A}dB;R32Nhu*!i~cGrC8zm3>BW6 zI&S20_#o5|s)DDj;dK72W{(xpIVaRVpXYHp5yJXuE~7cVq!;_>w(QRvvxooWdfvQ@ zJ*1G`@jbhLp5X7;#}={M7O*=#XHUG(UVe@}GM4@A3HCtY`EIw+E{E;qbh3s04Ic>e z!G4EvI-`YsWXzp7K4ciXT|@TGCEPFC^_*Sr1N-9w_R^Q^&)%?4zRA8fmi^HI_S~K9 zTQ;%(n9puKn!P7)FR$<|=l2nI73^zTa{7Zz*hfxdZz()CJr|y@qlA5;!`kw7(nwfW zTw@-`m-S*dYr~!+T%QWzx#o-TTvKqD%g1Up`(|DC8^S!j#Y6c#78d=(gbeSq`wQ>g znttH;*-zQWB(RrXVK=|WzABsj_%rr%XW6$LW!Ig`?(>`9lXep3Q+1xq@wzJPeJ}HS z>$@KBky`z9Ii^@+|hEz3c~a z*oO`0@`-!SuIs|*#k`z-%WyvLKbEnZhO(!nvZtPB58lPDI)`0(6nnkN?8WQZD`VN$ zRpd$_0`uU9G_&yUSF6$d99F->s~f{b^}g- zhHzX5S8{y0H+v(Y-gb`S_=#ogQLX~@3%Ij1u|l-*I-&vf=Ej*lM09%#XCGm-tEkbb@%$G_;p-gzXu z>t^=F+3XEfxje^BWp9$e-oF>`clqWfyPFyBrx_#cPddn-<8>CYt8`#r`ib-NIgEYP zBK8Jd*=>Gt`OL~^Hz;PG*o@QfZ^~}&!Jd48y<{W%T0?f7NY3Zw?(8rMSR z&-F}eVO@Pa;XBrat+*cR^pNY}k-~W3kRXnaU&sDyBK!RI>=(Xc^`=;o$G*NEr*mo$ z`+;ffuY`7_`F|Y0TNs}?$=x(XOb+LN_8Io{CG3lI*rSE-F^w~M9LD7wd(a*BoLB4{ zi`nn_NGsHoFrHH9&L#l$CrNM{#(^6 z_LsuGqIb`6eCi?gi3#kJU$e*SaQ;JV*mKsh58uSzM))qkYX`?4iD3_T&wgH+&*O9> z_Bpof&MVo^9%J{p%N|k7uG5OI+nI*!pZl`wj$khk_TS78<@i&=eQhYrQ_Ahm^-owA z_C6}?8@_UWoP_m@Ooee~gH4=Ht?-@oPy>!n?!=y9%D!2se`-@XULnkjd-5NbPuX&I z6)*OR)9li^Ue{Z3yB1{0-qeNt-U0Te_t<|6?_ujr;{M4(Vcy00s~kV+1-n-Xd%f@M zqYStK`!tLF;aT>@mF&-i^&yv=asSY89Q&fB?4N~s?D_T_zgJj)((WVY-%R*UWW^?q zALYXSU=_Q!CwoU9_I111wF206g>>Et-_aBZ-?=yo-?L15#lL$__}*vSK91k9mHnVF zpMOm#$J-0v`-~B;+h6B6osvj)W#PD1yyf^~f7#zQ;p?+T_%5cl1;-oKar&MOI6kBv zyQ{FyYCFLXt8zNG^Ef|`h4LS;o8$EsvbQy7H)_v5Oqh3MGL-AX=|cT{T3GM8pHM%) z6!vp;XvDu8Ak63SHRE`HVg0VUY>wZwj=frX89gSDB>?Q-w0>`KD?y%rbwx~ehd>;Jv*JyhZ(PA5i~k9XdWkGF$xUTRNq{9j@I z;p!F~Uptk{r`VM}Ad}sxKc|1`I(y|C_TahfuZ4MEg>N}OCIdO09HAV3T5-HrGxoU) z_; z&+$I_oPI;0J(@49*VoLI)A=imdwdwk<1M>{eRe!Ma{O{(KT4Y%jvp4zUL~wo_C(m9 zacCuvYmHvR=|2_r!8|AIBbjB(>6>ie@xTdb{66~k9d^q}oX*b8>{IpFGlX@k4(M}y zx+A-mE4#L^k7SLI{xM;_ta;?f1hQ?{~~Phh_>fW2KG zcCAkAhEI7Ol#Vm|Q)Tv^M|u9$1T*%W4?Mr?Xb`)$1$)g;o`?420(*;%>}}ex-`dG9 z2)k*qYpSuU^<_`DV1L_(-6Z=PHdK+D**m(huSsX0*p+{`w~!zI#Te>d4*A7mdmjNMpx&-GDQkLy7@PRApc-9h+{ELfkP zQ*3^1PQLhCGjG)^_%kE$kK3+4c0;pFHIJJdI+1(vZ_hNo21$$}cQm zA6DfPFtIWE-relO1KF3lun#Nb-+iIXzPyHyOY1h5Phkq5_li;M%Z2%GS;F-*Vif=G zaACfg$9&HJ^(c0iJM693v+sDs`8nK}y>bAT!`@ANAI%Wf%W5pF*VH(X?^BciIDHS{ zyu=Fm*Ky+GnzNq0p)ikb(i<*^#3k%+k~#kyp7HSxZ^T|CtPk*WCXdflc(7aCV1F-s z7e6P0<2MQWv_@{>ai_4&SUo6A7IHh4FRYiYyqw$XNy2wqy-c{>bo#~Ztie}yBjGtc z$dA(>d!K#wb@qE}+2<5+e(E~0U)aq3jYn$i$-;WMA@te_L<0kw375uwf%{c$R zns7OI?PLE^%$`un-tQKBXDjvx!uM_q13CW=_Ut9&*^kX+Ume80GL!w75$Av29`o=B0!S^GRL{6N@8-ePefp z@$cpd>%*U($2sbi6mS=LqWqPfg)?l~VSD z!n_)7L+%Ie6!xdSk;3u)+i*Yg@N#ygE9?_Kv5&3K{oy=S_QAsUET`Ua`XRU3f5)*0 zhqG_k%O1apUCEn$Q8fF1Hw7x6gyXvk^NaL^c?fR8_reQ= z@0Ux2{RM^#sCu}kNF&5vzI+f=x44w!SUrg*@K04Bw-}SuW!u0>MNH|qEJ77$l&;`3GAzc z_BD};66qg!%(A2s&lKRExdgz>tGQ5@fIKYLeU{Loi;&N{l1(=is- z2WTbCf17cH(^0>}zEb#Z#ZriWE|kLp;r_j}kbk#ISWmS;Sa-BrAg80fh&@`EFWSkH z<70(+cl!-Fe)>(W|4U}GUl-PaZ>r7lk)`~+-$r;Jx9|(cYkp>*ag*J^i#@e9yEDHI zQd~FT_%u!S&~miWmOa?tRr7fA@?iGY zJ=i<_C*b7Y9ySHawkjMGSKF$6nj=d_Ly`?96RZsR|)xWT!Of6#*mwWk3Il)7PEKez`aMAYb-`K=zWKJU{B>cJ?1Z?3%gkb z8`#5#u;-lniuqJ>XFpuc{(Um1uRoSO<~4izST4`p(R^N7Dfm3v*z)x-d?#OTsZII% z3=*#YhUR>K9rt3NTLn+7CqQA6zp9;@b4b&&)!K`mpE1Uj>A$|-(#E5Pd@3$zw55c`Clr$AG~#oJJ4f= z@q{{I93Xx&r?XgiF59z%|J2 z4@fmJ?0(ujAMag%_JRh2zu@%m{$j7m=5&mk@`qj(rs{aX^=iipxVS%Ne?E>kzWVo@ z<9B`L-}PP2`OIz13&GE>&&NBmIhRk44xeA^2|VBLY-{#=L)cyaWB;em-X)u_&wvi> zc1`#?_kG6qMHgW{o5F_clS?jmIVf(u=jX~=VIG>Muy67MVc%rco}9k5KYP7z?D58& z{{UgU;-@fw;LW(c9&^$kgHZ7T|&a=o{2F8@Q} z6ZQ>4e^Tcq$M;EKe=V%{RXl{_&Bn412xHgO;QnC)VIQl3i5#EvklpV#`{!hKkKOEN z#<4r9un(x?X4h=R{nfu#>}|%d*BAP|KBxG1_jO}0 z-^a(buA0kdg;4$$m-)P#k7U>V%GcE+VSbuZYmV=`kFVPoZP|UF@O?2tST8HQ7suxv z`V=#@=cMWFuNoLQ!&VEw34#yng`0K(tsPBz9-ry4-uktnarT5r- zx8U@5IJ0YIu{-PYd4J{49wyB1G7jbXD&#YJbD`ezUcvQY$4Bg!%())!n3s$$m+gza3Y?@m4?CkJYgcQRjB;Qxo1as8|$&3=*!-( z2YcE;_E;euy|x^G^cm;BXe)c<2zK>fe4SK3VQ+VueUPy3S;uD_e@T<`qdb}Y!)o?D zhuPoPvbWIY@=Q@<|0rDNLlQatAQ$$3quK47v2QEpa`Sn>e&QVa``hf>(%GlqWlt3P zhYrF%HR>9iPUTIm-!?5}-}{B@)dT+QFD9}#>B)Xn=x5&8$L&I)(0^FZuSpfxBDpWzLVR{QFiPV1KI2Avriwy?lG19(>!*K#q5Q)?8-CQ-wVIHNmx(5 zPIyn6aDc~)%+|9H@nHWO!EPn&i#lJJ|MsjcA8(u``z&ERznS0}_MA>yGxkFt`M3_> zV84El-FgXoSZDUNbv(Y8U&y{Doqg0<_O5r>uYO=x`pK>#`I30Glg}NtnTpm_6K1d1}`O!zjKzy)vrxrKcisx%Hi?7MeO!f+)-P7 zg8jBG`%OQdUuWEj-SRnqkl=2~K5Rlc9@ns#GIYx$?A6EF|MO$NdWgMVJ4g<5>SoK@xf)H{lOMmqbq-|U`YT>lu> z=X$lF3fKRG`*1(%p)fwCJcFNuz6;;wt=-ShaXEVY+)Ty@Ov*&VSz@?A?WNp}lW;e4t+tzu#$9pWg?$Xs~-7=XCZ~^6&l>_S0Ovl;dw4 zW4Cz0KCO=Z-WkqkpfdP4j=iKS`@sS1iT&7n&SYPn z$-X+4^RJVpj>mPqUNiJYhRxBR-eq@N&;DsLr>}U&`6=7O`PVk*}qc8 z_b#wEdc&@k!#-1u^Y87*{_7@tryBMlPuXK!*jv04KceEkr zGp+-d!)_D4ANL9S2pApX`seNg?tl6m4SUE8_A=r7i*rRB z|FSFh>k@={R>963zkCM!+u`iC-#I_|YuGhPxgRok9D8jlpD*Qg>?*?g#*2h`ajr$2 z&JH8aPuN)Y;*speo!BG3@$VKyvl|()ciGF=d2kKi7fNT?O@#H<&X;lg!D;-v=I7W| znsENLXR}W_!Jd7Y-Ec~Y z+5fQ%+mb8#$8kOUU<7-%u&>sULazTi3HywD2;=bPGr9dLNZ|JFy9xXLAKc$QUC8cS z!QNZguc5oJp1@rpex&3j{JYPEdB4-a$MFI#gxV;97} z>=JwS9rj!yKFo*X&ziFPYq9SXzSo;&$nn0yIAphAj=wFetA9+GcfC4->+_XA*#C6r zb|K7;eYY?k_(AADB)8>u-`s}%Q~-OYJM0UaaQ|w|DE21v**n>@51YkqE%fUyujlx| zyV$k7*i)9X-yFt1tRZ{5EH1YJ5$v5eveydd>q0Y*-xkK#PoOe;`x$(F-r2|ZMY1s8 z?5*&8blHZVoA$L}e=V%Pccz@{L#J2lHc9NauCSY&VQ(XRcV9V@;}eAW=hKCCGXKrs z_F{$5zj6`A6%$Ljy}R^|UA3X`yFxo?vW?@1WU+r$;_`7;X3r7!rCoD})3*@z_0Sp5 z@y%PZtMKbwMePGFH}5^{E0?hk8O|P5$K$|v_OqW9=IOO<#PJP^xF1z2%tLD}?4x?} z3a3*Y!+trDz3>wIYGFLb;t|JB6uhnQUHnL49$ji@F1I|PJokU%{8YbVPb_D*>cGF- zZX^5hFYId;^L6# ztigVaSut0O|8R$2uPLT+^`=DD* zx1Zq(C_$JP7vGBG_dVtJGSxclofh)EqXz{%PwAc;`=06S7wp-M=dn+oz&_y;&!^hd zj@=@K=VhrmvOoL59jufP_Kp_pqo4CUvDbm@Awle2N3y#J3k2_q;Q4Gv!^^N?cxL|@ zeOwNA&_|`RuTNlamBzmM1-o`r&d;w<_RI)AuHP599Evh{Uf&2`K97Fm`MOG3%hzW_ z1>Z+KR`PxNZXMSHf0l7QGi^54d%hdFUj6ui>)~s*+^+5QKw$qOTyLo7@cV)gVPB6v)m&e-IEvMVLT4*KzxWB`13$)b{W;-2 z*SA$axWD~Q=x=}B$Mt;g-rO$i5$1cl|Kon(Tx)K>c6o3+n0bZU&7^hQZ&7{8?eC&H z?9I(Nont@PCj@YQ+?sHIugeRL9}&#n<`#Q{1)RRM4VT+0GwwfFYIFH7{>bi{#OLv> z@IB5_p}g!>zRy7G0k{~~*qAzz>4ve}2s<^D<6=6qkczGp9<&-d51r|fPs_&zlg z#@~hs;~u}c*;EX(;`$_HGP_?J_CZ&;{yFHt{#V#P!dIK)n=fTA)93sQ?8Wt`+F%|? z3e)F)p!r0ux1XQj_c$rVT>tyj@q3~&p&dz?&Fy3P7xoJaxSiT^k9}=tZtp&>XLtF< z?)Q@0(FkOI?EbSjef3n%Pn8;b(>Z)xTek2G)_Mn* zPvmAUPlNS*zCzsjysOXSe#qihe7$wK%-3y)b$p$_oX+>fZQ(vL5cU;X#y_j@(Bb>q zMOasMw=m!J+C{EE56@xODB=3K?IiZoUR?k8kK^{@Ss}MO4Q$!_>$6Xs%x-^~{hb-- zXW|3)_LKRz77F{(XUyjEX>y)@>`V5%bL`HJ>^D`}owsxTHH_H3intu6pJm_e#hz@% z{@9J(LYOC3V8Qt;^I=~$oBcv(!ByFHh5Te`a{OhX|8r58$9_kd&)1Qy?2*F$=J$kk z8%AVtzbK@F>yw4~*o-Kip5uPP0%4ufR}Z*8e6GzET%i;92cBeb{XE!|>-qkhxLt@! zLe7zOjXMgX`zP};6X)s^s zQ)jb#b!Lwi)>%DrobRu7W7tiE^|kbExu28KgMIK=_Cbr-Z!TbOp~k-UIM*j`OW3s) z?7Oe=b4|#6_UumVZdF_#23%#2+Q`1!l-;u_yU_=(pNo&PAL`6LNf-xnPvZ7MwIh3j zXzn-eTF1WDgT22SyNW;i^e61&EIFS?g>|=5h3~f3aj_`^-1!fKpR#+j=kwTj9eZF2 z`v_OQ4i`OTZz}9pu2ahQMZB<{p8G1UH|BKVdMV@rdv!Ce4>vVp|0#U$f379R?-1fO zKXHDheq{HIXP-Qry~lknpPtj%kC$`(rnidy@-IGLXZ+abX|bmY`}W#f@bz>17hi|H zQrIsG^C4?yar_?}_FH4veGS-6gn5-?n{d2qI^U-qz1gpgW>4kriK3%1$G6+deu0O9 z6(dG*{+%4ytAu%RKcYF_{t^4)>+F++_RD($$KPzlUi5&=!Nr-~t%RRb9&TelJ(Rtn zFt0M;3AY#h&ae-@$i7`zhp=}z$8WG;zj~M3wFC$Dk;d$OJFwd;*wt$Id9&;f`>rhZ zUN_i(2D3lu#-1RoFZA#;KX-qPW_NXD|Jk11x|YW!?1k|GOJU#MybhfHxCBoBs}1|S zA|Agwb&lQBg?-{)ejns|g6FFkm+}0TgnsN7;`qH)v-yHAXPj?IsR^JO&Pkg z8vD#|r5JCf&aPiug7Jw7?32#3JM`f6$2+h$$zqQe*6W+9%;#(RR6g%-y7GP6s14Uw zALnts7dV0I;Wll#9USh*?Q)b37PG?W8~1Y>sB=Gj!D#O1A9UyEi?VI1_`{jMxC0t< zo!{RXch$snY)iG!e|^+OpPSqY{prls=sg|TgXeQPjqCI8uH3`<*HdqazxyOb1Kq2d z%cp@I$G@v&@3@P7fE%a3BDX2#XVrH;kM}fqygICw$1~#x@N;qdJ^UQHPS{83paoyI zBgU~8#IxJpVP7JArx_^3{}%Rfi;3g=?&du#X2pvs><5h5zY5>SbqwI=3o||TBNNy+ zRkA-zZMPa64|+i`(nWtK1ISM{zqlyeE5+4*Q1g?6tw{MyohK>D8a{ zLg`Y=$J_E7m)niCd>&)l^Yx(KklX7S)ZRTs#wmdy|_LPwB`E$a3=dTVLp6BHOG55;P-32hOuvZ%HCl-w_npn zvcIY2bmqQccd2HtSI7QENZ&G;~Q7NA5?tb?5W)Q}`b3=Xq{_=f!jTYq^83pBr1NU=#J!>c5cPqy7eX5+pUM%dp7oE=W)r;5%H)YRy z$oXt|o&8P)`@i9wzTp=3^Uv9Tui^SFLs)ll%3H2Kb9Qoj*WZfkZM%-#F8I7)?-k1J z%N&@~iU(Zd2eFisu<9eo8 zco^y@%`hIe)ob*etBKpuUFV z`z&W4d6s=pKhDoGUCzIT9k)By0bFiP61bc{XYhD$kg#6Lg)4ZQDtv`?w4!hE^JX8R zAD9=<*I}Trp6Z`|+z#%W%N}@?-RwELO*Xr#H~WYx&i~9H_U0?uTRXEqUeE3%tdmwG zthY8$lk#t_(?+vNp@s3&>oaTX=!OEm8OvPBBi2|XlT;X zRH&3DqNp@Tdm++LZ^KroRJ{Mdb^m&~o#%}EeC~73_Y4Q&9)LyKs zjnT|k-{o@k7sfNy@40@CY-g^g#yolh*MHS_j%%~*m@BQ}c0YZY{UkDh{jK{R?spS6 zvA%5%W1VdAn#cd1Q<#^0VtsDDow@ls=AE`OKk3f=-zes;&dk^PG7rvWt}VPLTTggz zH|#Lir}G4^|LLX7-wW?;P1(rp+v@~#p9JPjgnKOa`Ln&oAm)oqn7a!1I=;*0@+$T- zck*OD#))~Gk<2%?VIK6H+w1fY<_FKP|402`|M@+H`3qq`wu2Ure+ zH~Yza?^aG{fd$vw>xInUs4#!%%IV)zVg99#^Qm^7`MLSb4J?=&RaK&(>sK<*PGRmh zl=&S`<~~h0KND9m&uPv4&mCT8ZoKb1mg}54^BV68v@h7e>-?vycwIeg7q7$b{7{VP zI|VY|b-W1e14kAj?{W1T@-s7;SJh+Q-Rdi*vry{`a@$Xzkq_?5_FDIu$DiWgJwA@} znHRwI@M{m(XOG3)j<)OAukO3Du6hdVTE@aX&xO`JzS>gD|a#x-8={g=!2U|G!T^MlSa?-|d0n<}S&Cz!d(0_G<-ar*Yc`>nU0Dq}s|EMULN zugCs5DU<#D=tN9jk=&feb+Ko8JZ3DMqj`Rwf7f2Px1^w)?Y9W~@qC2&>7E^2u0a}H zE~kY&Zgf1u<3oLa=FjFcPd~_9RX7*p_m%UL-H!9W#F2UN9!{rv1CL|NTJpH4q8pDB z^bc@c9$s0B4RBd_&%Kcs$5W+a%)f2sI1;B)g1_5nGV`VPnA`ml_ygu=8#BMShx6~d zj^pF|bmpp=oKCARTo1;cT>o#baGafN$nE>Roc&?`3Z5TbTgduQbsn2VF(ZKE>~#g} z+W_I7fzc5hPwVV>{WJb|6U*d}(Sfg|6{tEZ39@XLb@}PdK^CjO(vEr&)FmHUZ1nv9nWq$rP^L4E_{gbvR5X3bX>l3xtw1yk88x~tQGc+Z!Ty1t%85YR+-QdL8pd=b0}n zW}ZKU>&@l~^QD1Y|Ix#^z3$ubxNAcwxBCrYomTOW{c7Vj_RmYgxIOO?`~RC~++TL? z;{H|kjrk^F9B%xS?M*_N2OBfrdyw-vWHj?~VIGmTmhDqLm>(DJH&&0~`b?O}ytyTF z{}-%3*QPU1_{Z&Dua9W)8QzL&%$WZd#eU@_ z>}#s85bUqIKa2O<^9mk@<&e<~I*=ep=aZ zy`79_u4lvTwdW{vr99^Sco?n-Z^nKlZ2wVYW^($ce3=KdWuEts%lk*rNrwowen1>1HWmem>|5Uu-`Gt`W^W)~skJNC0bSq^(?i_O$ z;e7NtE4H6q&hxBqZP?zhHFKp5PUlGy^GCw(dVgYjL*e~}1mS&+FT%SFyKFdplN&sr z^&ZSTNS%3UIuB@SleuI2MDx0OoHz5v0xxOE_Ty&qKBek={9X0gTIPfHFyGyP`Ia-h zUcEbm*SGE7FyHx%d0ThpbMNxH`p_lJv%fMo5bov6+sO9m%FGjm_5ar~{9Rz%H|B2z z`~1uNogy)tzjx>aFt6Rg{M~Hku5rZ}Fg`Egfo%4zLbQLmocWpO-_U+&?N{VG|9(O4 zeS-OdP)>h+M=qDnbgl<01Frvgd-eyvEdE||dMxWh-2>K{X#-h@&Am8Il^wzAQT*M; zc)vkWz82cAeXfh#d5!_{(ZgCI zKXZxgzujcs;3=mweT*Td@1x81*S+-6{`@9wpk6xxJ=F@OplV z5BtNyX3SS-^SVc$1fH)ge#i4KU*SBIbtsRM^M!HyvO*q@b$QR@glF%$KW>a>zSy4m zLlYh+oa)RvP=6%zkVc%2`yl2Sy37ZwGw<)l-2653a6jhn26F!IhVr;&P$2UjkC~qj zX7169$3Lb!S%)Jtc-%73gSnL}k3)P0avWDUa~#Q9%W>!I3Fdq6F%L;*e!VIG?%i%2 zzk0=U{(VkyTr08SdU$=8dCm>4PZJX!Pv$J)c63|G?Y>(0o~7E9`*kM`j+=q2QEnCI zgmdw3S*&kHtvEh@?W=}A@a!b(^Xbv7=Vo^~K6{yu=Y zp)tq16)idcJ@;|_44KI75@gHcs6~C*PfGpR4@U|2GUfJ0cThZA#=7w`h;_zg6YEuv z6|8S7T{u2YZo#^GIGN+7#Z-=)#dkHZV6ES>{co56h1SuWSSk6aHKSGeAm_vd&Qy^q^v^fjxOWGgkQS|Ly?mNmV#kTwgzqYgf{kH~h?8H-YyBsSEdJCu*~<9`j=! z{g`>FGtWo7YM8&+#5zA^HuD|A`^Cw1oc@ug%%AsW9w^)se&z;`D>}U5dfubX++Ca7 z>p(O1hmZjFpCfyixBbh!dlmD*4$K>=u%Aa~aDP#|$o*@10r%^B!hVuO;a;XhJx*uM zLFPw?a(;TBV;*^*d95~=x2v$9E$%hj>%C-Nkj*@yAM4MgkIb`uxxJRXWv&q3i*Xn3 zrA*J{bjD>ce|(R5kYGPd7k)pSk-n<|7w! z`zG>on&N67_QRxI%u5BoZJ)#TN&A>vPGWwcGxNPmnXiatel(8xyMxU0BAK^JU|ti# zT%$hor@`DV{)?GE^I*QJJM#`7*&kk-_Q{Let< zqrUMx{rgUcdr)q#0Q(huxNX5P$S z+cEEu_8rsFS^6Ax%WHfy_$3V{HMgc!75HC<`DC-!hMNa zKiEEAgZYjM{!X#Vn)$Fd{Jq1!9rIr4ykOT~!S+FAY=5AL_b1ek1&9het|F~4os0@I1o(m_6| ztv>Qo4u;6rA2dcDmuiOm-1FARlP{Sf&)I2&Jo>91@?OKVkjJ@k{a?Pv?LM;=`^g`! z9!0z>``gqR%%}Zj-n9dd(^kA?`>Z3(+Y0yHDJSwcC;2dsA5Q0RzcU)laiMlL>vktQ zj%%ZZ{{Hzd>%dBF{@rY0Vzbhf%cb;}xsDd=Nk$FZZ@$UAzOYYnQGXs^b^plYqHb&1 zexwWkuB!^?zg-M--CaD6UB8q4Bu&`Ay}OL_Gr*Spr{NZE-|^ubABS(?I5_NGA@=vm z-puz8;JA711IHulC7jRPQuf2r7F-W?C0x&nc0Au1QpWt(Smu}gcph|gCG(f=oQ|5H zOEzvipY0aOI{8<4-}Aq-YS>=;)@vd+kKj1r4c@_OgkKFxvC?|eiT z)A5|f`P@848||+sah&oD=6X0aoa4Lqd>%hcn#J)h;w{&|(?$MnwIZLtPyP3m*RfBH z;&st_!u?uB!ab|gg!7DF53xV*(q>+{mvwBH3G;qo+)rH#Sw9C=aeu!Rz`8x=JL}== z>#Qg5hA@wO$lS04#}UIi&QEj+m+NgkuFv29ST~a9^0+1U7xTSGnD<)6;~DquoFAVq z++H!IT;6@=TtCM;bGv*I-Ua9?yz3ful+(F2jDNSaaK7N-VD_tCZ<#lYW)~ZP z=85w-pQ#O)`?q1fttqEp7R>of3FLNcmm{?MO!l9H8vFsHta&~-%7}G4t_ADA>none8P4GNa&(Oj#+_|{n2&wQe3URx)P2SAE59S> zGslwSS6Y3JQ$Fe(r*d|1oGRPT?V_K4x> zv#vhs&HZ9kDEF_M&a6M)MLaJ%Je_%L6!XTjIPT~R@36dD$og<>Cg*=bch(0p;T}1Y z0=AF8!rXB>^B@)GH6J*i2|_#_J)hG#t;ccpLnd=&FK+iLVIRKFP#(`DePaIlChMw+ z0mt8SH`s5d2>Vr%=J7c2-v%Bxjt=C0=UU9;Ps2#=zXSg;4;J>JwJ&G;Q#Y7rlraAk z#riX*ob{^le%3d;4y=bE2^=r1JUCt))nTaU-?i(>I-l{2(qUaan#erQf#cxIP0ZT_GyglAx#vgz-Q$-z|AlS2 z9wHjBpY#>(Z(lW${Wdv)bs%5(Ui13^>&(F&tV@qyvJMaI$NcPP*3WF=Ug8_m*?xC7 z=I>3JyES9(VaVLL1@rNrdE7hYKJymB?*^ab^mB!Ks+%}*{Ra=__KFtXv0cxyrn&Zs8t?-WC?dfdqE8O$^ z54rzd@59{MkL%O+A=iJQa1ZTr7q(wx!Q3{6b>m(G=9>c9PuxDU&Y0il`Pb%H9tTF; zVSk>~f%(vS%-`a_Ox0%oOXFk-B z`LZXR|8qk9^mAf8Z|T80Hgy;4;qCjp&S24v`99%Zk@lx~edB5$=KAM&J*Pyt_vVnW zZ_r72mnZKxryrilyyJ4_1G+N5E9^gfpvCs>O_{rV;dQnxDa=RTWZvdI^DtrmWVulP zeY$XaDdjTXwV3@R{WkL#70l-g>spV5{S_b6IGwKRm_JVB{QGBcyNvkF^%?NE5{1?5 zF|Tt@Fk{|4hxY?~Jy4G6Uoc=kYT9b$eUxCPc*zn0p_Lq_Q!Z}^^h z+fBM?Kl-~K@_O}KB7bq;5P8B#Bjg%t%;S7Go%7=jFrB^8T&~+^xjr*5aC^-X){R>i zG{WCqV#DLlqnmkrI6-&^ZSZX#hxB)5zD2y^Rk%r#V*x7o|})Au{q=cu8~w-4s_DqhQRyh8}bahF>hm$N#SVt@4V;&`1G z%{>*0?{%=Lx&n*S2EchO^B`Iz;=Bb>RO zuunr>*x%?c+|!#T+y}VCoEx&Iu%F?@G;YV%eyn2}J$M{`LwFbFNF}GUzdrM8%h-RC zRksYi`FCri{ei>TuTq5jqCM5PecRt)t~HtK zvqgPw_u3NXKApMUr#;}fHY$eKV}D*^{i&^Fy|Nz1x;N+$>ty4ntgFrQc)qZHF2^q= zf7bJk3wb_rZV1PPEyBL^w4=NaB&Pw#ozB&4KWrNFPE$EQzY4fq6}23vJTrM;jgs)5 z?DNOmUfzy8|7!Y+{lTP?{YP&i4hIys8n7QuNMoHb72X34bL9T=y8-vFyEGK`KQ|EGAv%!2=`4NB{BRBP<;LtkPGgz>63$b6X~sG{w}5%#I@V{E zF5Hjm9p!n%*gHI)G$`eL1y7B6zEJ-T^E>repI53dk5?7=2<8v|F<02J{x4|3`d_2V zI^V^b^>$Vn>-I0$`GJIHa_ z>oms&C*i%<#XmSMs0r_STpq^yzf8Cn<<>9mkDVGbZ@q^5``{whtNT5fn+V@!1_|dJ zy)0NKPYdsHTy|!AXC>x!-&mhJ*|5FS1LkXXa(QF?g?bC%dM;Sc`t~!E<9KV~e!|H; zSoacy`^Wma@c2`8Dvw)+_htV3AgAM!!Fn50$$qY}mig?V%*R+WZ?=qie+|x$sS@YE zrxBNT^+)D@dCUh1`v$KXvVG7u&QInK=EnA%PRbSLR~vJ@J0a{pJfO$+hd*%oi$5_} z9m?sb9%p{y5c5UO%%8h3|F(yDq%ZTc#>^vvxm+8raJ!hqv%hUiV*gBh#^3dZ3hy8n z-^1asV!||z3mKPLPeusuZze5f9lI39x@S6{dCD5*ZI3cvoyC0oc+QVSHuEA6*4s&+ znSU@~9iAiX_j`Ae?bV&Qo}+4+Z&BvdUd zGi4okoZKmfxltzb@d?ZWH#6@#hIyA7&gZEq%oBHTc~?K-{ytQAA8}>`R=rj_t>eXWmoTm#9*~_7_%hxfTfT^0X1|;YkY_OR5;(H z`-|%*$A;^9SQgv6c`~>3VgBs}bJzcvYae4iwVL^eOPqfjNA|0Ixy(-}v45uRX8R*? z{JSQJoX^O3Zm&mYcz)O69nTZ{=rT85&)-3e>M_si%j=33=PFUS?bkC`wPXG#m)A3m zw=?&?!|S5X+j#%Lmx^-CXF($K(KmU2LUAzfXXrnRdGtHxjh{1D-NyXwKIR<{G1sZ) z{TPotnfE=!{F)x~z!ybWpL)}nEA3?7(}%g$Fy=R^nRl-%#{4|F&h-$tQsB{?R4jH?13B}*9AZ3abwLBUdL;GvnkfY_CQ__Y%9F`tTI&{(|bD+7}4-evD|%^{}HI z*IWM*ZkMa?xqXK`WPiBxoBb!lgvax04(x{wStb>UUhK~+tvTL374DU~vW4Tr+=QZeVXuY!gF}OtWNuWiO}iy-f?#+1H)(>D8RewYiY%L3b$cC#jgIhQGU9*iZ7I7ss!>1{}Yp zHD*8YYRc5%VQSdE9tu3HRTX19%-+SDE9{hHU2kO*tOz+0HuixjpOB*7qEbj)ZYM8q=BM zQCa}&XVPJgQ=3Cshh4_9Za2Qed{hZ@4?+Lm2=*~moX$-Rp6`ST^B`a0T;BBCT;5ro zxPH`za6S9|;<%IJ$L-rs7`OC4$bRKBh5a^u9Q*&6SngkKM{|Evwc`Hk){gsoJvG*c zSEa10E@wDid|J->{A&s8eB3f#CwaAlCy*P9%CX{XFEFnY-hX%W;PhX+bAJ8_aVj^9 z%WMCN>nHIV*Jp?a$Eh_9xm|t;>$E*wxqSmVu|GIfGB2p85J~oc%qA@w^z58 z+`c(udEG2~3G4s6QS4Wvd$S)}S@OK&Vi{JaqRN~5%h*cpkMD*3A@ha()j>wAGslH{ zIg}h&$Ck#j?j01~rCK1&7c_##o?^C z`VG0g>J4K3v{=UanJB!2X}OC1$5?o9R9Cp?Fw~0uHh(;?tCR`n4ZCmSe(^JzdHiPP zCG(lL7Siut$o6XUdA$9p8TV`5XUwY{I9?o>&V02o^H;+Cy7OA_?+)3|`JX$NxrMOa zRp!n1HG#~#Zep$#%6z;J^C@kaw+`p_x~j%}=2rGYpKA8ol!?qApW%7jz%Q)NDh-)u zbmDPHh!>Art_E{IZIj63pH8)`|2Ks9cHh^ro;dzs{pqK|+}4iAffLWMzTF(nTtl1r zL}7nR!dbSDnZ)_IChXI2-^JxhpT+gl*OK)%SlC}Q@-nx}@D1FKkJfOzho53UsjFhY z8Y#R3zJ3||c|TzvvZn?2#|?U{KT65W_iM1ex!E!wIh6T-f_-Kc|L*r4%om$7KPl){ z_b03~UWKePi66P1jk8!!KL26eP!{$#-V@$;UVEMW$4b}_FsTvyp?fp-Ta)JO|DXGC ze`&gd`&Xw9%uoK~{#!2Wm(vvXWu@KYbe6<3KX;jVGeI}bcjo+8Ph@U(i20x9TyG7I zGH)c@e^@($+r@MM^Toowjuw5`K0x?g(;uAAr4N|zN@G4lIM=V3G)Un%!f^2ZYT89#-*H}9$K8vep}|(O__JGV{W{V z`Gj-KpFL$hv5@)4a^@*P%rAcCdbno8d_gq(=Uad7zxla54mljd^S&o zpYeS2av1Y);hu_h_jo?*n!@wqv_{NN+weMPrA`F~p8uxs`szmq=HV91Z;#`JkNQ!i z_`9E0G5`0k1no}*F}Lf@+$yLT(|LD{_W{1oVE*wbr_*8>|L)iJ%*TvlzF-gY@BNuC za^d_uKg9VrYR5ceL?PBs;lgjo)4Z66XmUF9)cALm9JpM{!u#X%#&ADU-p&0wQg{!s zAeP7BOUCo~Ic|;`)0y2% z>gywq$zncba!a&V@-RYf*V-6)J16D?ayXsmKK#4QUASEJUA6Fc2i@fL5BV-6FiZYP%e}wc?#{j&kx1jz>AdeJLtC)bR&=S96?t7RKM# zjK4E)cbB=rdgkwfnUDL&{FN%l&F@24w{!1lV|fRy(M7&1nd8D+1;@2U#%ymC%JKTi zCeEkzdoFM7Om44rQ#kH4iRAUGEz@{CYSJRC2F13=JfFHB%KfqQBFCxQpSfRj5x%?m zePjJpR$;yE@6YjKVJFt}#zMUC5atUZyLkM0vNy+({X_V7U4uEFW6~?I0jhs;d98$f z^*?<$F3+xDo;iv2Uy;RJX9?@!LU(T88JAgabu2h846Ip1SH`m!$VJJ=K}=-oWtclY=;^J%?!o^|9r^A6ovKWBeu{_$-y%xC0xj*l@F ztlO(2G%+3R$IMp>?~U#e;^S&3&X2=wE?1)P?z5r`x64>zzx^05_J>h1>_3sheuL7} z?4Maf*q`6u;`vd>_Z)ZfKCoWR`N#2Pb|CBUaDUeGLq!}H94dLeC1pQzrytDsM{@eZ zLpkoeU&;9#Je=cBVlneRGq@gF#4!(3aGdHH%zVWpu77vooZTql-I=O%jyru{u|N1U zX8(zA%(^=5G5cX3ZT8!ysvIvYuQ1=K&f_uFiOlQoU~W^vyo(pFKlnA`e){AF^AAxx zp47a{I?&CAzr)^fV4ZO=WxcWpXI-6@#pCDR4S762wgZpPKVM`%W)<^+TRHvnT0G9r zQQ~=r&1BBMS###Pt(fn0V7}Ic`5588dPfJ2NAC`C9IOfFxLn?pkCBkMr2KgR{l|5%qU%w*l$YR7u}_W zM$E@+G4CwgtNC9A`{DB~%w2{1MN6*pIAQN2?iUwSnCo8R@lT`0%yY*ucQIie_5s~o zk-MDv+$$Ux+`h0rOl-hBM7SR~MYvb(xIf1o%R<&M$Cb=4XfiK3&N|tyC-W=C9Pf6w zWBXcR9e(OCE?3K=tiv-JbN!zU;`W*%oV#2iy#G5{xS#e`C68~Xw&MOZ(SiH>i66|@ zEMXlR|BQJ>JJ!R^i81+nr8v{j^Wxdd_;wy0qdh zx7Ub0tV_RVvi|hx#=6n=E&Ji}VD9f9+Oj_{_{aURg>a5LTsSv({|om!^K|B|h5K4{ zg?))vPjEgTW-+fRXa3rP`}>$f%vH6y-p(&)?sbSJ~f<$0s)*^E`3$Fy=|oyzckCkmsR? z%J_R$ivi46-R602YDebJb9mjr>n8J~*O}+NWInzr|L&>A%q=G}e;&i!ek*gcFy?c# zx!zs~@49}O&Fx}&kolJV%zp{@S=CyzKb$+p{Q6ktw)gmVpIm3YMDRD|K5TDn!S&|b zn7PVm=6PqhU1qtn|E&GS>p8D)F%N9cJhdsWgW1RO`jScKQVfvS)p?!DyA7{v4VuO4 zV8&+5?G`ZK@s+vHM*dyvP|j!XP%dxDYp%D>57{5w&+s_#lQ3@4sOE9<(AzwoFB{Yh z>%ZPmE#$A1c-=eWsy^DsMi?MZ8Qv24p&x7?;lSzN751<057WW)V|1C@oX|%5y4}p5 z#Bw_KoVkADwK)F={_5iIraa`|wXf4e`*sR$$Blcq-K{3DpRDrc_^!K?{WJXr`?K*M z_J0dy?(b_>aX%`GVEfwTye^$>#QDjuU>-Jx_3(ude>H_TKCK6*b5x6ex7>zxvf)22 zS6(#R_qXET-O`%lLi>>%*Gj(dxGU3;{o#xzj}OQ8VjgeH{O@Z{zr{lOONKU_S zs3!hys#0_0QF*M-dz&!#{LSBGy6<88mKDs89c7;Ln$zDXyx%%q!QXubcjNfdC7#>; zcoh3d{zUFa^Mrc?0_s@bu1;n>Z0^AN`RPX)wpZyc=EL_h@41Hg{YA|Cr!e0#nDzhs zM&=trna7%Od94R?JjxX2p`X3Dp4Iws963FZ^>)uB)|tS;-0o_JSZ8Vv@cM?0KQ^Oc zeJA#}GFRru?3jo2W8U>5^M~tsU1*W;zMjDxUiWV5%>8Jp3a_hYjAcH#2lIO&oc_W! zoS*bDJZ=mc$K}=Z=K5*E?x}d<$o6L!a{9LoIGTPeHE{-d*+h5KW# zaom4r3*Wob?AYE;xX;Z)nSZxoKhEb3KQ32cE!TrX9`g>yoX#WRe&*%EJG0X+ay~!W za=AvNGH=q7>n&;~bIWMv#}%x@cUChuGGaZ?`N@2KeIEatDs%k0kjH#mD$hF(`!&N3 zV=;kw>Of9sMIz_Z;w6{Mburhc&3*Qh(Hprx4vOJ^t=|WWr3mZAy5ZNI^(U{2b*$Y} z*1d&M9M_z(Ij)rkvEFJXvOc>D>tm}vu+D3YXTE0|^T15zdFwfzM#OVI?FMqWa-Q=1 zC29)C7ZoF}=a3q1mzpqc#}n*6isr(1>Qq(!hgL^f-}cvMT`C*F`codl{@-mM>&8E6 zJekS;>wF~hX%m?bv|*kr+><#bj`LYFgt?aq^L{OvA1USf*>#AyeQ)L$(zyN~Oklq9 z47X$Rr>sl4+3XMZ{;~g*3GdqHedKvo*C6Jbk1((O!(4kR=V#L{=KBvbzqgwlT| z71r%-GueJ?pn;=XS3V_62<`X1_Xg zi2d`(IPSj}RJgydZNd6bXvcc;-&ocq4PpIu-3`{m$u6wVTXrzd>d!nSm(%YxmbqgT z=RY`$%WI|1{Hg`lTLa;oQP?_e7ptG#j(>(SFA&}(zxj~;>Vz@#i23ZdQQKHI`lhiy z7zyv`%s;^$AXm5_^5{qI?`pz5mbX^3z2ko7FHSKZaf!LxZRRSfT&}=j%xAA>ZvKGz zG9|9(#Iek)g?BD2EV&)u_%VMXoa^6Q%=TyNm~X9RzWp!rQ7@S5A7TD5g!!%*=2L`w zYm@kMoMPG(?iUxYG55FU{$+N9`KS)8=eB#8uTZcKs0?8~%!B!X&CCsibH1M!vi){% z=Ep*qM^9otQ@H2c|1Q@5a;rfpr$$U&Sw{LR|<|z}|-&B0KpZY~`fB#X< zI@4?#^9E@=fAlnEo;HN%?{n7h{B&d%&+E4sF@G<7zZ-Il=gZ1=%v;xIZrp}>>%q*U zg!PAa$JzeDTjpt&Jg;{Y_H*9f#`X%~zSf&UeMSx8dOos`xrT5bnq~^yw+Ufx6Ucn| zC+3EJ>_2`E>~GS0Pr(7~w>|5a_Yv;9Hi~C^n>x-90dLHl*WlRy8%>6M*xX8Q>b}f}2rM4SkD)!GM|;q zam4d7bLSt-ZG`*1t4{Op&Tq`|;_VRT`+b>zKE=FC74we49Cr={aokZV;dZGM#^KSz zy7 zw=wHUZhz*L^O#32VqR*>-0%?R$KeH+cXLDLmmRoWoG-CnrOswBd0cetF!K!IeCSVMKm5i=+`rl#61Xq(v16D&(q(@9 zBKP;~4$Nn);c@27!yI1>g?$l&g>{3)A9y@Gd@}RQX3Q5WF>h(f{DwdC1vSiVgnPzX zzTkLT@{{XrlJMSfho;<5%iFUKEN;)^BF{BEFTVaCbB$`|AB1<_H$Ue2xb8V#PZ<7$ z=k=HG@jAedAYM0^Ys35G2Rbm<*XDFyujBj#%;o%-MsRr-#B#l@yuj^}eS*iOD%#w> zKbx~Z1h-_p`qhQ|d%i3CVT14Nx4y#n&2xG@KXt6;ame7N%nPDkISZ z_QE-=SmC?a>J6NJLo@c<06iYJyh>p{wU+tD7tAe&F<-En^V2Gx^FPFjxnT?Di$*X{ zxWe4rit`hBka@2s%#AXczYxZO_U*ZTu4FRz`OLax@{M&&BZYPE_iWb5`pL|5_A{^4 zXI`GmzpMF;c|{XWCo7xnwT3dExR2|h?grP}PT`(vZ$amKe`lS)B%DJ(Ud;M%X+HD5 zH(7rU{o`@qTqEXBg?n8pN?BJ23-4Q*rLOQVGK zN=u#fr$;f{CvInMYRG(*u>PQbfXj7%J9FbB!G}(UmOZLwf8<<;7WZq*SbF~S~M+*I7{zJB(*M{?dY7+AV;r`x^ zL)kv_HUF;366W6Qo{G-NtOG~pF<)QGda}ir`MqzfOTUEu28B0S_q1)8pU-4nH49^2 zvX^=C9_E!3m^Wy_T-T6!*kI-_rZQhE+#5DmiR&S4H*=d}=1==_yNtNT{Gc!rwgKF9~BFBdi-Z{$u;Hye-_7lt`PUP3g^x3h5f**gzqf9zi>R- z)`bU@cICYOuyh8mdsOA~y0=jmUO%r1G3=1W^}`UVF$KgQ|&y`bz8*R!84e~%b6g6;di<@`js^E^7NfX6@QgLr(> zaWVHhts>U*lxE!D*W6;AnQ6{EWD4`IjaYv+3VPe_I_Kx0G3S58Z?+HjW^THP^P^bF z`F|v)lGt4KA zV!opl^DKYnhkLL;-#y8Eng@^Dm4tajaXHU-2K8qhZZMGh<0=!@nJ3GbuerkM__*-z z)^y@^D$6yT{~147AL^ZCzD1MM`A@hv)zzHy|L6^ucZdV)TlFN?+iRw*w{8=dH~Yxx z3^ZV_Bk2Fycbxwlow&R!Pjb6F&EWcM?9aUKNap$zm`{JnyrvoF=gTp+AC<=b(C93W zPt4r7e>J+m{r6%H$DRCXJU*v>WSZZD1d97j42U>)8)iv8q*9{bg?SInJ- z`xCkg_h28gVSk=0oDXdytOJ*9=5)qYF<+h}^siOiA5(2HMlKgZ8y{mIW^KJ6WI zlL+SDh5hhKjW`}f>2tZwwP^<}dbg zyx1<>r<8k)b;;%y$C2?S%yWhJ`*!SMJq$U{yzOb`nR}Vv4`RM%KJ(=c%oTO4^KFE8 z1{>dD`@6#V);H_~A;A*l&X#aDRC+gZrIr zEb}AJn4kT^+|-nHX51p?hQ-Y53;UYXOIc@3g!KW(ldSW{o-;rEfcb=7%&!UWJM^R;ide!3oGK57bcDNa2R#?SuY+`jc)nHwlE{}#c1c-fS>_G$L#C;gdk z{>J?x_$KoY!aMSh?y&tbVL!QIJKI-`W&X03`*or49j%)o+uz&Ix>4AixyxSGp8=hi z&k)}2>Lu(CS8QP2>*&wC{UPQxPnciU=6sI!V%|NGxvg;jwt)lJ+q8qsRa$VnR3-|dxo9boWDUXP7E&Fk1VTJt?Bs*m{Il~MXy zSm5vo=HLFdKzqM*PX9|1=f@<9?{)DH=XHDEGA^&pAm;1(@IHSJQ(pHrDd2URuL-;^ z6luxr*u4|Si$vkv@rI{Zor-ATeC0mjU8j*g+)uB~;qj8gXt1F1g~IpNn9H31k9WDeJ=M8>uEz0ra@=6nv0K7AbFr{*Dpj~I zbZ7`%E=6>d;4OtJbrZNxS&;6_2Zr=ag z!j}7K%|_-^*E6@#Wqx`Y|LzCjyXV1MoPYh(%r(w44|>czJ&(C^9rGCtIsc6wu)Xdh z=JV@uI_?9QFAZaEb&h$JBlAgNoS%K=>_4&p*bfs@xL=rO3jIij`5NIpyKVfliqGjh z4mtjW$1~bW%rzWXf2JK|{jVCze1LF2s-^|odyHoOX)^PNp3J-NVE!+I`7>QEZ=kR* zqR$SlwKjHJF=jU>(-W=6Z+_-iIoh!u5G=7T3SsY3{&D zEt!AW%kBHGlKmlS40D^^>{rKx^V<8kSc;j#{@WaN_VeT&+%Nuq=YI6ollkn%%+;f~ z|6Z8S{Iakg;DHI-7uRQQsn2}XQ0C9(FmE5oywe%xvy+(TUu15Pz`W`n^MHTMuj_LC z2lQm_Jb`(q1I$kg?{4P{=T93AV1L_K&U{t?>+O{m+%GJIbEyM``_Dau{^%CW{denN z?(ggGF~87+^`yj#dGJ`~=Lax%Zo%C58RsW0nECpd%vE)mr@ZI-St+b@&NgEE%kxh~V+e-FnQ|T<7_w&q3yg zeVKQ0Wxi)2^G~tNYm1q`)8hOe`NZ~yk<3S(V1DKr^NRD#2MYC;Tg~?Gnsfg53}CMQ zjCo35Zueq=TXkpq+Fs1Z3-PPs9p~qhaK6>TpVQaTW`EY+#oV!q`5t5LN2;BfKbXq= z*>2{0h4W>-g?k9w2=DKF9K-3q65gGe+k(qme2nY!xH5CIzT94aV%R^sr!b#6gwt_Y z$^3^Ea~E^w@n86N-}PlaXF9K&%^1tybFW_E^|x_x%!3y&FKW*`JdpW`&YYi5smu@F zWNvhr`6uDrjZp&IUl_~v7I=jD&)Lk+Ut#`wEw|Sc;U1N*4cTuMhV1_psmy;*=l+!` zyvO<{o8$8Hm&{iS?;m;WV*5wC1uon-wO}vjf9xCP8#i+L#*3JT3HM9i_2cv_f|n#yp%w0BeI#Wt`on)>D=f_`| zU)0awa=jVH{Mam>NBlU!^A~eJ&d;x=y#7-stVhkc!u9hZgX_n+Bd4z;+^=|PG?!O+ z_CYZ(jQiIVPwq!?m)LKQ3ipflSj*qVhLtkk_niC7zA4;Ks~T`V&Hpk#e}Hx4gm7Ly zN*HgSX~^S~KJlD>|G&(0PIEdTKHM(9h5g|wn^@1a+wr`0lkmOZr|@p6xA1UvsBrJc zu0)+>iju)ZA{br4>vp=NIWPY^=^B8aD-(EBST*ds7@ZGS7aKG!i zJ?!T`bGRMVesH^gc4fbvmBfBqJ&XNqhdb-J{t+H8c?;)0igG!Q+;7V17)@nfm(2Wp z6V9jQJmzEan5#N-J@nJydULSl{&+Kr>))>}>*3A>Zr{j0>{kw9Jl@EN=l=35oX1zk zelSlJ&Sk6#WBXYe%+Gpoezrt&{v&%bUv0qrg0P-k-i7Tu3FFdv5p3T}I3L$h&>z(h zZZEHS+^-i|al89#vY%v_a(~yH%>K47kNvYCoB4|NoQ}0H{<*P$^P@9`^Iz-4>T^a2Q%hXci7*Yh4V5Ug4w=k1M^cWn2&O1-bJ{N$o(?w{9PC3 z^M7-^P!nEnXta0+?Msf zgRl;eyOix0OlAIA*snOEhVwZpjk)z<<}=-yS6DKCP{8%}aTW9H!g)+b;oh_0%dDRU z`piFV<#w;9%Ut6Y>-isl<}n`31BLb8^}@a1pM`X$dvf}AE12trGA}#DJidZ?!C
ckP!7?*wU>b2{->q$OW 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

sRbyetk9b7V_R` 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∓XW|0uq~|l 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 data) { else if(formatChunk->numChannels == 2 && formatChunk->bitsPerSample == 16) _format = Buffer::Format::Stereo16; else { - Error() << "Audio::WavImporter::openData(): unsupported channel count" + Error() << "Audio::WavImporter::openData(): PCM with unsupported channel count" << formatChunk->numChannels << "with" << formatChunk->bitsPerSample << "bits per sample"; return; @@ -148,7 +148,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { else if(formatChunk->numChannels == 2 && formatChunk->bitsPerSample == 64) _format = Buffer::Format::StereoDouble; else { - Error() << "Audio::WavImporter::openData(): unsupported channel count" + Error() << "Audio::WavImporter::openData(): IEEE with unsupported channel count" << formatChunk->numChannels << "with" << formatChunk->bitsPerSample << "bits per sample"; return; @@ -161,7 +161,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { else if(formatChunk->numChannels == 2) _format = Buffer::Format::StereoALaw; else { - Error() << "Audio::WavImporter::openData(): unsupported channel count" + Error() << "Audio::WavImporter::openData(): ALaw with unsupported channel count" << formatChunk->numChannels << "with" << formatChunk->bitsPerSample << "bits per sample"; return; @@ -174,7 +174,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { else if(formatChunk->numChannels == 2) _format = Buffer::Format::StereoMuLaw; else { - Error() << "Audio::WavImporter::openData(): unsupported channel count" + Error() << "Audio::WavImporter::openData(): ULaw with unsupported channel count" << formatChunk->numChannels << "with" << formatChunk->bitsPerSample << "bits per sample"; return; From d3239b6be62319bfa1e45524363cdec21c12bb50 Mon Sep 17 00:00:00 2001 From: Alice Date: Fri, 30 Sep 2016 00:25:12 -0400 Subject: [PATCH 210/290] Audio: minor correction of documentation for ALAW and MULAW. --- src/Magnum/Audio/Buffer.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Magnum/Audio/Buffer.h b/src/Magnum/Audio/Buffer.h index 7adc651c6..fa0ddf3fe 100644 --- a/src/Magnum/Audio/Buffer.h +++ b/src/Magnum/Audio/Buffer.h @@ -58,28 +58,28 @@ class Buffer { Stereo16 = AL_FORMAT_STEREO16, /**< 16-bit interleaved signed stereo */ /** - * @brief 8-bit unsigned mono [A-Law Compressed Sound Format](https://en.wikipedia.org/wiki/A-law_algorithm) + * @brief 8-bit mono [A-Law Compressed Sound Format](https://en.wikipedia.org/wiki/A-law_algorithm) * * @requires_al_extension Extension @al_extension{EXT,ALAW} */ MonoALaw = AL_FORMAT_MONO_ALAW_EXT, /** - * @brief 16-bit signed stereo [A-Law Compressed Sound Format](https://en.wikipedia.org/wiki/A-law_algorithm) + * @brief 8-bit interleaved stereo [A-Law Compressed Sound Format](https://en.wikipedia.org/wiki/A-law_algorithm) * * @requires_al_extension Extension @al_extension{EXT,ALAW} */ StereoALaw = AL_FORMAT_STEREO_ALAW_EXT, /** - * @brief 8-bit unsigned mono [μ-Law Compressed Sound Format](https://en.wikipedia.org/wiki/Μ-law_algorithm) + * @brief 8-bit mono [μ-Law Compressed Sound Format](https://en.wikipedia.org/wiki/Μ-law_algorithm) * * @requires_al_extension Extension @al_extension{EXT,MULAW} */ MonoMuLaw = AL_FORMAT_MONO_MULAW_EXT, /** - * @brief 16-bit signed [μ-Law Compressed Sound Format](https://en.wikipedia.org/wiki/Μ-law_algorithm) + * @brief 8-bit interleaved [μ-Law Compressed Sound Format](https://en.wikipedia.org/wiki/Μ-law_algorithm) * * @requires_al_extension Extension @al_extension{EXT,MULAW} */ From d3fc5f94109e730d491655caad336139adb2371b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 3 Oct 2016 16:48:59 +0200 Subject: [PATCH 211/290] WavAudioImporter: put new enums into the Debug output operator. Adapted tests and changed case of the AdPcm value. --- src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp | 6 +++--- src/MagnumPlugins/WavAudioImporter/WavHeader.cpp | 2 ++ src/MagnumPlugins/WavAudioImporter/WavHeader.h | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp index 12fc34f8c..2c537ea57 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp +++ b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp @@ -138,7 +138,7 @@ void WavImporterTest::unsupportedFormat() { WavImporter importer; CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "unsupportedFormat.wav"))); - CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat(0x2)\n"); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::AdPcm\n"); } void WavImporterTest::unsupportedChannelCount() { @@ -195,7 +195,7 @@ void WavImporterTest::mono4() { WavImporter importer; CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono4.wav"))); - CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat(0x2)\n"); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::AdPcm\n"); } void WavImporterTest::mono8() { @@ -264,7 +264,7 @@ void WavImporterTest::stereo4() { WavImporter importer; CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "stereo4.wav"))); - CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat(0x2)\n"); + CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::AdPcm\n"); } void WavImporterTest::stereo8() { diff --git a/src/MagnumPlugins/WavAudioImporter/WavHeader.cpp b/src/MagnumPlugins/WavAudioImporter/WavHeader.cpp index 1bfbbf990..a3df3b83a 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavHeader.cpp +++ b/src/MagnumPlugins/WavAudioImporter/WavHeader.cpp @@ -39,7 +39,9 @@ Debug& operator<<(Debug& debug, const WavAudioFormat value) { switch(value) { /* LCOV_EXCL_START */ #define _c(value) case WavAudioFormat::value: return debug << "Audio::WavAudioFormat::" #value; + _c(Unknown) _c(Pcm) + _c(AdPcm) _c(IeeeFloat) _c(ALaw) _c(MuLaw) diff --git a/src/MagnumPlugins/WavAudioImporter/WavHeader.h b/src/MagnumPlugins/WavAudioImporter/WavHeader.h index 678dbe5cd..90e447008 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavHeader.h +++ b/src/MagnumPlugins/WavAudioImporter/WavHeader.h @@ -38,7 +38,7 @@ namespace Magnum { namespace Audio { enum class WavAudioFormat: UnsignedShort { Unknown = 0x0000, /**< Unknown */ Pcm = 0x0001, /**< PCM */ - Adpcm = 0x0002, /**< Adaptive Differential PCM */ + AdPcm = 0x0002, /**< Adaptive Differential PCM */ IeeeFloat = 0x0003, /**< IEEE Float */ ALaw = 0x0006, /**< A-Law */ MuLaw = 0x0007, /**< μ-Law */ From 70eb0e816f618baac88eb5ce687bb70370ba500d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 3 Oct 2016 16:50:04 +0200 Subject: [PATCH 212/290] WavAudioImporter: use MuLaw consistently. --- src/MagnumPlugins/WavAudioImporter/WavImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp index 17d091702..449effa49 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp +++ b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp @@ -174,7 +174,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { else if(formatChunk->numChannels == 2) _format = Buffer::Format::StereoMuLaw; else { - Error() << "Audio::WavImporter::openData(): ULaw with unsupported channel count" + Error() << "Audio::WavImporter::openData(): MuLaw with unsupported channel count" << formatChunk->numChannels << "with" << formatChunk->bitsPerSample << "bits per sample"; return; From 2e91bb437260db7ea9516ce81dd7225613101083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 3 Oct 2016 17:05:08 +0200 Subject: [PATCH 213/290] Math: work around MSVC constexpr issues yet again. --- src/Magnum/Math/Test/ColorTest.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Math/Test/ColorTest.cpp b/src/Magnum/Math/Test/ColorTest.cpp index 105d32daa..eb7dd5a9b 100644 --- a/src/Magnum/Math/Test/ColorTest.cpp +++ b/src/Magnum/Math/Test/ColorTest.cpp @@ -281,7 +281,10 @@ void ColorTest::convert() { constexpr Vec3 a3{1.5f, 2.0f, -3.5f}; constexpr Color3 b3{1.5f, 2.0f, -3.5f}; - constexpr Color3 c3(a3); + #ifndef CORRADE_MSVC2015_COMPATIBILITY + constexpr /* No idea what's wrong. For Vector3 it "just works" */ + #endif + Color3 c3(a3); CORRADE_COMPARE(c3, b3); constexpr Vec3 d3(b3); @@ -292,7 +295,10 @@ void ColorTest::convert() { constexpr Vec4 a4{1.5f, 2.0f, -3.5f, -0.5f}; constexpr Color4 b4{1.5f, 2.0f, -3.5f, -0.5f}; - constexpr Vector4 c4(a4); + #ifndef CORRADE_MSVC2015_COMPATIBILITY + constexpr /* No idea what's wrong. For Vector4 it "just works" */ + #endif + Color4 c4(a4); CORRADE_COMPARE(c4, b4); constexpr Vec4 d4(b4); From a29d3c31ba8d1681f3bb9472764af583a4127263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 3 Oct 2016 17:24:17 +0200 Subject: [PATCH 214/290] WavAudioImporter: fix typo causing Emscripten build to fail. --- src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt index 120c07dae..b3da0dd9f 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt @@ -52,7 +52,7 @@ if(CORRADE_TARGET_EMSCRIPTEN) emscripten_embed_file(WavAudioImporterTest invalidDataChunk.wav "/invalidDataChunk.wav") emscripten_embed_file(WavAudioImporterTest invalidFactChunk.wav "/invalidFactChunk.wav") - emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8.wav") + emscripten_embed_file(WavAudioImporterTest mono4.wav "/mono4.wav") emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8.wav") emscripten_embed_file(WavAudioImporterTest mono8junk.wav "/mono8junk.wav") emscripten_embed_file(WavAudioImporterTest mono8ALaw.wav "/mono8ALaw.wav") From 98735f50f42adc9773215d6e92670b0333d4e192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 4 Oct 2016 15:32:28 +0200 Subject: [PATCH 215/290] Math: document the math behind 2D/3D matrix transformations. --- src/Magnum/Math/Matrix3.h | 48 ++++++++++- src/Magnum/Math/Matrix4.h | 125 ++++++++++++++++++++++++---- src/Magnum/Math/RectangularMatrix.h | 3 + 3 files changed, 156 insertions(+), 20 deletions(-) diff --git a/src/Magnum/Math/Matrix3.h b/src/Magnum/Math/Matrix3.h index be1eaa376..9eb69bf2d 100644 --- a/src/Magnum/Math/Matrix3.h +++ b/src/Magnum/Math/Matrix3.h @@ -49,6 +49,13 @@ template class Matrix3: public Matrix3x3 { * @brief 2D translation matrix * @param vector Translation vector * + * @f[ + * \boldsymbol{A} = \begin{pmatrix} + * 1 & 0 & v_x \\ + * 0 & 1 & v_y \\ + * 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref translation() const, @ref DualComplex::translation(), * @ref Matrix4::translation(const Vector3&), * @ref Vector2::xAxis(), @ref Vector2::yAxis() @@ -63,6 +70,13 @@ template class Matrix3: public Matrix3x3 { * @brief 2D scaling matrix * @param vector Scaling vector * + * @f[ + * \boldsymbol{A} = \begin{pmatrix} + * v_x & 0 & 0 \\ + * 0 & v_y & 0 \\ + * 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref rotationScaling(), * @ref Matrix4::scaling(const Vector3&), * @ref Vector2::xScale(), @ref Vector2::yScale() @@ -77,6 +91,13 @@ template class Matrix3: public Matrix3x3 { * @brief 2D rotation matrix * @param angle Rotation angle (counterclockwise) * + * @f[ + * \boldsymbol{A} = \begin{pmatrix} + * \cos\theta & -\sin\theta & 0 \\ + * \sin\theta & \cos\theta & 0 \\ + * 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref rotation() const, @ref Complex::rotation(), * @ref DualComplex::rotation(), * @ref Matrix4::rotation(Rad, const Vector3&) @@ -90,7 +111,9 @@ template class Matrix3: public Matrix3x3 { * Expects that the normal is normalized. Reflection along axes can be * done in a slightly simpler way also using @ref scaling(), e.g. * `Matrix3::reflection(Vector2::yAxis())` is equivalent to - * `Matrix3::scaling(Vector2::yScale(-1.0f))`. + * `Matrix3::scaling(Vector2::yScale(-1.0f))`. @f[ + * \boldsymbol{A} = \boldsymbol{I} - 2 \boldsymbol{NN}^T ~~~~~ \boldsymbol{N} = \begin{pmatrix} n_x \\ n_y \end{pmatrix} + * @f] * @see @ref Matrix4::reflection(), @ref Vector::isNormalized() */ static Matrix3 reflection(const Vector2& normal) { @@ -103,7 +126,13 @@ template class Matrix3: public Matrix3x3 { * @brief 2D shearing matrix along X axis * @param amount Shearing amount * - * Y axis remains unchanged. + * Y axis remains unchanged. @f[ + * \boldsymbol{A} = \begin{pmatrix} + * 1 & v_x & 0 \\ + * 0 & 1 & 0 \\ + * 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref shearingY(), @ref Matrix4::shearingXY(), * @ref Matrix4::shearingXZ(), @ref Matrix4::shearingYZ() */ @@ -117,7 +146,13 @@ template class Matrix3: public Matrix3x3 { * @brief 2D shearing matrix along Y axis * @param amount Shearing amount * - * X axis remains unchanged. + * X axis remains unchanged. @f[ + * \boldsymbol{A} = \begin{pmatrix} + * 1 & 0 & 0 \\ + * v_y & 1 & 0 \\ + * 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref shearingX(), @ref Matrix4::shearingXY(), * @ref Matrix4::shearingXZ(), @ref Matrix4::shearingYZ() */ @@ -131,6 +166,13 @@ template class Matrix3: public Matrix3x3 { * @brief 2D projection matrix * @param size Size of the view * + * @f[ + * \boldsymbol{A} = \begin{pmatrix} + * \frac{2}{s_x} & 0 & 0 \\ + * 0 & \frac{2}{s_y} & 0 \\ + * 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref Matrix4::orthographicProjection(), * @ref Matrix4::perspectiveProjection() */ diff --git a/src/Magnum/Math/Matrix4.h b/src/Magnum/Math/Matrix4.h index d3ee65716..73e0c936b 100644 --- a/src/Magnum/Math/Matrix4.h +++ b/src/Magnum/Math/Matrix4.h @@ -51,9 +51,17 @@ See @ref matrix-vector and @ref transformations for brief introduction. template class Matrix4: public Matrix4x4 { public: /** - * @brief 3D translation + * @brief 3D translation matrix * @param vector Translation vector * + * @f[ + * \boldsymbol{A} = \begin{pmatrix} + * 1 & 0 & 0 & v_x \\ + * 0 & 1 & 0 & v_y \\ + * 0 & 0 & 1 & v_z \\ + * 0 & 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref translation(), @ref DualQuaternion::translation(), * @ref Matrix3::translation(const Vector2&), * @ref Vector3::xAxis(), @ref Vector3::yAxis(), @@ -67,9 +75,17 @@ template class Matrix4: public Matrix4x4 { } /** - * @brief 3D scaling + * @brief 3D scaling matrix * @param vector Scaling vector * + * @f[ + * \boldsymbol{A} = \begin{pmatrix} + * v_x & 0 & 0 & 0 \\ + * 0 & v_y & 0 & 0 \\ + * 0 & 0 & v_z & 0 \\ + * 0 & 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref rotationScaling(), * @ref Matrix3::scaling(const Vector2&), * @ref Vector3::xScale(), @ref Vector3::yScale(), @@ -83,13 +99,20 @@ template class Matrix4: public Matrix4x4 { } /** - * @brief 3D rotation around arbitrary axis + * @brief 3D rotation matrix around arbitrary axis * @param angle Rotation angle (counterclockwise) * @param normalizedAxis Normalized rotation axis * * Expects that the rotation axis is normalized. If possible, use * faster alternatives like @ref rotationX(), @ref rotationY() and - * @ref rotationZ(). + * @ref rotationZ(). @f[ + * \boldsymbol{A} = \begin{pmatrix} + * v_{x}v_{x}(1 - \cos\theta) + \cos\theta & v_{y}v_{x}(1 - \cos\theta) - v_{z}\sin \theta & v_{z}v_{x}(1 - \cos\theta) + v_{y}\sin\theta & 0 \\ + * v_{x}v_{y}(1 - \cos\theta) + v_{z}\sin\theta & v_{y}v_{y}(1 - \cos\theta) + \cos\theta & v_{z}v_{y}(1 - \cos\theta) - v_{x}\sin\theta & 0 \\ + * v_{x}v_{z}(1 - \cos\theta) - v_{y}\sin\theta & v_{y}v_{z}(1 - \cos\theta)+v_{x}\sin\theta & v_{z}v_{z}(1 - \cos\theta) + \cos\theta & 0 \\ + * 0 & 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref rotation() const, @ref Quaternion::rotation(), * @ref DualQuaternion::rotation(), @ref Matrix3::rotation(Rad), * @ref Vector3::xAxis(), @ref Vector3::yAxis(), @@ -98,10 +121,17 @@ template class Matrix4: public Matrix4x4 { static Matrix4 rotation(Rad angle, const Vector3& normalizedAxis); /** - * @brief 3D rotation around X axis + * @brief 3D rotation matrix around X axis * @param angle Rotation angle (counterclockwise) * - * Faster than calling `Matrix4::rotation(angle, Vector3::xAxis())`. + * Faster than calling `Matrix4::rotation(angle, Vector3::xAxis())`. @f[ + * \boldsymbol{A} = \begin{pmatrix} + * 1 & 0 & 0 & 0 \\ + * 0 & \cos\theta & -\sin\theta & 0 \\ + * 0 & \sin\theta & \cos\theta & 0 \\ + * 0 & 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref rotation(Rad, const Vector3&), @ref rotationY(), * @ref rotationZ(), @ref rotation() const, * @ref Quaternion::rotation(), @ref Matrix3::rotation(Rad) @@ -109,10 +139,17 @@ template class Matrix4: public Matrix4x4 { static Matrix4 rotationX(Rad angle); /** - * @brief 3D rotation around Y axis + * @brief 3D rotation matrix around Y axis * @param angle Rotation angle (counterclockwise) * - * Faster than calling `Matrix4::rotation(angle, Vector3::yAxis())`. + * Faster than calling `Matrix4::rotation(angle, Vector3::yAxis())`. @f[ + * \boldsymbol{A} = \begin{pmatrix} + * \cos\theta & 0 & \sin\theta & 0 \\ + * 0 & 1 & 0 & 0 \\ + * -\sin\theta & 0 & \cos\theta & 0 \\ + * 0 & 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref rotation(Rad, const Vector3&), @ref rotationX(), * @ref rotationZ(), @ref rotation() const, * @ref Quaternion::rotation(), @ref Matrix3::rotation(Rad) @@ -123,7 +160,14 @@ template class Matrix4: public Matrix4x4 { * @brief 3D rotation matrix around Z axis * @param angle Rotation angle (counterclockwise) * - * Faster than calling `Matrix4::rotation(angle, Vector3::zAxis())`. + * Faster than calling `Matrix4::rotation(angle, Vector3::zAxis())`. @f[ + * \boldsymbol{A} = \begin{pmatrix} + * \cos\theta & -\sin\theta & 0 & 0 \\ + * \sin\theta & \cos\theta & 0 & 0 \\ + * 0 & 0 & 1 & 0 \\ + * 0 & 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref rotation(Rad, const Vector3&), @ref rotationX(), * @ref rotationY(), @ref rotation() const, * @ref Quaternion::rotation(), @ref Matrix3::rotation(Rad) @@ -137,17 +181,26 @@ template class Matrix4: public Matrix4x4 { * Expects that the normal is normalized. Reflection along axes can be * done in a slightly simpler way also using @ref scaling(), e.g. * `Matrix4::reflection(Vector3::yAxis())` is equivalent to - * `Matrix4::scaling(Vector3::yScale(-1.0f))`. + * `Matrix4::scaling(Vector3::yScale(-1.0f))`. @f[ + * \boldsymbol{A} = \boldsymbol{I} - 2 \boldsymbol{NN}^T ~~~~~ \boldsymbol{N} = \begin{pmatrix} n_x \\ n_y \\ n_z \end{pmatrix} + * @f] * @see @ref Matrix3::reflection(), @ref Vector::isNormalized() */ static Matrix4 reflection(const Vector3& normal); /** - * @brief 3D shearing along XY plane + * @brief 3D shearing matrix along XY plane * @param amountX Amount of shearing along X axis * @param amountY Amount of shearing along Y axis * - * Z axis remains unchanged. + * Z axis remains unchanged. @f[ + * \boldsymbol{A} = \begin{pmatrix} + * 1 & 0 & v_x & 0 \\ + * 0 & 1 & v_y & 0 \\ + * 0 & 0 & 1 & 0 \\ + * 0 & 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref shearingXZ(), @ref shearingYZ(), @ref Matrix3::shearingX(), * @ref Matrix3::shearingY() */ @@ -159,11 +212,18 @@ template class Matrix4: public Matrix4x4 { } /** - * @brief 3D shearing along XZ plane + * @brief 3D shearing matrix along XZ plane * @param amountX Amount of shearing along X axis * @param amountZ Amount of shearing along Z axis * - * Y axis remains unchanged. + * Y axis remains unchanged. @f[ + * \boldsymbol{A} = \begin{pmatrix} + * 1 & v_x & 0 & 0 \\ + * 0 & 1 & 0 & 0 \\ + * 0 & v_z & 1 & 0 \\ + * 0 & 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref shearingXY(), @ref shearingYZ(), @ref Matrix3::shearingX(), * @ref Matrix3::shearingY() */ @@ -175,11 +235,18 @@ template class Matrix4: public Matrix4x4 { } /** - * @brief 3D shearing along YZ plane + * @brief 3D shearing matrix along YZ plane * @param amountY Amount of shearing along Y axis * @param amountZ Amount of shearing along Z axis * - * X axis remains unchanged. + * X axis remains unchanged. @f[ + * \boldsymbol{A} = \begin{pmatrix} + * 1 & 0 & 0 & 0 \\ + * v_y & 1 & 0 & 0 \\ + * v_z & 0 & 1 & 0 \\ + * 0 & 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref shearingXY(), @ref shearingXZ(), @ref Matrix3::shearingX(), * @ref Matrix3::shearingY() */ @@ -196,6 +263,14 @@ template class Matrix4: public Matrix4x4 { * @param near Distance to near clipping plane, positive is ahead * @param far Distance to far clipping plane, positive is ahead * + * @f[ + * \boldsymbol{A} = \begin{pmatrix} + * \frac{2}{s_x} & 0 & 0 & 0 \\ + * 0 & \frac{2}{s_y} & 0 & 0 \\ + * 0 & 0 & \frac{2}{n - f} & \frac{2n}{n - f} - 1 \\ + * 0 & 0 & 0 & 1 + * \end{pmatrix} + * @f] * @see @ref perspectiveProjection(), @ref Matrix3::projection() */ static Matrix4 orthographicProjection(const Vector2& size, T near, T far); @@ -206,6 +281,14 @@ template class Matrix4: public Matrix4x4 { * @param near Distance to near clipping plane, positive is ahead * @param far Distance to far clipping plane, positive is ahead * + * @f[ + * \boldsymbol{A} = \begin{pmatrix} + * \frac{2n}{s_x} & 0 & 0 & 0 \\ + * 0 & \frac{2n}{s_y} & 0 & 0 \\ + * 0 & 0 & \frac{n + f}{n - f} & \frac{2nf}{n - f} \\ + * 0 & 0 & -1 & 0 + * \end{pmatrix} + * @f] * @see @ref orthographicProjection(), @ref Matrix3::projection() */ static Matrix4 perspectiveProjection(const Vector2& size, T near, T far); @@ -217,6 +300,14 @@ template class Matrix4: public Matrix4x4 { * @param near Near clipping plane * @param far Far clipping plane * + * @f[ + * \boldsymbol{A} = \begin{pmatrix} + * \frac{1}{\tan{\frac{\theta}{2}}} & 0 & 0 & 0 \\ + * 0 & \frac{a}{\tan{\frac{\theta}{2}}} & 0 & 0 \\ + * 0 & 0 & \frac{n + f}{n - f} & \frac{2nf}{n - f} \\ + * 0 & 0 & -1 & 0 + * \end{pmatrix} + * @f] * @see @ref orthographicProjection(), @ref Matrix3::projection() */ static Matrix4 perspectiveProjection(Rad fov, T aspectRatio, T near, T far) { @@ -447,7 +538,7 @@ template class Matrix4: public Matrix4x4 { * * Unlike in @ref transformVector(), translation is also involved in * the transformation. @f[ - * \boldsymbol v' = v''_{xyz} / v''_w ~~~~~~~~~~ \boldsymbol v'' = \begin{pmatrix} v''_x \\ v''_y \\ v''_z \\ v''_w \end{pmatrix} = \boldsymbol M \begin{pmatrix} v_x \\ v_y \\ v_z \\ 1 \end{pmatrix} \\ + * \boldsymbol v' = \boldsymbol v''_{xyz} / v''_w ~~~~~~~~~~ \boldsymbol v'' = \begin{pmatrix} v''_x \\ v''_y \\ v''_z \\ v''_w \end{pmatrix} = \boldsymbol M \begin{pmatrix} v_x \\ v_y \\ v_z \\ 1 \end{pmatrix} \\ * @f] * @see @ref DualQuaternion::transformPoint(), * @ref Matrix3::transformPoint() diff --git a/src/Magnum/Math/RectangularMatrix.h b/src/Magnum/Math/RectangularMatrix.h index 76b8d67e0..5c5e5ebbe 100644 --- a/src/Magnum/Math/RectangularMatrix.h +++ b/src/Magnum/Math/RectangularMatrix.h @@ -339,6 +339,9 @@ template class RectangularMatrix { /** * @brief Transposed matrix * + * @f[ + * \boldsymbol{A}^T_ij = \boldsymbol{A}_ji + * @f] * @see @ref row(), @ref flippedCols(), @ref flippedRows() */ RectangularMatrix transposed() const; From 9fdf467c5986aa76d3096914d79b10230d342cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 5 Oct 2016 11:49:03 +0200 Subject: [PATCH 216/290] Math: added *Matrix::setRow(). Row equivalent for the mutable operator[](). --- src/Magnum/Math/RectangularMatrix.h | 17 ++++++++++++++++- src/Magnum/Math/Test/RectangularMatrixTest.cpp | 11 ++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/Magnum/Math/RectangularMatrix.h b/src/Magnum/Math/RectangularMatrix.h index 5c5e5ebbe..41c60897f 100644 --- a/src/Magnum/Math/RectangularMatrix.h +++ b/src/Magnum/Math/RectangularMatrix.h @@ -191,10 +191,20 @@ template class RectangularMatrix { * Consider using @ref transposed() when accessing rows frequently, as * this is slower than accessing columns due to the way the matrix is * stored. - * @see @ref operator[]() + * @see @ref setRow(), @ref operator[]() */ Vector row(std::size_t row) const; + /** + * @brief Set matrix row + * + * Consider using @ref transposed() when accessing rows frequently, as + * this is slower than accessing columns due to the way the matrix is + * stored. + * @see @ref row(), @ref operator()[] + */ + void setRow(std::size_t row, const Vector& data); + /** @brief Equality comparison */ bool operator==(const RectangularMatrix& other) const { for(std::size_t i = 0; i != cols; ++i) @@ -662,6 +672,11 @@ template inline Vector Rec return out; } +template inline void RectangularMatrix::setRow(std::size_t row, const Vector& data) { + for(std::size_t i = 0; i != cols; ++i) + _data[i][row] = data[i]; +} + template inline RectangularMatrix RectangularMatrix::operator-() const { RectangularMatrix out; diff --git a/src/Magnum/Math/Test/RectangularMatrixTest.cpp b/src/Magnum/Math/Test/RectangularMatrixTest.cpp index 7deb7e198..d1adf3735 100644 --- a/src/Magnum/Math/Test/RectangularMatrixTest.cpp +++ b/src/Magnum/Math/Test/RectangularMatrixTest.cpp @@ -300,11 +300,16 @@ void RectangularMatrixTest::data() { } void RectangularMatrixTest::row() { - const Matrix3x4 a(Vector4(1.0f, 2.0f, 3.0f, 4.0f), - Vector4(5.0f, 6.0f, 7.0f, 8.0f), - Vector4(9.0f, 10.0f, 11.0f, 12.0f)); + Matrix3x4 a(Vector4(1.0f, 2.0f, 3.0f, 4.0f), + Vector4(5.0f, 6.0f, 7.0f, 8.0f), + Vector4(9.0f, 10.0f, 11.0f, 12.0f)); CORRADE_COMPARE(a.row(1), Vector3(2.0f, 6.0f, 10.0f)); + + a.setRow(1, {-2.1f, -6.1f, -10.1f}); + CORRADE_COMPARE(a, (Matrix3x4{Vector4{1.0f, -2.1f, 3.0f, 4.0f}, + Vector4{5.0f, -6.1f, 7.0f, 8.0f}, + Vector4{9.0f, -10.1f, 11.0f, 12.0f}})); } void RectangularMatrixTest::compare() { From 87074202c8e5c5fcf9d352cefce1252ae2272875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 5 Oct 2016 11:49:52 +0200 Subject: [PATCH 217/290] Math: support infinite far plane in Matrix::perspectiveProjection(). --- src/Magnum/Math/Matrix4.h | 49 +++++++++++++++++++++------- src/Magnum/Math/Test/Matrix4Test.cpp | 28 +++++++++++++++- 2 files changed, 65 insertions(+), 12 deletions(-) diff --git a/src/Magnum/Math/Matrix4.h b/src/Magnum/Math/Matrix4.h index 73e0c936b..c7dc88f91 100644 --- a/src/Magnum/Math/Matrix4.h +++ b/src/Magnum/Math/Matrix4.h @@ -281,7 +281,7 @@ template class Matrix4: public Matrix4x4 { * @param near Distance to near clipping plane, positive is ahead * @param far Distance to far clipping plane, positive is ahead * - * @f[ + * If @p far is finite, the result is: @f[ * \boldsymbol{A} = \begin{pmatrix} * \frac{2n}{s_x} & 0 & 0 & 0 \\ * 0 & \frac{2n}{s_y} & 0 & 0 \\ @@ -289,7 +289,17 @@ template class Matrix4: public Matrix4x4 { * 0 & 0 & -1 & 0 * \end{pmatrix} * @f] - * @see @ref orthographicProjection(), @ref Matrix3::projection() + * + * For infinite @p far, the result is: @f[ + * \boldsymbol{A} = \begin{pmatrix} + * \frac{2n}{s_x} & 0 & 0 & 0 \\ + * 0 & \frac{2n}{s_y} & 0 & 0 \\ + * 0 & 0 & -1 & -2n \\ + * 0 & 0 & -1 & 0 + * \end{pmatrix} + * @f] + * @see @ref orthographicProjection(), @ref Matrix3::projection(), + * @ref Constants::inf() */ static Matrix4 perspectiveProjection(const Vector2& size, T near, T far); @@ -300,7 +310,7 @@ template class Matrix4: public Matrix4x4 { * @param near Near clipping plane * @param far Far clipping plane * - * @f[ + * If @p far is finite, the result is: @f[ * \boldsymbol{A} = \begin{pmatrix} * \frac{1}{\tan{\frac{\theta}{2}}} & 0 & 0 & 0 \\ * 0 & \frac{a}{\tan{\frac{\theta}{2}}} & 0 & 0 \\ @@ -308,7 +318,17 @@ template class Matrix4: public Matrix4x4 { * 0 & 0 & -1 & 0 * \end{pmatrix} * @f] - * @see @ref orthographicProjection(), @ref Matrix3::projection() + * + * For infinite @p far, the result is: @f[ + * \boldsymbol{A} = \begin{pmatrix} + * \frac{1}{\tan{\frac{\theta}{2}}} & 0 & 0 & 0 \\ + * 0 & \frac{a}{\tan{\frac{\theta}{2}}} & 0 & 0 \\ + * 0 & 0 & -1 & -2n \\ + * 0 & 0 & -1 & 0 + * \end{pmatrix} + * @f] + * @see @ref orthographicProjection(), @ref Matrix3::projection(), + * @ref Constants::inf() */ static Matrix4 perspectiveProjection(Rad fov, T aspectRatio, T near, T far) { const T xyScale = 2*std::tan(T(fov)/2)*near; @@ -640,13 +660,20 @@ template Matrix4 Matrix4::orthographicProjection(const Vector2 } template Matrix4 Matrix4::perspectiveProjection(const Vector2& size, const T near, const T far) { - Vector2 xyScale = 2*near/size; - T zScale = T(1.0)/(near-far); - - return {{xyScale.x(), T(0), T(0), T(0)}, - { T(0), xyScale.y(), T(0), T(0)}, - { T(0), T(0), (far+near)*zScale, T(-1)}, - { T(0), T(0), T(2)*far*near*zScale, T(0)}}; + const Vector2 xyScale = 2*near/size; + + if(far == Constants::inf()) { + return {{xyScale.x(), T(0), T(0), T(0)}, + { T(0), xyScale.y(), T(0), T(0)}, + { T(0), T(0), T(-1), T(-1)}, + { T(0), T(0), T(-2)*near, T(0)}}; + } else { + const T zScale = T(1.0)/(near-far); + return {{xyScale.x(), T(0), T(0), T(0)}, + { T(0), xyScale.y(), T(0), T(0)}, + { T(0), T(0), (far+near)*zScale, T(-1)}, + { T(0), T(0), T(2)*far*near*zScale, T(0)}}; + } } template Matrix4 Matrix4::lookAt(const Vector3& eye, const Vector3& target, const Vector3& up) { diff --git a/src/Magnum/Math/Test/Matrix4Test.cpp b/src/Magnum/Math/Test/Matrix4Test.cpp index 49e20cade..7cce470c9 100644 --- a/src/Magnum/Math/Test/Matrix4Test.cpp +++ b/src/Magnum/Math/Test/Matrix4Test.cpp @@ -84,7 +84,9 @@ struct Matrix4Test: Corrade::TestSuite::Tester { void shearingYZ(); void orthographicProjection(); void perspectiveProjection(); + void perspectiveProjectionInfiniteFar(); void perspectiveProjectionFov(); + void perspectiveProjectionFovInfiniteFar(); void lookAt(); void fromParts(); @@ -134,7 +136,9 @@ Matrix4Test::Matrix4Test() { &Matrix4Test::shearingYZ, &Matrix4Test::orthographicProjection, &Matrix4Test::perspectiveProjection, + &Matrix4Test::perspectiveProjectionInfiniteFar, &Matrix4Test::perspectiveProjectionFov, + &Matrix4Test::perspectiveProjectionFovInfiniteFar, &Matrix4Test::lookAt, &Matrix4Test::fromParts, @@ -420,12 +424,34 @@ void Matrix4Test::perspectiveProjection() { CORRADE_COMPARE(actual.transformPoint({0.0f, 0.0f, -100.0f}), Vector3(0.0f, 0.0f, +1.0f)); } +void Matrix4Test::perspectiveProjectionInfiniteFar() { + Matrix4 expected({4.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 7.111111f, 0.0f, 0.0f}, + {0.0f, 0.0f, -1.0f, -1.0f}, + {0.0f, 0.0f, -64.0f, 0.0f}); + Matrix4 actual = Matrix4::perspectiveProjection({16.0f, 9.0f}, 32.0f, Constants::inf()); + CORRADE_COMPARE(actual, expected); + + /* NDC is left-handed, so point on near plane should be -1 and a *vector* + in direction of far plane +1 */ + CORRADE_COMPARE(actual.transformPoint({0.0f, 0.0f, -32.0f}), Vector3(0.0f, 0.0f, -1.0f)); + CORRADE_COMPARE(actual.transformVector({0.0f, 0.0f, -1.0f}), Vector3(0.0f, 0.0f, +1.0f)); +} + void Matrix4Test::perspectiveProjectionFov() { Matrix4 expected({4.1652994f, 0.0f, 0.0f, 0.0f}, { 0.0f, 9.788454f, 0.0f, 0.0f}, { 0.0f, 0.0f, -1.9411764f, -1.0f}, { 0.0f, 0.0f, -94.1176452f, 0.0f}); - CORRADE_COMPARE(Matrix4::perspectiveProjection(Deg(27.0f), 2.35f, 32.0f, 100), expected); + CORRADE_COMPARE(Matrix4::perspectiveProjection(Deg(27.0f), 2.35f, 32.0f, 100.0f), expected); +} + +void Matrix4Test::perspectiveProjectionFovInfiniteFar() { + Matrix4 expected({4.1652994f, 0.0f, 0.0f, 0.0f}, + { 0.0f, 9.788454f, 0.0f, 0.0f}, + { 0.0f, 0.0f, -1.0f, -1.0f}, + { 0.0f, 0.0f, -64.0f, 0.0f}); + CORRADE_COMPARE(Matrix4::perspectiveProjection(Deg(27.0f), 2.35f, 32.0f, Constants::inf()), expected); } void Matrix4Test::fromParts() { From 3764f5b830e939b598d670179c04e92b92fa4dde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 5 Oct 2016 13:42:41 +0200 Subject: [PATCH 218/290] Math: don't zero-initialize output variables if not necessary. Could possibly save some cycles. --- src/Magnum/Math/Matrix.h | 4 ++-- src/Magnum/Math/RectangularMatrix.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Magnum/Math/Matrix.h b/src/Magnum/Math/Matrix.h index b34c7ed90..8e6515412 100644 --- a/src/Magnum/Math/Matrix.h +++ b/src/Magnum/Math/Matrix.h @@ -333,7 +333,7 @@ template bool Matrix::isOrthogonal() const { } template Matrix Matrix::ij(const std::size_t skipCol, const std::size_t skipRow) const { - Matrix out{ZeroInit}; + Matrix out{NoInit}; for(std::size_t col = 0; col != size-1; ++col) for(std::size_t row = 0; row != size-1; ++row) @@ -344,7 +344,7 @@ template Matrix Matrix::ij(const } template Matrix Matrix::inverted() const { - Matrix out{ZeroInit}; + Matrix out{NoInit}; const T _determinant = determinant(); diff --git a/src/Magnum/Math/RectangularMatrix.h b/src/Magnum/Math/RectangularMatrix.h index 41c60897f..a433736b9 100644 --- a/src/Magnum/Math/RectangularMatrix.h +++ b/src/Magnum/Math/RectangularMatrix.h @@ -523,7 +523,7 @@ template inline RectangularMatrix& matrix) { - RectangularMatrix out; + RectangularMatrix out{NoInit}; for(std::size_t i = 0; i != cols; ++i) out[i] = number/matrix[i]; @@ -687,7 +687,7 @@ template inline RectangularMatrix template inline RectangularMatrix RectangularMatrix::operator*(const RectangularMatrix& other) const { - RectangularMatrix out; + RectangularMatrix out{ZeroInit}; for(std::size_t col = 0; col != size; ++col) for(std::size_t row = 0; row != rows; ++row) @@ -698,7 +698,7 @@ template template } template inline RectangularMatrix RectangularMatrix::transposed() const { - RectangularMatrix out; + RectangularMatrix out{NoInit}; for(std::size_t col = 0; col != cols; ++col) for(std::size_t row = 0; row != rows; ++row) From a2e3c3a3f46a31a9bd2c610535af5a3632863c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 5 Oct 2016 13:43:33 +0200 Subject: [PATCH 219/290] Math: added Algorithms::gaussJordanInverted(). --- src/Magnum/Math/Algorithms/GaussJordan.h | 18 +++++- .../Math/Algorithms/Test/GaussJordanTest.cpp | 57 ++++++++++++------- src/Magnum/Math/Matrix.h | 1 + 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/Magnum/Math/Algorithms/GaussJordan.h b/src/Magnum/Math/Algorithms/GaussJordan.h index ac6ba4a8e..c5dfcb43a 100644 --- a/src/Magnum/Math/Algorithms/GaussJordan.h +++ b/src/Magnum/Math/Algorithms/GaussJordan.h @@ -26,10 +26,10 @@ */ /** @file - * @brief Function @ref Magnum::Math::Algorithms::gaussJordanInPlaceTransposed(), @ref Magnum::Math::Algorithms::gaussJordanInPlace() + * @brief Function @ref Magnum::Math::Algorithms::gaussJordanInPlaceTransposed(), @ref Magnum::Math::Algorithms::gaussJordanInPlace(), @ref Magnum::Math::Algorithms::gaussJordanInverted() */ -#include "Magnum/Math/RectangularMatrix.h" +#include "Magnum/Math/Matrix.h" namespace Magnum { namespace Math { namespace Algorithms { @@ -111,6 +111,20 @@ template bool gaussJordanInPlace(Re return ret; } +/** +@brief Gauss-Jordan matrix inversion + +Since @f$ (\boldsymbol{A}^{-1})^T = (\boldsymbol{A}^T)^{-1} @f$, passes @p a +and an identity matrix to @ref gaussJordanInPlaceTransposed() and returns the +inverted matrix. Expects that the matrix is invertible. +@see @ref Matrix::inverted() +*/ +template Matrix gaussJordanInverted(Matrix matrix) { + Matrix inverted{Math::IdentityInit}; + CORRADE_INTERNAL_ASSERT_OUTPUT(gaussJordanInPlaceTransposed(matrix, inverted)); + return inverted; +} + }}} #endif diff --git a/src/Magnum/Math/Algorithms/Test/GaussJordanTest.cpp b/src/Magnum/Math/Algorithms/Test/GaussJordanTest.cpp index d7885d1b1..cb20424de 100644 --- a/src/Magnum/Math/Algorithms/Test/GaussJordanTest.cpp +++ b/src/Magnum/Math/Algorithms/Test/GaussJordanTest.cpp @@ -32,16 +32,38 @@ namespace Magnum { namespace Math { namespace Algorithms { namespace Test { struct GaussJordanTest: Corrade::TestSuite::Tester { explicit GaussJordanTest(); + void test(); void singular(); - void invert(); + void inverted(); }; -typedef RectangularMatrix<4, 4, Float> Matrix4x4; +typedef Matrix<4, Float> Matrix4x4; typedef Vector<4, Float> Vector4; GaussJordanTest::GaussJordanTest() { - addTests({&GaussJordanTest::singular, - &GaussJordanTest::invert}); + addTests({&GaussJordanTest::test, + &GaussJordanTest::singular, + &GaussJordanTest::inverted}); +} + +void GaussJordanTest::test() { + /* Basic matrix inversion */ + const Matrix4x4 m{Vector4{3.0f, 5.0f, 8.0f, 4.0f}, + Vector4{4.0f, 4.0f, 7.0f, 3.0f}, + Vector4{7.0f, -1.0f, 8.0f, 0.0f}, + Vector4{9.0f, 4.0f, 5.0f, 9.0f}}; + + const Matrix4x4 expected{Vector4{-60/103.0f, 71/103.0f, -4/103.0f, 3/103.0f}, + Vector4{-66/103.0f, 109/103.0f, -25/103.0f, -7/103.0f}, + Vector4{177/412.0f, -97/206.0f, 53/412.0f, -7/206.0f}, + Vector4{259/412.0f, -185/206.0f, 31/412.0f, 27/206.0f}}; + + Matrix4x4 a2{m}; + Matrix4x4 inverse{Math::IdentityInit}; + CORRADE_VERIFY(gaussJordanInPlace(a2, inverse)); + + CORRADE_COMPARE(inverse, expected); + CORRADE_COMPARE(m*inverse, Matrix4x4{}); } void GaussJordanTest::singular() { @@ -54,23 +76,20 @@ void GaussJordanTest::singular() { CORRADE_VERIFY(!gaussJordanInPlaceTransposed(a, t)); } -void GaussJordanTest::invert() { - Matrix4x4 a(Vector4(3.0f, 5.0f, 8.0f, 4.0f), - Vector4(4.0f, 4.0f, 7.0f, 3.0f), - Vector4(7.0f, -1.0f, 8.0f, 0.0f), - Vector4(9.0f, 4.0f, 5.0f, 9.0f)); +void GaussJordanTest::inverted() { + const Matrix4x4 m{Vector4{3.0f, 5.0f, 8.0f, 4.0f}, + Vector4{4.0f, 4.0f, 7.0f, 3.0f}, + Vector4{7.0f, -1.0f, 8.0f, 0.0f}, + Vector4{9.0f, 4.0f, 5.0f, 9.0f}}; - Matrix4x4 expectedInverse(Vector4(-60/103.0f, 71/103.0f, -4/103.0f, 3/103.0f), - Vector4(-66/103.0f, 109/103.0f, -25/103.0f, -7/103.0f), - Vector4(177/412.0f, -97/206.0f, 53/412.0f, -7/206.0f), - Vector4(259/412.0f, -185/206.0f, 31/412.0f, 27/206.0f)); - - Matrix4x4 a2(a); - Matrix4x4 inverse = Matrix4x4::fromDiagonal(Vector4(1.0f)); - CORRADE_VERIFY(gaussJordanInPlace(a2, inverse)); + const Matrix4x4 expected{Vector4{-60/103.0f, 71/103.0f, -4/103.0f, 3/103.0f}, + Vector4{-66/103.0f, 109/103.0f, -25/103.0f, -7/103.0f}, + Vector4{177/412.0f, -97/206.0f, 53/412.0f, -7/206.0f}, + Vector4{259/412.0f, -185/206.0f, 31/412.0f, 27/206.0f}}; - CORRADE_COMPARE(inverse, expectedInverse); - CORRADE_COMPARE(a*inverse, Matrix4x4::fromDiagonal(Vector4(1.0f))); + const Matrix4x4 inverse = gaussJordanInverted(m); + CORRADE_COMPARE(inverse, expected); + CORRADE_COMPARE(inverse*m, Matrix4x4{}); } }}}} diff --git a/src/Magnum/Math/Matrix.h b/src/Magnum/Math/Matrix.h index 8e6515412..b2b391aa7 100644 --- a/src/Magnum/Math/Matrix.h +++ b/src/Magnum/Math/Matrix.h @@ -182,6 +182,7 @@ template class Matrix: public RectangularMatrix inverted() const; From c93cc0ba083b4bd49fabf028051da1ee1c58c633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 6 Oct 2016 16:26:55 +0200 Subject: [PATCH 220/290] Added nv-windows-dangling-transform-feedback-varying-names workaround. On Windows NVidia drivers the glTransformFeedbackVaryings() does not make a copy of its char* arguments so it fails at link time when the original char arrays are not in scope anymore. Enabling *synchronous* debug output circumvents this bug. Can be triggered by running TransformFeedbackGLTest with GL_KHR_debug extension disabled. --- src/Magnum/AbstractShaderProgram.cpp | 17 +++++++++++++++++ src/Magnum/AbstractShaderProgram.h | 17 +++++++++++++++++ .../Implementation/ShaderProgramState.cpp | 13 +++++++++++++ src/Magnum/Implementation/ShaderProgramState.h | 9 +++++---- src/Magnum/Implementation/driverSpecific.cpp | 8 ++++++++ 5 files changed, 60 insertions(+), 4 deletions(-) diff --git a/src/Magnum/AbstractShaderProgram.cpp b/src/Magnum/AbstractShaderProgram.cpp index 7fc4228f9..ce19cb1a6 100644 --- a/src/Magnum/AbstractShaderProgram.cpp +++ b/src/Magnum/AbstractShaderProgram.cpp @@ -368,6 +368,10 @@ void AbstractShaderProgram::bindFragmentDataLocationIndexedInternal(const Unsign #ifndef MAGNUM_TARGET_GLES2 void AbstractShaderProgram::setTransformFeedbackOutputs(const std::initializer_list outputs, const TransformFeedbackBufferMode bufferMode) { + (this->*Context::current().state().shaderProgram->transformFeedbackVaryingsImplementation)({outputs.begin(), outputs.size()}, bufferMode); +} + +void AbstractShaderProgram::transformFeedbackVaryingsImplementationDefault(const Containers::ArrayView outputs, const TransformFeedbackBufferMode bufferMode) { /** @todo VLAs */ Containers::Array names{outputs.size()}; @@ -376,6 +380,19 @@ void AbstractShaderProgram::setTransformFeedbackOutputs(const std::initializer_l glTransformFeedbackVaryings(_id, outputs.size(), names, GLenum(bufferMode)); } + +#ifdef CORRADE_TARGET_WINDOWS +void AbstractShaderProgram::transformFeedbackVaryingsImplementationDanglingWorkaround(const Containers::ArrayView outputs, const TransformFeedbackBufferMode bufferMode) { + /* NVidia on Windows doesn't copy the names when calling + glTransformFeedbackVaryings() so it then fails at link time because the + char* are dangling. We have to do the copy on the engine side and keep + the values until link time (which can happen any time and multiple + times, so basically for the remaining lifetime of the shader program) */ + _transformFeedbackVaryingNames.assign(outputs.begin(), outputs.end()); + + transformFeedbackVaryingsImplementationDefault({_transformFeedbackVaryingNames.data(), _transformFeedbackVaryingNames.size()}, bufferMode); +} +#endif #endif bool AbstractShaderProgram::link(std::initializer_list> shaders) { diff --git a/src/Magnum/AbstractShaderProgram.h b/src/Magnum/AbstractShaderProgram.h index 74538e0b9..9c5aed167 100644 --- a/src/Magnum/AbstractShaderProgram.h +++ b/src/Magnum/AbstractShaderProgram.h @@ -36,6 +36,10 @@ #include "Magnum/AbstractObject.h" #include "Magnum/Attribute.h" +#if defined(CORRADE_TARGET_WINDOWS) && !defined(MAGNUM_TARGET_GLES2) +#include +#endif + namespace Magnum { namespace Implementation { struct ShaderProgramState; } @@ -1189,6 +1193,13 @@ class MAGNUM_EXPORT AbstractShaderProgram: public AbstractObject { Int uniformLocationInternal(Containers::ArrayView name); UnsignedInt uniformBlockIndexInternal(Containers::ArrayView name); + #ifndef MAGNUM_TARGET_GLES2 + void MAGNUM_LOCAL transformFeedbackVaryingsImplementationDefault(Containers::ArrayView outputs, TransformFeedbackBufferMode bufferMode); + #ifdef CORRADE_TARGET_WINDOWS + void MAGNUM_LOCAL transformFeedbackVaryingsImplementationDanglingWorkaround(Containers::ArrayView outputs, TransformFeedbackBufferMode bufferMode); + #endif + #endif + #ifndef MAGNUM_BUILD_DEPRECATED void use(); #endif @@ -1347,6 +1358,12 @@ class MAGNUM_EXPORT AbstractShaderProgram: public AbstractObject { #endif GLuint _id; + + #if defined(CORRADE_TARGET_WINDOWS) && !defined(MAGNUM_TARGET_GLES2) + /* Needed for the nv-windows-dangling-transform-feedback-varying-names + workaround */ + std::vector _transformFeedbackVaryingNames; + #endif }; } diff --git a/src/Magnum/Implementation/ShaderProgramState.cpp b/src/Magnum/Implementation/ShaderProgramState.cpp index 2d16fa201..80e753a8b 100644 --- a/src/Magnum/Implementation/ShaderProgramState.cpp +++ b/src/Magnum/Implementation/ShaderProgramState.cpp @@ -47,6 +47,19 @@ ShaderProgramState::ShaderProgramState(Context& context, std::vector()) diff --git a/src/Magnum/Implementation/ShaderProgramState.h b/src/Magnum/Implementation/ShaderProgramState.h index 689875174..92aa939a2 100644 --- a/src/Magnum/Implementation/ShaderProgramState.h +++ b/src/Magnum/Implementation/ShaderProgramState.h @@ -32,10 +32,7 @@ #include "Magnum/OpenGL.h" #include "Magnum/Math/Vector3.h" -#ifdef _MSC_VER -/* Otherwise the member function pointers will have different size based on - whether the header was included or not. CAUSES SERIOUS MEMORY CORRUPTION AND - IS NOT CAUGHT BY ANY WARNING WHATSOEVER! AARGH! */ +#ifndef MAGNUM_TARGET_GLES2 #include "Magnum/AbstractShaderProgram.h" #endif @@ -46,6 +43,10 @@ struct ShaderProgramState { void reset(); + #ifndef MAGNUM_TARGET_GLES2 + void(AbstractShaderProgram::*transformFeedbackVaryingsImplementation)(Containers::ArrayView, AbstractShaderProgram::TransformFeedbackBufferMode); + #endif + void(AbstractShaderProgram::*uniform1fvImplementation)(GLint, GLsizei, const GLfloat*); void(AbstractShaderProgram::*uniform2fvImplementation)(GLint, GLsizei, const Math::Vector<2, GLfloat>*); void(AbstractShaderProgram::*uniform3fvImplementation)(GLint, GLsizei, const Math::Vector<3, GLfloat>*); diff --git a/src/Magnum/Implementation/driverSpecific.cpp b/src/Magnum/Implementation/driverSpecific.cpp index b405dc12d..32c726a2e 100644 --- a/src/Magnum/Implementation/driverSpecific.cpp +++ b/src/Magnum/Implementation/driverSpecific.cpp @@ -48,6 +48,14 @@ namespace { GLSL even though the extension (e.g. binding keyword) is not supported */ "intel-windows-glsl-exposes-unsupported-shading-language-420pack", + + /* On Windows NVidia drivers the glTransformFeedbackVaryings() does not + make a copy of its char* arguments so it fails at link time when the + original char arrays are not in scope anymore. Enabling + *synchronous* debug output circumvents this bug. Can be triggered by + running TransformFeedbackGLTest with GL_KHR_debug extension + disabled. */ + "nv-windows-dangling-transform-feedback-varying-names", #endif /* Layout qualifier causes compiler error with GLSL 1.20 on Mesa, GLSL From 931091b5192806b6124fe4fabe2a3dcf2bf5fda1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 18:10:28 +0200 Subject: [PATCH 221/290] Don't expose and enable BUILD_AL_TESTS if Audio library is not built. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ec90174d..a84018885 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -151,7 +151,7 @@ option(BUILD_STATIC_PIC "Build static libraries and plugins with position-indepe option(BUILD_PLUGINS_STATIC "Build static plugins (default are dynamic)" OFF) option(BUILD_TESTS "Build unit tests" OFF) cmake_dependent_option(BUILD_GL_TESTS "Build unit tests for OpenGL code" OFF "BUILD_TESTS" OFF) -cmake_dependent_option(BUILD_AL_TESTS "Build unit tests for OpenAL code" ON "BUILD_TESTS" OFF) +cmake_dependent_option(BUILD_AL_TESTS "Build unit tests for OpenAL code" ON "BUILD_TESTS;WITH_AUDIO" OFF) if(BUILD_TESTS) find_package(Corrade REQUIRED TestSuite) if(CORRADE_TARGET_IOS) From 71de2e47499729aceb64eb9adeb7d68f2fa7061d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 15:23:50 +0200 Subject: [PATCH 222/290] Don't force EGL stuff on users that want *desktop* GLES on Windows. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a84018885..985b82227 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,7 +121,7 @@ elseif(CORRADE_TARGET_UNIX) # Windows-specific application libraries elseif(CORRADE_TARGET_WINDOWS) - if(NOT TARGET_GLES) + if(NOT TARGET_GLES OR TARGET_DESKTOP_GLES) cmake_dependent_option(WITH_WINDOWLESSWGLAPPLICATION "Build WindowlessWglApplication library" OFF "NOT WITH_MAGNUMINFO;NOT WITH_FONTCONVERTER;NOT WITH_DISTANCEFIELDCONVERTER" ON) option(WITH_WGLCONTEXT "Build WglContext library" OFF) else() From d44d50293f50c39f1132cd00dafd1a4ab1d21df4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 15:24:18 +0200 Subject: [PATCH 223/290] Platform: added missing define for desktop GLES on Windows. --- src/Magnum/Platform/WindowlessWglApplication.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magnum/Platform/WindowlessWglApplication.cpp b/src/Magnum/Platform/WindowlessWglApplication.cpp index 9f3ed7fde..dfea35899 100644 --- a/src/Magnum/Platform/WindowlessWglApplication.cpp +++ b/src/Magnum/Platform/WindowlessWglApplication.cpp @@ -41,6 +41,7 @@ #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 +#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 #endif namespace Magnum { namespace Platform { From 7bd41d2b9384c70f864a0b28de4c02422cc7c075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 15:25:03 +0200 Subject: [PATCH 224/290] Implemented support for desktop GLES on Windows. Because the library still links to the old crappy opengl32.dll, we need to load all symbols above OpenGL 1.1, not just those that are above OpenGL ES 2.0/3.0. --- doc/building.dox | 3 +- src/Magnum/Implementation/driverSpecific.cpp | 8 +- src/Magnum/OpenGL.h | 10 +- src/Magnum/Platform/CMakeLists.txt | 8 +- .../OpenGL/GLES2/CMakeLists.txt | 32 +- src/MagnumExternal/OpenGL/GLES2/README.md | 14 +- .../GLES2/flextGLPlatformWindowsDesktop.cpp | 297 +++ ...flextGLPlatformWindowsDesktop.cpp.template | 23 + .../OpenGL/GLES2/flextGLWindowsDesktop.cpp | 296 +++ .../GLES2/flextGLWindowsDesktop.cpp.template | 22 + .../OpenGL/GLES2/flextGLWindowsDesktop.h | 1627 ++++++++++++ .../GLES2/flextGLWindowsDesktop.h.template | 90 + .../OpenGL/GLES3/CMakeLists.txt | 36 +- src/MagnumExternal/OpenGL/GLES3/README.md | 14 +- .../GLES3/flextGLPlatformWindowsDesktop.cpp | 437 ++++ ...flextGLPlatformWindowsDesktop.cpp.template | 23 + .../OpenGL/GLES3/flextGLWindowsDesktop.cpp | 436 ++++ .../GLES3/flextGLWindowsDesktop.cpp.template | 22 + .../OpenGL/GLES3/flextGLWindowsDesktop.h | 2237 +++++++++++++++++ .../GLES3/flextGLWindowsDesktop.h.template | 94 + 20 files changed, 5696 insertions(+), 33 deletions(-) create mode 100644 src/MagnumExternal/OpenGL/GLES2/flextGLPlatformWindowsDesktop.cpp create mode 100644 src/MagnumExternal/OpenGL/GLES2/flextGLPlatformWindowsDesktop.cpp.template create mode 100644 src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.cpp create mode 100644 src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.cpp.template create mode 100644 src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h create mode 100644 src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h.template create mode 100644 src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp create mode 100644 src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp.template create mode 100644 src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.cpp create mode 100644 src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.cpp.template create mode 100644 src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h create mode 100644 src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h.template diff --git a/doc/building.dox b/doc/building.dox index c1813fb13..0be3f9d1b 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -166,7 +166,8 @@ available for desktop OpenGL only, see @ref requires-gl. - `TARGET_GLES2` -- Target OpenGL ES 2.0. Currently enabled by default when `TARGET_GLES` is set. - `TARGET_DESKTOP_GLES` -- Target OpenGL ES on desktop, i.e. use OpenGL ES - emulation in desktop OpenGL library. Might not be supported in all drivers. + emulation in desktop OpenGL library. Available on Linux and Windows, though + might not be supported by all drivers. - `TARGET_HEADLESS` -- Build command-line utilities for use on a headless machine. Basically it means that EGL with no display attachment is being used everywhere instead of platform-specific toolkits like CGL, GLX or WGL. diff --git a/src/Magnum/Implementation/driverSpecific.cpp b/src/Magnum/Implementation/driverSpecific.cpp index 32c726a2e..060d5f2d4 100644 --- a/src/Magnum/Implementation/driverSpecific.cpp +++ b/src/Magnum/Implementation/driverSpecific.cpp @@ -34,8 +34,7 @@ namespace Magnum { namespace { std::vector KnownWorkarounds{ - #ifndef MAGNUM_TARGET_GLES - #ifndef CORRADE_TARGET_APPLE + #if !defined(MAGNUM_TARGET_GLES) && !defined(CORRADE_TARGET_APPLE) /* Creating core context with specific version on AMD and NV proprietary drivers on Linux/Windows and Intel drivers on Windows causes the context to be forced to given version instead of @@ -43,12 +42,14 @@ namespace { "no-forward-compatible-core-context", #endif - #ifdef CORRADE_TARGET_WINDOWS + #if !defined(MAGNUM_TARGET_GLES) && defined(CORRADE_TARGET_WINDOWS) /* On Windows Intel drivers ARB_shading_language_420pack is exposed in GLSL even though the extension (e.g. binding keyword) is not supported */ "intel-windows-glsl-exposes-unsupported-shading-language-420pack", + #endif + #if !defined(MAGNUM_TARGET_GLES2) && defined(CORRADE_TARGET_WINDOWS) /* On Windows NVidia drivers the glTransformFeedbackVaryings() does not make a copy of its char* arguments so it fails at link time when the original char arrays are not in scope anymore. Enabling @@ -58,6 +59,7 @@ namespace { "nv-windows-dangling-transform-feedback-varying-names", #endif + #if !defined(MAGNUM_TARGET_GLES) /* Layout qualifier causes compiler error with GLSL 1.20 on Mesa, GLSL 1.30 on NVidia and 1.40 on Mac OS X. Everything is fine when using newer GLSL version. */ diff --git a/src/Magnum/OpenGL.h b/src/Magnum/OpenGL.h index e6e792a13..b8ab3f9a5 100644 --- a/src/Magnum/OpenGL.h +++ b/src/Magnum/OpenGL.h @@ -55,7 +55,15 @@ #include "MagnumExternal/OpenGL/GLES3/flextGLEmscripten.h" #endif -/* Generic OpenGL ES */ +/* Special case for desktop GLES on Windows (still links to the old opengl32.dll) */ +#elif defined(CORRADE_TARGET_WINDOWS) && defined(MAGNUM_TARGET_DESKTOP_GLES) + #ifdef MAGNUM_TARGET_GLES2 + #include "MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h" + #else + #include "MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h" + #endif + +/* Generic, sane OpenGL ES */ #elif defined(MAGNUM_TARGET_GLES2) #include "MagnumExternal/OpenGL/GLES2/flextGL.h" #else diff --git a/src/Magnum/Platform/CMakeLists.txt b/src/Magnum/Platform/CMakeLists.txt index 142a2d4b7..7cef63b75 100644 --- a/src/Magnum/Platform/CMakeLists.txt +++ b/src/Magnum/Platform/CMakeLists.txt @@ -593,13 +593,17 @@ endif() if(NOT MAGNUM_TARGET_GLES) list(APPEND MagnumContext_SRCS ../../MagnumExternal/OpenGL/GL/flextGLPlatform.cpp) elseif(MAGNUM_TARGET_GLES AND MAGNUM_TARGET_GLES2) - if(CORRADE_TARGET_IOS) + if(CORRADE_TARGET_WINDOWS AND MAGNUM_TARGET_DESKTOP_GLES) + list(APPEND MagnumContext_SRCS ../../MagnumExternal/OpenGL/GLES2/flextGLPlatformWindowsDesktop.cpp) + elseif(CORRADE_TARGET_IOS) list(APPEND MagnumContext_SRCS ../../MagnumExternal/OpenGL/GLES2/flextGLPlatformIOS.cpp) else() list(APPEND MagnumContext_SRCS ../../MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp) endif() elseif(MAGNUM_TARGET_GLES AND NOT MAGNUM_TARGET_GLES2) - if(CORRADE_TARGET_IOS) + if(CORRADE_TARGET_WINDOWS AND MAGNUM_TARGET_DESKTOP_GLES) + list(APPEND MagnumContext_SRCS ../../MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp) + elseif(CORRADE_TARGET_IOS) list(APPEND MagnumContext_SRCS ../../MagnumExternal/OpenGL/GLES3/flextGLPlatformIOS.cpp) else() list(APPEND MagnumContext_SRCS ../../MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp) diff --git a/src/MagnumExternal/OpenGL/GLES2/CMakeLists.txt b/src/MagnumExternal/OpenGL/GLES2/CMakeLists.txt index 56d3cb0fd..91ae146a8 100644 --- a/src/MagnumExternal/OpenGL/GLES2/CMakeLists.txt +++ b/src/MagnumExternal/OpenGL/GLES2/CMakeLists.txt @@ -23,10 +23,29 @@ # DEALINGS IN THE SOFTWARE. # +# Desktop GLES on Windows still links to opengl32.dll so we have a special +# function loading code that queries everything above OpenGL 1.1 +if(CORRADE_TARGET_WINDOWS AND MAGNUM_TARGET_DESKTOP_GLES) + set(MagnumOpenGL_HEADERS flextGLWindowsDesktop.h) + set(MagnumOpenGL_SRCS flextGLWindowsDesktop.cpp) + +# NaCl and Emscripten are special, provide only some extensions for them (and +# no extension loading) +elseif(CORRADE_TARGET_NACL) + set(MagnumOpenGL_HEADERS flextGLNaCl.h) +elseif(CORRADE_TARGET_EMSCRIPTEN) + set(MagnumOpenGL_HEADERS flextGLEmscripten.h) + +# The common sane case +else() + set(MagnumOpenGL_HEADERS flextGL.h) + set(MagnumOpenGL_SRCS flextGL.cpp) +endif() + # NaCl and Emscripten don't have the ability to load function pointers manually if(NOT CORRADE_TARGET_NACL AND NOT CORRADE_TARGET_EMSCRIPTEN) - # flextGLPlatform.cpp is compiled as part of Magnum*Context libraries in Platform - add_library(MagnumFlextGLObjects OBJECT flextGL.cpp) + # flextGLPlatform*.cpp is compiled as part of Magnum*Context libraries in Platform + add_library(MagnumFlextGLObjects OBJECT ${MagnumOpenGL_SRCS}) target_include_directories(MagnumFlextGLObjects PUBLIC $) if(NOT BUILD_STATIC) @@ -37,13 +56,4 @@ if(NOT CORRADE_TARGET_NACL AND NOT CORRADE_TARGET_EMSCRIPTEN) endif() endif() -# NaCl and Emscripten are special, provide only some extensions for them -if(CORRADE_TARGET_NACL) - set(MagnumOpenGL_HEADERS flextGLNaCl.h) -elseif(CORRADE_TARGET_EMSCRIPTEN) - set(MagnumOpenGL_HEADERS flextGLEmscripten.h) -else() - set(MagnumOpenGL_HEADERS flextGL.h) -endif() - install(FILES ${MagnumOpenGL_HEADERS} DESTINATION ${MAGNUM_EXTERNAL_INCLUDE_INSTALL_DIR}/OpenGL/GLES2) diff --git a/src/MagnumExternal/OpenGL/GLES2/README.md b/src/MagnumExternal/OpenGL/GLES2/README.md index b4f73b127..8750a9b45 100644 --- a/src/MagnumExternal/OpenGL/GLES2/README.md +++ b/src/MagnumExternal/OpenGL/GLES2/README.md @@ -7,8 +7,18 @@ files for generic GLES2 implementations: .../flextGLgen.py -D . -t . extensions.txt -It will generate `flextGL.h`, `flextGL.cpp`, `flextGLPlatform.cpp` and -`flextGLPlatformIOS.cpp` files. +It will generate `flextGL.h`, `flextGL.cpp`, `flextGLPlatform.cpp`, +`flextGLWindowsDesktop.h`, `flextGLWindowsDesktop.cpp`, +`flextGLPlatformWindowsDesktop.cpp` and `flextGLPlatformIOS.cpp` files. + +Desktop GLES on Windows still links to the ancient `opengl32.dll` which exports +only OpenGL 1.1 symbols, so we have a special set of headers that queries +pointers for everything above OpenGL 1.1 (instead of everything above OpenGL ES +2.0). + +iOS, on the other hand, doesn't have any extension loader mechanism and all +supported entrypoints are exported from the library, so we set the function +pointers to those exported symbols in case the system GL header defines them. NaCl and Emscripten don't have the ability to manually load extension pointers, thus they have only header files: diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformWindowsDesktop.cpp b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformWindowsDesktop.cpp new file mode 100644 index 000000000..fed940656 --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformWindowsDesktop.cpp @@ -0,0 +1,297 @@ +#include "flextGLWindowsDesktop.h" + +#include +#include + +#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h" + +void flextGLInit() { + Magnum::Platform::Implementation::OpenGLFunctionLoader loader; + + /* GL_ANGLE_framebuffer_blit */ + flextglBlitFramebufferANGLE = reinterpret_cast(loader.load("glBlitFramebufferANGLE")); + + /* GL_ANGLE_framebuffer_multisample */ + flextglRenderbufferStorageMultisampleANGLE = reinterpret_cast(loader.load("glRenderbufferStorageMultisampleANGLE")); + + /* GL_ANGLE_instanced_arrays */ + flextglDrawArraysInstancedANGLE = reinterpret_cast(loader.load("glDrawArraysInstancedANGLE")); + flextglDrawElementsInstancedANGLE = reinterpret_cast(loader.load("glDrawElementsInstancedANGLE")); + flextglVertexAttribDivisorANGLE = reinterpret_cast(loader.load("glVertexAttribDivisorANGLE")); + + /* GL_APPLE_framebuffer_multisample */ + flextglRenderbufferStorageMultisampleAPPLE = reinterpret_cast(loader.load("glRenderbufferStorageMultisampleAPPLE")); + flextglResolveMultisampleFramebufferAPPLE = reinterpret_cast(loader.load("glResolveMultisampleFramebufferAPPLE")); + + /* GL_ES_VERSION_2_0 */ + flextglActiveTexture = reinterpret_cast(loader.load("glActiveTexture")); + flextglAttachShader = reinterpret_cast(loader.load("glAttachShader")); + flextglBindAttribLocation = reinterpret_cast(loader.load("glBindAttribLocation")); + flextglBindBuffer = reinterpret_cast(loader.load("glBindBuffer")); + flextglBindFramebuffer = reinterpret_cast(loader.load("glBindFramebuffer")); + flextglBindRenderbuffer = reinterpret_cast(loader.load("glBindRenderbuffer")); + flextglBlendColor = reinterpret_cast(loader.load("glBlendColor")); + flextglBlendEquation = reinterpret_cast(loader.load("glBlendEquation")); + flextglBlendEquationSeparate = reinterpret_cast(loader.load("glBlendEquationSeparate")); + flextglBlendFuncSeparate = reinterpret_cast(loader.load("glBlendFuncSeparate")); + flextglBufferData = reinterpret_cast(loader.load("glBufferData")); + flextglBufferSubData = reinterpret_cast(loader.load("glBufferSubData")); + flextglCheckFramebufferStatus = reinterpret_cast(loader.load("glCheckFramebufferStatus")); + flextglClearDepthf = reinterpret_cast(loader.load("glClearDepthf")); + flextglCompileShader = reinterpret_cast(loader.load("glCompileShader")); + flextglCompressedTexImage2D = reinterpret_cast(loader.load("glCompressedTexImage2D")); + flextglCompressedTexSubImage2D = reinterpret_cast(loader.load("glCompressedTexSubImage2D")); + flextglCreateProgram = reinterpret_cast(loader.load("glCreateProgram")); + flextglCreateShader = reinterpret_cast(loader.load("glCreateShader")); + flextglDeleteBuffers = reinterpret_cast(loader.load("glDeleteBuffers")); + flextglDeleteFramebuffers = reinterpret_cast(loader.load("glDeleteFramebuffers")); + flextglDeleteProgram = reinterpret_cast(loader.load("glDeleteProgram")); + flextglDeleteRenderbuffers = reinterpret_cast(loader.load("glDeleteRenderbuffers")); + flextglDeleteShader = reinterpret_cast(loader.load("glDeleteShader")); + flextglDepthRangef = reinterpret_cast(loader.load("glDepthRangef")); + flextglDetachShader = reinterpret_cast(loader.load("glDetachShader")); + flextglDisableVertexAttribArray = reinterpret_cast(loader.load("glDisableVertexAttribArray")); + flextglEnableVertexAttribArray = reinterpret_cast(loader.load("glEnableVertexAttribArray")); + flextglFramebufferRenderbuffer = reinterpret_cast(loader.load("glFramebufferRenderbuffer")); + flextglFramebufferTexture2D = reinterpret_cast(loader.load("glFramebufferTexture2D")); + flextglGenBuffers = reinterpret_cast(loader.load("glGenBuffers")); + flextglGenFramebuffers = reinterpret_cast(loader.load("glGenFramebuffers")); + flextglGenRenderbuffers = reinterpret_cast(loader.load("glGenRenderbuffers")); + flextglGenerateMipmap = reinterpret_cast(loader.load("glGenerateMipmap")); + flextglGetActiveAttrib = reinterpret_cast(loader.load("glGetActiveAttrib")); + flextglGetActiveUniform = reinterpret_cast(loader.load("glGetActiveUniform")); + flextglGetAttachedShaders = reinterpret_cast(loader.load("glGetAttachedShaders")); + flextglGetAttribLocation = reinterpret_cast(loader.load("glGetAttribLocation")); + flextglGetBufferParameteriv = reinterpret_cast(loader.load("glGetBufferParameteriv")); + flextglGetFramebufferAttachmentParameteriv = reinterpret_cast(loader.load("glGetFramebufferAttachmentParameteriv")); + flextglGetProgramInfoLog = reinterpret_cast(loader.load("glGetProgramInfoLog")); + flextglGetProgramiv = reinterpret_cast(loader.load("glGetProgramiv")); + flextglGetRenderbufferParameteriv = reinterpret_cast(loader.load("glGetRenderbufferParameteriv")); + flextglGetShaderInfoLog = reinterpret_cast(loader.load("glGetShaderInfoLog")); + flextglGetShaderPrecisionFormat = reinterpret_cast(loader.load("glGetShaderPrecisionFormat")); + flextglGetShaderSource = reinterpret_cast(loader.load("glGetShaderSource")); + flextglGetShaderiv = reinterpret_cast(loader.load("glGetShaderiv")); + flextglGetUniformLocation = reinterpret_cast(loader.load("glGetUniformLocation")); + flextglGetUniformfv = reinterpret_cast(loader.load("glGetUniformfv")); + flextglGetUniformiv = reinterpret_cast(loader.load("glGetUniformiv")); + flextglGetVertexAttribPointerv = reinterpret_cast(loader.load("glGetVertexAttribPointerv")); + flextglGetVertexAttribfv = reinterpret_cast(loader.load("glGetVertexAttribfv")); + flextglGetVertexAttribiv = reinterpret_cast(loader.load("glGetVertexAttribiv")); + flextglIsBuffer = reinterpret_cast(loader.load("glIsBuffer")); + flextglIsFramebuffer = reinterpret_cast(loader.load("glIsFramebuffer")); + flextglIsProgram = reinterpret_cast(loader.load("glIsProgram")); + flextglIsRenderbuffer = reinterpret_cast(loader.load("glIsRenderbuffer")); + flextglIsShader = reinterpret_cast(loader.load("glIsShader")); + flextglLinkProgram = reinterpret_cast(loader.load("glLinkProgram")); + flextglReleaseShaderCompiler = reinterpret_cast(loader.load("glReleaseShaderCompiler")); + flextglRenderbufferStorage = reinterpret_cast(loader.load("glRenderbufferStorage")); + flextglSampleCoverage = reinterpret_cast(loader.load("glSampleCoverage")); + flextglShaderBinary = reinterpret_cast(loader.load("glShaderBinary")); + flextglShaderSource = reinterpret_cast(loader.load("glShaderSource")); + flextglStencilFuncSeparate = reinterpret_cast(loader.load("glStencilFuncSeparate")); + flextglStencilMaskSeparate = reinterpret_cast(loader.load("glStencilMaskSeparate")); + flextglStencilOpSeparate = reinterpret_cast(loader.load("glStencilOpSeparate")); + flextglUniform1f = reinterpret_cast(loader.load("glUniform1f")); + flextglUniform1fv = reinterpret_cast(loader.load("glUniform1fv")); + flextglUniform1i = reinterpret_cast(loader.load("glUniform1i")); + flextglUniform1iv = reinterpret_cast(loader.load("glUniform1iv")); + flextglUniform2f = reinterpret_cast(loader.load("glUniform2f")); + flextglUniform2fv = reinterpret_cast(loader.load("glUniform2fv")); + flextglUniform2i = reinterpret_cast(loader.load("glUniform2i")); + flextglUniform2iv = reinterpret_cast(loader.load("glUniform2iv")); + flextglUniform3f = reinterpret_cast(loader.load("glUniform3f")); + flextglUniform3fv = reinterpret_cast(loader.load("glUniform3fv")); + flextglUniform3i = reinterpret_cast(loader.load("glUniform3i")); + flextglUniform3iv = reinterpret_cast(loader.load("glUniform3iv")); + flextglUniform4f = reinterpret_cast(loader.load("glUniform4f")); + flextglUniform4fv = reinterpret_cast(loader.load("glUniform4fv")); + flextglUniform4i = reinterpret_cast(loader.load("glUniform4i")); + flextglUniform4iv = reinterpret_cast(loader.load("glUniform4iv")); + flextglUniformMatrix2fv = reinterpret_cast(loader.load("glUniformMatrix2fv")); + flextglUniformMatrix3fv = reinterpret_cast(loader.load("glUniformMatrix3fv")); + flextglUniformMatrix4fv = reinterpret_cast(loader.load("glUniformMatrix4fv")); + flextglUseProgram = reinterpret_cast(loader.load("glUseProgram")); + flextglValidateProgram = reinterpret_cast(loader.load("glValidateProgram")); + flextglVertexAttrib1f = reinterpret_cast(loader.load("glVertexAttrib1f")); + flextglVertexAttrib1fv = reinterpret_cast(loader.load("glVertexAttrib1fv")); + flextglVertexAttrib2f = reinterpret_cast(loader.load("glVertexAttrib2f")); + flextglVertexAttrib2fv = reinterpret_cast(loader.load("glVertexAttrib2fv")); + flextglVertexAttrib3f = reinterpret_cast(loader.load("glVertexAttrib3f")); + flextglVertexAttrib3fv = reinterpret_cast(loader.load("glVertexAttrib3fv")); + flextglVertexAttrib4f = reinterpret_cast(loader.load("glVertexAttrib4f")); + flextglVertexAttrib4fv = reinterpret_cast(loader.load("glVertexAttrib4fv")); + flextglVertexAttribPointer = reinterpret_cast(loader.load("glVertexAttribPointer")); + + /* GL_EXT_debug_label */ + flextglGetObjectLabelEXT = reinterpret_cast(loader.load("glGetObjectLabelEXT")); + flextglLabelObjectEXT = reinterpret_cast(loader.load("glLabelObjectEXT")); + + /* GL_EXT_debug_marker */ + flextglInsertEventMarkerEXT = reinterpret_cast(loader.load("glInsertEventMarkerEXT")); + flextglPopGroupMarkerEXT = reinterpret_cast(loader.load("glPopGroupMarkerEXT")); + flextglPushGroupMarkerEXT = reinterpret_cast(loader.load("glPushGroupMarkerEXT")); + + /* GL_EXT_discard_framebuffer */ + flextglDiscardFramebufferEXT = reinterpret_cast(loader.load("glDiscardFramebufferEXT")); + + /* GL_EXT_disjoint_timer_query */ + flextglGetQueryObjecti64vEXT = reinterpret_cast(loader.load("glGetQueryObjecti64vEXT")); + flextglGetQueryObjectivEXT = reinterpret_cast(loader.load("glGetQueryObjectivEXT")); + flextglGetQueryObjectui64vEXT = reinterpret_cast(loader.load("glGetQueryObjectui64vEXT")); + flextglQueryCounterEXT = reinterpret_cast(loader.load("glQueryCounterEXT")); + + /* GL_EXT_draw_buffers */ + flextglDrawBuffersEXT = reinterpret_cast(loader.load("glDrawBuffersEXT")); + + /* GL_EXT_draw_buffers_indexed */ + flextglBlendEquationSeparateiEXT = reinterpret_cast(loader.load("glBlendEquationSeparateiEXT")); + flextglBlendEquationiEXT = reinterpret_cast(loader.load("glBlendEquationiEXT")); + flextglBlendFuncSeparateiEXT = reinterpret_cast(loader.load("glBlendFuncSeparateiEXT")); + flextglBlendFunciEXT = reinterpret_cast(loader.load("glBlendFunciEXT")); + flextglColorMaskiEXT = reinterpret_cast(loader.load("glColorMaskiEXT")); + flextglDisableiEXT = reinterpret_cast(loader.load("glDisableiEXT")); + flextglEnableiEXT = reinterpret_cast(loader.load("glEnableiEXT")); + flextglIsEnablediEXT = reinterpret_cast(loader.load("glIsEnablediEXT")); + + /* GL_EXT_instanced_arrays */ + flextglDrawArraysInstancedEXT = reinterpret_cast(loader.load("glDrawArraysInstancedEXT")); + flextglDrawElementsInstancedEXT = reinterpret_cast(loader.load("glDrawElementsInstancedEXT")); + flextglVertexAttribDivisorEXT = reinterpret_cast(loader.load("glVertexAttribDivisorEXT")); + + /* GL_EXT_map_buffer_range */ + flextglFlushMappedBufferRangeEXT = reinterpret_cast(loader.load("glFlushMappedBufferRangeEXT")); + flextglMapBufferRangeEXT = reinterpret_cast(loader.load("glMapBufferRangeEXT")); + + /* GL_EXT_multi_draw_arrays */ + flextglMultiDrawArraysEXT = reinterpret_cast(loader.load("glMultiDrawArraysEXT")); + flextglMultiDrawElementsEXT = reinterpret_cast(loader.load("glMultiDrawElementsEXT")); + + /* GL_EXT_multisampled_render_to_texture */ + flextglFramebufferTexture2DMultisampleEXT = reinterpret_cast(loader.load("glFramebufferTexture2DMultisampleEXT")); + flextglRenderbufferStorageMultisampleEXT = reinterpret_cast(loader.load("glRenderbufferStorageMultisampleEXT")); + + /* GL_EXT_occlusion_query_boolean */ + flextglBeginQueryEXT = reinterpret_cast(loader.load("glBeginQueryEXT")); + flextglDeleteQueriesEXT = reinterpret_cast(loader.load("glDeleteQueriesEXT")); + flextglEndQueryEXT = reinterpret_cast(loader.load("glEndQueryEXT")); + flextglGenQueriesEXT = reinterpret_cast(loader.load("glGenQueriesEXT")); + flextglGetQueryObjectuivEXT = reinterpret_cast(loader.load("glGetQueryObjectuivEXT")); + flextglGetQueryivEXT = reinterpret_cast(loader.load("glGetQueryivEXT")); + flextglIsQueryEXT = reinterpret_cast(loader.load("glIsQueryEXT")); + + /* GL_EXT_robustness */ + flextglGetGraphicsResetStatusEXT = reinterpret_cast(loader.load("glGetGraphicsResetStatusEXT")); + flextglGetnUniformfvEXT = reinterpret_cast(loader.load("glGetnUniformfvEXT")); + flextglGetnUniformivEXT = reinterpret_cast(loader.load("glGetnUniformivEXT")); + flextglReadnPixelsEXT = reinterpret_cast(loader.load("glReadnPixelsEXT")); + + /* GL_EXT_separate_shader_objects */ + flextglActiveShaderProgramEXT = reinterpret_cast(loader.load("glActiveShaderProgramEXT")); + flextglBindProgramPipelineEXT = reinterpret_cast(loader.load("glBindProgramPipelineEXT")); + flextglCreateShaderProgramvEXT = reinterpret_cast(loader.load("glCreateShaderProgramvEXT")); + flextglDeleteProgramPipelinesEXT = reinterpret_cast(loader.load("glDeleteProgramPipelinesEXT")); + flextglGenProgramPipelinesEXT = reinterpret_cast(loader.load("glGenProgramPipelinesEXT")); + flextglGetProgramPipelineInfoLogEXT = reinterpret_cast(loader.load("glGetProgramPipelineInfoLogEXT")); + flextglGetProgramPipelineivEXT = reinterpret_cast(loader.load("glGetProgramPipelineivEXT")); + flextglIsProgramPipelineEXT = reinterpret_cast(loader.load("glIsProgramPipelineEXT")); + flextglProgramParameteriEXT = reinterpret_cast(loader.load("glProgramParameteriEXT")); + flextglProgramUniform1fEXT = reinterpret_cast(loader.load("glProgramUniform1fEXT")); + flextglProgramUniform1fvEXT = reinterpret_cast(loader.load("glProgramUniform1fvEXT")); + flextglProgramUniform1iEXT = reinterpret_cast(loader.load("glProgramUniform1iEXT")); + flextglProgramUniform1ivEXT = reinterpret_cast(loader.load("glProgramUniform1ivEXT")); + flextglProgramUniform2fEXT = reinterpret_cast(loader.load("glProgramUniform2fEXT")); + flextglProgramUniform2fvEXT = reinterpret_cast(loader.load("glProgramUniform2fvEXT")); + flextglProgramUniform2iEXT = reinterpret_cast(loader.load("glProgramUniform2iEXT")); + flextglProgramUniform2ivEXT = reinterpret_cast(loader.load("glProgramUniform2ivEXT")); + flextglProgramUniform3fEXT = reinterpret_cast(loader.load("glProgramUniform3fEXT")); + flextglProgramUniform3fvEXT = reinterpret_cast(loader.load("glProgramUniform3fvEXT")); + flextglProgramUniform3iEXT = reinterpret_cast(loader.load("glProgramUniform3iEXT")); + flextglProgramUniform3ivEXT = reinterpret_cast(loader.load("glProgramUniform3ivEXT")); + flextglProgramUniform4fEXT = reinterpret_cast(loader.load("glProgramUniform4fEXT")); + flextglProgramUniform4fvEXT = reinterpret_cast(loader.load("glProgramUniform4fvEXT")); + flextglProgramUniform4iEXT = reinterpret_cast(loader.load("glProgramUniform4iEXT")); + flextglProgramUniform4ivEXT = reinterpret_cast(loader.load("glProgramUniform4ivEXT")); + flextglProgramUniformMatrix2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2fvEXT")); + flextglProgramUniformMatrix3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3fvEXT")); + flextglProgramUniformMatrix4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4fvEXT")); + flextglUseProgramStagesEXT = reinterpret_cast(loader.load("glUseProgramStagesEXT")); + flextglValidateProgramPipelineEXT = reinterpret_cast(loader.load("glValidateProgramPipelineEXT")); + + /* GL_EXT_texture_border_clamp */ + flextglGetSamplerParameterIivEXT = reinterpret_cast(loader.load("glGetSamplerParameterIivEXT")); + flextglGetSamplerParameterIuivEXT = reinterpret_cast(loader.load("glGetSamplerParameterIuivEXT")); + flextglGetTexParameterIivEXT = reinterpret_cast(loader.load("glGetTexParameterIivEXT")); + flextglGetTexParameterIuivEXT = reinterpret_cast(loader.load("glGetTexParameterIuivEXT")); + flextglSamplerParameterIivEXT = reinterpret_cast(loader.load("glSamplerParameterIivEXT")); + flextglSamplerParameterIuivEXT = reinterpret_cast(loader.load("glSamplerParameterIuivEXT")); + flextglTexParameterIivEXT = reinterpret_cast(loader.load("glTexParameterIivEXT")); + flextglTexParameterIuivEXT = reinterpret_cast(loader.load("glTexParameterIuivEXT")); + + /* GL_EXT_texture_storage */ + flextglTexStorage2DEXT = reinterpret_cast(loader.load("glTexStorage2DEXT")); + flextglTexStorage3DEXT = reinterpret_cast(loader.load("glTexStorage3DEXT")); + + /* GL_KHR_blend_equation_advanced */ + flextglBlendBarrierKHR = reinterpret_cast(loader.load("glBlendBarrierKHR")); + + /* GL_KHR_debug */ + flextglDebugMessageCallbackKHR = reinterpret_cast(loader.load("glDebugMessageCallbackKHR")); + flextglDebugMessageControlKHR = reinterpret_cast(loader.load("glDebugMessageControlKHR")); + flextglDebugMessageInsertKHR = reinterpret_cast(loader.load("glDebugMessageInsertKHR")); + flextglGetDebugMessageLogKHR = reinterpret_cast(loader.load("glGetDebugMessageLogKHR")); + flextglGetObjectLabelKHR = reinterpret_cast(loader.load("glGetObjectLabelKHR")); + flextglGetObjectPtrLabelKHR = reinterpret_cast(loader.load("glGetObjectPtrLabelKHR")); + flextglGetPointervKHR = reinterpret_cast(loader.load("glGetPointervKHR")); + flextglObjectLabelKHR = reinterpret_cast(loader.load("glObjectLabelKHR")); + flextglObjectPtrLabelKHR = reinterpret_cast(loader.load("glObjectPtrLabelKHR")); + flextglPopDebugGroupKHR = reinterpret_cast(loader.load("glPopDebugGroupKHR")); + flextglPushDebugGroupKHR = reinterpret_cast(loader.load("glPushDebugGroupKHR")); + + /* GL_KHR_robustness */ + flextglGetGraphicsResetStatusKHR = reinterpret_cast(loader.load("glGetGraphicsResetStatusKHR")); + flextglGetnUniformfvKHR = reinterpret_cast(loader.load("glGetnUniformfvKHR")); + flextglGetnUniformivKHR = reinterpret_cast(loader.load("glGetnUniformivKHR")); + flextglGetnUniformuivKHR = reinterpret_cast(loader.load("glGetnUniformuivKHR")); + flextglReadnPixelsKHR = reinterpret_cast(loader.load("glReadnPixelsKHR")); + + /* GL_NV_draw_buffers */ + flextglDrawBuffersNV = reinterpret_cast(loader.load("glDrawBuffersNV")); + + /* GL_NV_draw_instanced */ + flextglDrawArraysInstancedNV = reinterpret_cast(loader.load("glDrawArraysInstancedNV")); + flextglDrawElementsInstancedNV = reinterpret_cast(loader.load("glDrawElementsInstancedNV")); + + /* GL_NV_framebuffer_blit */ + flextglBlitFramebufferNV = reinterpret_cast(loader.load("glBlitFramebufferNV")); + + /* GL_NV_framebuffer_multisample */ + flextglRenderbufferStorageMultisampleNV = reinterpret_cast(loader.load("glRenderbufferStorageMultisampleNV")); + + /* GL_NV_instanced_arrays */ + flextglVertexAttribDivisorNV = reinterpret_cast(loader.load("glVertexAttribDivisorNV")); + + /* GL_NV_polygon_mode */ + flextglPolygonModeNV = reinterpret_cast(loader.load("glPolygonModeNV")); + + /* GL_NV_read_buffer */ + flextglReadBufferNV = reinterpret_cast(loader.load("glReadBufferNV")); + + /* GL_OES_mapbuffer */ + flextglGetBufferPointervOES = reinterpret_cast(loader.load("glGetBufferPointervOES")); + flextglMapBufferOES = reinterpret_cast(loader.load("glMapBufferOES")); + flextglUnmapBufferOES = reinterpret_cast(loader.load("glUnmapBufferOES")); + + /* GL_OES_texture_3D */ + flextglCompressedTexImage3DOES = reinterpret_cast(loader.load("glCompressedTexImage3DOES")); + flextglCompressedTexSubImage3DOES = reinterpret_cast(loader.load("glCompressedTexSubImage3DOES")); + flextglCopyTexSubImage3DOES = reinterpret_cast(loader.load("glCopyTexSubImage3DOES")); + flextglFramebufferTexture3DOES = reinterpret_cast(loader.load("glFramebufferTexture3DOES")); + flextglTexImage3DOES = reinterpret_cast(loader.load("glTexImage3DOES")); + flextglTexSubImage3DOES = reinterpret_cast(loader.load("glTexSubImage3DOES")); + + /* GL_OES_vertex_array_object */ + flextglBindVertexArrayOES = reinterpret_cast(loader.load("glBindVertexArrayOES")); + flextglDeleteVertexArraysOES = reinterpret_cast(loader.load("glDeleteVertexArraysOES")); + flextglGenVertexArraysOES = reinterpret_cast(loader.load("glGenVertexArraysOES")); + flextglIsVertexArrayOES = reinterpret_cast(loader.load("glIsVertexArrayOES")); +} diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformWindowsDesktop.cpp.template b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformWindowsDesktop.cpp.template new file mode 100644 index 000000000..8af659565 --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatformWindowsDesktop.cpp.template @@ -0,0 +1,23 @@ +@require(passthru, functions, enums, options, version, extensions) +#include "flextGLWindowsDesktop.h" + +#include +#include + +#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h" + +void flextGLInit() { + Magnum::Platform::Implementation::OpenGLFunctionLoader loader; + @for category,funcs in functions: + @if funcs: + + /* GL_@category */ + @for f in funcs: + @if f.name not in ['BlendFunc', 'Clear', 'ClearColor', 'ClearDepth', 'ClearStencil', 'ColorMask', 'CullFace', 'DepthFunc', 'DepthMask', 'DepthRange', 'Disable', 'DrawBuffer', 'Enable', 'Finish', 'Flush', 'FrontFace', 'GetBooleanv', 'GetDoublev', 'GetError', 'GetFloatv', 'GetIntegerv', 'GetString', 'GetTexImage', 'GetTexLevelParameterfv', 'GetTexLevelParameteriv', 'GetTexParameterfv', 'GetTexParameteriv', 'Hint', 'IsEnabled', 'LineWidth', 'LogicOp', 'PixelStoref', 'PixelStorei', 'PointSize', 'PolygonMode', 'ReadBuffer', 'ReadPixels', 'Scissor', 'StencilFunc', 'StencilMask', 'StencilOp', 'TexImage1D', 'TexImage2D', 'TexParameterf', 'TexParameterfv', 'TexParameteri', 'TexParameteriv', 'Viewport', 'BindTexture', 'CopyTexImage1D', 'CopyTexImage2D', 'CopyTexSubImage1D', 'CopyTexSubImage2D', 'DeleteTextures', 'DrawArrays', 'DrawElements', 'GenTextures', 'IsTexture', 'PolygonOffset', 'TexSubImage1D', 'TexSubImage2D']: + flextgl@f.name = reinterpret_cast<@f.returntype\ +(APIENTRY*)(@f.param_type_list_string())>(loader.load("gl@f.name")); + @end + @end + @end + @end +} diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.cpp b/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.cpp new file mode 100644 index 000000000..52038efea --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.cpp @@ -0,0 +1,296 @@ +#include "flextGLWindowsDesktop.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* GL_ANGLE_framebuffer_blit */ +FLEXTGL_EXPORT void(APIENTRY *flextglBlitFramebufferANGLE)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum) = nullptr; + +/* GL_ANGLE_framebuffer_multisample */ +FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisampleANGLE)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr; + +/* GL_ANGLE_instanced_arrays */ +FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstancedANGLE)(GLenum, GLint, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstancedANGLE)(GLenum, GLsizei, GLenum, const void *, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribDivisorANGLE)(GLuint, GLuint) = nullptr; + +/* GL_APPLE_framebuffer_multisample */ +FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisampleAPPLE)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglResolveMultisampleFramebufferAPPLE)(void) = nullptr; + +/* GL_ES_VERSION_2_0 */ +FLEXTGL_EXPORT void(APIENTRY *flextglActiveTexture)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglAttachShader)(GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindAttribLocation)(GLuint, GLuint, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindBuffer)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindFramebuffer)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindRenderbuffer)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendColor)(GLfloat, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquation)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationSeparate)(GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendFuncSeparate)(GLenum, GLenum, GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBufferData)(GLenum, GLsizeiptr, const void *, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBufferSubData)(GLenum, GLintptr, GLsizeiptr, const void *) = nullptr; +FLEXTGL_EXPORT GLenum(APIENTRY *flextglCheckFramebufferStatus)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglClearDepthf)(GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCompileShader)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexImage2D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void *) = nullptr; +FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateProgram)(void) = nullptr; +FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShader)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteBuffers)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteFramebuffers)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgram)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteRenderbuffers)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteShader)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDepthRangef)(GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDetachShader)(GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDisableVertexAttribArray)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglEnableVertexAttribArray)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferRenderbuffer)(GLenum, GLenum, GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture2D)(GLenum, GLenum, GLenum, GLuint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenBuffers)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenFramebuffers)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenRenderbuffers)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenerateMipmap)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveAttrib)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniform)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetAttachedShaders)(GLuint, GLsizei, GLsizei *, GLuint *) = nullptr; +FLEXTGL_EXPORT GLint(APIENTRY *flextglGetAttribLocation)(GLuint, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferParameteriv)(GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetFramebufferAttachmentParameteriv)(GLenum, GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramiv)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetRenderbufferParameteriv)(GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderPrecisionFormat)(GLenum, GLenum, GLint *, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderSource)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderiv)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT GLint(APIENTRY *flextglGetUniformLocation)(GLuint, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformfv)(GLuint, GLint, GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformiv)(GLuint, GLint, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribPointerv)(GLuint, GLenum, void **) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribfv)(GLuint, GLenum, GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribiv)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsBuffer)(GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsFramebuffer)(GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgram)(GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsRenderbuffer)(GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsShader)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglLinkProgram)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglReleaseShaderCompiler)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorage)(GLenum, GLenum, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglSampleCoverage)(GLfloat, GLboolean) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglShaderBinary)(GLsizei, const GLuint *, GLenum, const void *, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglShaderSource)(GLuint, GLsizei, const GLchar *const*, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglStencilFuncSeparate)(GLenum, GLenum, GLint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglStencilMaskSeparate)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglStencilOpSeparate)(GLenum, GLenum, GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform1f)(GLint, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform1fv)(GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform1i)(GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform1iv)(GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform2f)(GLint, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform2fv)(GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform2i)(GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform2iv)(GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform3f)(GLint, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform3fv)(GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform3i)(GLint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform3iv)(GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform4f)(GLint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform4fv)(GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform4i)(GLint, GLint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform4iv)(GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUseProgram)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgram)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1f)(GLuint, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1fv)(GLuint, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2f)(GLuint, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2fv)(GLuint, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3f)(GLuint, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3fv)(GLuint, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4f)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4fv)(GLuint, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, const void *) = nullptr; + +/* GL_EXT_debug_label */ +FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectLabelEXT)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglLabelObjectEXT)(GLenum, GLuint, GLsizei, const GLchar *) = nullptr; + +/* GL_EXT_debug_marker */ +FLEXTGL_EXPORT void(APIENTRY *flextglInsertEventMarkerEXT)(GLsizei, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglPopGroupMarkerEXT)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglPushGroupMarkerEXT)(GLsizei, const GLchar *) = nullptr; + +/* GL_EXT_discard_framebuffer */ +FLEXTGL_EXPORT void(APIENTRY *flextglDiscardFramebufferEXT)(GLenum, GLsizei, const GLenum *) = nullptr; + +/* GL_EXT_disjoint_timer_query */ +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjecti64vEXT)(GLuint, GLenum, GLint64 *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectivEXT)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectui64vEXT)(GLuint, GLenum, GLuint64 *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglQueryCounterEXT)(GLuint, GLenum) = nullptr; + +/* GL_EXT_draw_buffers */ +FLEXTGL_EXPORT void(APIENTRY *flextglDrawBuffersEXT)(GLsizei, const GLenum *) = nullptr; + +/* GL_EXT_draw_buffers_indexed */ +FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationSeparateiEXT)(GLuint, GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationiEXT)(GLuint, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendFuncSeparateiEXT)(GLuint, GLenum, GLenum, GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendFunciEXT)(GLuint, GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglColorMaskiEXT)(GLuint, GLboolean, GLboolean, GLboolean, GLboolean) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDisableiEXT)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglEnableiEXT)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsEnablediEXT)(GLenum, GLuint) = nullptr; + +/* GL_EXT_instanced_arrays */ +FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstancedEXT)(GLenum, GLint, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstancedEXT)(GLenum, GLsizei, GLenum, const void *, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribDivisorEXT)(GLuint, GLuint) = nullptr; + +/* GL_EXT_map_buffer_range */ +FLEXTGL_EXPORT void(APIENTRY *flextglFlushMappedBufferRangeEXT)(GLenum, GLintptr, GLsizeiptr) = nullptr; +FLEXTGL_EXPORT void *(APIENTRY *flextglMapBufferRangeEXT)(GLenum, GLintptr, GLsizeiptr, GLbitfield) = nullptr; + +/* GL_EXT_multi_draw_arrays */ +FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawArraysEXT)(GLenum, const GLint *, const GLsizei *, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawElementsEXT)(GLenum, const GLsizei *, GLenum, const void *const*, GLsizei) = nullptr; + +/* GL_EXT_multisampled_render_to_texture */ +FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture2DMultisampleEXT)(GLenum, GLenum, GLenum, GLuint, GLint, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisampleEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr; + +/* GL_EXT_occlusion_query_boolean */ +FLEXTGL_EXPORT void(APIENTRY *flextglBeginQueryEXT)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteQueriesEXT)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglEndQueryEXT)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenQueriesEXT)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectuivEXT)(GLuint, GLenum, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryivEXT)(GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsQueryEXT)(GLuint) = nullptr; + +/* GL_EXT_robustness */ +FLEXTGL_EXPORT GLenum(APIENTRY *flextglGetGraphicsResetStatusEXT)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformfvEXT)(GLuint, GLint, GLsizei, GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformivEXT)(GLuint, GLint, GLsizei, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglReadnPixelsEXT)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void *) = nullptr; + +/* GL_EXT_separate_shader_objects */ +FLEXTGL_EXPORT void(APIENTRY *flextglActiveShaderProgramEXT)(GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindProgramPipelineEXT)(GLuint) = nullptr; +FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShaderProgramvEXT)(GLenum, GLsizei, const GLchar **) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgramPipelinesEXT)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenProgramPipelinesEXT)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineInfoLogEXT)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineivEXT)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgramPipelineEXT)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramParameteriEXT)(GLuint, GLenum, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fEXT)(GLuint, GLint, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1iEXT)(GLuint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fEXT)(GLuint, GLint, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2iEXT)(GLuint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3iEXT)(GLuint, GLint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4iEXT)(GLuint, GLint, GLint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUseProgramStagesEXT)(GLuint, GLbitfield, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgramPipelineEXT)(GLuint) = nullptr; + +/* GL_EXT_texture_border_clamp */ +FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterIivEXT)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterIuivEXT)(GLuint, GLenum, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterIivEXT)(GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterIuivEXT)(GLenum, GLenum, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterIivEXT)(GLuint, GLenum, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterIuivEXT)(GLuint, GLenum, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIivEXT)(GLenum, GLenum, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIuivEXT)(GLenum, GLenum, const GLuint *) = nullptr; + +/* GL_EXT_texture_storage */ +FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage2DEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage3DEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei) = nullptr; + +/* GL_KHR_blend_equation_advanced */ +FLEXTGL_EXPORT void(APIENTRY *flextglBlendBarrierKHR)(void) = nullptr; + +/* GL_KHR_debug */ +FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageCallbackKHR)(GLDEBUGPROCKHR, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageControlKHR)(GLenum, GLenum, GLenum, GLsizei, const GLuint *, GLboolean) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageInsertKHR)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar *) = nullptr; +FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetDebugMessageLogKHR)(GLuint, GLsizei, GLenum *, GLenum *, GLuint *, GLenum *, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectLabelKHR)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectPtrLabelKHR)(const void *, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetPointervKHR)(GLenum, void **) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglObjectLabelKHR)(GLenum, GLuint, GLsizei, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglObjectPtrLabelKHR)(const void *, GLsizei, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglPopDebugGroupKHR)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglPushDebugGroupKHR)(GLenum, GLuint, GLsizei, const GLchar *) = nullptr; + +/* GL_KHR_robustness */ +FLEXTGL_EXPORT GLenum(APIENTRY *flextglGetGraphicsResetStatusKHR)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformfvKHR)(GLuint, GLint, GLsizei, GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformivKHR)(GLuint, GLint, GLsizei, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformuivKHR)(GLuint, GLint, GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglReadnPixelsKHR)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void *) = nullptr; + +/* GL_NV_draw_buffers */ +FLEXTGL_EXPORT void(APIENTRY *flextglDrawBuffersNV)(GLsizei, const GLenum *) = nullptr; + +/* GL_NV_draw_instanced */ +FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstancedNV)(GLenum, GLint, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstancedNV)(GLenum, GLsizei, GLenum, const void *, GLsizei) = nullptr; + +/* GL_NV_framebuffer_blit */ +FLEXTGL_EXPORT void(APIENTRY *flextglBlitFramebufferNV)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum) = nullptr; + +/* GL_NV_framebuffer_multisample */ +FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisampleNV)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr; + +/* GL_NV_instanced_arrays */ +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribDivisorNV)(GLuint, GLuint) = nullptr; + +/* GL_NV_polygon_mode */ +FLEXTGL_EXPORT void(APIENTRY *flextglPolygonModeNV)(GLenum, GLenum) = nullptr; + +/* GL_NV_read_buffer */ +FLEXTGL_EXPORT void(APIENTRY *flextglReadBufferNV)(GLenum) = nullptr; + +/* GL_OES_mapbuffer */ +FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferPointervOES)(GLenum, GLenum, void **) = nullptr; +FLEXTGL_EXPORT void *(APIENTRY *flextglMapBufferOES)(GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglUnmapBufferOES)(GLenum) = nullptr; + +/* GL_OES_texture_3D */ +FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexImage3DOES)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexSubImage3DOES)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexSubImage3DOES)(GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture3DOES)(GLenum, GLenum, GLenum, GLuint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexImage3DOES)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexSubImage3DOES)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *) = nullptr; + +/* GL_OES_vertex_array_object */ +FLEXTGL_EXPORT void(APIENTRY *flextglBindVertexArrayOES)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteVertexArraysOES)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenVertexArraysOES)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsVertexArrayOES)(GLuint) = nullptr; + +#ifdef __cplusplus +} +#endif diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.cpp.template b/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.cpp.template new file mode 100644 index 000000000..dfc149e94 --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.cpp.template @@ -0,0 +1,22 @@ +@require(passthru, functions, enums, options, version, extensions) +#include "flextGLWindowsDesktop.h" + +#ifdef __cplusplus +extern "C" { +#endif +@for category,funcs in functions: +@if funcs: + +/* GL_@category */ +@for f in funcs: + @if f.name not in ['BlendFunc', 'Clear', 'ClearColor', 'ClearDepth', 'ClearStencil', 'ColorMask', 'CullFace', 'DepthFunc', 'DepthMask', 'DepthRange', 'Disable', 'DrawBuffer', 'Enable', 'Finish', 'Flush', 'FrontFace', 'GetBooleanv', 'GetDoublev', 'GetError', 'GetFloatv', 'GetIntegerv', 'GetString', 'GetTexImage', 'GetTexLevelParameterfv', 'GetTexLevelParameteriv', 'GetTexParameterfv', 'GetTexParameteriv', 'Hint', 'IsEnabled', 'LineWidth', 'LogicOp', 'PixelStoref', 'PixelStorei', 'PointSize', 'PolygonMode', 'ReadBuffer', 'ReadPixels', 'Scissor', 'StencilFunc', 'StencilMask', 'StencilOp', 'TexImage1D', 'TexImage2D', 'TexParameterf', 'TexParameterfv', 'TexParameteri', 'TexParameteriv', 'Viewport', 'BindTexture', 'CopyTexImage1D', 'CopyTexImage2D', 'CopyTexSubImage1D', 'CopyTexSubImage2D', 'DeleteTextures', 'DrawArrays', 'DrawElements', 'GenTextures', 'IsTexture', 'PolygonOffset', 'TexSubImage1D', 'TexSubImage2D']: +FLEXTGL_EXPORT @f.returntype\ +(APIENTRY *flextgl@f.name)(@f.param_type_list_string()) = nullptr; + @end +@end +@end +@end + +#ifdef __cplusplus +} +#endif diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h b/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h new file mode 100644 index 000000000..2af306248 --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h @@ -0,0 +1,1627 @@ +#ifndef _flextgl_h_ +#define _flextgl_h_ + +#include + +#include "Magnum/configure.h" + +/* Defensive include guards */ + +#if defined(__gl_h_) || defined(__gl2_h_) +#error Attempt to include auto-generated header after including gl2.h +#endif +#if defined(__gl2ext_h_) +#error Attempt to include auto-generated header after including gl2ext.h +#endif +#if defined(__gl2platform_h_) +#error Attempt to include auto-generated header after including gl2platform.h +#endif + +#define __gl_h_ +#define __gl2_h_ +#define __gl2ext_h_ +#define __gl2platform_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +void flextGLInit(); + +/* Function declaration macros */ + +#ifndef MAGNUM_BUILD_STATIC + #ifdef FlextGL_EXPORTS + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_EXPORT + #else + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_IMPORT + #endif +#else + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_STATIC +#endif + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#ifndef WINAPI +#define WINAPI __stdcall +#endif +#define APIENTRY WINAPI +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/* Data types */ + +#include +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef short GLshort; +typedef int GLint; +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef int GLsizei; +typedef char GLchar; +typedef struct __GLsync *GLsync; +typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef khronos_int8_t GLbyte; +typedef khronos_uint8_t GLubyte; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef khronos_int32_t GLfixed; +typedef khronos_int64_t GLint64; +typedef khronos_uint64_t GLuint64; +typedef khronos_intptr_t GLintptr; +typedef khronos_ssize_t GLsizeiptr; + +/* Enums */ + +/* GL_ES_VERSION_2_0 */ + +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_FALSE 0 +#define GL_TRUE 1 +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_FUNC_ADD 0x8006 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_STREAM_DRAW 0x88E0 +#define GL_STATIC_DRAW 0x88E4 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_CULL_FACE 0x0B44 +#define GL_BLEND 0x0BE2 +#define GL_DITHER 0x0BD0 +#define GL_STENCIL_TEST 0x0B90 +#define GL_DEPTH_TEST 0x0B71 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_LINE_WIDTH 0x0B21 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_FIXED 0x140C +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#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_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_SHADER_TYPE 0x8B4F +#define GL_DELETE_STATUS 0x8B80 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_INVERT 0x150A +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TEXTURE 0x1702 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_REPEAT 0x2901 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_COMPILE_STATUS 0x8B81 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGB565 0x8D62 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_NONE 0 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 + +/* GL_ANGLE_framebuffer_blit */ + +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA + +/* GL_ANGLE_framebuffer_multisample */ + +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_MAX_SAMPLES_ANGLE 0x8D57 + +/* GL_ANGLE_instanced_arrays */ + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE + +/* GL_ANGLE_depth_texture */ + +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_DEPTH_STENCIL_OES 0x84F9 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_UNSIGNED_INT 0x1405 +#define GL_UNSIGNED_INT_24_8_OES 0x84FA +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT32_OES 0x81A7 +#define GL_DEPTH24_STENCIL8_OES 0x88F0 + +/* GL_APPLE_framebuffer_multisample */ + +#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 +#define GL_MAX_SAMPLES_APPLE 0x8D57 +#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA + +/* GL_APPLE_texture_max_level */ + +#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D + +/* GL_EXT_texture_type_2_10_10_10_REV */ + +#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 + +/* GL_EXT_discard_framebuffer */ + +#define GL_COLOR_EXT 0x1800 +#define GL_DEPTH_EXT 0x1801 +#define GL_STENCIL_EXT 0x1802 + +/* GL_EXT_blend_minmax */ + +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 + +/* GL_EXT_unpack_subimage */ + +#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 +#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 + +/* GL_EXT_occlusion_query_boolean */ + +#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A +#define GL_CURRENT_QUERY_EXT 0x8865 +#define GL_QUERY_RESULT_EXT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 + +/* GL_EXT_shadow_samplers */ + +#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C +#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D +#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E +#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 + +/* GL_EXT_texture_rg */ + +#define GL_RED_EXT 0x1903 +#define GL_RG_EXT 0x8227 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B + +/* GL_EXT_sRGB */ + +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 + +/* GL_EXT_texture_storage */ + +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_ALPHA8_EXT 0x803C +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGB32F_EXT 0x8815 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_ALPHA16F_EXT 0x881C +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGB10_EXT 0x8052 +#define GL_BGRA8_EXT 0x93A1 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#define GL_R32F_EXT 0x822E +#define GL_RG32F_EXT 0x8230 +#define GL_R16F_EXT 0x822D +#define GL_RG16F_EXT 0x822F + +/* GL_EXT_map_buffer_range */ + +#define GL_MAP_READ_BIT_EXT 0x0001 +#define GL_MAP_WRITE_BIT_EXT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 + +/* GL_EXT_draw_buffers */ + +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 +#define GL_DRAW_BUFFER0_EXT 0x8825 +#define GL_DRAW_BUFFER1_EXT 0x8826 +#define GL_DRAW_BUFFER2_EXT 0x8827 +#define GL_DRAW_BUFFER3_EXT 0x8828 +#define GL_DRAW_BUFFER4_EXT 0x8829 +#define GL_DRAW_BUFFER5_EXT 0x882A +#define GL_DRAW_BUFFER6_EXT 0x882B +#define GL_DRAW_BUFFER7_EXT 0x882C +#define GL_DRAW_BUFFER8_EXT 0x882D +#define GL_DRAW_BUFFER9_EXT 0x882E +#define GL_DRAW_BUFFER10_EXT 0x882F +#define GL_DRAW_BUFFER11_EXT 0x8830 +#define GL_DRAW_BUFFER12_EXT 0x8831 +#define GL_DRAW_BUFFER13_EXT 0x8832 +#define GL_DRAW_BUFFER14_EXT 0x8833 +#define GL_DRAW_BUFFER15_EXT 0x8834 +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF + +/* GL_EXT_instanced_arrays */ + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE + +/* GL_NV_draw_buffers */ + +#define GL_MAX_DRAW_BUFFERS_NV 0x8824 +#define GL_DRAW_BUFFER0_NV 0x8825 +#define GL_DRAW_BUFFER1_NV 0x8826 +#define GL_DRAW_BUFFER2_NV 0x8827 +#define GL_DRAW_BUFFER3_NV 0x8828 +#define GL_DRAW_BUFFER4_NV 0x8829 +#define GL_DRAW_BUFFER5_NV 0x882A +#define GL_DRAW_BUFFER6_NV 0x882B +#define GL_DRAW_BUFFER7_NV 0x882C +#define GL_DRAW_BUFFER8_NV 0x882D +#define GL_DRAW_BUFFER9_NV 0x882E +#define GL_DRAW_BUFFER10_NV 0x882F +#define GL_DRAW_BUFFER11_NV 0x8830 +#define GL_DRAW_BUFFER12_NV 0x8831 +#define GL_DRAW_BUFFER13_NV 0x8832 +#define GL_DRAW_BUFFER14_NV 0x8833 +#define GL_DRAW_BUFFER15_NV 0x8834 +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF + +/* GL_NV_fbo_color_attachments */ + +#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF + +/* GL_NV_read_buffer */ + +#define GL_READ_BUFFER_NV 0x0C02 + +/* GL_NV_framebuffer_blit */ + +#define GL_READ_FRAMEBUFFER_NV 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA + +/* GL_NV_framebuffer_multisample */ + +#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 +#define GL_MAX_SAMPLES_NV 0x8D57 + +/* GL_NV_instanced_arrays */ + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE + +/* GL_NV_shadow_samplers_array */ + +#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 + +/* GL_NV_shadow_samplers_cube */ + +#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 + +/* GL_OES_depth24 */ + +#define GL_DEPTH_COMPONENT24_OES 0x81A6 + +/* GL_OES_element_index_uint */ + +#define GL_UNSIGNED_INT 0x1405 + +/* GL_OES_rgb8_rgba8 */ + +#define GL_RGB8_OES 0x8051 +#define GL_RGBA8_OES 0x8058 + +/* GL_OES_texture_3D */ + +#define GL_TEXTURE_WRAP_R_OES 0x8072 +#define GL_TEXTURE_3D_OES 0x806F +#define GL_TEXTURE_BINDING_3D_OES 0x806A +#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 +#define GL_SAMPLER_3D_OES 0x8B5F +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 + +/* GL_OES_texture_half_float */ + +#define GL_HALF_FLOAT_OES 0x8D61 + +/* GL_OES_texture_float */ + +#define GL_FLOAT 0x1406 + +/* GL_OES_vertex_half_float */ + +#define GL_HALF_FLOAT_OES 0x8D61 + +/* GL_OES_packed_depth_stencil */ + +#define GL_DEPTH_STENCIL_OES 0x84F9 +#define GL_UNSIGNED_INT_24_8_OES 0x84FA +#define GL_DEPTH24_STENCIL8_OES 0x88F0 + +/* GL_OES_depth_texture */ + +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_UNSIGNED_INT 0x1405 + +/* GL_OES_standard_derivatives */ + +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B + +/* GL_OES_vertex_array_object */ + +#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 + +/* GL_OES_required_internalformat */ + +#define GL_ALPHA8_OES 0x803C +#define GL_DEPTH_COMPONENT16_OES 0x81A5 +#define GL_DEPTH_COMPONENT24_OES 0x81A6 +#define GL_DEPTH24_STENCIL8_OES 0x88F0 +#define GL_DEPTH_COMPONENT32_OES 0x81A7 +#define GL_LUMINANCE4_ALPHA4_OES 0x8043 +#define GL_LUMINANCE8_ALPHA8_OES 0x8045 +#define GL_LUMINANCE8_OES 0x8040 +#define GL_RGBA4_OES 0x8056 +#define GL_RGB5_A1_OES 0x8057 +#define GL_RGB565_OES 0x8D62 +#define GL_RGB8_OES 0x8051 +#define GL_RGBA8_OES 0x8058 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB10_A2_EXT 0x8059 + +/* GL_OES_surfaceless_context */ + +#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 + +/* GL_APPLE_texture_format_BGRA8888 */ + +#define GL_BGRA_EXT 0x80E1 +#define GL_BGRA8_EXT 0x93A1 + +/* GL_ARM_shader_framebuffer_fetch */ + +#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 +#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 + +/* GL_EXT_texture_filter_anisotropic */ + +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + +/* GL_EXT_texture_format_BGRA8888 */ + +#define GL_BGRA_EXT 0x80E1 + +/* GL_EXT_read_format_bgra */ + +#define GL_BGRA_EXT 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 + +/* GL_EXT_debug_label */ + +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +#define GL_SAMPLER 0x82E6 +#define GL_TRANSFORM_FEEDBACK 0x8E22 + +/* GL_EXT_shader_framebuffer_fetch */ + +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 + +/* GL_EXT_disjoint_timer_query */ + +#define GL_QUERY_COUNTER_BITS_EXT 0x8864 +#define GL_CURRENT_QUERY_EXT 0x8865 +#define GL_QUERY_RESULT_EXT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 +#define GL_TIME_ELAPSED_EXT 0x88BF +#define GL_TIMESTAMP_EXT 0x8E28 +#define GL_GPU_DISJOINT_EXT 0x8FBB + +/* GL_EXT_texture_sRGB_decode */ + +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A + +/* GL_EXT_sRGB_write_control */ + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 + +/* GL_EXT_texture_compression_s3tc */ + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + +/* GL_EXT_draw_buffers_indexed */ + +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_BLEND 0x0BE2 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_SRC_ALPHA_SATURATE 0x0308 + +/* GL_EXT_texture_border_clamp */ + +#define GL_TEXTURE_BORDER_COLOR_EXT 0x1004 +#define GL_CLAMP_TO_BORDER_EXT 0x812D + +/* GL_EXT_separate_shader_objects */ + +#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 +#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE_EXT 0x8258 +#define GL_ACTIVE_PROGRAM_EXT 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A + +/* GL_EXT_multisampled_render_to_texture */ + +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 + +/* GL_EXT_robustness */ + +#define GL_NO_ERROR 0 +#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 +#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 +#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 +#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 + +/* GL_KHR_texture_compression_astc_ldr */ + +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD + +/* GL_KHR_texture_compression_astc_hdr */ + +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD + +/* GL_KHR_debug */ + +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245 +#define GL_DEBUG_SOURCE_API_KHR 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A +#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B +#define GL_DEBUG_TYPE_ERROR_KHR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250 +#define GL_DEBUG_TYPE_OTHER_KHR 0x8251 +#define GL_DEBUG_TYPE_MARKER_KHR 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D +#define GL_BUFFER_KHR 0x82E0 +#define GL_SHADER_KHR 0x82E1 +#define GL_PROGRAM_KHR 0x82E2 +#define GL_VERTEX_ARRAY_KHR 0x8074 +#define GL_QUERY_KHR 0x82E3 +#define GL_PROGRAM_PIPELINE_KHR 0x82E4 +#define GL_SAMPLER_KHR 0x82E6 +#define GL_MAX_LABEL_LENGTH_KHR 0x82E8 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147 +#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148 +#define GL_DEBUG_OUTPUT_KHR 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002 +#define GL_STACK_OVERFLOW_KHR 0x0503 +#define GL_STACK_UNDERFLOW_KHR 0x0504 + +/* GL_KHR_blend_equation_advanced */ + +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 + +/* GL_KHR_blend_equation_advanced_coherent */ + +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 + +/* GL_KHR_robustness */ + +#define GL_NO_ERROR 0 +#define GL_CONTEXT_ROBUST_ACCESS_KHR 0x90F3 +#define GL_LOSE_CONTEXT_ON_RESET_KHR 0x8252 +#define GL_GUILTY_CONTEXT_RESET_KHR 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_KHR 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_KHR 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_KHR 0x8256 +#define GL_NO_RESET_NOTIFICATION_KHR 0x8261 +#define GL_CONTEXT_LOST_KHR 0x0507 + +/* GL_KHR_context_flush_control */ + +#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x82FC +#define GL_NONE 0 + +/* GL_KHR_no_error */ + +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 + +/* GL_NV_texture_border_clamp */ + +#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 +#define GL_CLAMP_TO_BORDER_NV 0x812D + +/* GL_NV_polygon_mode */ + +#define GL_POLYGON_MODE_NV 0x0B40 +#define GL_POLYGON_OFFSET_POINT_NV 0x2A01 +#define GL_POLYGON_OFFSET_LINE_NV 0x2A02 +#define GL_POINT_NV 0x1B00 +#define GL_LINE_NV 0x1B01 +#define GL_FILL_NV 0x1B02 + +/* GL_OES_depth32 */ + +#define GL_DEPTH_COMPONENT32_OES 0x81A7 + +/* GL_OES_mapbuffer */ + +#define GL_WRITE_ONLY_OES 0x88B9 +#define GL_BUFFER_ACCESS_OES 0x88BB +#define GL_BUFFER_MAPPED_OES 0x88BC +#define GL_BUFFER_MAP_POINTER_OES 0x88BD + +/* GL_OES_stencil1 */ + +#define GL_STENCIL_INDEX1_OES 0x8D46 + +/* GL_OES_stencil4 */ + +#define GL_STENCIL_INDEX4_OES 0x8D47 + +/* GL_OES_texture_stencil8 */ + +#define GL_STENCIL_INDEX_OES 0x1901 +#define GL_STENCIL_INDEX8_OES 0x8D48 + +/* Function prototypes */ + +/* GL_ANGLE_framebuffer_blit */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlitFramebufferANGLE)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum); +#define glBlitFramebufferANGLE flextglBlitFramebufferANGLE + +/* GL_ANGLE_framebuffer_multisample */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisampleANGLE)(GLenum, GLsizei, GLenum, GLsizei, GLsizei); +#define glRenderbufferStorageMultisampleANGLE flextglRenderbufferStorageMultisampleANGLE + +/* GL_ANGLE_instanced_arrays */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstancedANGLE)(GLenum, GLint, GLsizei, GLsizei); +#define glDrawArraysInstancedANGLE flextglDrawArraysInstancedANGLE +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstancedANGLE)(GLenum, GLsizei, GLenum, const void *, GLsizei); +#define glDrawElementsInstancedANGLE flextglDrawElementsInstancedANGLE +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribDivisorANGLE)(GLuint, GLuint); +#define glVertexAttribDivisorANGLE flextglVertexAttribDivisorANGLE + +/* GL_APPLE_framebuffer_multisample */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisampleAPPLE)(GLenum, GLsizei, GLenum, GLsizei, GLsizei); +#define glRenderbufferStorageMultisampleAPPLE flextglRenderbufferStorageMultisampleAPPLE +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglResolveMultisampleFramebufferAPPLE)(void); +#define glResolveMultisampleFramebufferAPPLE flextglResolveMultisampleFramebufferAPPLE + +/* GL_ES_VERSION_2_0 */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglActiveTexture)(GLenum); +#define glActiveTexture flextglActiveTexture +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglAttachShader)(GLuint, GLuint); +#define glAttachShader flextglAttachShader +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindAttribLocation)(GLuint, GLuint, const GLchar *); +#define glBindAttribLocation flextglBindAttribLocation +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindBuffer)(GLenum, GLuint); +#define glBindBuffer flextglBindBuffer +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindFramebuffer)(GLenum, GLuint); +#define glBindFramebuffer flextglBindFramebuffer +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindRenderbuffer)(GLenum, GLuint); +#define glBindRenderbuffer flextglBindRenderbuffer +GLAPI FLEXTGL_EXPORT void APIENTRY glBindTexture(GLenum, GLuint); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendColor)(GLfloat, GLfloat, GLfloat, GLfloat); +#define glBlendColor flextglBlendColor +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquation)(GLenum); +#define glBlendEquation flextglBlendEquation +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationSeparate)(GLenum, GLenum); +#define glBlendEquationSeparate flextglBlendEquationSeparate +GLAPI FLEXTGL_EXPORT void APIENTRY glBlendFunc(GLenum, GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendFuncSeparate)(GLenum, GLenum, GLenum, GLenum); +#define glBlendFuncSeparate flextglBlendFuncSeparate +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBufferData)(GLenum, GLsizeiptr, const void *, GLenum); +#define glBufferData flextglBufferData +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBufferSubData)(GLenum, GLintptr, GLsizeiptr, const void *); +#define glBufferSubData flextglBufferSubData +GLAPI FLEXTGL_EXPORT GLenum(APIENTRY *flextglCheckFramebufferStatus)(GLenum); +#define glCheckFramebufferStatus flextglCheckFramebufferStatus +GLAPI FLEXTGL_EXPORT void APIENTRY glClear(GLbitfield); +GLAPI FLEXTGL_EXPORT void APIENTRY glClearColor(GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglClearDepthf)(GLfloat); +#define glClearDepthf flextglClearDepthf +GLAPI FLEXTGL_EXPORT void APIENTRY glClearStencil(GLint); +GLAPI FLEXTGL_EXPORT void APIENTRY glColorMask(GLboolean, GLboolean, GLboolean, GLboolean); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCompileShader)(GLuint); +#define glCompileShader flextglCompileShader +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexImage2D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void *); +#define glCompressedTexImage2D flextglCompressedTexImage2D +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void *); +#define glCompressedTexSubImage2D flextglCompressedTexSubImage2D +GLAPI FLEXTGL_EXPORT void APIENTRY glCopyTexImage2D(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +GLAPI FLEXTGL_EXPORT void APIENTRY glCopyTexSubImage2D(GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +GLAPI FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateProgram)(void); +#define glCreateProgram flextglCreateProgram +GLAPI FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShader)(GLenum); +#define glCreateShader flextglCreateShader +GLAPI FLEXTGL_EXPORT void APIENTRY glCullFace(GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteBuffers)(GLsizei, const GLuint *); +#define glDeleteBuffers flextglDeleteBuffers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteFramebuffers)(GLsizei, const GLuint *); +#define glDeleteFramebuffers flextglDeleteFramebuffers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgram)(GLuint); +#define glDeleteProgram flextglDeleteProgram +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteRenderbuffers)(GLsizei, const GLuint *); +#define glDeleteRenderbuffers flextglDeleteRenderbuffers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteShader)(GLuint); +#define glDeleteShader flextglDeleteShader +GLAPI FLEXTGL_EXPORT void APIENTRY glDeleteTextures(GLsizei, const GLuint *); +GLAPI FLEXTGL_EXPORT void APIENTRY glDepthFunc(GLenum); +GLAPI FLEXTGL_EXPORT void APIENTRY glDepthMask(GLboolean); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDepthRangef)(GLfloat, GLfloat); +#define glDepthRangef flextglDepthRangef +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDetachShader)(GLuint, GLuint); +#define glDetachShader flextglDetachShader +GLAPI FLEXTGL_EXPORT void APIENTRY glDisable(GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDisableVertexAttribArray)(GLuint); +#define glDisableVertexAttribArray flextglDisableVertexAttribArray +GLAPI FLEXTGL_EXPORT void APIENTRY glDrawArrays(GLenum, GLint, GLsizei); +GLAPI FLEXTGL_EXPORT void APIENTRY glDrawElements(GLenum, GLsizei, GLenum, const void *); +GLAPI FLEXTGL_EXPORT void APIENTRY glEnable(GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglEnableVertexAttribArray)(GLuint); +#define glEnableVertexAttribArray flextglEnableVertexAttribArray +GLAPI FLEXTGL_EXPORT void APIENTRY glFinish(void); +GLAPI FLEXTGL_EXPORT void APIENTRY glFlush(void); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferRenderbuffer)(GLenum, GLenum, GLenum, GLuint); +#define glFramebufferRenderbuffer flextglFramebufferRenderbuffer +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture2D)(GLenum, GLenum, GLenum, GLuint, GLint); +#define glFramebufferTexture2D flextglFramebufferTexture2D +GLAPI FLEXTGL_EXPORT void APIENTRY glFrontFace(GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenBuffers)(GLsizei, GLuint *); +#define glGenBuffers flextglGenBuffers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenFramebuffers)(GLsizei, GLuint *); +#define glGenFramebuffers flextglGenFramebuffers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenRenderbuffers)(GLsizei, GLuint *); +#define glGenRenderbuffers flextglGenRenderbuffers +GLAPI FLEXTGL_EXPORT void APIENTRY glGenTextures(GLsizei, GLuint *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenerateMipmap)(GLenum); +#define glGenerateMipmap flextglGenerateMipmap +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveAttrib)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +#define glGetActiveAttrib flextglGetActiveAttrib +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniform)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +#define glGetActiveUniform flextglGetActiveUniform +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetAttachedShaders)(GLuint, GLsizei, GLsizei *, GLuint *); +#define glGetAttachedShaders flextglGetAttachedShaders +GLAPI FLEXTGL_EXPORT GLint(APIENTRY *flextglGetAttribLocation)(GLuint, const GLchar *); +#define glGetAttribLocation flextglGetAttribLocation +GLAPI FLEXTGL_EXPORT void APIENTRY glGetBooleanv(GLenum, GLboolean *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferParameteriv)(GLenum, GLenum, GLint *); +#define glGetBufferParameteriv flextglGetBufferParameteriv +GLAPI FLEXTGL_EXPORT GLenum APIENTRY glGetError(void); +GLAPI FLEXTGL_EXPORT void APIENTRY glGetFloatv(GLenum, GLfloat *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetFramebufferAttachmentParameteriv)(GLenum, GLenum, GLenum, GLint *); +#define glGetFramebufferAttachmentParameteriv flextglGetFramebufferAttachmentParameteriv +GLAPI FLEXTGL_EXPORT void APIENTRY glGetIntegerv(GLenum, GLint *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetProgramInfoLog flextglGetProgramInfoLog +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramiv)(GLuint, GLenum, GLint *); +#define glGetProgramiv flextglGetProgramiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetRenderbufferParameteriv)(GLenum, GLenum, GLint *); +#define glGetRenderbufferParameteriv flextglGetRenderbufferParameteriv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetShaderInfoLog flextglGetShaderInfoLog +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderPrecisionFormat)(GLenum, GLenum, GLint *, GLint *); +#define glGetShaderPrecisionFormat flextglGetShaderPrecisionFormat +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderSource)(GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetShaderSource flextglGetShaderSource +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderiv)(GLuint, GLenum, GLint *); +#define glGetShaderiv flextglGetShaderiv +GLAPI FLEXTGL_EXPORT const GLubyte * APIENTRY glGetString(GLenum); +GLAPI FLEXTGL_EXPORT void APIENTRY glGetTexParameterfv(GLenum, GLenum, GLfloat *); +GLAPI FLEXTGL_EXPORT void APIENTRY glGetTexParameteriv(GLenum, GLenum, GLint *); +GLAPI FLEXTGL_EXPORT GLint(APIENTRY *flextglGetUniformLocation)(GLuint, const GLchar *); +#define glGetUniformLocation flextglGetUniformLocation +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformfv)(GLuint, GLint, GLfloat *); +#define glGetUniformfv flextglGetUniformfv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformiv)(GLuint, GLint, GLint *); +#define glGetUniformiv flextglGetUniformiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribPointerv)(GLuint, GLenum, void **); +#define glGetVertexAttribPointerv flextglGetVertexAttribPointerv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribfv)(GLuint, GLenum, GLfloat *); +#define glGetVertexAttribfv flextglGetVertexAttribfv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribiv)(GLuint, GLenum, GLint *); +#define glGetVertexAttribiv flextglGetVertexAttribiv +GLAPI FLEXTGL_EXPORT void APIENTRY glHint(GLenum, GLenum); +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsBuffer)(GLuint); +#define glIsBuffer flextglIsBuffer +GLAPI FLEXTGL_EXPORT GLboolean APIENTRY glIsEnabled(GLenum); +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsFramebuffer)(GLuint); +#define glIsFramebuffer flextglIsFramebuffer +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgram)(GLuint); +#define glIsProgram flextglIsProgram +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsRenderbuffer)(GLuint); +#define glIsRenderbuffer flextglIsRenderbuffer +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsShader)(GLuint); +#define glIsShader flextglIsShader +GLAPI FLEXTGL_EXPORT GLboolean APIENTRY glIsTexture(GLuint); +GLAPI FLEXTGL_EXPORT void APIENTRY glLineWidth(GLfloat); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglLinkProgram)(GLuint); +#define glLinkProgram flextglLinkProgram +GLAPI FLEXTGL_EXPORT void APIENTRY glPixelStorei(GLenum, GLint); +GLAPI FLEXTGL_EXPORT void APIENTRY glPolygonOffset(GLfloat, GLfloat); +GLAPI FLEXTGL_EXPORT void APIENTRY glReadPixels(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, void *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglReleaseShaderCompiler)(void); +#define glReleaseShaderCompiler flextglReleaseShaderCompiler +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorage)(GLenum, GLenum, GLsizei, GLsizei); +#define glRenderbufferStorage flextglRenderbufferStorage +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglSampleCoverage)(GLfloat, GLboolean); +#define glSampleCoverage flextglSampleCoverage +GLAPI FLEXTGL_EXPORT void APIENTRY glScissor(GLint, GLint, GLsizei, GLsizei); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglShaderBinary)(GLsizei, const GLuint *, GLenum, const void *, GLsizei); +#define glShaderBinary flextglShaderBinary +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglShaderSource)(GLuint, GLsizei, const GLchar *const*, const GLint *); +#define glShaderSource flextglShaderSource +GLAPI FLEXTGL_EXPORT void APIENTRY glStencilFunc(GLenum, GLint, GLuint); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglStencilFuncSeparate)(GLenum, GLenum, GLint, GLuint); +#define glStencilFuncSeparate flextglStencilFuncSeparate +GLAPI FLEXTGL_EXPORT void APIENTRY glStencilMask(GLuint); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglStencilMaskSeparate)(GLenum, GLuint); +#define glStencilMaskSeparate flextglStencilMaskSeparate +GLAPI FLEXTGL_EXPORT void APIENTRY glStencilOp(GLenum, GLenum, GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglStencilOpSeparate)(GLenum, GLenum, GLenum, GLenum); +#define glStencilOpSeparate flextglStencilOpSeparate +GLAPI FLEXTGL_EXPORT void APIENTRY glTexImage2D(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *); +GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameterf(GLenum, GLenum, GLfloat); +GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameterfv(GLenum, GLenum, const GLfloat *); +GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameteri(GLenum, GLenum, GLint); +GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameteriv(GLenum, GLenum, const GLint *); +GLAPI FLEXTGL_EXPORT void APIENTRY glTexSubImage2D(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform1f)(GLint, GLfloat); +#define glUniform1f flextglUniform1f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform1fv)(GLint, GLsizei, const GLfloat *); +#define glUniform1fv flextglUniform1fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform1i)(GLint, GLint); +#define glUniform1i flextglUniform1i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform1iv)(GLint, GLsizei, const GLint *); +#define glUniform1iv flextglUniform1iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform2f)(GLint, GLfloat, GLfloat); +#define glUniform2f flextglUniform2f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform2fv)(GLint, GLsizei, const GLfloat *); +#define glUniform2fv flextglUniform2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform2i)(GLint, GLint, GLint); +#define glUniform2i flextglUniform2i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform2iv)(GLint, GLsizei, const GLint *); +#define glUniform2iv flextglUniform2iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform3f)(GLint, GLfloat, GLfloat, GLfloat); +#define glUniform3f flextglUniform3f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform3fv)(GLint, GLsizei, const GLfloat *); +#define glUniform3fv flextglUniform3fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform3i)(GLint, GLint, GLint, GLint); +#define glUniform3i flextglUniform3i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform3iv)(GLint, GLsizei, const GLint *); +#define glUniform3iv flextglUniform3iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform4f)(GLint, GLfloat, GLfloat, GLfloat, GLfloat); +#define glUniform4f flextglUniform4f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform4fv)(GLint, GLsizei, const GLfloat *); +#define glUniform4fv flextglUniform4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform4i)(GLint, GLint, GLint, GLint, GLint); +#define glUniform4i flextglUniform4i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform4iv)(GLint, GLsizei, const GLint *); +#define glUniform4iv flextglUniform4iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix2fv flextglUniformMatrix2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix3fv flextglUniformMatrix3fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix4fv flextglUniformMatrix4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUseProgram)(GLuint); +#define glUseProgram flextglUseProgram +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgram)(GLuint); +#define glValidateProgram flextglValidateProgram +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1f)(GLuint, GLfloat); +#define glVertexAttrib1f flextglVertexAttrib1f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1fv)(GLuint, const GLfloat *); +#define glVertexAttrib1fv flextglVertexAttrib1fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2f)(GLuint, GLfloat, GLfloat); +#define glVertexAttrib2f flextglVertexAttrib2f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2fv)(GLuint, const GLfloat *); +#define glVertexAttrib2fv flextglVertexAttrib2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3f)(GLuint, GLfloat, GLfloat, GLfloat); +#define glVertexAttrib3f flextglVertexAttrib3f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3fv)(GLuint, const GLfloat *); +#define glVertexAttrib3fv flextglVertexAttrib3fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4f)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +#define glVertexAttrib4f flextglVertexAttrib4f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4fv)(GLuint, const GLfloat *); +#define glVertexAttrib4fv flextglVertexAttrib4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, const void *); +#define glVertexAttribPointer flextglVertexAttribPointer +GLAPI FLEXTGL_EXPORT void APIENTRY glViewport(GLint, GLint, GLsizei, GLsizei); + +/* GL_EXT_debug_label */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectLabelEXT)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetObjectLabelEXT flextglGetObjectLabelEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglLabelObjectEXT)(GLenum, GLuint, GLsizei, const GLchar *); +#define glLabelObjectEXT flextglLabelObjectEXT + +/* GL_EXT_debug_marker */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglInsertEventMarkerEXT)(GLsizei, const GLchar *); +#define glInsertEventMarkerEXT flextglInsertEventMarkerEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPopGroupMarkerEXT)(void); +#define glPopGroupMarkerEXT flextglPopGroupMarkerEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPushGroupMarkerEXT)(GLsizei, const GLchar *); +#define glPushGroupMarkerEXT flextglPushGroupMarkerEXT + +/* GL_EXT_discard_framebuffer */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDiscardFramebufferEXT)(GLenum, GLsizei, const GLenum *); +#define glDiscardFramebufferEXT flextglDiscardFramebufferEXT + +/* GL_EXT_disjoint_timer_query */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjecti64vEXT)(GLuint, GLenum, GLint64 *); +#define glGetQueryObjecti64vEXT flextglGetQueryObjecti64vEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectivEXT)(GLuint, GLenum, GLint *); +#define glGetQueryObjectivEXT flextglGetQueryObjectivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectui64vEXT)(GLuint, GLenum, GLuint64 *); +#define glGetQueryObjectui64vEXT flextglGetQueryObjectui64vEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglQueryCounterEXT)(GLuint, GLenum); +#define glQueryCounterEXT flextglQueryCounterEXT + +/* GL_EXT_draw_buffers */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawBuffersEXT)(GLsizei, const GLenum *); +#define glDrawBuffersEXT flextglDrawBuffersEXT + +/* GL_EXT_draw_buffers_indexed */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationSeparateiEXT)(GLuint, GLenum, GLenum); +#define glBlendEquationSeparateiEXT flextglBlendEquationSeparateiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationiEXT)(GLuint, GLenum); +#define glBlendEquationiEXT flextglBlendEquationiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendFuncSeparateiEXT)(GLuint, GLenum, GLenum, GLenum, GLenum); +#define glBlendFuncSeparateiEXT flextglBlendFuncSeparateiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendFunciEXT)(GLuint, GLenum, GLenum); +#define glBlendFunciEXT flextglBlendFunciEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglColorMaskiEXT)(GLuint, GLboolean, GLboolean, GLboolean, GLboolean); +#define glColorMaskiEXT flextglColorMaskiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDisableiEXT)(GLenum, GLuint); +#define glDisableiEXT flextglDisableiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglEnableiEXT)(GLenum, GLuint); +#define glEnableiEXT flextglEnableiEXT +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsEnablediEXT)(GLenum, GLuint); +#define glIsEnablediEXT flextglIsEnablediEXT + +/* GL_EXT_instanced_arrays */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstancedEXT)(GLenum, GLint, GLsizei, GLsizei); +#define glDrawArraysInstancedEXT flextglDrawArraysInstancedEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstancedEXT)(GLenum, GLsizei, GLenum, const void *, GLsizei); +#define glDrawElementsInstancedEXT flextglDrawElementsInstancedEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribDivisorEXT)(GLuint, GLuint); +#define glVertexAttribDivisorEXT flextglVertexAttribDivisorEXT + +/* GL_EXT_map_buffer_range */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFlushMappedBufferRangeEXT)(GLenum, GLintptr, GLsizeiptr); +#define glFlushMappedBufferRangeEXT flextglFlushMappedBufferRangeEXT +GLAPI FLEXTGL_EXPORT void *(APIENTRY *flextglMapBufferRangeEXT)(GLenum, GLintptr, GLsizeiptr, GLbitfield); +#define glMapBufferRangeEXT flextglMapBufferRangeEXT + +/* GL_EXT_multi_draw_arrays */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawArraysEXT)(GLenum, const GLint *, const GLsizei *, GLsizei); +#define glMultiDrawArraysEXT flextglMultiDrawArraysEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawElementsEXT)(GLenum, const GLsizei *, GLenum, const void *const*, GLsizei); +#define glMultiDrawElementsEXT flextglMultiDrawElementsEXT + +/* GL_EXT_multisampled_render_to_texture */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture2DMultisampleEXT)(GLenum, GLenum, GLenum, GLuint, GLint, GLsizei); +#define glFramebufferTexture2DMultisampleEXT flextglFramebufferTexture2DMultisampleEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisampleEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei); +#define glRenderbufferStorageMultisampleEXT flextglRenderbufferStorageMultisampleEXT + +/* GL_EXT_occlusion_query_boolean */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBeginQueryEXT)(GLenum, GLuint); +#define glBeginQueryEXT flextglBeginQueryEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteQueriesEXT)(GLsizei, const GLuint *); +#define glDeleteQueriesEXT flextglDeleteQueriesEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglEndQueryEXT)(GLenum); +#define glEndQueryEXT flextglEndQueryEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenQueriesEXT)(GLsizei, GLuint *); +#define glGenQueriesEXT flextglGenQueriesEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectuivEXT)(GLuint, GLenum, GLuint *); +#define glGetQueryObjectuivEXT flextglGetQueryObjectuivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryivEXT)(GLenum, GLenum, GLint *); +#define glGetQueryivEXT flextglGetQueryivEXT +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsQueryEXT)(GLuint); +#define glIsQueryEXT flextglIsQueryEXT + +/* GL_EXT_robustness */ + +GLAPI FLEXTGL_EXPORT GLenum(APIENTRY *flextglGetGraphicsResetStatusEXT)(void); +#define glGetGraphicsResetStatusEXT flextglGetGraphicsResetStatusEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformfvEXT)(GLuint, GLint, GLsizei, GLfloat *); +#define glGetnUniformfvEXT flextglGetnUniformfvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformivEXT)(GLuint, GLint, GLsizei, GLint *); +#define glGetnUniformivEXT flextglGetnUniformivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglReadnPixelsEXT)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void *); +#define glReadnPixelsEXT flextglReadnPixelsEXT + +/* GL_EXT_separate_shader_objects */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglActiveShaderProgramEXT)(GLuint, GLuint); +#define glActiveShaderProgramEXT flextglActiveShaderProgramEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindProgramPipelineEXT)(GLuint); +#define glBindProgramPipelineEXT flextglBindProgramPipelineEXT +GLAPI FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShaderProgramvEXT)(GLenum, GLsizei, const GLchar **); +#define glCreateShaderProgramvEXT flextglCreateShaderProgramvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgramPipelinesEXT)(GLsizei, const GLuint *); +#define glDeleteProgramPipelinesEXT flextglDeleteProgramPipelinesEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenProgramPipelinesEXT)(GLsizei, GLuint *); +#define glGenProgramPipelinesEXT flextglGenProgramPipelinesEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineInfoLogEXT)(GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetProgramPipelineInfoLogEXT flextglGetProgramPipelineInfoLogEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineivEXT)(GLuint, GLenum, GLint *); +#define glGetProgramPipelineivEXT flextglGetProgramPipelineivEXT +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgramPipelineEXT)(GLuint); +#define glIsProgramPipelineEXT flextglIsProgramPipelineEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramParameteriEXT)(GLuint, GLenum, GLint); +#define glProgramParameteriEXT flextglProgramParameteriEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fEXT)(GLuint, GLint, GLfloat); +#define glProgramUniform1fEXT flextglProgramUniform1fEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fvEXT)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform1fvEXT flextglProgramUniform1fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1iEXT)(GLuint, GLint, GLint); +#define glProgramUniform1iEXT flextglProgramUniform1iEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1ivEXT)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform1ivEXT flextglProgramUniform1ivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fEXT)(GLuint, GLint, GLfloat, GLfloat); +#define glProgramUniform2fEXT flextglProgramUniform2fEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fvEXT)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform2fvEXT flextglProgramUniform2fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2iEXT)(GLuint, GLint, GLint, GLint); +#define glProgramUniform2iEXT flextglProgramUniform2iEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2ivEXT)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform2ivEXT flextglProgramUniform2ivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat); +#define glProgramUniform3fEXT flextglProgramUniform3fEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fvEXT)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform3fvEXT flextglProgramUniform3fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3iEXT)(GLuint, GLint, GLint, GLint, GLint); +#define glProgramUniform3iEXT flextglProgramUniform3iEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3ivEXT)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform3ivEXT flextglProgramUniform3ivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat); +#define glProgramUniform4fEXT flextglProgramUniform4fEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fvEXT)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform4fvEXT flextglProgramUniform4fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4iEXT)(GLuint, GLint, GLint, GLint, GLint, GLint); +#define glProgramUniform4iEXT flextglProgramUniform4iEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4ivEXT)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform4ivEXT flextglProgramUniform4ivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix2fvEXT flextglProgramUniformMatrix2fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix3fvEXT flextglProgramUniformMatrix3fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix4fvEXT flextglProgramUniformMatrix4fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUseProgramStagesEXT)(GLuint, GLbitfield, GLuint); +#define glUseProgramStagesEXT flextglUseProgramStagesEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgramPipelineEXT)(GLuint); +#define glValidateProgramPipelineEXT flextglValidateProgramPipelineEXT + +/* GL_EXT_texture_border_clamp */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterIivEXT)(GLuint, GLenum, GLint *); +#define glGetSamplerParameterIivEXT flextglGetSamplerParameterIivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterIuivEXT)(GLuint, GLenum, GLuint *); +#define glGetSamplerParameterIuivEXT flextglGetSamplerParameterIuivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterIivEXT)(GLenum, GLenum, GLint *); +#define glGetTexParameterIivEXT flextglGetTexParameterIivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterIuivEXT)(GLenum, GLenum, GLuint *); +#define glGetTexParameterIuivEXT flextglGetTexParameterIuivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterIivEXT)(GLuint, GLenum, const GLint *); +#define glSamplerParameterIivEXT flextglSamplerParameterIivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterIuivEXT)(GLuint, GLenum, const GLuint *); +#define glSamplerParameterIuivEXT flextglSamplerParameterIuivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIivEXT)(GLenum, GLenum, const GLint *); +#define glTexParameterIivEXT flextglTexParameterIivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIuivEXT)(GLenum, GLenum, const GLuint *); +#define glTexParameterIuivEXT flextglTexParameterIuivEXT + +/* GL_EXT_texture_storage */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage2DEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei); +#define glTexStorage2DEXT flextglTexStorage2DEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage3DEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei); +#define glTexStorage3DEXT flextglTexStorage3DEXT + +/* GL_KHR_blend_equation_advanced */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendBarrierKHR)(void); +#define glBlendBarrierKHR flextglBlendBarrierKHR + +/* GL_KHR_debug */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageCallbackKHR)(GLDEBUGPROCKHR, const void *); +#define glDebugMessageCallbackKHR flextglDebugMessageCallbackKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageControlKHR)(GLenum, GLenum, GLenum, GLsizei, const GLuint *, GLboolean); +#define glDebugMessageControlKHR flextglDebugMessageControlKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageInsertKHR)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar *); +#define glDebugMessageInsertKHR flextglDebugMessageInsertKHR +GLAPI FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetDebugMessageLogKHR)(GLuint, GLsizei, GLenum *, GLenum *, GLuint *, GLenum *, GLsizei *, GLchar *); +#define glGetDebugMessageLogKHR flextglGetDebugMessageLogKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectLabelKHR)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetObjectLabelKHR flextglGetObjectLabelKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectPtrLabelKHR)(const void *, GLsizei, GLsizei *, GLchar *); +#define glGetObjectPtrLabelKHR flextglGetObjectPtrLabelKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetPointervKHR)(GLenum, void **); +#define glGetPointervKHR flextglGetPointervKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglObjectLabelKHR)(GLenum, GLuint, GLsizei, const GLchar *); +#define glObjectLabelKHR flextglObjectLabelKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglObjectPtrLabelKHR)(const void *, GLsizei, const GLchar *); +#define glObjectPtrLabelKHR flextglObjectPtrLabelKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPopDebugGroupKHR)(void); +#define glPopDebugGroupKHR flextglPopDebugGroupKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPushDebugGroupKHR)(GLenum, GLuint, GLsizei, const GLchar *); +#define glPushDebugGroupKHR flextglPushDebugGroupKHR + +/* GL_KHR_robustness */ + +GLAPI FLEXTGL_EXPORT GLenum(APIENTRY *flextglGetGraphicsResetStatusKHR)(void); +#define glGetGraphicsResetStatusKHR flextglGetGraphicsResetStatusKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformfvKHR)(GLuint, GLint, GLsizei, GLfloat *); +#define glGetnUniformfvKHR flextglGetnUniformfvKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformivKHR)(GLuint, GLint, GLsizei, GLint *); +#define glGetnUniformivKHR flextglGetnUniformivKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformuivKHR)(GLuint, GLint, GLsizei, GLuint *); +#define glGetnUniformuivKHR flextglGetnUniformuivKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglReadnPixelsKHR)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void *); +#define glReadnPixelsKHR flextglReadnPixelsKHR + +/* GL_NV_draw_buffers */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawBuffersNV)(GLsizei, const GLenum *); +#define glDrawBuffersNV flextglDrawBuffersNV + +/* GL_NV_draw_instanced */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstancedNV)(GLenum, GLint, GLsizei, GLsizei); +#define glDrawArraysInstancedNV flextglDrawArraysInstancedNV +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstancedNV)(GLenum, GLsizei, GLenum, const void *, GLsizei); +#define glDrawElementsInstancedNV flextglDrawElementsInstancedNV + +/* GL_NV_framebuffer_blit */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlitFramebufferNV)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum); +#define glBlitFramebufferNV flextglBlitFramebufferNV + +/* GL_NV_framebuffer_multisample */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisampleNV)(GLenum, GLsizei, GLenum, GLsizei, GLsizei); +#define glRenderbufferStorageMultisampleNV flextglRenderbufferStorageMultisampleNV + +/* GL_NV_instanced_arrays */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribDivisorNV)(GLuint, GLuint); +#define glVertexAttribDivisorNV flextglVertexAttribDivisorNV + +/* GL_NV_polygon_mode */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPolygonModeNV)(GLenum, GLenum); +#define glPolygonModeNV flextglPolygonModeNV + +/* GL_NV_read_buffer */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglReadBufferNV)(GLenum); +#define glReadBufferNV flextglReadBufferNV + +/* GL_OES_mapbuffer */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferPointervOES)(GLenum, GLenum, void **); +#define glGetBufferPointervOES flextglGetBufferPointervOES +GLAPI FLEXTGL_EXPORT void *(APIENTRY *flextglMapBufferOES)(GLenum, GLenum); +#define glMapBufferOES flextglMapBufferOES +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglUnmapBufferOES)(GLenum); +#define glUnmapBufferOES flextglUnmapBufferOES + +/* GL_OES_texture_3D */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexImage3DOES)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void *); +#define glCompressedTexImage3DOES flextglCompressedTexImage3DOES +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexSubImage3DOES)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void *); +#define glCompressedTexSubImage3DOES flextglCompressedTexSubImage3DOES +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexSubImage3DOES)(GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#define glCopyTexSubImage3DOES flextglCopyTexSubImage3DOES +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture3DOES)(GLenum, GLenum, GLenum, GLuint, GLint, GLint); +#define glFramebufferTexture3DOES flextglFramebufferTexture3DOES +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexImage3DOES)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *); +#define glTexImage3DOES flextglTexImage3DOES +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexSubImage3DOES)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *); +#define glTexSubImage3DOES flextglTexSubImage3DOES + +/* GL_OES_vertex_array_object */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindVertexArrayOES)(GLuint); +#define glBindVertexArrayOES flextglBindVertexArrayOES +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteVertexArraysOES)(GLsizei, const GLuint *); +#define glDeleteVertexArraysOES flextglDeleteVertexArraysOES +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenVertexArraysOES)(GLsizei, GLuint *); +#define glGenVertexArraysOES flextglGenVertexArraysOES +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsVertexArrayOES)(GLuint); +#define glIsVertexArrayOES flextglIsVertexArrayOES + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h.template b/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h.template new file mode 100644 index 000000000..b51dafe52 --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h.template @@ -0,0 +1,90 @@ +@require(passthru, functions, enums, options, version, extensions) +#ifndef _flextgl_h_ +#define _flextgl_h_ + +#include + +#include "Magnum/configure.h" + +/* Defensive include guards */ + +#if defined(__gl_h_) || defined(__gl2_h_) +#error Attempt to include auto-generated header after including gl2.h +#endif +#if defined(__gl2ext_h_) +#error Attempt to include auto-generated header after including gl2ext.h +#endif +#if defined(__gl2platform_h_) +#error Attempt to include auto-generated header after including gl2platform.h +#endif + +#define __gl_h_ +#define __gl2_h_ +#define __gl2ext_h_ +#define __gl2platform_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +void flextGLInit(); + +/* Function declaration macros */ + +#ifndef MAGNUM_BUILD_STATIC + #ifdef FlextGL_EXPORTS + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_EXPORT + #else + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_IMPORT + #endif +#else + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_STATIC +#endif + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#ifndef WINAPI +#define WINAPI __stdcall +#endif +#define APIENTRY WINAPI +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/* Data types */ + +@passthru + +/* Enums */ + +@enums + +/* Function prototypes */ +@for cat,funcs in functions: +@if funcs: + +/* GL_@cat */ + + @for f in funcs: + @if f.name in ['BlendFunc', 'Clear', 'ClearColor', 'ClearDepth', 'ClearStencil', 'ColorMask', 'CullFace', 'DepthFunc', 'DepthMask', 'DepthRange', 'Disable', 'DrawBuffer', 'Enable', 'Finish', 'Flush', 'FrontFace', 'GetBooleanv', 'GetDoublev', 'GetError', 'GetFloatv', 'GetIntegerv', 'GetString', 'GetTexImage', 'GetTexLevelParameterfv', 'GetTexLevelParameteriv', 'GetTexParameterfv', 'GetTexParameteriv', 'Hint', 'IsEnabled', 'LineWidth', 'LogicOp', 'PixelStoref', 'PixelStorei', 'PointSize', 'PolygonMode', 'ReadBuffer', 'ReadPixels', 'Scissor', 'StencilFunc', 'StencilMask', 'StencilOp', 'TexImage1D', 'TexImage2D', 'TexParameterf', 'TexParameterfv', 'TexParameteri', 'TexParameteriv', 'Viewport', 'BindTexture', 'CopyTexImage1D', 'CopyTexImage2D', 'CopyTexSubImage1D', 'CopyTexSubImage2D', 'DeleteTextures', 'DrawArrays', 'DrawElements', 'GenTextures', 'IsTexture', 'PolygonOffset', 'TexSubImage1D', 'TexSubImage2D']: +GLAPI FLEXTGL_EXPORT @f.returntype APIENTRY gl@f.name\ +(@f.param_type_list_string()); + @else: +GLAPI FLEXTGL_EXPORT @f.returntype\ +(APIENTRY *flextgl@f.name)(@f.param_type_list_string()); +#define gl@f.name flextgl@f.name + @end + @end +@end +@end + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/MagnumExternal/OpenGL/GLES3/CMakeLists.txt b/src/MagnumExternal/OpenGL/GLES3/CMakeLists.txt index 0cd6050e3..b0e3ed10c 100644 --- a/src/MagnumExternal/OpenGL/GLES3/CMakeLists.txt +++ b/src/MagnumExternal/OpenGL/GLES3/CMakeLists.txt @@ -23,21 +23,35 @@ # DEALINGS IN THE SOFTWARE. # -# flextGLPlatform.cpp is compiled as part of Magnum*Context libraries in Platform -add_library(MagnumFlextGLObjects OBJECT flextGL.cpp) -target_include_directories(MagnumFlextGLObjects PUBLIC $) +# Desktop GLES on Windows still links to opengl32.dll so we have a special +# function loading code that queries everything above OpenGL 1.1 +if(CORRADE_TARGET_WINDOWS AND MAGNUM_TARGET_DESKTOP_GLES) + set(MagnumOpenGL_HEADERS flextGLWindowsDesktop.h) + set(MagnumOpenGL_SRCS flextGLWindowsDesktop.cpp) -if(NOT BUILD_STATIC) - target_compile_definitions(MagnumFlextGLObjects PRIVATE "FlextGL_EXPORTS") -endif() -if(NOT BUILD_STATIC OR BUILD_STATIC_PIC) - set_target_properties(MagnumFlextGLObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) -endif() - -if(CORRADE_TARGET_EMSCRIPTEN) +# Emscripten is special, provide only some extensions for it (and no extension +# loading) +elseif(CORRADE_TARGET_EMSCRIPTEN) set(MagnumOpenGL_HEADERS flextGLEmscripten.h) + +# The common sane case else() set(MagnumOpenGL_HEADERS flextGL.h) + set(MagnumOpenGL_SRCS flextGL.cpp) +endif() + +# Emscripten doesn't have the ability to load function pointers manually +if(NOT CORRADE_TARGET_NACL AND NOT CORRADE_TARGET_EMSCRIPTEN) + # flextGLPlatform*.cpp is compiled as part of Magnum*Context libraries in Platform + add_library(MagnumFlextGLObjects OBJECT ${MagnumOpenGL_SRCS}) + target_include_directories(MagnumFlextGLObjects PUBLIC $) + + if(NOT BUILD_STATIC) + target_compile_definitions(MagnumFlextGLObjects PRIVATE "FlextGL_EXPORTS") + endif() + if(NOT BUILD_STATIC OR BUILD_STATIC_PIC) + set_target_properties(MagnumFlextGLObjects PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() endif() install(FILES ${MagnumOpenGL_HEADERS} DESTINATION ${MAGNUM_EXTERNAL_INCLUDE_INSTALL_DIR}/OpenGL/GLES3) diff --git a/src/MagnumExternal/OpenGL/GLES3/README.md b/src/MagnumExternal/OpenGL/GLES3/README.md index 680618870..8aa7a5d6d 100644 --- a/src/MagnumExternal/OpenGL/GLES3/README.md +++ b/src/MagnumExternal/OpenGL/GLES3/README.md @@ -6,8 +6,18 @@ Call `flextGLgen.py` in this directory with the following arguments: .../flextGLgen.py -D . -t . extensions.txt -It will generate `flextGL.h`, `flextGL.cpp`, `flextGLPlatform.cpp` and -`flextGLPlatformIOS.cpp` files. +It will generate `flextGL.h`, `flextGL.cpp`, `flextGLPlatform.cpp`, +`flextGLWindowsDesktop.h`, `flextGLWindowsDesktop.cpp`, +`flextGLPlatformWindowsDesktop.cpp` and `flextGLPlatformIOS.cpp` files. + +Desktop GLES on Windows still links to the ancient `opengl32.dll` which exports +only OpenGL 1.1 symbols, so we have a special set of headers that queries +pointers for everything above OpenGL 1.1 (instead of everything above OpenGL ES +3.0). + +iOS, on the other hand, doesn't have any extension loader mechanism and all +supported entrypoints are exported from the library, so we set the function +pointers to those exported symbols in case the system GL header defines them. Emscripten doesn't have the ability to manually load extension pointers, thus it has only header files: diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp new file mode 100644 index 000000000..a2c38b1b1 --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp @@ -0,0 +1,437 @@ +#include "flextGLWindowsDesktop.h" + +#include +#include + +#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h" + +void flextGLInit() { + Magnum::Platform::Implementation::OpenGLFunctionLoader loader; + + /* GL_ES_VERSION_2_0 */ + flextglActiveTexture = reinterpret_cast(loader.load("glActiveTexture")); + flextglAttachShader = reinterpret_cast(loader.load("glAttachShader")); + flextglBindAttribLocation = reinterpret_cast(loader.load("glBindAttribLocation")); + flextglBindBuffer = reinterpret_cast(loader.load("glBindBuffer")); + flextglBindFramebuffer = reinterpret_cast(loader.load("glBindFramebuffer")); + flextglBindRenderbuffer = reinterpret_cast(loader.load("glBindRenderbuffer")); + flextglBlendColor = reinterpret_cast(loader.load("glBlendColor")); + flextglBlendEquation = reinterpret_cast(loader.load("glBlendEquation")); + flextglBlendEquationSeparate = reinterpret_cast(loader.load("glBlendEquationSeparate")); + flextglBlendFuncSeparate = reinterpret_cast(loader.load("glBlendFuncSeparate")); + flextglBufferData = reinterpret_cast(loader.load("glBufferData")); + flextglBufferSubData = reinterpret_cast(loader.load("glBufferSubData")); + flextglCheckFramebufferStatus = reinterpret_cast(loader.load("glCheckFramebufferStatus")); + flextglClearDepthf = reinterpret_cast(loader.load("glClearDepthf")); + flextglCompileShader = reinterpret_cast(loader.load("glCompileShader")); + flextglCompressedTexImage2D = reinterpret_cast(loader.load("glCompressedTexImage2D")); + flextglCompressedTexSubImage2D = reinterpret_cast(loader.load("glCompressedTexSubImage2D")); + flextglCreateProgram = reinterpret_cast(loader.load("glCreateProgram")); + flextglCreateShader = reinterpret_cast(loader.load("glCreateShader")); + flextglDeleteBuffers = reinterpret_cast(loader.load("glDeleteBuffers")); + flextglDeleteFramebuffers = reinterpret_cast(loader.load("glDeleteFramebuffers")); + flextglDeleteProgram = reinterpret_cast(loader.load("glDeleteProgram")); + flextglDeleteRenderbuffers = reinterpret_cast(loader.load("glDeleteRenderbuffers")); + flextglDeleteShader = reinterpret_cast(loader.load("glDeleteShader")); + flextglDepthRangef = reinterpret_cast(loader.load("glDepthRangef")); + flextglDetachShader = reinterpret_cast(loader.load("glDetachShader")); + flextglDisableVertexAttribArray = reinterpret_cast(loader.load("glDisableVertexAttribArray")); + flextglEnableVertexAttribArray = reinterpret_cast(loader.load("glEnableVertexAttribArray")); + flextglFramebufferRenderbuffer = reinterpret_cast(loader.load("glFramebufferRenderbuffer")); + flextglFramebufferTexture2D = reinterpret_cast(loader.load("glFramebufferTexture2D")); + flextglGenBuffers = reinterpret_cast(loader.load("glGenBuffers")); + flextglGenFramebuffers = reinterpret_cast(loader.load("glGenFramebuffers")); + flextglGenRenderbuffers = reinterpret_cast(loader.load("glGenRenderbuffers")); + flextglGenerateMipmap = reinterpret_cast(loader.load("glGenerateMipmap")); + flextglGetActiveAttrib = reinterpret_cast(loader.load("glGetActiveAttrib")); + flextglGetActiveUniform = reinterpret_cast(loader.load("glGetActiveUniform")); + flextglGetAttachedShaders = reinterpret_cast(loader.load("glGetAttachedShaders")); + flextglGetAttribLocation = reinterpret_cast(loader.load("glGetAttribLocation")); + flextglGetBufferParameteriv = reinterpret_cast(loader.load("glGetBufferParameteriv")); + flextglGetFramebufferAttachmentParameteriv = reinterpret_cast(loader.load("glGetFramebufferAttachmentParameteriv")); + flextglGetProgramInfoLog = reinterpret_cast(loader.load("glGetProgramInfoLog")); + flextglGetProgramiv = reinterpret_cast(loader.load("glGetProgramiv")); + flextglGetRenderbufferParameteriv = reinterpret_cast(loader.load("glGetRenderbufferParameteriv")); + flextglGetShaderInfoLog = reinterpret_cast(loader.load("glGetShaderInfoLog")); + flextglGetShaderPrecisionFormat = reinterpret_cast(loader.load("glGetShaderPrecisionFormat")); + flextglGetShaderSource = reinterpret_cast(loader.load("glGetShaderSource")); + flextglGetShaderiv = reinterpret_cast(loader.load("glGetShaderiv")); + flextglGetUniformLocation = reinterpret_cast(loader.load("glGetUniformLocation")); + flextglGetUniformfv = reinterpret_cast(loader.load("glGetUniformfv")); + flextglGetUniformiv = reinterpret_cast(loader.load("glGetUniformiv")); + flextglGetVertexAttribPointerv = reinterpret_cast(loader.load("glGetVertexAttribPointerv")); + flextglGetVertexAttribfv = reinterpret_cast(loader.load("glGetVertexAttribfv")); + flextglGetVertexAttribiv = reinterpret_cast(loader.load("glGetVertexAttribiv")); + flextglIsBuffer = reinterpret_cast(loader.load("glIsBuffer")); + flextglIsFramebuffer = reinterpret_cast(loader.load("glIsFramebuffer")); + flextglIsProgram = reinterpret_cast(loader.load("glIsProgram")); + flextglIsRenderbuffer = reinterpret_cast(loader.load("glIsRenderbuffer")); + flextglIsShader = reinterpret_cast(loader.load("glIsShader")); + flextglLinkProgram = reinterpret_cast(loader.load("glLinkProgram")); + flextglReleaseShaderCompiler = reinterpret_cast(loader.load("glReleaseShaderCompiler")); + flextglRenderbufferStorage = reinterpret_cast(loader.load("glRenderbufferStorage")); + flextglSampleCoverage = reinterpret_cast(loader.load("glSampleCoverage")); + flextglShaderBinary = reinterpret_cast(loader.load("glShaderBinary")); + flextglShaderSource = reinterpret_cast(loader.load("glShaderSource")); + flextglStencilFuncSeparate = reinterpret_cast(loader.load("glStencilFuncSeparate")); + flextglStencilMaskSeparate = reinterpret_cast(loader.load("glStencilMaskSeparate")); + flextglStencilOpSeparate = reinterpret_cast(loader.load("glStencilOpSeparate")); + flextglUniform1f = reinterpret_cast(loader.load("glUniform1f")); + flextglUniform1fv = reinterpret_cast(loader.load("glUniform1fv")); + flextglUniform1i = reinterpret_cast(loader.load("glUniform1i")); + flextglUniform1iv = reinterpret_cast(loader.load("glUniform1iv")); + flextglUniform2f = reinterpret_cast(loader.load("glUniform2f")); + flextglUniform2fv = reinterpret_cast(loader.load("glUniform2fv")); + flextglUniform2i = reinterpret_cast(loader.load("glUniform2i")); + flextglUniform2iv = reinterpret_cast(loader.load("glUniform2iv")); + flextglUniform3f = reinterpret_cast(loader.load("glUniform3f")); + flextglUniform3fv = reinterpret_cast(loader.load("glUniform3fv")); + flextglUniform3i = reinterpret_cast(loader.load("glUniform3i")); + flextglUniform3iv = reinterpret_cast(loader.load("glUniform3iv")); + flextglUniform4f = reinterpret_cast(loader.load("glUniform4f")); + flextglUniform4fv = reinterpret_cast(loader.load("glUniform4fv")); + flextglUniform4i = reinterpret_cast(loader.load("glUniform4i")); + flextglUniform4iv = reinterpret_cast(loader.load("glUniform4iv")); + flextglUniformMatrix2fv = reinterpret_cast(loader.load("glUniformMatrix2fv")); + flextglUniformMatrix3fv = reinterpret_cast(loader.load("glUniformMatrix3fv")); + flextglUniformMatrix4fv = reinterpret_cast(loader.load("glUniformMatrix4fv")); + flextglUseProgram = reinterpret_cast(loader.load("glUseProgram")); + flextglValidateProgram = reinterpret_cast(loader.load("glValidateProgram")); + flextglVertexAttrib1f = reinterpret_cast(loader.load("glVertexAttrib1f")); + flextglVertexAttrib1fv = reinterpret_cast(loader.load("glVertexAttrib1fv")); + flextglVertexAttrib2f = reinterpret_cast(loader.load("glVertexAttrib2f")); + flextglVertexAttrib2fv = reinterpret_cast(loader.load("glVertexAttrib2fv")); + flextglVertexAttrib3f = reinterpret_cast(loader.load("glVertexAttrib3f")); + flextglVertexAttrib3fv = reinterpret_cast(loader.load("glVertexAttrib3fv")); + flextglVertexAttrib4f = reinterpret_cast(loader.load("glVertexAttrib4f")); + flextglVertexAttrib4fv = reinterpret_cast(loader.load("glVertexAttrib4fv")); + flextglVertexAttribPointer = reinterpret_cast(loader.load("glVertexAttribPointer")); + + /* GL_ES_VERSION_3_0 */ + flextglBeginQuery = reinterpret_cast(loader.load("glBeginQuery")); + flextglBeginTransformFeedback = reinterpret_cast(loader.load("glBeginTransformFeedback")); + flextglBindBufferBase = reinterpret_cast(loader.load("glBindBufferBase")); + flextglBindBufferRange = reinterpret_cast(loader.load("glBindBufferRange")); + flextglBindSampler = reinterpret_cast(loader.load("glBindSampler")); + flextglBindTransformFeedback = reinterpret_cast(loader.load("glBindTransformFeedback")); + flextglBindVertexArray = reinterpret_cast(loader.load("glBindVertexArray")); + flextglBlitFramebuffer = reinterpret_cast(loader.load("glBlitFramebuffer")); + flextglClearBufferfi = reinterpret_cast(loader.load("glClearBufferfi")); + flextglClearBufferfv = reinterpret_cast(loader.load("glClearBufferfv")); + flextglClearBufferiv = reinterpret_cast(loader.load("glClearBufferiv")); + flextglClearBufferuiv = reinterpret_cast(loader.load("glClearBufferuiv")); + flextglClientWaitSync = reinterpret_cast(loader.load("glClientWaitSync")); + flextglCompressedTexImage3D = reinterpret_cast(loader.load("glCompressedTexImage3D")); + flextglCompressedTexSubImage3D = reinterpret_cast(loader.load("glCompressedTexSubImage3D")); + flextglCopyBufferSubData = reinterpret_cast(loader.load("glCopyBufferSubData")); + flextglCopyTexSubImage3D = reinterpret_cast(loader.load("glCopyTexSubImage3D")); + flextglDeleteQueries = reinterpret_cast(loader.load("glDeleteQueries")); + flextglDeleteSamplers = reinterpret_cast(loader.load("glDeleteSamplers")); + flextglDeleteSync = reinterpret_cast(loader.load("glDeleteSync")); + flextglDeleteTransformFeedbacks = reinterpret_cast(loader.load("glDeleteTransformFeedbacks")); + flextglDeleteVertexArrays = reinterpret_cast(loader.load("glDeleteVertexArrays")); + flextglDrawArraysInstanced = reinterpret_cast(loader.load("glDrawArraysInstanced")); + flextglDrawBuffers = reinterpret_cast(loader.load("glDrawBuffers")); + flextglDrawElementsInstanced = reinterpret_cast(loader.load("glDrawElementsInstanced")); + flextglDrawRangeElements = reinterpret_cast(loader.load("glDrawRangeElements")); + flextglEndQuery = reinterpret_cast(loader.load("glEndQuery")); + flextglEndTransformFeedback = reinterpret_cast(loader.load("glEndTransformFeedback")); + flextglFenceSync = reinterpret_cast(loader.load("glFenceSync")); + flextglFlushMappedBufferRange = reinterpret_cast(loader.load("glFlushMappedBufferRange")); + flextglFramebufferTextureLayer = reinterpret_cast(loader.load("glFramebufferTextureLayer")); + flextglGenQueries = reinterpret_cast(loader.load("glGenQueries")); + flextglGenSamplers = reinterpret_cast(loader.load("glGenSamplers")); + flextglGenTransformFeedbacks = reinterpret_cast(loader.load("glGenTransformFeedbacks")); + flextglGenVertexArrays = reinterpret_cast(loader.load("glGenVertexArrays")); + flextglGetActiveUniformBlockName = reinterpret_cast(loader.load("glGetActiveUniformBlockName")); + flextglGetActiveUniformBlockiv = reinterpret_cast(loader.load("glGetActiveUniformBlockiv")); + flextglGetActiveUniformsiv = reinterpret_cast(loader.load("glGetActiveUniformsiv")); + flextglGetBufferParameteri64v = reinterpret_cast(loader.load("glGetBufferParameteri64v")); + flextglGetBufferPointerv = reinterpret_cast(loader.load("glGetBufferPointerv")); + flextglGetFragDataLocation = reinterpret_cast(loader.load("glGetFragDataLocation")); + flextglGetInteger64i_v = reinterpret_cast(loader.load("glGetInteger64i_v")); + flextglGetInteger64v = reinterpret_cast(loader.load("glGetInteger64v")); + flextglGetIntegeri_v = reinterpret_cast(loader.load("glGetIntegeri_v")); + flextglGetInternalformativ = reinterpret_cast(loader.load("glGetInternalformativ")); + flextglGetProgramBinary = reinterpret_cast(loader.load("glGetProgramBinary")); + flextglGetQueryObjectuiv = reinterpret_cast(loader.load("glGetQueryObjectuiv")); + flextglGetQueryiv = reinterpret_cast(loader.load("glGetQueryiv")); + flextglGetSamplerParameterfv = reinterpret_cast(loader.load("glGetSamplerParameterfv")); + flextglGetSamplerParameteriv = reinterpret_cast(loader.load("glGetSamplerParameteriv")); + flextglGetStringi = reinterpret_cast(loader.load("glGetStringi")); + flextglGetSynciv = reinterpret_cast(loader.load("glGetSynciv")); + flextglGetTransformFeedbackVarying = reinterpret_cast(loader.load("glGetTransformFeedbackVarying")); + flextglGetUniformBlockIndex = reinterpret_cast(loader.load("glGetUniformBlockIndex")); + flextglGetUniformIndices = reinterpret_cast(loader.load("glGetUniformIndices")); + flextglGetUniformuiv = reinterpret_cast(loader.load("glGetUniformuiv")); + flextglGetVertexAttribIiv = reinterpret_cast(loader.load("glGetVertexAttribIiv")); + flextglGetVertexAttribIuiv = reinterpret_cast(loader.load("glGetVertexAttribIuiv")); + flextglInvalidateFramebuffer = reinterpret_cast(loader.load("glInvalidateFramebuffer")); + flextglInvalidateSubFramebuffer = reinterpret_cast(loader.load("glInvalidateSubFramebuffer")); + flextglIsQuery = reinterpret_cast(loader.load("glIsQuery")); + flextglIsSampler = reinterpret_cast(loader.load("glIsSampler")); + flextglIsSync = reinterpret_cast(loader.load("glIsSync")); + flextglIsTransformFeedback = reinterpret_cast(loader.load("glIsTransformFeedback")); + flextglIsVertexArray = reinterpret_cast(loader.load("glIsVertexArray")); + flextglMapBufferRange = reinterpret_cast(loader.load("glMapBufferRange")); + flextglPauseTransformFeedback = reinterpret_cast(loader.load("glPauseTransformFeedback")); + flextglProgramBinary = reinterpret_cast(loader.load("glProgramBinary")); + flextglProgramParameteri = reinterpret_cast(loader.load("glProgramParameteri")); + flextglRenderbufferStorageMultisample = reinterpret_cast(loader.load("glRenderbufferStorageMultisample")); + flextglResumeTransformFeedback = reinterpret_cast(loader.load("glResumeTransformFeedback")); + flextglSamplerParameterf = reinterpret_cast(loader.load("glSamplerParameterf")); + flextglSamplerParameterfv = reinterpret_cast(loader.load("glSamplerParameterfv")); + flextglSamplerParameteri = reinterpret_cast(loader.load("glSamplerParameteri")); + flextglSamplerParameteriv = reinterpret_cast(loader.load("glSamplerParameteriv")); + flextglTexImage3D = reinterpret_cast(loader.load("glTexImage3D")); + flextglTexStorage2D = reinterpret_cast(loader.load("glTexStorage2D")); + flextglTexStorage3D = reinterpret_cast(loader.load("glTexStorage3D")); + flextglTexSubImage3D = reinterpret_cast(loader.load("glTexSubImage3D")); + flextglTransformFeedbackVaryings = reinterpret_cast(loader.load("glTransformFeedbackVaryings")); + flextglUniform1ui = reinterpret_cast(loader.load("glUniform1ui")); + flextglUniform1uiv = reinterpret_cast(loader.load("glUniform1uiv")); + flextglUniform2ui = reinterpret_cast(loader.load("glUniform2ui")); + flextglUniform2uiv = reinterpret_cast(loader.load("glUniform2uiv")); + flextglUniform3ui = reinterpret_cast(loader.load("glUniform3ui")); + flextglUniform3uiv = reinterpret_cast(loader.load("glUniform3uiv")); + flextglUniform4ui = reinterpret_cast(loader.load("glUniform4ui")); + flextglUniform4uiv = reinterpret_cast(loader.load("glUniform4uiv")); + flextglUniformBlockBinding = reinterpret_cast(loader.load("glUniformBlockBinding")); + flextglUniformMatrix2x3fv = reinterpret_cast(loader.load("glUniformMatrix2x3fv")); + flextglUniformMatrix2x4fv = reinterpret_cast(loader.load("glUniformMatrix2x4fv")); + flextglUniformMatrix3x2fv = reinterpret_cast(loader.load("glUniformMatrix3x2fv")); + flextglUniformMatrix3x4fv = reinterpret_cast(loader.load("glUniformMatrix3x4fv")); + flextglUniformMatrix4x2fv = reinterpret_cast(loader.load("glUniformMatrix4x2fv")); + flextglUniformMatrix4x3fv = reinterpret_cast(loader.load("glUniformMatrix4x3fv")); + flextglUnmapBuffer = reinterpret_cast(loader.load("glUnmapBuffer")); + flextglVertexAttribDivisor = reinterpret_cast(loader.load("glVertexAttribDivisor")); + flextglVertexAttribI4i = reinterpret_cast(loader.load("glVertexAttribI4i")); + flextglVertexAttribI4iv = reinterpret_cast(loader.load("glVertexAttribI4iv")); + flextglVertexAttribI4ui = reinterpret_cast(loader.load("glVertexAttribI4ui")); + flextglVertexAttribI4uiv = reinterpret_cast(loader.load("glVertexAttribI4uiv")); + flextglVertexAttribIPointer = reinterpret_cast(loader.load("glVertexAttribIPointer")); + flextglWaitSync = reinterpret_cast(loader.load("glWaitSync")); + + /* GL_ES_VERSION_3_1 */ + flextglActiveShaderProgram = reinterpret_cast(loader.load("glActiveShaderProgram")); + flextglBindImageTexture = reinterpret_cast(loader.load("glBindImageTexture")); + flextglBindProgramPipeline = reinterpret_cast(loader.load("glBindProgramPipeline")); + flextglBindVertexBuffer = reinterpret_cast(loader.load("glBindVertexBuffer")); + flextglCreateShaderProgramv = reinterpret_cast(loader.load("glCreateShaderProgramv")); + flextglDeleteProgramPipelines = reinterpret_cast(loader.load("glDeleteProgramPipelines")); + flextglDispatchCompute = reinterpret_cast(loader.load("glDispatchCompute")); + flextglDispatchComputeIndirect = reinterpret_cast(loader.load("glDispatchComputeIndirect")); + flextglDrawArraysIndirect = reinterpret_cast(loader.load("glDrawArraysIndirect")); + flextglDrawElementsIndirect = reinterpret_cast(loader.load("glDrawElementsIndirect")); + flextglFramebufferParameteri = reinterpret_cast(loader.load("glFramebufferParameteri")); + flextglGenProgramPipelines = reinterpret_cast(loader.load("glGenProgramPipelines")); + flextglGetBooleani_v = reinterpret_cast(loader.load("glGetBooleani_v")); + flextglGetFramebufferParameteriv = reinterpret_cast(loader.load("glGetFramebufferParameteriv")); + flextglGetMultisamplefv = reinterpret_cast(loader.load("glGetMultisamplefv")); + flextglGetProgramInterfaceiv = reinterpret_cast(loader.load("glGetProgramInterfaceiv")); + flextglGetProgramPipelineInfoLog = reinterpret_cast(loader.load("glGetProgramPipelineInfoLog")); + flextglGetProgramPipelineiv = reinterpret_cast(loader.load("glGetProgramPipelineiv")); + flextglGetProgramResourceIndex = reinterpret_cast(loader.load("glGetProgramResourceIndex")); + flextglGetProgramResourceLocation = reinterpret_cast(loader.load("glGetProgramResourceLocation")); + flextglGetProgramResourceName = reinterpret_cast(loader.load("glGetProgramResourceName")); + flextglGetProgramResourceiv = reinterpret_cast(loader.load("glGetProgramResourceiv")); + flextglIsProgramPipeline = reinterpret_cast(loader.load("glIsProgramPipeline")); + flextglMemoryBarrier = reinterpret_cast(loader.load("glMemoryBarrier")); + flextglMemoryBarrierByRegion = reinterpret_cast(loader.load("glMemoryBarrierByRegion")); + flextglProgramUniform1f = reinterpret_cast(loader.load("glProgramUniform1f")); + flextglProgramUniform1fv = reinterpret_cast(loader.load("glProgramUniform1fv")); + flextglProgramUniform1i = reinterpret_cast(loader.load("glProgramUniform1i")); + flextglProgramUniform1iv = reinterpret_cast(loader.load("glProgramUniform1iv")); + flextglProgramUniform1ui = reinterpret_cast(loader.load("glProgramUniform1ui")); + flextglProgramUniform1uiv = reinterpret_cast(loader.load("glProgramUniform1uiv")); + flextglProgramUniform2f = reinterpret_cast(loader.load("glProgramUniform2f")); + flextglProgramUniform2fv = reinterpret_cast(loader.load("glProgramUniform2fv")); + flextglProgramUniform2i = reinterpret_cast(loader.load("glProgramUniform2i")); + flextglProgramUniform2iv = reinterpret_cast(loader.load("glProgramUniform2iv")); + flextglProgramUniform2ui = reinterpret_cast(loader.load("glProgramUniform2ui")); + flextglProgramUniform2uiv = reinterpret_cast(loader.load("glProgramUniform2uiv")); + flextglProgramUniform3f = reinterpret_cast(loader.load("glProgramUniform3f")); + flextglProgramUniform3fv = reinterpret_cast(loader.load("glProgramUniform3fv")); + flextglProgramUniform3i = reinterpret_cast(loader.load("glProgramUniform3i")); + flextglProgramUniform3iv = reinterpret_cast(loader.load("glProgramUniform3iv")); + flextglProgramUniform3ui = reinterpret_cast(loader.load("glProgramUniform3ui")); + flextglProgramUniform3uiv = reinterpret_cast(loader.load("glProgramUniform3uiv")); + flextglProgramUniform4f = reinterpret_cast(loader.load("glProgramUniform4f")); + flextglProgramUniform4fv = reinterpret_cast(loader.load("glProgramUniform4fv")); + flextglProgramUniform4i = reinterpret_cast(loader.load("glProgramUniform4i")); + flextglProgramUniform4iv = reinterpret_cast(loader.load("glProgramUniform4iv")); + flextglProgramUniform4ui = reinterpret_cast(loader.load("glProgramUniform4ui")); + flextglProgramUniform4uiv = reinterpret_cast(loader.load("glProgramUniform4uiv")); + flextglProgramUniformMatrix2fv = reinterpret_cast(loader.load("glProgramUniformMatrix2fv")); + flextglProgramUniformMatrix2x3fv = reinterpret_cast(loader.load("glProgramUniformMatrix2x3fv")); + flextglProgramUniformMatrix2x4fv = reinterpret_cast(loader.load("glProgramUniformMatrix2x4fv")); + flextglProgramUniformMatrix3fv = reinterpret_cast(loader.load("glProgramUniformMatrix3fv")); + flextglProgramUniformMatrix3x2fv = reinterpret_cast(loader.load("glProgramUniformMatrix3x2fv")); + flextglProgramUniformMatrix3x4fv = reinterpret_cast(loader.load("glProgramUniformMatrix3x4fv")); + flextglProgramUniformMatrix4fv = reinterpret_cast(loader.load("glProgramUniformMatrix4fv")); + flextglProgramUniformMatrix4x2fv = reinterpret_cast(loader.load("glProgramUniformMatrix4x2fv")); + flextglProgramUniformMatrix4x3fv = reinterpret_cast(loader.load("glProgramUniformMatrix4x3fv")); + flextglSampleMaski = reinterpret_cast(loader.load("glSampleMaski")); + flextglTexStorage2DMultisample = reinterpret_cast(loader.load("glTexStorage2DMultisample")); + flextglUseProgramStages = reinterpret_cast(loader.load("glUseProgramStages")); + flextglValidateProgramPipeline = reinterpret_cast(loader.load("glValidateProgramPipeline")); + flextglVertexAttribBinding = reinterpret_cast(loader.load("glVertexAttribBinding")); + flextglVertexAttribFormat = reinterpret_cast(loader.load("glVertexAttribFormat")); + flextglVertexAttribIFormat = reinterpret_cast(loader.load("glVertexAttribIFormat")); + flextglVertexBindingDivisor = reinterpret_cast(loader.load("glVertexBindingDivisor")); + + /* GL_EXT_copy_image */ + flextglCopyImageSubDataEXT = reinterpret_cast(loader.load("glCopyImageSubDataEXT")); + + /* GL_EXT_debug_label */ + flextglGetObjectLabelEXT = reinterpret_cast(loader.load("glGetObjectLabelEXT")); + flextglLabelObjectEXT = reinterpret_cast(loader.load("glLabelObjectEXT")); + + /* GL_EXT_debug_marker */ + flextglInsertEventMarkerEXT = reinterpret_cast(loader.load("glInsertEventMarkerEXT")); + flextglPopGroupMarkerEXT = reinterpret_cast(loader.load("glPopGroupMarkerEXT")); + flextglPushGroupMarkerEXT = reinterpret_cast(loader.load("glPushGroupMarkerEXT")); + + /* GL_EXT_disjoint_timer_query */ + flextglBeginQueryEXT = reinterpret_cast(loader.load("glBeginQueryEXT")); + flextglDeleteQueriesEXT = reinterpret_cast(loader.load("glDeleteQueriesEXT")); + flextglEndQueryEXT = reinterpret_cast(loader.load("glEndQueryEXT")); + flextglGenQueriesEXT = reinterpret_cast(loader.load("glGenQueriesEXT")); + flextglGetQueryObjecti64vEXT = reinterpret_cast(loader.load("glGetQueryObjecti64vEXT")); + flextglGetQueryObjectivEXT = reinterpret_cast(loader.load("glGetQueryObjectivEXT")); + flextglGetQueryObjectui64vEXT = reinterpret_cast(loader.load("glGetQueryObjectui64vEXT")); + flextglGetQueryObjectuivEXT = reinterpret_cast(loader.load("glGetQueryObjectuivEXT")); + flextglGetQueryivEXT = reinterpret_cast(loader.load("glGetQueryivEXT")); + flextglIsQueryEXT = reinterpret_cast(loader.load("glIsQueryEXT")); + flextglQueryCounterEXT = reinterpret_cast(loader.load("glQueryCounterEXT")); + + /* GL_EXT_draw_buffers_indexed */ + flextglBlendEquationSeparateiEXT = reinterpret_cast(loader.load("glBlendEquationSeparateiEXT")); + flextglBlendEquationiEXT = reinterpret_cast(loader.load("glBlendEquationiEXT")); + flextglBlendFuncSeparateiEXT = reinterpret_cast(loader.load("glBlendFuncSeparateiEXT")); + flextglBlendFunciEXT = reinterpret_cast(loader.load("glBlendFunciEXT")); + flextglColorMaskiEXT = reinterpret_cast(loader.load("glColorMaskiEXT")); + flextglDisableiEXT = reinterpret_cast(loader.load("glDisableiEXT")); + flextglEnableiEXT = reinterpret_cast(loader.load("glEnableiEXT")); + flextglIsEnablediEXT = reinterpret_cast(loader.load("glIsEnablediEXT")); + + /* GL_EXT_geometry_shader */ + flextglFramebufferTextureEXT = reinterpret_cast(loader.load("glFramebufferTextureEXT")); + + /* GL_EXT_multi_draw_arrays */ + flextglMultiDrawArraysEXT = reinterpret_cast(loader.load("glMultiDrawArraysEXT")); + flextglMultiDrawElementsEXT = reinterpret_cast(loader.load("glMultiDrawElementsEXT")); + + /* GL_EXT_multisampled_render_to_texture */ + flextglFramebufferTexture2DMultisampleEXT = reinterpret_cast(loader.load("glFramebufferTexture2DMultisampleEXT")); + flextglRenderbufferStorageMultisampleEXT = reinterpret_cast(loader.load("glRenderbufferStorageMultisampleEXT")); + + /* GL_EXT_primitive_bounding_box */ + flextglPrimitiveBoundingBoxEXT = reinterpret_cast(loader.load("glPrimitiveBoundingBoxEXT")); + + /* GL_EXT_robustness */ + flextglGetGraphicsResetStatusEXT = reinterpret_cast(loader.load("glGetGraphicsResetStatusEXT")); + flextglGetnUniformfvEXT = reinterpret_cast(loader.load("glGetnUniformfvEXT")); + flextglGetnUniformivEXT = reinterpret_cast(loader.load("glGetnUniformivEXT")); + flextglReadnPixelsEXT = reinterpret_cast(loader.load("glReadnPixelsEXT")); + + /* GL_EXT_separate_shader_objects */ + flextglActiveShaderProgramEXT = reinterpret_cast(loader.load("glActiveShaderProgramEXT")); + flextglBindProgramPipelineEXT = reinterpret_cast(loader.load("glBindProgramPipelineEXT")); + flextglCreateShaderProgramvEXT = reinterpret_cast(loader.load("glCreateShaderProgramvEXT")); + flextglDeleteProgramPipelinesEXT = reinterpret_cast(loader.load("glDeleteProgramPipelinesEXT")); + flextglGenProgramPipelinesEXT = reinterpret_cast(loader.load("glGenProgramPipelinesEXT")); + flextglGetProgramPipelineInfoLogEXT = reinterpret_cast(loader.load("glGetProgramPipelineInfoLogEXT")); + flextglGetProgramPipelineivEXT = reinterpret_cast(loader.load("glGetProgramPipelineivEXT")); + flextglIsProgramPipelineEXT = reinterpret_cast(loader.load("glIsProgramPipelineEXT")); + flextglProgramParameteriEXT = reinterpret_cast(loader.load("glProgramParameteriEXT")); + flextglProgramUniform1fEXT = reinterpret_cast(loader.load("glProgramUniform1fEXT")); + flextglProgramUniform1fvEXT = reinterpret_cast(loader.load("glProgramUniform1fvEXT")); + flextglProgramUniform1iEXT = reinterpret_cast(loader.load("glProgramUniform1iEXT")); + flextglProgramUniform1ivEXT = reinterpret_cast(loader.load("glProgramUniform1ivEXT")); + flextglProgramUniform1uiEXT = reinterpret_cast(loader.load("glProgramUniform1uiEXT")); + flextglProgramUniform1uivEXT = reinterpret_cast(loader.load("glProgramUniform1uivEXT")); + flextglProgramUniform2fEXT = reinterpret_cast(loader.load("glProgramUniform2fEXT")); + flextglProgramUniform2fvEXT = reinterpret_cast(loader.load("glProgramUniform2fvEXT")); + flextglProgramUniform2iEXT = reinterpret_cast(loader.load("glProgramUniform2iEXT")); + flextglProgramUniform2ivEXT = reinterpret_cast(loader.load("glProgramUniform2ivEXT")); + flextglProgramUniform2uiEXT = reinterpret_cast(loader.load("glProgramUniform2uiEXT")); + flextglProgramUniform2uivEXT = reinterpret_cast(loader.load("glProgramUniform2uivEXT")); + flextglProgramUniform3fEXT = reinterpret_cast(loader.load("glProgramUniform3fEXT")); + flextglProgramUniform3fvEXT = reinterpret_cast(loader.load("glProgramUniform3fvEXT")); + flextglProgramUniform3iEXT = reinterpret_cast(loader.load("glProgramUniform3iEXT")); + flextglProgramUniform3ivEXT = reinterpret_cast(loader.load("glProgramUniform3ivEXT")); + flextglProgramUniform3uiEXT = reinterpret_cast(loader.load("glProgramUniform3uiEXT")); + flextglProgramUniform3uivEXT = reinterpret_cast(loader.load("glProgramUniform3uivEXT")); + flextglProgramUniform4fEXT = reinterpret_cast(loader.load("glProgramUniform4fEXT")); + flextglProgramUniform4fvEXT = reinterpret_cast(loader.load("glProgramUniform4fvEXT")); + flextglProgramUniform4iEXT = reinterpret_cast(loader.load("glProgramUniform4iEXT")); + flextglProgramUniform4ivEXT = reinterpret_cast(loader.load("glProgramUniform4ivEXT")); + flextglProgramUniform4uiEXT = reinterpret_cast(loader.load("glProgramUniform4uiEXT")); + flextglProgramUniform4uivEXT = reinterpret_cast(loader.load("glProgramUniform4uivEXT")); + flextglProgramUniformMatrix2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2fvEXT")); + flextglProgramUniformMatrix2x3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2x3fvEXT")); + flextglProgramUniformMatrix2x4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix2x4fvEXT")); + flextglProgramUniformMatrix3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3fvEXT")); + flextglProgramUniformMatrix3x2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3x2fvEXT")); + flextglProgramUniformMatrix3x4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix3x4fvEXT")); + flextglProgramUniformMatrix4fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4fvEXT")); + flextglProgramUniformMatrix4x2fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4x2fvEXT")); + flextglProgramUniformMatrix4x3fvEXT = reinterpret_cast(loader.load("glProgramUniformMatrix4x3fvEXT")); + flextglUseProgramStagesEXT = reinterpret_cast(loader.load("glUseProgramStagesEXT")); + flextglValidateProgramPipelineEXT = reinterpret_cast(loader.load("glValidateProgramPipelineEXT")); + + /* GL_EXT_tessellation_shader */ + flextglPatchParameteriEXT = reinterpret_cast(loader.load("glPatchParameteriEXT")); + + /* GL_EXT_texture_border_clamp */ + flextglGetSamplerParameterIivEXT = reinterpret_cast(loader.load("glGetSamplerParameterIivEXT")); + flextglGetSamplerParameterIuivEXT = reinterpret_cast(loader.load("glGetSamplerParameterIuivEXT")); + flextglGetTexParameterIivEXT = reinterpret_cast(loader.load("glGetTexParameterIivEXT")); + flextglGetTexParameterIuivEXT = reinterpret_cast(loader.load("glGetTexParameterIuivEXT")); + flextglSamplerParameterIivEXT = reinterpret_cast(loader.load("glSamplerParameterIivEXT")); + flextglSamplerParameterIuivEXT = reinterpret_cast(loader.load("glSamplerParameterIuivEXT")); + flextglTexParameterIivEXT = reinterpret_cast(loader.load("glTexParameterIivEXT")); + flextglTexParameterIuivEXT = reinterpret_cast(loader.load("glTexParameterIuivEXT")); + + /* GL_EXT_texture_buffer */ + flextglTexBufferEXT = reinterpret_cast(loader.load("glTexBufferEXT")); + flextglTexBufferRangeEXT = reinterpret_cast(loader.load("glTexBufferRangeEXT")); + + /* GL_KHR_blend_equation_advanced */ + flextglBlendBarrierKHR = reinterpret_cast(loader.load("glBlendBarrierKHR")); + + /* GL_KHR_debug */ + flextglDebugMessageCallbackKHR = reinterpret_cast(loader.load("glDebugMessageCallbackKHR")); + flextglDebugMessageControlKHR = reinterpret_cast(loader.load("glDebugMessageControlKHR")); + flextglDebugMessageInsertKHR = reinterpret_cast(loader.load("glDebugMessageInsertKHR")); + flextglGetDebugMessageLogKHR = reinterpret_cast(loader.load("glGetDebugMessageLogKHR")); + flextglGetObjectLabelKHR = reinterpret_cast(loader.load("glGetObjectLabelKHR")); + flextglGetObjectPtrLabelKHR = reinterpret_cast(loader.load("glGetObjectPtrLabelKHR")); + flextglGetPointervKHR = reinterpret_cast(loader.load("glGetPointervKHR")); + flextglObjectLabelKHR = reinterpret_cast(loader.load("glObjectLabelKHR")); + flextglObjectPtrLabelKHR = reinterpret_cast(loader.load("glObjectPtrLabelKHR")); + flextglPopDebugGroupKHR = reinterpret_cast(loader.load("glPopDebugGroupKHR")); + flextglPushDebugGroupKHR = reinterpret_cast(loader.load("glPushDebugGroupKHR")); + + /* GL_KHR_robustness */ + flextglGetGraphicsResetStatusKHR = reinterpret_cast(loader.load("glGetGraphicsResetStatusKHR")); + flextglGetnUniformfvKHR = reinterpret_cast(loader.load("glGetnUniformfvKHR")); + flextglGetnUniformivKHR = reinterpret_cast(loader.load("glGetnUniformivKHR")); + flextglGetnUniformuivKHR = reinterpret_cast(loader.load("glGetnUniformuivKHR")); + flextglReadnPixelsKHR = reinterpret_cast(loader.load("glReadnPixelsKHR")); + + /* GL_NV_polygon_mode */ + flextglPolygonModeNV = reinterpret_cast(loader.load("glPolygonModeNV")); + + /* GL_OES_mapbuffer */ + flextglGetBufferPointervOES = reinterpret_cast(loader.load("glGetBufferPointervOES")); + flextglMapBufferOES = reinterpret_cast(loader.load("glMapBufferOES")); + flextglUnmapBufferOES = reinterpret_cast(loader.load("glUnmapBufferOES")); + + /* GL_OES_sample_shading */ + flextglMinSampleShadingOES = reinterpret_cast(loader.load("glMinSampleShadingOES")); + + /* GL_OES_texture_storage_multisample_2d_array */ + flextglTexStorage3DMultisampleOES = reinterpret_cast(loader.load("glTexStorage3DMultisampleOES")); +} diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp.template b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp.template new file mode 100644 index 000000000..8af659565 --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp.template @@ -0,0 +1,23 @@ +@require(passthru, functions, enums, options, version, extensions) +#include "flextGLWindowsDesktop.h" + +#include +#include + +#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h" + +void flextGLInit() { + Magnum::Platform::Implementation::OpenGLFunctionLoader loader; + @for category,funcs in functions: + @if funcs: + + /* GL_@category */ + @for f in funcs: + @if f.name not in ['BlendFunc', 'Clear', 'ClearColor', 'ClearDepth', 'ClearStencil', 'ColorMask', 'CullFace', 'DepthFunc', 'DepthMask', 'DepthRange', 'Disable', 'DrawBuffer', 'Enable', 'Finish', 'Flush', 'FrontFace', 'GetBooleanv', 'GetDoublev', 'GetError', 'GetFloatv', 'GetIntegerv', 'GetString', 'GetTexImage', 'GetTexLevelParameterfv', 'GetTexLevelParameteriv', 'GetTexParameterfv', 'GetTexParameteriv', 'Hint', 'IsEnabled', 'LineWidth', 'LogicOp', 'PixelStoref', 'PixelStorei', 'PointSize', 'PolygonMode', 'ReadBuffer', 'ReadPixels', 'Scissor', 'StencilFunc', 'StencilMask', 'StencilOp', 'TexImage1D', 'TexImage2D', 'TexParameterf', 'TexParameterfv', 'TexParameteri', 'TexParameteriv', 'Viewport', 'BindTexture', 'CopyTexImage1D', 'CopyTexImage2D', 'CopyTexSubImage1D', 'CopyTexSubImage2D', 'DeleteTextures', 'DrawArrays', 'DrawElements', 'GenTextures', 'IsTexture', 'PolygonOffset', 'TexSubImage1D', 'TexSubImage2D']: + flextgl@f.name = reinterpret_cast<@f.returntype\ +(APIENTRY*)(@f.param_type_list_string())>(loader.load("gl@f.name")); + @end + @end + @end + @end +} diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.cpp b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.cpp new file mode 100644 index 000000000..cb3b19a22 --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.cpp @@ -0,0 +1,436 @@ +#include "flextGLWindowsDesktop.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* GL_ES_VERSION_2_0 */ +FLEXTGL_EXPORT void(APIENTRY *flextglActiveTexture)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglAttachShader)(GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindAttribLocation)(GLuint, GLuint, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindBuffer)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindFramebuffer)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindRenderbuffer)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendColor)(GLfloat, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquation)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationSeparate)(GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendFuncSeparate)(GLenum, GLenum, GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBufferData)(GLenum, GLsizeiptr, const void *, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBufferSubData)(GLenum, GLintptr, GLsizeiptr, const void *) = nullptr; +FLEXTGL_EXPORT GLenum(APIENTRY *flextglCheckFramebufferStatus)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglClearDepthf)(GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCompileShader)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexImage2D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void *) = nullptr; +FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateProgram)(void) = nullptr; +FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShader)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteBuffers)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteFramebuffers)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgram)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteRenderbuffers)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteShader)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDepthRangef)(GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDetachShader)(GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDisableVertexAttribArray)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglEnableVertexAttribArray)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferRenderbuffer)(GLenum, GLenum, GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture2D)(GLenum, GLenum, GLenum, GLuint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenBuffers)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenFramebuffers)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenRenderbuffers)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenerateMipmap)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveAttrib)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniform)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetAttachedShaders)(GLuint, GLsizei, GLsizei *, GLuint *) = nullptr; +FLEXTGL_EXPORT GLint(APIENTRY *flextglGetAttribLocation)(GLuint, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferParameteriv)(GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetFramebufferAttachmentParameteriv)(GLenum, GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramiv)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetRenderbufferParameteriv)(GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderPrecisionFormat)(GLenum, GLenum, GLint *, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderSource)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderiv)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT GLint(APIENTRY *flextglGetUniformLocation)(GLuint, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformfv)(GLuint, GLint, GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformiv)(GLuint, GLint, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribPointerv)(GLuint, GLenum, void **) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribfv)(GLuint, GLenum, GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribiv)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsBuffer)(GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsFramebuffer)(GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgram)(GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsRenderbuffer)(GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsShader)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglLinkProgram)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglReleaseShaderCompiler)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorage)(GLenum, GLenum, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglSampleCoverage)(GLfloat, GLboolean) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglShaderBinary)(GLsizei, const GLuint *, GLenum, const void *, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglShaderSource)(GLuint, GLsizei, const GLchar *const*, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglStencilFuncSeparate)(GLenum, GLenum, GLint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglStencilMaskSeparate)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglStencilOpSeparate)(GLenum, GLenum, GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform1f)(GLint, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform1fv)(GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform1i)(GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform1iv)(GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform2f)(GLint, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform2fv)(GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform2i)(GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform2iv)(GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform3f)(GLint, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform3fv)(GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform3i)(GLint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform3iv)(GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform4f)(GLint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform4fv)(GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform4i)(GLint, GLint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform4iv)(GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUseProgram)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgram)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1f)(GLuint, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1fv)(GLuint, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2f)(GLuint, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2fv)(GLuint, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3f)(GLuint, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3fv)(GLuint, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4f)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4fv)(GLuint, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, const void *) = nullptr; + +/* GL_ES_VERSION_3_0 */ +FLEXTGL_EXPORT void(APIENTRY *flextglBeginQuery)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBeginTransformFeedback)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindBufferBase)(GLenum, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindBufferRange)(GLenum, GLuint, GLuint, GLintptr, GLsizeiptr) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindSampler)(GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindTransformFeedback)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindVertexArray)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlitFramebuffer)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferfi)(GLenum, GLint, GLfloat, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferfv)(GLenum, GLint, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferiv)(GLenum, GLint, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferuiv)(GLenum, GLint, const GLuint *) = nullptr; +FLEXTGL_EXPORT GLenum(APIENTRY *flextglClientWaitSync)(GLsync, GLbitfield, GLuint64) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCopyBufferSubData)(GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteQueries)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteSamplers)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteSync)(GLsync) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteTransformFeedbacks)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteVertexArrays)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstanced)(GLenum, GLint, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDrawBuffers)(GLsizei, const GLenum *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstanced)(GLenum, GLsizei, GLenum, const void *, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDrawRangeElements)(GLenum, GLuint, GLuint, GLsizei, GLenum, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglEndQuery)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglEndTransformFeedback)(void) = nullptr; +FLEXTGL_EXPORT GLsync(APIENTRY *flextglFenceSync)(GLenum, GLbitfield) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglFlushMappedBufferRange)(GLenum, GLintptr, GLsizeiptr) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTextureLayer)(GLenum, GLenum, GLuint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenQueries)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenSamplers)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenTransformFeedbacks)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenVertexArrays)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniformBlockName)(GLuint, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniformBlockiv)(GLuint, GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniformsiv)(GLuint, GLsizei, const GLuint *, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferParameteri64v)(GLenum, GLenum, GLint64 *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferPointerv)(GLenum, GLenum, void **) = nullptr; +FLEXTGL_EXPORT GLint(APIENTRY *flextglGetFragDataLocation)(GLuint, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetInteger64i_v)(GLenum, GLuint, GLint64 *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetInteger64v)(GLenum, GLint64 *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetIntegeri_v)(GLenum, GLuint, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetInternalformativ)(GLenum, GLenum, GLenum, GLsizei, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramBinary)(GLuint, GLsizei, GLsizei *, GLenum *, void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectuiv)(GLuint, GLenum, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryiv)(GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterfv)(GLuint, GLenum, GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameteriv)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT const GLubyte *(APIENTRY *flextglGetStringi)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetSynciv)(GLsync, GLenum, GLsizei, GLsizei *, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetTransformFeedbackVarying)(GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *) = nullptr; +FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetUniformBlockIndex)(GLuint, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformIndices)(GLuint, GLsizei, const GLchar *const*, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformuiv)(GLuint, GLint, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribIiv)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribIuiv)(GLuint, GLenum, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglInvalidateFramebuffer)(GLenum, GLsizei, const GLenum *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglInvalidateSubFramebuffer)(GLenum, GLsizei, const GLenum *, GLint, GLint, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsQuery)(GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsSampler)(GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsSync)(GLsync) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsTransformFeedback)(GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsVertexArray)(GLuint) = nullptr; +FLEXTGL_EXPORT void *(APIENTRY *flextglMapBufferRange)(GLenum, GLintptr, GLsizeiptr, GLbitfield) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglPauseTransformFeedback)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramBinary)(GLuint, GLenum, const void *, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramParameteri)(GLuint, GLenum, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglResumeTransformFeedback)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterf)(GLuint, GLenum, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterfv)(GLuint, GLenum, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameteri)(GLuint, GLenum, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameteriv)(GLuint, GLenum, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexImage3D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage2D)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage3D)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTransformFeedbackVaryings)(GLuint, GLsizei, const GLchar *const*, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform1ui)(GLint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform1uiv)(GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform2ui)(GLint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform2uiv)(GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform3ui)(GLint, GLuint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform3uiv)(GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform4ui)(GLint, GLuint, GLuint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniform4uiv)(GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformBlockBinding)(GLuint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2x3fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2x4fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3x2fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3x4fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4x2fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4x3fv)(GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglUnmapBuffer)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribDivisor)(GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4i)(GLuint, GLint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4iv)(GLuint, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4ui)(GLuint, GLuint, GLuint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4uiv)(GLuint, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribIPointer)(GLuint, GLint, GLenum, GLsizei, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglWaitSync)(GLsync, GLbitfield, GLuint64) = nullptr; + +/* GL_ES_VERSION_3_1 */ +FLEXTGL_EXPORT void(APIENTRY *flextglActiveShaderProgram)(GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindImageTexture)(GLuint, GLuint, GLint, GLboolean, GLint, GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindProgramPipeline)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindVertexBuffer)(GLuint, GLuint, GLintptr, GLsizei) = nullptr; +FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShaderProgramv)(GLenum, GLsizei, const GLchar *const*) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgramPipelines)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDispatchCompute)(GLuint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDispatchComputeIndirect)(GLintptr) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysIndirect)(GLenum, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsIndirect)(GLenum, GLenum, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferParameteri)(GLenum, GLenum, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenProgramPipelines)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetBooleani_v)(GLenum, GLuint, GLboolean *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetFramebufferParameteriv)(GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetMultisamplefv)(GLenum, GLuint, GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramInterfaceiv)(GLuint, GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineiv)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetProgramResourceIndex)(GLuint, GLenum, const GLchar *) = nullptr; +FLEXTGL_EXPORT GLint(APIENTRY *flextglGetProgramResourceLocation)(GLuint, GLenum, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramResourceName)(GLuint, GLenum, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramResourceiv)(GLuint, GLenum, GLuint, GLsizei, const GLenum *, GLsizei, GLsizei *, GLint *) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgramPipeline)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglMemoryBarrier)(GLbitfield) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglMemoryBarrierByRegion)(GLbitfield) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1f)(GLuint, GLint, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fv)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1i)(GLuint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1iv)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1ui)(GLuint, GLint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uiv)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2f)(GLuint, GLint, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fv)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2i)(GLuint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2iv)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2ui)(GLuint, GLint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uiv)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3f)(GLuint, GLint, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fv)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3i)(GLuint, GLint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3iv)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3ui)(GLuint, GLint, GLuint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uiv)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4f)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fv)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4i)(GLuint, GLint, GLint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4iv)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4ui)(GLuint, GLint, GLuint, GLuint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uiv)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x3fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x4fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x2fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x4fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x2fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x3fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglSampleMaski)(GLuint, GLbitfield) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage2DMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUseProgramStages)(GLuint, GLbitfield, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgramPipeline)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribBinding)(GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribFormat)(GLuint, GLint, GLenum, GLboolean, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribIFormat)(GLuint, GLint, GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglVertexBindingDivisor)(GLuint, GLuint) = nullptr; + +/* GL_EXT_copy_image */ +FLEXTGL_EXPORT void(APIENTRY *flextglCopyImageSubDataEXT)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei) = nullptr; + +/* GL_EXT_debug_label */ +FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectLabelEXT)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglLabelObjectEXT)(GLenum, GLuint, GLsizei, const GLchar *) = nullptr; + +/* GL_EXT_debug_marker */ +FLEXTGL_EXPORT void(APIENTRY *flextglInsertEventMarkerEXT)(GLsizei, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglPopGroupMarkerEXT)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglPushGroupMarkerEXT)(GLsizei, const GLchar *) = nullptr; + +/* GL_EXT_disjoint_timer_query */ +FLEXTGL_EXPORT void(APIENTRY *flextglBeginQueryEXT)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteQueriesEXT)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglEndQueryEXT)(GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenQueriesEXT)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjecti64vEXT)(GLuint, GLenum, GLint64 *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectivEXT)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectui64vEXT)(GLuint, GLenum, GLuint64 *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectuivEXT)(GLuint, GLenum, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryivEXT)(GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsQueryEXT)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglQueryCounterEXT)(GLuint, GLenum) = nullptr; + +/* GL_EXT_draw_buffers_indexed */ +FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationSeparateiEXT)(GLuint, GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationiEXT)(GLuint, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendFuncSeparateiEXT)(GLuint, GLenum, GLenum, GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBlendFunciEXT)(GLuint, GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglColorMaskiEXT)(GLuint, GLboolean, GLboolean, GLboolean, GLboolean) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDisableiEXT)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglEnableiEXT)(GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsEnablediEXT)(GLenum, GLuint) = nullptr; + +/* GL_EXT_geometry_shader */ +FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTextureEXT)(GLenum, GLenum, GLuint, GLint) = nullptr; + +/* GL_EXT_multi_draw_arrays */ +FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawArraysEXT)(GLenum, const GLint *, const GLsizei *, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawElementsEXT)(GLenum, const GLsizei *, GLenum, const void *const*, GLsizei) = nullptr; + +/* GL_EXT_multisampled_render_to_texture */ +FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture2DMultisampleEXT)(GLenum, GLenum, GLenum, GLuint, GLint, GLsizei) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisampleEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = nullptr; + +/* GL_EXT_primitive_bounding_box */ +FLEXTGL_EXPORT void(APIENTRY *flextglPrimitiveBoundingBoxEXT)(GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr; + +/* GL_EXT_robustness */ +FLEXTGL_EXPORT GLenum(APIENTRY *flextglGetGraphicsResetStatusEXT)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformfvEXT)(GLuint, GLint, GLsizei, GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformivEXT)(GLuint, GLint, GLsizei, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglReadnPixelsEXT)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void *) = nullptr; + +/* GL_EXT_separate_shader_objects */ +FLEXTGL_EXPORT void(APIENTRY *flextglActiveShaderProgramEXT)(GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglBindProgramPipelineEXT)(GLuint) = nullptr; +FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShaderProgramvEXT)(GLenum, GLsizei, const GLchar **) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgramPipelinesEXT)(GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGenProgramPipelinesEXT)(GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineInfoLogEXT)(GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineivEXT)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgramPipelineEXT)(GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramParameteriEXT)(GLuint, GLenum, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fEXT)(GLuint, GLint, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1iEXT)(GLuint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uiEXT)(GLuint, GLint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fEXT)(GLuint, GLint, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2iEXT)(GLuint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uiEXT)(GLuint, GLint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3iEXT)(GLuint, GLint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uiEXT)(GLuint, GLint, GLuint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fvEXT)(GLuint, GLint, GLsizei, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4iEXT)(GLuint, GLint, GLint, GLint, GLint, GLint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4ivEXT)(GLuint, GLint, GLsizei, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uiEXT)(GLuint, GLint, GLuint, GLuint, GLuint, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uivEXT)(GLuint, GLint, GLsizei, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglUseProgramStagesEXT)(GLuint, GLbitfield, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgramPipelineEXT)(GLuint) = nullptr; + +/* GL_EXT_tessellation_shader */ +FLEXTGL_EXPORT void(APIENTRY *flextglPatchParameteriEXT)(GLenum, GLint) = nullptr; + +/* GL_EXT_texture_border_clamp */ +FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterIivEXT)(GLuint, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterIuivEXT)(GLuint, GLenum, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterIivEXT)(GLenum, GLenum, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterIuivEXT)(GLenum, GLenum, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterIivEXT)(GLuint, GLenum, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterIuivEXT)(GLuint, GLenum, const GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIivEXT)(GLenum, GLenum, const GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIuivEXT)(GLenum, GLenum, const GLuint *) = nullptr; + +/* GL_EXT_texture_buffer */ +FLEXTGL_EXPORT void(APIENTRY *flextglTexBufferEXT)(GLenum, GLenum, GLuint) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglTexBufferRangeEXT)(GLenum, GLenum, GLuint, GLintptr, GLsizeiptr) = nullptr; + +/* GL_KHR_blend_equation_advanced */ +FLEXTGL_EXPORT void(APIENTRY *flextglBlendBarrierKHR)(void) = nullptr; + +/* GL_KHR_debug */ +FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageCallbackKHR)(GLDEBUGPROCKHR, const void *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageControlKHR)(GLenum, GLenum, GLenum, GLsizei, const GLuint *, GLboolean) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageInsertKHR)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar *) = nullptr; +FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetDebugMessageLogKHR)(GLuint, GLsizei, GLenum *, GLenum *, GLuint *, GLenum *, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectLabelKHR)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectPtrLabelKHR)(const void *, GLsizei, GLsizei *, GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetPointervKHR)(GLenum, void **) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglObjectLabelKHR)(GLenum, GLuint, GLsizei, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglObjectPtrLabelKHR)(const void *, GLsizei, const GLchar *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglPopDebugGroupKHR)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglPushDebugGroupKHR)(GLenum, GLuint, GLsizei, const GLchar *) = nullptr; + +/* GL_KHR_robustness */ +FLEXTGL_EXPORT GLenum(APIENTRY *flextglGetGraphicsResetStatusKHR)(void) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformfvKHR)(GLuint, GLint, GLsizei, GLfloat *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformivKHR)(GLuint, GLint, GLsizei, GLint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformuivKHR)(GLuint, GLint, GLsizei, GLuint *) = nullptr; +FLEXTGL_EXPORT void(APIENTRY *flextglReadnPixelsKHR)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void *) = nullptr; + +/* GL_NV_polygon_mode */ +FLEXTGL_EXPORT void(APIENTRY *flextglPolygonModeNV)(GLenum, GLenum) = nullptr; + +/* GL_OES_mapbuffer */ +FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferPointervOES)(GLenum, GLenum, void **) = nullptr; +FLEXTGL_EXPORT void *(APIENTRY *flextglMapBufferOES)(GLenum, GLenum) = nullptr; +FLEXTGL_EXPORT GLboolean(APIENTRY *flextglUnmapBufferOES)(GLenum) = nullptr; + +/* GL_OES_sample_shading */ +FLEXTGL_EXPORT void(APIENTRY *flextglMinSampleShadingOES)(GLfloat) = nullptr; + +/* GL_OES_texture_storage_multisample_2d_array */ +FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage3DMultisampleOES)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean) = nullptr; + +#ifdef __cplusplus +} +#endif diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.cpp.template b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.cpp.template new file mode 100644 index 000000000..dfc149e94 --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.cpp.template @@ -0,0 +1,22 @@ +@require(passthru, functions, enums, options, version, extensions) +#include "flextGLWindowsDesktop.h" + +#ifdef __cplusplus +extern "C" { +#endif +@for category,funcs in functions: +@if funcs: + +/* GL_@category */ +@for f in funcs: + @if f.name not in ['BlendFunc', 'Clear', 'ClearColor', 'ClearDepth', 'ClearStencil', 'ColorMask', 'CullFace', 'DepthFunc', 'DepthMask', 'DepthRange', 'Disable', 'DrawBuffer', 'Enable', 'Finish', 'Flush', 'FrontFace', 'GetBooleanv', 'GetDoublev', 'GetError', 'GetFloatv', 'GetIntegerv', 'GetString', 'GetTexImage', 'GetTexLevelParameterfv', 'GetTexLevelParameteriv', 'GetTexParameterfv', 'GetTexParameteriv', 'Hint', 'IsEnabled', 'LineWidth', 'LogicOp', 'PixelStoref', 'PixelStorei', 'PointSize', 'PolygonMode', 'ReadBuffer', 'ReadPixels', 'Scissor', 'StencilFunc', 'StencilMask', 'StencilOp', 'TexImage1D', 'TexImage2D', 'TexParameterf', 'TexParameterfv', 'TexParameteri', 'TexParameteriv', 'Viewport', 'BindTexture', 'CopyTexImage1D', 'CopyTexImage2D', 'CopyTexSubImage1D', 'CopyTexSubImage2D', 'DeleteTextures', 'DrawArrays', 'DrawElements', 'GenTextures', 'IsTexture', 'PolygonOffset', 'TexSubImage1D', 'TexSubImage2D']: +FLEXTGL_EXPORT @f.returntype\ +(APIENTRY *flextgl@f.name)(@f.param_type_list_string()) = nullptr; + @end +@end +@end +@end + +#ifdef __cplusplus +} +#endif diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h new file mode 100644 index 000000000..b0d5cdf1c --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h @@ -0,0 +1,2237 @@ +#ifndef _flextgl_h_ +#define _flextgl_h_ + +#include + +#include "Magnum/configure.h" + +/* Defensive include guards */ + +#if defined(__gl_h_) || defined(__gl2_h_) || defined(__gl3_h_) || defined(__gl31_h_) +#error Attempt to include auto-generated header after including gl3.h +#endif +#if defined(__gl2ext_h_) || defined(__gl3ext_h_) +#error Attempt to include auto-generated header after including gl3ext.h +#endif +#if defined(__gl2platform_h_) || defined(__gl3platform_h_) +#error Attempt to include auto-generated header after including gl3platform.h +#endif + +#define __gl_h_ +#define __gl2_h_ +#define __gl3_h_ +#define __gl31_h_ +#define __gl2ext_h_ +#define __gl3ext_h_ +#define __gl2platform_h_ +#define __gl3platform_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +void flextGLInit(); + +/* Function declaration macros */ + +#ifndef MAGNUM_BUILD_STATIC + #ifdef FlextGL_EXPORTS + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_EXPORT + #else + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_IMPORT + #endif +#else + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_STATIC +#endif + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#ifndef WINAPI +#define WINAPI __stdcall +#endif +#define APIENTRY WINAPI +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/* Data types */ + +#include +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef short GLshort; +typedef int GLint; +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef int GLsizei; +typedef char GLchar; +typedef unsigned short GLhalf; +typedef struct __GLsync *GLsync; +typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef khronos_int8_t GLbyte; +typedef khronos_uint8_t GLubyte; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef khronos_int32_t GLfixed; +typedef khronos_int64_t GLint64; +typedef khronos_uint64_t GLuint64; +typedef khronos_intptr_t GLintptr; +typedef khronos_ssize_t GLsizeiptr; + +/* Enums */ + +/* GL_ES_VERSION_2_0 */ + +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_FALSE 0 +#define GL_TRUE 1 +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_FUNC_ADD 0x8006 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_STREAM_DRAW 0x88E0 +#define GL_STATIC_DRAW 0x88E4 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_CULL_FACE 0x0B44 +#define GL_BLEND 0x0BE2 +#define GL_DITHER 0x0BD0 +#define GL_STENCIL_TEST 0x0B90 +#define GL_DEPTH_TEST 0x0B71 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_LINE_WIDTH 0x0B21 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_FIXED 0x140C +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#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_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_SHADER_TYPE 0x8B4F +#define GL_DELETE_STATUS 0x8B80 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_INVERT 0x150A +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TEXTURE 0x1702 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_REPEAT 0x2901 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_COMPILE_STATUS 0x8B81 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGB565 0x8D62 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_NONE 0 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 + +/* GL_ES_VERSION_3_0 */ + +#define GL_READ_BUFFER 0x0C02 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_RED 0x1903 +#define GL_RGB8 0x8051 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_COLOR_ATTACHMENT16 0x8CF0 +#define GL_COLOR_ATTACHMENT17 0x8CF1 +#define GL_COLOR_ATTACHMENT18 0x8CF2 +#define GL_COLOR_ATTACHMENT19 0x8CF3 +#define GL_COLOR_ATTACHMENT20 0x8CF4 +#define GL_COLOR_ATTACHMENT21 0x8CF5 +#define GL_COLOR_ATTACHMENT22 0x8CF6 +#define GL_COLOR_ATTACHMENT23 0x8CF7 +#define GL_COLOR_ATTACHMENT24 0x8CF8 +#define GL_COLOR_ATTACHMENT25 0x8CF9 +#define GL_COLOR_ATTACHMENT26 0x8CFA +#define GL_COLOR_ATTACHMENT27 0x8CFB +#define GL_COLOR_ATTACHMENT28 0x8CFC +#define GL_COLOR_ATTACHMENT29 0x8CFD +#define GL_COLOR_ATTACHMENT30 0x8CFE +#define GL_COLOR_ATTACHMENT31 0x8CFF +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_HALF_FLOAT 0x140B +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_RG8 0x822B +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFFu +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_SAMPLER_BINDING 0x8919 +#define GL_RGB10_A2UI 0x906F +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_INT_2_10_10_10_REV 0x8D9F +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF + +/* GL_ES_VERSION_3_1 */ + +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#define GL_MAX_UNIFORM_LOCATIONS 0x826E +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_NAME_LENGTH 0x92F9 +#define GL_TYPE 0x92FA +#define GL_ARRAY_SIZE 0x92FB +#define GL_OFFSET 0x92FC +#define GL_BLOCK_INDEX 0x92FD +#define GL_ARRAY_STRIDE 0x92FE +#define GL_MATRIX_STRIDE 0x92FF +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_LOCATION 0x930E +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#define GL_STENCIL_INDEX 0x1901 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 + +/* GL_APPLE_texture_format_BGRA8888 */ + +#define GL_BGRA_EXT 0x80E1 +#define GL_BGRA8_EXT 0x93A1 + +/* GL_ARM_shader_framebuffer_fetch */ + +#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 +#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 + +/* GL_EXT_texture_filter_anisotropic */ + +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + +/* GL_EXT_texture_format_BGRA8888 */ + +#define GL_BGRA_EXT 0x80E1 + +/* GL_EXT_read_format_bgra */ + +#define GL_BGRA_EXT 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 + +/* GL_EXT_debug_label */ + +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +#define GL_SAMPLER 0x82E6 +#define GL_TRANSFORM_FEEDBACK 0x8E22 + +/* GL_EXT_shader_framebuffer_fetch */ + +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 + +/* GL_EXT_disjoint_timer_query */ + +#define GL_QUERY_COUNTER_BITS_EXT 0x8864 +#define GL_CURRENT_QUERY_EXT 0x8865 +#define GL_QUERY_RESULT_EXT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 +#define GL_TIME_ELAPSED_EXT 0x88BF +#define GL_TIMESTAMP_EXT 0x8E28 +#define GL_GPU_DISJOINT_EXT 0x8FBB + +/* GL_EXT_texture_sRGB_decode */ + +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A + +/* GL_EXT_sRGB_write_control */ + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 + +/* GL_EXT_texture_compression_s3tc */ + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + +/* GL_EXT_draw_buffers_indexed */ + +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_BLEND 0x0BE2 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_SRC_ALPHA_SATURATE 0x0308 + +/* GL_EXT_geometry_shader */ + +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 + +/* GL_EXT_tessellation_shader */ + +#define GL_PATCHES_EXT 0x000E +#define GL_PATCH_VERTICES_EXT 0x8E72 +#define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT 0x8E75 +#define GL_TESS_GEN_MODE_EXT 0x8E76 +#define GL_TESS_GEN_SPACING_EXT 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER_EXT 0x8E78 +#define GL_TESS_GEN_POINT_MODE_EXT 0x8E79 +#define GL_TRIANGLES 0x0004 +#define GL_ISOLINES_EXT 0x8E7A +#define GL_QUADS_EXT 0x0007 +#define GL_EQUAL 0x0202 +#define GL_FRACTIONAL_ODD_EXT 0x8E7B +#define GL_FRACTIONAL_EVEN_EXT 0x8E7C +#define GL_CCW 0x0901 +#define GL_CW 0x0900 +#define GL_MAX_PATCH_VERTICES_EXT 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL_EXT 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS_EXT 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E1F +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT 0x92CE +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT 0x92D4 +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT 0x90CC +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT 0x90D9 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_IS_PER_PATCH_EXT 0x92E7 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT 0x9308 +#define GL_TESS_CONTROL_SHADER_EXT 0x8E88 +#define GL_TESS_EVALUATION_SHADER_EXT 0x8E87 +#define GL_TESS_CONTROL_SHADER_BIT_EXT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT_EXT 0x00000010 + +/* GL_EXT_texture_border_clamp */ + +#define GL_TEXTURE_BORDER_COLOR_EXT 0x1004 +#define GL_CLAMP_TO_BORDER_EXT 0x812D + +/* GL_EXT_texture_buffer */ + +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_TEXTURE_BUFFER_BINDING_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT 0x919F +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_TEXTURE_BUFFER_OFFSET_EXT 0x919D +#define GL_TEXTURE_BUFFER_SIZE_EXT 0x919E + +/* GL_EXT_texture_cube_map_array */ + +#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A +#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A + +/* GL_EXT_primitive_bounding_box */ + +#define GL_PRIMITIVE_BOUNDING_BOX_EXT 0x92BE + +/* GL_EXT_separate_shader_objects */ + +#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 +#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE_EXT 0x8258 +#define GL_ACTIVE_PROGRAM_EXT 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A + +/* GL_EXT_multisampled_render_to_texture */ + +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 + +/* GL_EXT_robustness */ + +#define GL_NO_ERROR 0 +#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 +#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 +#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 +#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 + +/* GL_KHR_texture_compression_astc_ldr */ + +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD + +/* GL_KHR_texture_compression_astc_hdr */ + +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD + +/* GL_KHR_debug */ + +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245 +#define GL_DEBUG_SOURCE_API_KHR 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A +#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B +#define GL_DEBUG_TYPE_ERROR_KHR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250 +#define GL_DEBUG_TYPE_OTHER_KHR 0x8251 +#define GL_DEBUG_TYPE_MARKER_KHR 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D +#define GL_BUFFER_KHR 0x82E0 +#define GL_SHADER_KHR 0x82E1 +#define GL_PROGRAM_KHR 0x82E2 +#define GL_VERTEX_ARRAY_KHR 0x8074 +#define GL_QUERY_KHR 0x82E3 +#define GL_PROGRAM_PIPELINE_KHR 0x82E4 +#define GL_SAMPLER_KHR 0x82E6 +#define GL_MAX_LABEL_LENGTH_KHR 0x82E8 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147 +#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148 +#define GL_DEBUG_OUTPUT_KHR 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002 +#define GL_STACK_OVERFLOW_KHR 0x0503 +#define GL_STACK_UNDERFLOW_KHR 0x0504 + +/* GL_KHR_blend_equation_advanced */ + +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 + +/* GL_KHR_blend_equation_advanced_coherent */ + +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 + +/* GL_KHR_robustness */ + +#define GL_NO_ERROR 0 +#define GL_CONTEXT_ROBUST_ACCESS_KHR 0x90F3 +#define GL_LOSE_CONTEXT_ON_RESET_KHR 0x8252 +#define GL_GUILTY_CONTEXT_RESET_KHR 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_KHR 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_KHR 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_KHR 0x8256 +#define GL_NO_RESET_NOTIFICATION_KHR 0x8261 +#define GL_CONTEXT_LOST_KHR 0x0507 + +/* GL_KHR_context_flush_control */ + +#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x82FC +#define GL_NONE 0 + +/* GL_KHR_no_error */ + +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 + +/* GL_NV_texture_border_clamp */ + +#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 +#define GL_CLAMP_TO_BORDER_NV 0x812D + +/* GL_NV_polygon_mode */ + +#define GL_POLYGON_MODE_NV 0x0B40 +#define GL_POLYGON_OFFSET_POINT_NV 0x2A01 +#define GL_POLYGON_OFFSET_LINE_NV 0x2A02 +#define GL_POINT_NV 0x1B00 +#define GL_LINE_NV 0x1B01 +#define GL_FILL_NV 0x1B02 + +/* GL_OES_depth32 */ + +#define GL_DEPTH_COMPONENT32_OES 0x81A7 + +/* GL_OES_mapbuffer */ + +#define GL_WRITE_ONLY_OES 0x88B9 +#define GL_BUFFER_ACCESS_OES 0x88BB +#define GL_BUFFER_MAPPED_OES 0x88BC +#define GL_BUFFER_MAP_POINTER_OES 0x88BD + +/* GL_OES_stencil1 */ + +#define GL_STENCIL_INDEX1_OES 0x8D46 + +/* GL_OES_stencil4 */ + +#define GL_STENCIL_INDEX4_OES 0x8D47 + +/* GL_OES_sample_shading */ + +#define GL_SAMPLE_SHADING_OES 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_OES 0x8C37 + +/* GL_OES_shader_multisample_interpolation */ + +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES 0x8E5D + +/* GL_OES_texture_stencil8 */ + +#define GL_STENCIL_INDEX_OES 0x1901 +#define GL_STENCIL_INDEX8_OES 0x8D48 + +/* GL_OES_texture_storage_multisample_2d_array */ + +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES 0x9102 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES 0x9105 +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910D + +/* Function prototypes */ + +/* GL_ES_VERSION_2_0 */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglActiveTexture)(GLenum); +#define glActiveTexture flextglActiveTexture +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglAttachShader)(GLuint, GLuint); +#define glAttachShader flextglAttachShader +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindAttribLocation)(GLuint, GLuint, const GLchar *); +#define glBindAttribLocation flextglBindAttribLocation +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindBuffer)(GLenum, GLuint); +#define glBindBuffer flextglBindBuffer +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindFramebuffer)(GLenum, GLuint); +#define glBindFramebuffer flextglBindFramebuffer +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindRenderbuffer)(GLenum, GLuint); +#define glBindRenderbuffer flextglBindRenderbuffer +GLAPI FLEXTGL_EXPORT void APIENTRY glBindTexture(GLenum, GLuint); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendColor)(GLfloat, GLfloat, GLfloat, GLfloat); +#define glBlendColor flextglBlendColor +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquation)(GLenum); +#define glBlendEquation flextglBlendEquation +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationSeparate)(GLenum, GLenum); +#define glBlendEquationSeparate flextglBlendEquationSeparate +GLAPI FLEXTGL_EXPORT void APIENTRY glBlendFunc(GLenum, GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendFuncSeparate)(GLenum, GLenum, GLenum, GLenum); +#define glBlendFuncSeparate flextglBlendFuncSeparate +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBufferData)(GLenum, GLsizeiptr, const void *, GLenum); +#define glBufferData flextglBufferData +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBufferSubData)(GLenum, GLintptr, GLsizeiptr, const void *); +#define glBufferSubData flextglBufferSubData +GLAPI FLEXTGL_EXPORT GLenum(APIENTRY *flextglCheckFramebufferStatus)(GLenum); +#define glCheckFramebufferStatus flextglCheckFramebufferStatus +GLAPI FLEXTGL_EXPORT void APIENTRY glClear(GLbitfield); +GLAPI FLEXTGL_EXPORT void APIENTRY glClearColor(GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglClearDepthf)(GLfloat); +#define glClearDepthf flextglClearDepthf +GLAPI FLEXTGL_EXPORT void APIENTRY glClearStencil(GLint); +GLAPI FLEXTGL_EXPORT void APIENTRY glColorMask(GLboolean, GLboolean, GLboolean, GLboolean); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCompileShader)(GLuint); +#define glCompileShader flextglCompileShader +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexImage2D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void *); +#define glCompressedTexImage2D flextglCompressedTexImage2D +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void *); +#define glCompressedTexSubImage2D flextglCompressedTexSubImage2D +GLAPI FLEXTGL_EXPORT void APIENTRY glCopyTexImage2D(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +GLAPI FLEXTGL_EXPORT void APIENTRY glCopyTexSubImage2D(GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +GLAPI FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateProgram)(void); +#define glCreateProgram flextglCreateProgram +GLAPI FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShader)(GLenum); +#define glCreateShader flextglCreateShader +GLAPI FLEXTGL_EXPORT void APIENTRY glCullFace(GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteBuffers)(GLsizei, const GLuint *); +#define glDeleteBuffers flextglDeleteBuffers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteFramebuffers)(GLsizei, const GLuint *); +#define glDeleteFramebuffers flextglDeleteFramebuffers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgram)(GLuint); +#define glDeleteProgram flextglDeleteProgram +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteRenderbuffers)(GLsizei, const GLuint *); +#define glDeleteRenderbuffers flextglDeleteRenderbuffers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteShader)(GLuint); +#define glDeleteShader flextglDeleteShader +GLAPI FLEXTGL_EXPORT void APIENTRY glDeleteTextures(GLsizei, const GLuint *); +GLAPI FLEXTGL_EXPORT void APIENTRY glDepthFunc(GLenum); +GLAPI FLEXTGL_EXPORT void APIENTRY glDepthMask(GLboolean); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDepthRangef)(GLfloat, GLfloat); +#define glDepthRangef flextglDepthRangef +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDetachShader)(GLuint, GLuint); +#define glDetachShader flextglDetachShader +GLAPI FLEXTGL_EXPORT void APIENTRY glDisable(GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDisableVertexAttribArray)(GLuint); +#define glDisableVertexAttribArray flextglDisableVertexAttribArray +GLAPI FLEXTGL_EXPORT void APIENTRY glDrawArrays(GLenum, GLint, GLsizei); +GLAPI FLEXTGL_EXPORT void APIENTRY glDrawElements(GLenum, GLsizei, GLenum, const void *); +GLAPI FLEXTGL_EXPORT void APIENTRY glEnable(GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglEnableVertexAttribArray)(GLuint); +#define glEnableVertexAttribArray flextglEnableVertexAttribArray +GLAPI FLEXTGL_EXPORT void APIENTRY glFinish(void); +GLAPI FLEXTGL_EXPORT void APIENTRY glFlush(void); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferRenderbuffer)(GLenum, GLenum, GLenum, GLuint); +#define glFramebufferRenderbuffer flextglFramebufferRenderbuffer +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture2D)(GLenum, GLenum, GLenum, GLuint, GLint); +#define glFramebufferTexture2D flextglFramebufferTexture2D +GLAPI FLEXTGL_EXPORT void APIENTRY glFrontFace(GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenBuffers)(GLsizei, GLuint *); +#define glGenBuffers flextglGenBuffers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenFramebuffers)(GLsizei, GLuint *); +#define glGenFramebuffers flextglGenFramebuffers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenRenderbuffers)(GLsizei, GLuint *); +#define glGenRenderbuffers flextglGenRenderbuffers +GLAPI FLEXTGL_EXPORT void APIENTRY glGenTextures(GLsizei, GLuint *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenerateMipmap)(GLenum); +#define glGenerateMipmap flextglGenerateMipmap +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveAttrib)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +#define glGetActiveAttrib flextglGetActiveAttrib +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniform)(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +#define glGetActiveUniform flextglGetActiveUniform +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetAttachedShaders)(GLuint, GLsizei, GLsizei *, GLuint *); +#define glGetAttachedShaders flextglGetAttachedShaders +GLAPI FLEXTGL_EXPORT GLint(APIENTRY *flextglGetAttribLocation)(GLuint, const GLchar *); +#define glGetAttribLocation flextglGetAttribLocation +GLAPI FLEXTGL_EXPORT void APIENTRY glGetBooleanv(GLenum, GLboolean *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferParameteriv)(GLenum, GLenum, GLint *); +#define glGetBufferParameteriv flextglGetBufferParameteriv +GLAPI FLEXTGL_EXPORT GLenum APIENTRY glGetError(void); +GLAPI FLEXTGL_EXPORT void APIENTRY glGetFloatv(GLenum, GLfloat *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetFramebufferAttachmentParameteriv)(GLenum, GLenum, GLenum, GLint *); +#define glGetFramebufferAttachmentParameteriv flextglGetFramebufferAttachmentParameteriv +GLAPI FLEXTGL_EXPORT void APIENTRY glGetIntegerv(GLenum, GLint *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetProgramInfoLog flextglGetProgramInfoLog +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramiv)(GLuint, GLenum, GLint *); +#define glGetProgramiv flextglGetProgramiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetRenderbufferParameteriv)(GLenum, GLenum, GLint *); +#define glGetRenderbufferParameteriv flextglGetRenderbufferParameteriv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetShaderInfoLog flextglGetShaderInfoLog +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderPrecisionFormat)(GLenum, GLenum, GLint *, GLint *); +#define glGetShaderPrecisionFormat flextglGetShaderPrecisionFormat +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderSource)(GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetShaderSource flextglGetShaderSource +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetShaderiv)(GLuint, GLenum, GLint *); +#define glGetShaderiv flextglGetShaderiv +GLAPI FLEXTGL_EXPORT const GLubyte * APIENTRY glGetString(GLenum); +GLAPI FLEXTGL_EXPORT void APIENTRY glGetTexParameterfv(GLenum, GLenum, GLfloat *); +GLAPI FLEXTGL_EXPORT void APIENTRY glGetTexParameteriv(GLenum, GLenum, GLint *); +GLAPI FLEXTGL_EXPORT GLint(APIENTRY *flextglGetUniformLocation)(GLuint, const GLchar *); +#define glGetUniformLocation flextglGetUniformLocation +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformfv)(GLuint, GLint, GLfloat *); +#define glGetUniformfv flextglGetUniformfv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformiv)(GLuint, GLint, GLint *); +#define glGetUniformiv flextglGetUniformiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribPointerv)(GLuint, GLenum, void **); +#define glGetVertexAttribPointerv flextglGetVertexAttribPointerv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribfv)(GLuint, GLenum, GLfloat *); +#define glGetVertexAttribfv flextglGetVertexAttribfv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribiv)(GLuint, GLenum, GLint *); +#define glGetVertexAttribiv flextglGetVertexAttribiv +GLAPI FLEXTGL_EXPORT void APIENTRY glHint(GLenum, GLenum); +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsBuffer)(GLuint); +#define glIsBuffer flextglIsBuffer +GLAPI FLEXTGL_EXPORT GLboolean APIENTRY glIsEnabled(GLenum); +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsFramebuffer)(GLuint); +#define glIsFramebuffer flextglIsFramebuffer +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgram)(GLuint); +#define glIsProgram flextglIsProgram +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsRenderbuffer)(GLuint); +#define glIsRenderbuffer flextglIsRenderbuffer +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsShader)(GLuint); +#define glIsShader flextglIsShader +GLAPI FLEXTGL_EXPORT GLboolean APIENTRY glIsTexture(GLuint); +GLAPI FLEXTGL_EXPORT void APIENTRY glLineWidth(GLfloat); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglLinkProgram)(GLuint); +#define glLinkProgram flextglLinkProgram +GLAPI FLEXTGL_EXPORT void APIENTRY glPixelStorei(GLenum, GLint); +GLAPI FLEXTGL_EXPORT void APIENTRY glPolygonOffset(GLfloat, GLfloat); +GLAPI FLEXTGL_EXPORT void APIENTRY glReadPixels(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, void *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglReleaseShaderCompiler)(void); +#define glReleaseShaderCompiler flextglReleaseShaderCompiler +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorage)(GLenum, GLenum, GLsizei, GLsizei); +#define glRenderbufferStorage flextglRenderbufferStorage +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglSampleCoverage)(GLfloat, GLboolean); +#define glSampleCoverage flextglSampleCoverage +GLAPI FLEXTGL_EXPORT void APIENTRY glScissor(GLint, GLint, GLsizei, GLsizei); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglShaderBinary)(GLsizei, const GLuint *, GLenum, const void *, GLsizei); +#define glShaderBinary flextglShaderBinary +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglShaderSource)(GLuint, GLsizei, const GLchar *const*, const GLint *); +#define glShaderSource flextglShaderSource +GLAPI FLEXTGL_EXPORT void APIENTRY glStencilFunc(GLenum, GLint, GLuint); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglStencilFuncSeparate)(GLenum, GLenum, GLint, GLuint); +#define glStencilFuncSeparate flextglStencilFuncSeparate +GLAPI FLEXTGL_EXPORT void APIENTRY glStencilMask(GLuint); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglStencilMaskSeparate)(GLenum, GLuint); +#define glStencilMaskSeparate flextglStencilMaskSeparate +GLAPI FLEXTGL_EXPORT void APIENTRY glStencilOp(GLenum, GLenum, GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglStencilOpSeparate)(GLenum, GLenum, GLenum, GLenum); +#define glStencilOpSeparate flextglStencilOpSeparate +GLAPI FLEXTGL_EXPORT void APIENTRY glTexImage2D(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *); +GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameterf(GLenum, GLenum, GLfloat); +GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameterfv(GLenum, GLenum, const GLfloat *); +GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameteri(GLenum, GLenum, GLint); +GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameteriv(GLenum, GLenum, const GLint *); +GLAPI FLEXTGL_EXPORT void APIENTRY glTexSubImage2D(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void *); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform1f)(GLint, GLfloat); +#define glUniform1f flextglUniform1f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform1fv)(GLint, GLsizei, const GLfloat *); +#define glUniform1fv flextglUniform1fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform1i)(GLint, GLint); +#define glUniform1i flextglUniform1i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform1iv)(GLint, GLsizei, const GLint *); +#define glUniform1iv flextglUniform1iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform2f)(GLint, GLfloat, GLfloat); +#define glUniform2f flextglUniform2f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform2fv)(GLint, GLsizei, const GLfloat *); +#define glUniform2fv flextglUniform2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform2i)(GLint, GLint, GLint); +#define glUniform2i flextglUniform2i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform2iv)(GLint, GLsizei, const GLint *); +#define glUniform2iv flextglUniform2iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform3f)(GLint, GLfloat, GLfloat, GLfloat); +#define glUniform3f flextglUniform3f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform3fv)(GLint, GLsizei, const GLfloat *); +#define glUniform3fv flextglUniform3fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform3i)(GLint, GLint, GLint, GLint); +#define glUniform3i flextglUniform3i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform3iv)(GLint, GLsizei, const GLint *); +#define glUniform3iv flextglUniform3iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform4f)(GLint, GLfloat, GLfloat, GLfloat, GLfloat); +#define glUniform4f flextglUniform4f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform4fv)(GLint, GLsizei, const GLfloat *); +#define glUniform4fv flextglUniform4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform4i)(GLint, GLint, GLint, GLint, GLint); +#define glUniform4i flextglUniform4i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform4iv)(GLint, GLsizei, const GLint *); +#define glUniform4iv flextglUniform4iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix2fv flextglUniformMatrix2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix3fv flextglUniformMatrix3fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix4fv flextglUniformMatrix4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUseProgram)(GLuint); +#define glUseProgram flextglUseProgram +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgram)(GLuint); +#define glValidateProgram flextglValidateProgram +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1f)(GLuint, GLfloat); +#define glVertexAttrib1f flextglVertexAttrib1f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib1fv)(GLuint, const GLfloat *); +#define glVertexAttrib1fv flextglVertexAttrib1fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2f)(GLuint, GLfloat, GLfloat); +#define glVertexAttrib2f flextglVertexAttrib2f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib2fv)(GLuint, const GLfloat *); +#define glVertexAttrib2fv flextglVertexAttrib2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3f)(GLuint, GLfloat, GLfloat, GLfloat); +#define glVertexAttrib3f flextglVertexAttrib3f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib3fv)(GLuint, const GLfloat *); +#define glVertexAttrib3fv flextglVertexAttrib3fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4f)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +#define glVertexAttrib4f flextglVertexAttrib4f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttrib4fv)(GLuint, const GLfloat *); +#define glVertexAttrib4fv flextglVertexAttrib4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, const void *); +#define glVertexAttribPointer flextglVertexAttribPointer +GLAPI FLEXTGL_EXPORT void APIENTRY glViewport(GLint, GLint, GLsizei, GLsizei); + +/* GL_ES_VERSION_3_0 */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBeginQuery)(GLenum, GLuint); +#define glBeginQuery flextglBeginQuery +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBeginTransformFeedback)(GLenum); +#define glBeginTransformFeedback flextglBeginTransformFeedback +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindBufferBase)(GLenum, GLuint, GLuint); +#define glBindBufferBase flextglBindBufferBase +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindBufferRange)(GLenum, GLuint, GLuint, GLintptr, GLsizeiptr); +#define glBindBufferRange flextglBindBufferRange +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindSampler)(GLuint, GLuint); +#define glBindSampler flextglBindSampler +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindTransformFeedback)(GLenum, GLuint); +#define glBindTransformFeedback flextglBindTransformFeedback +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindVertexArray)(GLuint); +#define glBindVertexArray flextglBindVertexArray +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlitFramebuffer)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum); +#define glBlitFramebuffer flextglBlitFramebuffer +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferfi)(GLenum, GLint, GLfloat, GLint); +#define glClearBufferfi flextglClearBufferfi +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferfv)(GLenum, GLint, const GLfloat *); +#define glClearBufferfv flextglClearBufferfv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferiv)(GLenum, GLint, const GLint *); +#define glClearBufferiv flextglClearBufferiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglClearBufferuiv)(GLenum, GLint, const GLuint *); +#define glClearBufferuiv flextglClearBufferuiv +GLAPI FLEXTGL_EXPORT GLenum(APIENTRY *flextglClientWaitSync)(GLsync, GLbitfield, GLuint64); +#define glClientWaitSync flextglClientWaitSync +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void *); +#define glCompressedTexImage3D flextglCompressedTexImage3D +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCompressedTexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void *); +#define glCompressedTexSubImage3D flextglCompressedTexSubImage3D +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCopyBufferSubData)(GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr); +#define glCopyBufferSubData flextglCopyBufferSubData +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#define glCopyTexSubImage3D flextglCopyTexSubImage3D +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteQueries)(GLsizei, const GLuint *); +#define glDeleteQueries flextglDeleteQueries +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteSamplers)(GLsizei, const GLuint *); +#define glDeleteSamplers flextglDeleteSamplers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteSync)(GLsync); +#define glDeleteSync flextglDeleteSync +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteTransformFeedbacks)(GLsizei, const GLuint *); +#define glDeleteTransformFeedbacks flextglDeleteTransformFeedbacks +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteVertexArrays)(GLsizei, const GLuint *); +#define glDeleteVertexArrays flextglDeleteVertexArrays +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstanced)(GLenum, GLint, GLsizei, GLsizei); +#define glDrawArraysInstanced flextglDrawArraysInstanced +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawBuffers)(GLsizei, const GLenum *); +#define glDrawBuffers flextglDrawBuffers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstanced)(GLenum, GLsizei, GLenum, const void *, GLsizei); +#define glDrawElementsInstanced flextglDrawElementsInstanced +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawRangeElements)(GLenum, GLuint, GLuint, GLsizei, GLenum, const void *); +#define glDrawRangeElements flextglDrawRangeElements +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglEndQuery)(GLenum); +#define glEndQuery flextglEndQuery +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglEndTransformFeedback)(void); +#define glEndTransformFeedback flextglEndTransformFeedback +GLAPI FLEXTGL_EXPORT GLsync(APIENTRY *flextglFenceSync)(GLenum, GLbitfield); +#define glFenceSync flextglFenceSync +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFlushMappedBufferRange)(GLenum, GLintptr, GLsizeiptr); +#define glFlushMappedBufferRange flextglFlushMappedBufferRange +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTextureLayer)(GLenum, GLenum, GLuint, GLint, GLint); +#define glFramebufferTextureLayer flextglFramebufferTextureLayer +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenQueries)(GLsizei, GLuint *); +#define glGenQueries flextglGenQueries +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenSamplers)(GLsizei, GLuint *); +#define glGenSamplers flextglGenSamplers +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenTransformFeedbacks)(GLsizei, GLuint *); +#define glGenTransformFeedbacks flextglGenTransformFeedbacks +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenVertexArrays)(GLsizei, GLuint *); +#define glGenVertexArrays flextglGenVertexArrays +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniformBlockName)(GLuint, GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetActiveUniformBlockName flextglGetActiveUniformBlockName +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniformBlockiv)(GLuint, GLuint, GLenum, GLint *); +#define glGetActiveUniformBlockiv flextglGetActiveUniformBlockiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetActiveUniformsiv)(GLuint, GLsizei, const GLuint *, GLenum, GLint *); +#define glGetActiveUniformsiv flextglGetActiveUniformsiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferParameteri64v)(GLenum, GLenum, GLint64 *); +#define glGetBufferParameteri64v flextglGetBufferParameteri64v +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferPointerv)(GLenum, GLenum, void **); +#define glGetBufferPointerv flextglGetBufferPointerv +GLAPI FLEXTGL_EXPORT GLint(APIENTRY *flextglGetFragDataLocation)(GLuint, const GLchar *); +#define glGetFragDataLocation flextglGetFragDataLocation +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetInteger64i_v)(GLenum, GLuint, GLint64 *); +#define glGetInteger64i_v flextglGetInteger64i_v +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetInteger64v)(GLenum, GLint64 *); +#define glGetInteger64v flextglGetInteger64v +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetIntegeri_v)(GLenum, GLuint, GLint *); +#define glGetIntegeri_v flextglGetIntegeri_v +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetInternalformativ)(GLenum, GLenum, GLenum, GLsizei, GLint *); +#define glGetInternalformativ flextglGetInternalformativ +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramBinary)(GLuint, GLsizei, GLsizei *, GLenum *, void *); +#define glGetProgramBinary flextglGetProgramBinary +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectuiv)(GLuint, GLenum, GLuint *); +#define glGetQueryObjectuiv flextglGetQueryObjectuiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryiv)(GLenum, GLenum, GLint *); +#define glGetQueryiv flextglGetQueryiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterfv)(GLuint, GLenum, GLfloat *); +#define glGetSamplerParameterfv flextglGetSamplerParameterfv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameteriv)(GLuint, GLenum, GLint *); +#define glGetSamplerParameteriv flextglGetSamplerParameteriv +GLAPI FLEXTGL_EXPORT const GLubyte *(APIENTRY *flextglGetStringi)(GLenum, GLuint); +#define glGetStringi flextglGetStringi +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetSynciv)(GLsync, GLenum, GLsizei, GLsizei *, GLint *); +#define glGetSynciv flextglGetSynciv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetTransformFeedbackVarying)(GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *); +#define glGetTransformFeedbackVarying flextglGetTransformFeedbackVarying +GLAPI FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetUniformBlockIndex)(GLuint, const GLchar *); +#define glGetUniformBlockIndex flextglGetUniformBlockIndex +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformIndices)(GLuint, GLsizei, const GLchar *const*, GLuint *); +#define glGetUniformIndices flextglGetUniformIndices +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetUniformuiv)(GLuint, GLint, GLuint *); +#define glGetUniformuiv flextglGetUniformuiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribIiv)(GLuint, GLenum, GLint *); +#define glGetVertexAttribIiv flextglGetVertexAttribIiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetVertexAttribIuiv)(GLuint, GLenum, GLuint *); +#define glGetVertexAttribIuiv flextglGetVertexAttribIuiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglInvalidateFramebuffer)(GLenum, GLsizei, const GLenum *); +#define glInvalidateFramebuffer flextglInvalidateFramebuffer +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglInvalidateSubFramebuffer)(GLenum, GLsizei, const GLenum *, GLint, GLint, GLsizei, GLsizei); +#define glInvalidateSubFramebuffer flextglInvalidateSubFramebuffer +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsQuery)(GLuint); +#define glIsQuery flextglIsQuery +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsSampler)(GLuint); +#define glIsSampler flextglIsSampler +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsSync)(GLsync); +#define glIsSync flextglIsSync +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsTransformFeedback)(GLuint); +#define glIsTransformFeedback flextglIsTransformFeedback +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsVertexArray)(GLuint); +#define glIsVertexArray flextglIsVertexArray +GLAPI FLEXTGL_EXPORT void *(APIENTRY *flextglMapBufferRange)(GLenum, GLintptr, GLsizeiptr, GLbitfield); +#define glMapBufferRange flextglMapBufferRange +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPauseTransformFeedback)(void); +#define glPauseTransformFeedback flextglPauseTransformFeedback +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramBinary)(GLuint, GLenum, const void *, GLsizei); +#define glProgramBinary flextglProgramBinary +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramParameteri)(GLuint, GLenum, GLint); +#define glProgramParameteri flextglProgramParameteri +GLAPI FLEXTGL_EXPORT void APIENTRY glReadBuffer(GLenum); +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei); +#define glRenderbufferStorageMultisample flextglRenderbufferStorageMultisample +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglResumeTransformFeedback)(void); +#define glResumeTransformFeedback flextglResumeTransformFeedback +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterf)(GLuint, GLenum, GLfloat); +#define glSamplerParameterf flextglSamplerParameterf +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterfv)(GLuint, GLenum, const GLfloat *); +#define glSamplerParameterfv flextglSamplerParameterfv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameteri)(GLuint, GLenum, GLint); +#define glSamplerParameteri flextglSamplerParameteri +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameteriv)(GLuint, GLenum, const GLint *); +#define glSamplerParameteriv flextglSamplerParameteriv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexImage3D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *); +#define glTexImage3D flextglTexImage3D +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage2D)(GLenum, GLsizei, GLenum, GLsizei, GLsizei); +#define glTexStorage2D flextglTexStorage2D +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage3D)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei); +#define glTexStorage3D flextglTexStorage3D +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *); +#define glTexSubImage3D flextglTexSubImage3D +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTransformFeedbackVaryings)(GLuint, GLsizei, const GLchar *const*, GLenum); +#define glTransformFeedbackVaryings flextglTransformFeedbackVaryings +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform1ui)(GLint, GLuint); +#define glUniform1ui flextglUniform1ui +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform1uiv)(GLint, GLsizei, const GLuint *); +#define glUniform1uiv flextglUniform1uiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform2ui)(GLint, GLuint, GLuint); +#define glUniform2ui flextglUniform2ui +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform2uiv)(GLint, GLsizei, const GLuint *); +#define glUniform2uiv flextglUniform2uiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform3ui)(GLint, GLuint, GLuint, GLuint); +#define glUniform3ui flextglUniform3ui +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform3uiv)(GLint, GLsizei, const GLuint *); +#define glUniform3uiv flextglUniform3uiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform4ui)(GLint, GLuint, GLuint, GLuint, GLuint); +#define glUniform4ui flextglUniform4ui +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniform4uiv)(GLint, GLsizei, const GLuint *); +#define glUniform4uiv flextglUniform4uiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformBlockBinding)(GLuint, GLuint, GLuint); +#define glUniformBlockBinding flextglUniformBlockBinding +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2x3fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix2x3fv flextglUniformMatrix2x3fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix2x4fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix2x4fv flextglUniformMatrix2x4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3x2fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix3x2fv flextglUniformMatrix3x2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix3x4fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix3x4fv flextglUniformMatrix3x4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4x2fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix4x2fv flextglUniformMatrix4x2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUniformMatrix4x3fv)(GLint, GLsizei, GLboolean, const GLfloat *); +#define glUniformMatrix4x3fv flextglUniformMatrix4x3fv +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglUnmapBuffer)(GLenum); +#define glUnmapBuffer flextglUnmapBuffer +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribDivisor)(GLuint, GLuint); +#define glVertexAttribDivisor flextglVertexAttribDivisor +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4i)(GLuint, GLint, GLint, GLint, GLint); +#define glVertexAttribI4i flextglVertexAttribI4i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4iv)(GLuint, const GLint *); +#define glVertexAttribI4iv flextglVertexAttribI4iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4ui)(GLuint, GLuint, GLuint, GLuint, GLuint); +#define glVertexAttribI4ui flextglVertexAttribI4ui +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribI4uiv)(GLuint, const GLuint *); +#define glVertexAttribI4uiv flextglVertexAttribI4uiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribIPointer)(GLuint, GLint, GLenum, GLsizei, const void *); +#define glVertexAttribIPointer flextglVertexAttribIPointer +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglWaitSync)(GLsync, GLbitfield, GLuint64); +#define glWaitSync flextglWaitSync + +/* GL_ES_VERSION_3_1 */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglActiveShaderProgram)(GLuint, GLuint); +#define glActiveShaderProgram flextglActiveShaderProgram +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindImageTexture)(GLuint, GLuint, GLint, GLboolean, GLint, GLenum, GLenum); +#define glBindImageTexture flextglBindImageTexture +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindProgramPipeline)(GLuint); +#define glBindProgramPipeline flextglBindProgramPipeline +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindVertexBuffer)(GLuint, GLuint, GLintptr, GLsizei); +#define glBindVertexBuffer flextglBindVertexBuffer +GLAPI FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShaderProgramv)(GLenum, GLsizei, const GLchar *const*); +#define glCreateShaderProgramv flextglCreateShaderProgramv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgramPipelines)(GLsizei, const GLuint *); +#define glDeleteProgramPipelines flextglDeleteProgramPipelines +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDispatchCompute)(GLuint, GLuint, GLuint); +#define glDispatchCompute flextglDispatchCompute +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDispatchComputeIndirect)(GLintptr); +#define glDispatchComputeIndirect flextglDispatchComputeIndirect +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysIndirect)(GLenum, const void *); +#define glDrawArraysIndirect flextglDrawArraysIndirect +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsIndirect)(GLenum, GLenum, const void *); +#define glDrawElementsIndirect flextglDrawElementsIndirect +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferParameteri)(GLenum, GLenum, GLint); +#define glFramebufferParameteri flextglFramebufferParameteri +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenProgramPipelines)(GLsizei, GLuint *); +#define glGenProgramPipelines flextglGenProgramPipelines +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetBooleani_v)(GLenum, GLuint, GLboolean *); +#define glGetBooleani_v flextglGetBooleani_v +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetFramebufferParameteriv)(GLenum, GLenum, GLint *); +#define glGetFramebufferParameteriv flextglGetFramebufferParameteriv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetMultisamplefv)(GLenum, GLuint, GLfloat *); +#define glGetMultisamplefv flextglGetMultisamplefv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramInterfaceiv)(GLuint, GLenum, GLenum, GLint *); +#define glGetProgramInterfaceiv flextglGetProgramInterfaceiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetProgramPipelineInfoLog flextglGetProgramPipelineInfoLog +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineiv)(GLuint, GLenum, GLint *); +#define glGetProgramPipelineiv flextglGetProgramPipelineiv +GLAPI FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetProgramResourceIndex)(GLuint, GLenum, const GLchar *); +#define glGetProgramResourceIndex flextglGetProgramResourceIndex +GLAPI FLEXTGL_EXPORT GLint(APIENTRY *flextglGetProgramResourceLocation)(GLuint, GLenum, const GLchar *); +#define glGetProgramResourceLocation flextglGetProgramResourceLocation +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramResourceName)(GLuint, GLenum, GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetProgramResourceName flextglGetProgramResourceName +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramResourceiv)(GLuint, GLenum, GLuint, GLsizei, const GLenum *, GLsizei, GLsizei *, GLint *); +#define glGetProgramResourceiv flextglGetProgramResourceiv +GLAPI FLEXTGL_EXPORT void APIENTRY glGetTexLevelParameterfv(GLenum, GLint, GLenum, GLfloat *); +GLAPI FLEXTGL_EXPORT void APIENTRY glGetTexLevelParameteriv(GLenum, GLint, GLenum, GLint *); +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgramPipeline)(GLuint); +#define glIsProgramPipeline flextglIsProgramPipeline +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglMemoryBarrier)(GLbitfield); +#define glMemoryBarrier flextglMemoryBarrier +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglMemoryBarrierByRegion)(GLbitfield); +#define glMemoryBarrierByRegion flextglMemoryBarrierByRegion +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1f)(GLuint, GLint, GLfloat); +#define glProgramUniform1f flextglProgramUniform1f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fv)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform1fv flextglProgramUniform1fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1i)(GLuint, GLint, GLint); +#define glProgramUniform1i flextglProgramUniform1i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1iv)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform1iv flextglProgramUniform1iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1ui)(GLuint, GLint, GLuint); +#define glProgramUniform1ui flextglProgramUniform1ui +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uiv)(GLuint, GLint, GLsizei, const GLuint *); +#define glProgramUniform1uiv flextglProgramUniform1uiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2f)(GLuint, GLint, GLfloat, GLfloat); +#define glProgramUniform2f flextglProgramUniform2f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fv)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform2fv flextglProgramUniform2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2i)(GLuint, GLint, GLint, GLint); +#define glProgramUniform2i flextglProgramUniform2i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2iv)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform2iv flextglProgramUniform2iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2ui)(GLuint, GLint, GLuint, GLuint); +#define glProgramUniform2ui flextglProgramUniform2ui +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uiv)(GLuint, GLint, GLsizei, const GLuint *); +#define glProgramUniform2uiv flextglProgramUniform2uiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3f)(GLuint, GLint, GLfloat, GLfloat, GLfloat); +#define glProgramUniform3f flextglProgramUniform3f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fv)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform3fv flextglProgramUniform3fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3i)(GLuint, GLint, GLint, GLint, GLint); +#define glProgramUniform3i flextglProgramUniform3i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3iv)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform3iv flextglProgramUniform3iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3ui)(GLuint, GLint, GLuint, GLuint, GLuint); +#define glProgramUniform3ui flextglProgramUniform3ui +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uiv)(GLuint, GLint, GLsizei, const GLuint *); +#define glProgramUniform3uiv flextglProgramUniform3uiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4f)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat); +#define glProgramUniform4f flextglProgramUniform4f +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fv)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform4fv flextglProgramUniform4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4i)(GLuint, GLint, GLint, GLint, GLint, GLint); +#define glProgramUniform4i flextglProgramUniform4i +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4iv)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform4iv flextglProgramUniform4iv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4ui)(GLuint, GLint, GLuint, GLuint, GLuint, GLuint); +#define glProgramUniform4ui flextglProgramUniform4ui +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uiv)(GLuint, GLint, GLsizei, const GLuint *); +#define glProgramUniform4uiv flextglProgramUniform4uiv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix2fv flextglProgramUniformMatrix2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x3fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix2x3fv flextglProgramUniformMatrix2x3fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x4fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix2x4fv flextglProgramUniformMatrix2x4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix3fv flextglProgramUniformMatrix3fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x2fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix3x2fv flextglProgramUniformMatrix3x2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x4fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix3x4fv flextglProgramUniformMatrix3x4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix4fv flextglProgramUniformMatrix4fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x2fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix4x2fv flextglProgramUniformMatrix4x2fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x3fv)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix4x3fv flextglProgramUniformMatrix4x3fv +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglSampleMaski)(GLuint, GLbitfield); +#define glSampleMaski flextglSampleMaski +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage2DMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean); +#define glTexStorage2DMultisample flextglTexStorage2DMultisample +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUseProgramStages)(GLuint, GLbitfield, GLuint); +#define glUseProgramStages flextglUseProgramStages +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgramPipeline)(GLuint); +#define glValidateProgramPipeline flextglValidateProgramPipeline +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribBinding)(GLuint, GLuint); +#define glVertexAttribBinding flextglVertexAttribBinding +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribFormat)(GLuint, GLint, GLenum, GLboolean, GLuint); +#define glVertexAttribFormat flextglVertexAttribFormat +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexAttribIFormat)(GLuint, GLint, GLenum, GLuint); +#define glVertexAttribIFormat flextglVertexAttribIFormat +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglVertexBindingDivisor)(GLuint, GLuint); +#define glVertexBindingDivisor flextglVertexBindingDivisor + +/* GL_EXT_copy_image */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCopyImageSubDataEXT)(GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei); +#define glCopyImageSubDataEXT flextglCopyImageSubDataEXT + +/* GL_EXT_debug_label */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectLabelEXT)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetObjectLabelEXT flextglGetObjectLabelEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglLabelObjectEXT)(GLenum, GLuint, GLsizei, const GLchar *); +#define glLabelObjectEXT flextglLabelObjectEXT + +/* GL_EXT_debug_marker */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglInsertEventMarkerEXT)(GLsizei, const GLchar *); +#define glInsertEventMarkerEXT flextglInsertEventMarkerEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPopGroupMarkerEXT)(void); +#define glPopGroupMarkerEXT flextglPopGroupMarkerEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPushGroupMarkerEXT)(GLsizei, const GLchar *); +#define glPushGroupMarkerEXT flextglPushGroupMarkerEXT + +/* GL_EXT_disjoint_timer_query */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBeginQueryEXT)(GLenum, GLuint); +#define glBeginQueryEXT flextglBeginQueryEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteQueriesEXT)(GLsizei, const GLuint *); +#define glDeleteQueriesEXT flextglDeleteQueriesEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglEndQueryEXT)(GLenum); +#define glEndQueryEXT flextglEndQueryEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenQueriesEXT)(GLsizei, GLuint *); +#define glGenQueriesEXT flextglGenQueriesEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjecti64vEXT)(GLuint, GLenum, GLint64 *); +#define glGetQueryObjecti64vEXT flextglGetQueryObjecti64vEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectivEXT)(GLuint, GLenum, GLint *); +#define glGetQueryObjectivEXT flextglGetQueryObjectivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectui64vEXT)(GLuint, GLenum, GLuint64 *); +#define glGetQueryObjectui64vEXT flextglGetQueryObjectui64vEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryObjectuivEXT)(GLuint, GLenum, GLuint *); +#define glGetQueryObjectuivEXT flextglGetQueryObjectuivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetQueryivEXT)(GLenum, GLenum, GLint *); +#define glGetQueryivEXT flextglGetQueryivEXT +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsQueryEXT)(GLuint); +#define glIsQueryEXT flextglIsQueryEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglQueryCounterEXT)(GLuint, GLenum); +#define glQueryCounterEXT flextglQueryCounterEXT + +/* GL_EXT_draw_buffers_indexed */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationSeparateiEXT)(GLuint, GLenum, GLenum); +#define glBlendEquationSeparateiEXT flextglBlendEquationSeparateiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendEquationiEXT)(GLuint, GLenum); +#define glBlendEquationiEXT flextglBlendEquationiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendFuncSeparateiEXT)(GLuint, GLenum, GLenum, GLenum, GLenum); +#define glBlendFuncSeparateiEXT flextglBlendFuncSeparateiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendFunciEXT)(GLuint, GLenum, GLenum); +#define glBlendFunciEXT flextglBlendFunciEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglColorMaskiEXT)(GLuint, GLboolean, GLboolean, GLboolean, GLboolean); +#define glColorMaskiEXT flextglColorMaskiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDisableiEXT)(GLenum, GLuint); +#define glDisableiEXT flextglDisableiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglEnableiEXT)(GLenum, GLuint); +#define glEnableiEXT flextglEnableiEXT +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsEnablediEXT)(GLenum, GLuint); +#define glIsEnablediEXT flextglIsEnablediEXT + +/* GL_EXT_geometry_shader */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTextureEXT)(GLenum, GLenum, GLuint, GLint); +#define glFramebufferTextureEXT flextglFramebufferTextureEXT + +/* GL_EXT_multi_draw_arrays */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawArraysEXT)(GLenum, const GLint *, const GLsizei *, GLsizei); +#define glMultiDrawArraysEXT flextglMultiDrawArraysEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglMultiDrawElementsEXT)(GLenum, const GLsizei *, GLenum, const void *const*, GLsizei); +#define glMultiDrawElementsEXT flextglMultiDrawElementsEXT + +/* GL_EXT_multisampled_render_to_texture */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFramebufferTexture2DMultisampleEXT)(GLenum, GLenum, GLenum, GLuint, GLint, GLsizei); +#define glFramebufferTexture2DMultisampleEXT flextglFramebufferTexture2DMultisampleEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglRenderbufferStorageMultisampleEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei); +#define glRenderbufferStorageMultisampleEXT flextglRenderbufferStorageMultisampleEXT + +/* GL_EXT_primitive_bounding_box */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPrimitiveBoundingBoxEXT)(GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +#define glPrimitiveBoundingBoxEXT flextglPrimitiveBoundingBoxEXT + +/* GL_EXT_robustness */ + +GLAPI FLEXTGL_EXPORT GLenum(APIENTRY *flextglGetGraphicsResetStatusEXT)(void); +#define glGetGraphicsResetStatusEXT flextglGetGraphicsResetStatusEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformfvEXT)(GLuint, GLint, GLsizei, GLfloat *); +#define glGetnUniformfvEXT flextglGetnUniformfvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformivEXT)(GLuint, GLint, GLsizei, GLint *); +#define glGetnUniformivEXT flextglGetnUniformivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglReadnPixelsEXT)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void *); +#define glReadnPixelsEXT flextglReadnPixelsEXT + +/* GL_EXT_separate_shader_objects */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglActiveShaderProgramEXT)(GLuint, GLuint); +#define glActiveShaderProgramEXT flextglActiveShaderProgramEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindProgramPipelineEXT)(GLuint); +#define glBindProgramPipelineEXT flextglBindProgramPipelineEXT +GLAPI FLEXTGL_EXPORT GLuint(APIENTRY *flextglCreateShaderProgramvEXT)(GLenum, GLsizei, const GLchar **); +#define glCreateShaderProgramvEXT flextglCreateShaderProgramvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteProgramPipelinesEXT)(GLsizei, const GLuint *); +#define glDeleteProgramPipelinesEXT flextglDeleteProgramPipelinesEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenProgramPipelinesEXT)(GLsizei, GLuint *); +#define glGenProgramPipelinesEXT flextglGenProgramPipelinesEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineInfoLogEXT)(GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetProgramPipelineInfoLogEXT flextglGetProgramPipelineInfoLogEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetProgramPipelineivEXT)(GLuint, GLenum, GLint *); +#define glGetProgramPipelineivEXT flextglGetProgramPipelineivEXT +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsProgramPipelineEXT)(GLuint); +#define glIsProgramPipelineEXT flextglIsProgramPipelineEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramParameteriEXT)(GLuint, GLenum, GLint); +#define glProgramParameteriEXT flextglProgramParameteriEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fEXT)(GLuint, GLint, GLfloat); +#define glProgramUniform1fEXT flextglProgramUniform1fEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1fvEXT)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform1fvEXT flextglProgramUniform1fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1iEXT)(GLuint, GLint, GLint); +#define glProgramUniform1iEXT flextglProgramUniform1iEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1ivEXT)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform1ivEXT flextglProgramUniform1ivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uiEXT)(GLuint, GLint, GLuint); +#define glProgramUniform1uiEXT flextglProgramUniform1uiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform1uivEXT)(GLuint, GLint, GLsizei, const GLuint *); +#define glProgramUniform1uivEXT flextglProgramUniform1uivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fEXT)(GLuint, GLint, GLfloat, GLfloat); +#define glProgramUniform2fEXT flextglProgramUniform2fEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2fvEXT)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform2fvEXT flextglProgramUniform2fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2iEXT)(GLuint, GLint, GLint, GLint); +#define glProgramUniform2iEXT flextglProgramUniform2iEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2ivEXT)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform2ivEXT flextglProgramUniform2ivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uiEXT)(GLuint, GLint, GLuint, GLuint); +#define glProgramUniform2uiEXT flextglProgramUniform2uiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform2uivEXT)(GLuint, GLint, GLsizei, const GLuint *); +#define glProgramUniform2uivEXT flextglProgramUniform2uivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat); +#define glProgramUniform3fEXT flextglProgramUniform3fEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3fvEXT)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform3fvEXT flextglProgramUniform3fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3iEXT)(GLuint, GLint, GLint, GLint, GLint); +#define glProgramUniform3iEXT flextglProgramUniform3iEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3ivEXT)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform3ivEXT flextglProgramUniform3ivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uiEXT)(GLuint, GLint, GLuint, GLuint, GLuint); +#define glProgramUniform3uiEXT flextglProgramUniform3uiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform3uivEXT)(GLuint, GLint, GLsizei, const GLuint *); +#define glProgramUniform3uivEXT flextglProgramUniform3uivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fEXT)(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat); +#define glProgramUniform4fEXT flextglProgramUniform4fEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4fvEXT)(GLuint, GLint, GLsizei, const GLfloat *); +#define glProgramUniform4fvEXT flextglProgramUniform4fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4iEXT)(GLuint, GLint, GLint, GLint, GLint, GLint); +#define glProgramUniform4iEXT flextglProgramUniform4iEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4ivEXT)(GLuint, GLint, GLsizei, const GLint *); +#define glProgramUniform4ivEXT flextglProgramUniform4ivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uiEXT)(GLuint, GLint, GLuint, GLuint, GLuint, GLuint); +#define glProgramUniform4uiEXT flextglProgramUniform4uiEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniform4uivEXT)(GLuint, GLint, GLsizei, const GLuint *); +#define glProgramUniform4uivEXT flextglProgramUniform4uivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix2fvEXT flextglProgramUniformMatrix2fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix2x3fvEXT flextglProgramUniformMatrix2x3fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix2x4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix2x4fvEXT flextglProgramUniformMatrix2x4fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix3fvEXT flextglProgramUniformMatrix3fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix3x2fvEXT flextglProgramUniformMatrix3x2fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix3x4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix3x4fvEXT flextglProgramUniformMatrix3x4fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix4fvEXT flextglProgramUniformMatrix4fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x2fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix4x2fvEXT flextglProgramUniformMatrix4x2fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglProgramUniformMatrix4x3fvEXT)(GLuint, GLint, GLsizei, GLboolean, const GLfloat *); +#define glProgramUniformMatrix4x3fvEXT flextglProgramUniformMatrix4x3fvEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglUseProgramStagesEXT)(GLuint, GLbitfield, GLuint); +#define glUseProgramStagesEXT flextglUseProgramStagesEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglValidateProgramPipelineEXT)(GLuint); +#define glValidateProgramPipelineEXT flextglValidateProgramPipelineEXT + +/* GL_EXT_tessellation_shader */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPatchParameteriEXT)(GLenum, GLint); +#define glPatchParameteriEXT flextglPatchParameteriEXT + +/* GL_EXT_texture_border_clamp */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterIivEXT)(GLuint, GLenum, GLint *); +#define glGetSamplerParameterIivEXT flextglGetSamplerParameterIivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetSamplerParameterIuivEXT)(GLuint, GLenum, GLuint *); +#define glGetSamplerParameterIuivEXT flextglGetSamplerParameterIuivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterIivEXT)(GLenum, GLenum, GLint *); +#define glGetTexParameterIivEXT flextglGetTexParameterIivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterIuivEXT)(GLenum, GLenum, GLuint *); +#define glGetTexParameterIuivEXT flextglGetTexParameterIuivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterIivEXT)(GLuint, GLenum, const GLint *); +#define glSamplerParameterIivEXT flextglSamplerParameterIivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglSamplerParameterIuivEXT)(GLuint, GLenum, const GLuint *); +#define glSamplerParameterIuivEXT flextglSamplerParameterIuivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIivEXT)(GLenum, GLenum, const GLint *); +#define glTexParameterIivEXT flextglTexParameterIivEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterIuivEXT)(GLenum, GLenum, const GLuint *); +#define glTexParameterIuivEXT flextglTexParameterIuivEXT + +/* GL_EXT_texture_buffer */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexBufferEXT)(GLenum, GLenum, GLuint); +#define glTexBufferEXT flextglTexBufferEXT +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexBufferRangeEXT)(GLenum, GLenum, GLuint, GLintptr, GLsizeiptr); +#define glTexBufferRangeEXT flextglTexBufferRangeEXT + +/* GL_KHR_blend_equation_advanced */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendBarrierKHR)(void); +#define glBlendBarrierKHR flextglBlendBarrierKHR + +/* GL_KHR_debug */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageCallbackKHR)(GLDEBUGPROCKHR, const void *); +#define glDebugMessageCallbackKHR flextglDebugMessageCallbackKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageControlKHR)(GLenum, GLenum, GLenum, GLsizei, const GLuint *, GLboolean); +#define glDebugMessageControlKHR flextglDebugMessageControlKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDebugMessageInsertKHR)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar *); +#define glDebugMessageInsertKHR flextglDebugMessageInsertKHR +GLAPI FLEXTGL_EXPORT GLuint(APIENTRY *flextglGetDebugMessageLogKHR)(GLuint, GLsizei, GLenum *, GLenum *, GLuint *, GLenum *, GLsizei *, GLchar *); +#define glGetDebugMessageLogKHR flextglGetDebugMessageLogKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectLabelKHR)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *); +#define glGetObjectLabelKHR flextglGetObjectLabelKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetObjectPtrLabelKHR)(const void *, GLsizei, GLsizei *, GLchar *); +#define glGetObjectPtrLabelKHR flextglGetObjectPtrLabelKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetPointervKHR)(GLenum, void **); +#define glGetPointervKHR flextglGetPointervKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglObjectLabelKHR)(GLenum, GLuint, GLsizei, const GLchar *); +#define glObjectLabelKHR flextglObjectLabelKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglObjectPtrLabelKHR)(const void *, GLsizei, const GLchar *); +#define glObjectPtrLabelKHR flextglObjectPtrLabelKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPopDebugGroupKHR)(void); +#define glPopDebugGroupKHR flextglPopDebugGroupKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPushDebugGroupKHR)(GLenum, GLuint, GLsizei, const GLchar *); +#define glPushDebugGroupKHR flextglPushDebugGroupKHR + +/* GL_KHR_robustness */ + +GLAPI FLEXTGL_EXPORT GLenum(APIENTRY *flextglGetGraphicsResetStatusKHR)(void); +#define glGetGraphicsResetStatusKHR flextglGetGraphicsResetStatusKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformfvKHR)(GLuint, GLint, GLsizei, GLfloat *); +#define glGetnUniformfvKHR flextglGetnUniformfvKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformivKHR)(GLuint, GLint, GLsizei, GLint *); +#define glGetnUniformivKHR flextglGetnUniformivKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetnUniformuivKHR)(GLuint, GLint, GLsizei, GLuint *); +#define glGetnUniformuivKHR flextglGetnUniformuivKHR +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglReadnPixelsKHR)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void *); +#define glReadnPixelsKHR flextglReadnPixelsKHR + +/* GL_NV_polygon_mode */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPolygonModeNV)(GLenum, GLenum); +#define glPolygonModeNV flextglPolygonModeNV + +/* GL_OES_mapbuffer */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetBufferPointervOES)(GLenum, GLenum, void **); +#define glGetBufferPointervOES flextglGetBufferPointervOES +GLAPI FLEXTGL_EXPORT void *(APIENTRY *flextglMapBufferOES)(GLenum, GLenum); +#define glMapBufferOES flextglMapBufferOES +GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglUnmapBufferOES)(GLenum); +#define glUnmapBufferOES flextglUnmapBufferOES + +/* GL_OES_sample_shading */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglMinSampleShadingOES)(GLfloat); +#define glMinSampleShadingOES flextglMinSampleShadingOES + +/* GL_OES_texture_storage_multisample_2d_array */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexStorage3DMultisampleOES)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean); +#define glTexStorage3DMultisampleOES flextglTexStorage3DMultisampleOES + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h.template b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h.template new file mode 100644 index 000000000..eb9961c93 --- /dev/null +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h.template @@ -0,0 +1,94 @@ +@require(passthru, functions, enums, options, version, extensions) +#ifndef _flextgl_h_ +#define _flextgl_h_ + +#include + +#include "Magnum/configure.h" + +/* Defensive include guards */ + +#if defined(__gl_h_) || defined(__gl2_h_) || defined(__gl3_h_) || defined(__gl31_h_) +#error Attempt to include auto-generated header after including gl3.h +#endif +#if defined(__gl2ext_h_) || defined(__gl3ext_h_) +#error Attempt to include auto-generated header after including gl3ext.h +#endif +#if defined(__gl2platform_h_) || defined(__gl3platform_h_) +#error Attempt to include auto-generated header after including gl3platform.h +#endif + +#define __gl_h_ +#define __gl2_h_ +#define __gl3_h_ +#define __gl31_h_ +#define __gl2ext_h_ +#define __gl3ext_h_ +#define __gl2platform_h_ +#define __gl3platform_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +void flextGLInit(); + +/* Function declaration macros */ + +#ifndef MAGNUM_BUILD_STATIC + #ifdef FlextGL_EXPORTS + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_EXPORT + #else + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_IMPORT + #endif +#else + #define FLEXTGL_EXPORT CORRADE_VISIBILITY_STATIC +#endif + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#ifndef WINAPI +#define WINAPI __stdcall +#endif +#define APIENTRY WINAPI +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/* Data types */ + +@passthru + +/* Enums */ + +@enums + +/* Function prototypes */ +@for cat,funcs in functions: +@if funcs: + +/* GL_@cat */ + + @for f in funcs: + @if f.name in ['BlendFunc', 'Clear', 'ClearColor', 'ClearDepth', 'ClearStencil', 'ColorMask', 'CullFace', 'DepthFunc', 'DepthMask', 'DepthRange', 'Disable', 'DrawBuffer', 'Enable', 'Finish', 'Flush', 'FrontFace', 'GetBooleanv', 'GetDoublev', 'GetError', 'GetFloatv', 'GetIntegerv', 'GetString', 'GetTexImage', 'GetTexLevelParameterfv', 'GetTexLevelParameteriv', 'GetTexParameterfv', 'GetTexParameteriv', 'Hint', 'IsEnabled', 'LineWidth', 'LogicOp', 'PixelStoref', 'PixelStorei', 'PointSize', 'PolygonMode', 'ReadBuffer', 'ReadPixels', 'Scissor', 'StencilFunc', 'StencilMask', 'StencilOp', 'TexImage1D', 'TexImage2D', 'TexParameterf', 'TexParameterfv', 'TexParameteri', 'TexParameteriv', 'Viewport', 'BindTexture', 'CopyTexImage1D', 'CopyTexImage2D', 'CopyTexSubImage1D', 'CopyTexSubImage2D', 'DeleteTextures', 'DrawArrays', 'DrawElements', 'GenTextures', 'IsTexture', 'PolygonOffset', 'TexSubImage1D', 'TexSubImage2D']: +GLAPI FLEXTGL_EXPORT @f.returntype APIENTRY gl@f.name\ +(@f.param_type_list_string()); + @else: +GLAPI FLEXTGL_EXPORT @f.returntype\ +(APIENTRY *flextgl@f.name)(@f.param_type_list_string()); +#define gl@f.name flextgl@f.name + @end + @end +@end +@end + +#ifdef __cplusplus +} +#endif + +#endif From 1ae1f3d41911d04faf9a4960a1fb27e6feeb028d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 15:38:00 +0200 Subject: [PATCH 225/290] package/ci: add desktop GLES builds on Linux and Windows. --- package/ci/appveyor-desktop-gles.bat | 47 ++++++++++++++++++++++++++++ package/ci/appveyor.yml | 6 ++++ package/ci/travis-desktop-gles.sh | 42 +++++++++++++++++++++++++ package/ci/travis.yml | 25 +++++++++++---- 4 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 package/ci/appveyor-desktop-gles.bat create mode 100755 package/ci/travis-desktop-gles.sh diff --git a/package/ci/appveyor-desktop-gles.bat b/package/ci/appveyor-desktop-gles.bat new file mode 100644 index 000000000..b26c664cf --- /dev/null +++ b/package/ci/appveyor-desktop-gles.bat @@ -0,0 +1,47 @@ +call "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/vcvarsall.bat" x64 || exit /b +set PATH=%APPVEYOR_BUILD_FOLDER%/openal/bin/Win64;%APPVEYOR_BUILD_FOLDER%\deps\bin;%PATH% + +rem Build Corrade +git clone --depth 1 git://github.com/mosra/corrade.git || exit /b +cd corrade || exit /b +mkdir build && cd build || exit /b +cmake .. ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ + -DWITH_INTERCONNECT=OFF ^ + -G Ninja || exit /b +cmake --build . || exit /b +cmake --build . --target install || exit /b +cd .. && cd .. + +rem Build +mkdir build && cd build || exit /b +cmake .. ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ + -DCMAKE_PREFIX_PATH="%APPVEYOR_BUILD_FOLDER%/openal" ^ + -DTARGET_GLES=ON ^ + -DTARGET_GLES2=%TARGET_GLES2% ^ + -DTARGET_DESKTOP_GLES=ON ^ + -DWITH_AUDIO=ON ^ + -DWITH_SDL2APPLICATION=OFF ^ + -DWITH_WINDOWLESSWGLAPPLICATION=ON ^ + -DWITH_WGLCONTEXT=ON ^ + -DWITH_MAGNUMFONT=ON ^ + -DWITH_MAGNUMFONTCONVERTER=ON ^ + -DWITH_OBJIMPORTER=ON ^ + -DWITH_TGAIMAGECONVERTER=ON ^ + -DWITH_TGAIMPORTER=ON ^ + -DWITH_WAVAUDIOIMPORTER=ON ^ + -DWITH_DISTANCEFIELDCONVERTER=OFF ^ + -DWITH_FONTCONVERTER=OFF ^ + -DWITH_MAGNUMINFO=ON ^ + -DWITH_AL_INFO=ON ^ + -DBUILD_TESTS=ON ^ + -DBUILD_GL_TESTS=ON ^ + -G Ninja || exit /b +cmake --build . || exit /b +cmake --build . --target install || exit /b + +rem Test +ctest -V -E GLTest || exit /b diff --git a/package/ci/appveyor.yml b/package/ci/appveyor.yml index fe32a6125..674932a2a 100644 --- a/package/ci/appveyor.yml +++ b/package/ci/appveyor.yml @@ -10,6 +10,10 @@ environment: COMPILER: msvc - TARGET: desktop COMPILER: mingw + - TARGET: desktop-gles + TARGET_GLES2: ON + - TARGET: desktop-gles + TARGET_GLES2: OFF - TARGET: rt TARGET_GLES2: ON - TARGET: rt @@ -31,6 +35,7 @@ install: - IF NOT "%TARGET%" == "rt" IF NOT EXIST %APPVEYOR_BUILD_FOLDER%\openal-soft-1.17.2-bin.zip appveyor DownloadFile http://kcat.strangesoft.net/openal-binaries/openal-soft-1.17.2-bin.zip - IF NOT "%TARGET%" == "rt" 7z x openal-soft-1.17.2-bin.zip && ren openal-soft-1.17.2-bin openal && echo [General] > %APPDATA%/alsoft.ini & echo drivers=null >> %APPDATA%/alsoft.ini - IF "%TARGET%" == "desktop" ren openal\bin\Win64\soft_oal.dll OpenAL32.dll +- IF "%TARGET%" == "desktop-gles" ren openal\bin\Win64\soft_oal.dll OpenAL32.dll # SDL2 - IF "%TARGET%" == "desktop" IF "%COMPILER%" == "msvc" IF NOT EXIST %APPVEYOR_BUILD_FOLDER%\SDL2-devel-2.0.4-VC.zip appveyor DownloadFile http://www.libsdl.org/release/SDL2-devel-2.0.4-VC.zip @@ -41,6 +46,7 @@ install: build_script: - IF "%TARGET%" == "desktop" IF "%COMPILER%" == "msvc" call package\ci\appveyor-desktop.bat - IF "%TARGET%" == "desktop" IF "%COMPILER%" == "mingw" call package\ci\appveyor-desktop-mingw.bat +- IF "%TARGET%" == "desktop-gles" call package\ci\appveyor-desktop-gles.bat - IF "%TARGET%" == "rt" call package\ci\appveyor-rt.bat cache: diff --git a/package/ci/travis-desktop-gles.sh b/package/ci/travis-desktop-gles.sh new file mode 100755 index 000000000..45b4e95fa --- /dev/null +++ b/package/ci/travis-desktop-gles.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -ev + +# Corrade +git clone --depth 1 git://github.com/mosra/corrade.git +cd corrade +mkdir build && cd build +cmake .. \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps \ + -DCMAKE_INSTALL_RPATH=$HOME/deps/lib \ + -DCMAKE_BUILD_TYPE=Debug \ + -DWITH_INTERCONNECT=OFF +make -j install +cd ../.. + +mkdir build && cd build +cmake .. \ + -DCMAKE_CXX_FLAGS=$COVERAGE \ + -DCMAKE_PREFIX_PATH="$HOME/deps" \ + -DCMAKE_BUILD_TYPE=Debug \ + -DTARGET_GLES=ON \ + -DTARGET_GLES2=$TARGET_GLES2 \ + -DTARGET_DESKTOP_GLES=ON \ + -DWITH_AUDIO=ON \ + -DWITH_GLFWAPPLICATION=OFF \ + -DWITH_SDL2APPLICATION=OFF \ + -DWITH_WINDOWLESS${PLATFORM_GL_API}APPLICATION=ON \ + -DWITH_${PLATFORM_GL_API}CONTEXT=ON \ + -DWITH_MAGNUMFONT=ON \ + -DWITH_MAGNUMFONTCONVERTER=ON \ + -DWITH_OBJIMPORTER=ON \ + -DWITH_TGAIMAGECONVERTER=ON \ + -DWITH_TGAIMPORTER=ON \ + -DWITH_WAVAUDIOIMPORTER=ON \ + -DWITH_DISTANCEFIELDCONVERTER=OFF \ + -DWITH_FONTCONVERTER=OFF \ + -DWITH_MAGNUMINFO=ON \ + -DWITH_AL_INFO=ON \ + -DBUILD_TESTS=ON \ + -DBUILD_GL_TESTS=ON +make -j${JOBS_LIMIT} +CORRADE_TEST_COLOR=ON ctest -V -E GLTest diff --git a/package/ci/travis.yml b/package/ci/travis.yml index 3086360e6..d378d7390 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -10,6 +10,18 @@ matrix: - TARGET=desktop # Otherwise the job gets killed (probably because using too much memory) - JOBS_LIMIT=4 + - os: linux + compiler: gcc + env: + - TARGET=desktop-gles + - TARGET_GLES2=ON + - JOBS_LIMIT=4 + - os: linux + compiler: gcc + env: + - TARGET=desktop-gles + - TARGET_GLES2=OFF + - JOBS_LIMIT=4 - os: osx compiler: clang env: TARGET=desktop @@ -57,7 +69,7 @@ cache: - $HOME/sdl2 install: -- if [ "$TRAVIS_OS_NAME" == "linux" ]; then pip install --user cpp-coveralls && export COVERAGE="--coverage"; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "desktop" ]; then pip install --user cpp-coveralls && export COVERAGE="--coverage"; fi - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export CXX=g++-4.7; fi @@ -65,19 +77,20 @@ install: - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then export PLATFORM_GL_API=CGL; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then gem install xcpretty; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then brew install emscripten && export LLVM=/usr/local/opt/emscripten/libexec/llvm/bin && emcc; fi -- if [ "$TARGET" == "desktop" ]; then printf "[General]\ndrivers=null" > ~/.alsoftrc; fi +- if [ "$TARGET" == "desktop" ] || [ "$TARGET" == "desktop-gles" ]; then printf "[General]\ndrivers=null" > ~/.alsoftrc; fi # SDL (cached) - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then brew install sdl2; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then curl -O https://www.libsdl.org/release/SDL2-2.0.4.tar.gz && tar -xzvf SDL2-2.0.4.tar.gz && cd SDL2-2.0.4/Xcode-iOS/SDL && xcodebuild -sdk iphonesimulator9.3 | xcpretty && mkdir -p ../../../sdl2/lib && cp build/Release-iphonesimulator/libSDL2.a ../../../sdl2/lib && mkdir -p ../../../sdl2/include/SDL2 && cp -R ../../include/* ../../../sdl2/include/SDL2 && cd ../../..; fi -- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ ! -e "$HOME/sdl2/include" ]; then curl -O http://www.libsdl.org/release/SDL2-2.0.4.tar.gz && tar -xzvf SDL2-2.0.4.tar.gz && cd SDL2-2.0.4 && mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/sdl2 -DCMAKE_BUILD_TYPE=Release && cmake --build . --target install && cd ../..; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "desktop" ] && [ ! -e "$HOME/sdl2/include" ]; then curl -O http://www.libsdl.org/release/SDL2-2.0.4.tar.gz && tar -xzvf SDL2-2.0.4.tar.gz && cd SDL2-2.0.4 && mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/sdl2 -DCMAKE_BUILD_TYPE=Release && cmake --build . --target install && cd ../..; fi # GLFW (cached) - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then brew install homebrew/versions/glfw3; fi -- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ ! -e "$HOME/glfw/include" ]; then wget https://github.com/glfw/glfw/releases/download/3.1.2/glfw-3.1.2.zip && unzip glfw-3.1.2.zip && cd glfw-3.1.2 && mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/glfw -DCMAKE_BUILD_TYPE=Release -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF -DGLFW_BUILD_DOCS=OFF && cmake --build . --target install && cd ../..; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "desktop" ] && [ ! -e "$HOME/glfw/include" ]; then wget https://github.com/glfw/glfw/releases/download/3.1.2/glfw-3.1.2.zip && unzip glfw-3.1.2.zip && cd glfw-3.1.2 && mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/glfw -DCMAKE_BUILD_TYPE=Release -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF -DGLFW_BUILD_DOCS=OFF && cmake --build . --target install && cd ../..; fi script: -- if [ "$TRAVIS_OS_NAME" == "linux" ]; then ./package/ci/travis-desktop.sh; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "desktop" ]; then ./package/ci/travis-desktop.sh; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "desktop-gles" ]; then ./package/ci/travis-desktop-gles.sh; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then ./package/ci/travis-desktop.sh; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then ./package/ci/travis-ios-simulator.sh; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then ./package/ci/travis-emscripten.sh; fi @@ -86,4 +99,4 @@ script: after_success: # Ignoring all stuff that needs GL context and thus can't be run on Travis -- if [ "$TRAVIS_OS_NAME" == "linux" ]; then coveralls --gcov /usr/bin/gcov-4.7 -i src/ -E "(.*/(Test|MagnumExternal|Shaders|Platform)/.*|.*/src/Magnum/(AbstractFramebuffer|AbstractObject|AbstractQuery|AbstractShaderProgram|AbstractTexture|Buffer|BufferImage|BufferTexture|Context|CubeMapTexture|CubeMapTextureArray|DebugOutput|DefaultFramebuffer|Framebuffer|Mesh|MeshView|MultisampleTexture|OpenGL|PixelStorage|PrimitiveQuery|RectangleTexture|Renderbuffer|Renderer|SampleQuery|Sampler|Shader|Texture|TextureArray|TimeQuery|TransformFeedback|Implementation/BufferState|Implementation/DebugState|Implementation/driverSpecific|Implementation/FramebufferState|Implementation/maxTextureSize|Implementation/MeshState|Implementation/QueryState|Implementation/RendererState|Implementation/ShaderProgramState|Implementation/ShaderState|Implementation/State|Implementation/TextureState|Implementation/TransformFeedbackState)\\.(cpp|h))" --gcov-options '\-lp'; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "desktop" ]; then coveralls --gcov /usr/bin/gcov-4.7 -i src/ -E "(.*/(Test|MagnumExternal|Shaders|Platform)/.*|.*/src/Magnum/(AbstractFramebuffer|AbstractObject|AbstractQuery|AbstractShaderProgram|AbstractTexture|Buffer|BufferImage|BufferTexture|Context|CubeMapTexture|CubeMapTextureArray|DebugOutput|DefaultFramebuffer|Framebuffer|Mesh|MeshView|MultisampleTexture|OpenGL|PixelStorage|PrimitiveQuery|RectangleTexture|Renderbuffer|Renderer|SampleQuery|Sampler|Shader|Texture|TextureArray|TimeQuery|TransformFeedback|Implementation/BufferState|Implementation/DebugState|Implementation/driverSpecific|Implementation/FramebufferState|Implementation/maxTextureSize|Implementation/MeshState|Implementation/QueryState|Implementation/RendererState|Implementation/ShaderProgramState|Implementation/ShaderState|Implementation/State|Implementation/TextureState|Implementation/TransformFeedbackState)\\.(cpp|h))" --gcov-options '\-lp' > /dev/null; fi From 4b9e44ed26386a63acbd7b5eb60d981358ae730b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 20:07:58 +0200 Subject: [PATCH 226/290] package/ci: temporarily disable GLES3 build on Linux. The drivers on Ubuntu 12.04 are just too old and they miss some required entrypoints. --- package/ci/travis.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/package/ci/travis.yml b/package/ci/travis.yml index d378d7390..0d6a612d1 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -16,12 +16,14 @@ matrix: - TARGET=desktop-gles - TARGET_GLES2=ON - JOBS_LIMIT=4 - - os: linux - compiler: gcc - env: - - TARGET=desktop-gles - - TARGET_GLES2=OFF - - JOBS_LIMIT=4 + # Disabled because the Ubuntu 12.04 drivers are missing some ES3 entrypoints + # Should be enabled after moving to 14.04 + #- os: linux + #compiler: gcc + #env: + #- TARGET=desktop-gles + #- TARGET_GLES2=OFF + #- JOBS_LIMIT=4 - os: osx compiler: clang env: TARGET=desktop From 7689e991d374f7b5d4fe52858d36f4b7541c8069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 20:09:02 +0200 Subject: [PATCH 227/290] Doc++ --- doc/building.dox | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/building.dox b/doc/building.dox index 0be3f9d1b..018c07f41 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -244,10 +244,10 @@ on Linux, Mac OS X and Windows, also disabled by default: information about OpenAL capabilities. - `WITH_DISTANCEFIELDCONVERTER` - @ref magnum-distancefieldconverter "magnum-distancefieldconverter" executable for converting black&white images to distance field textures. - Enables also building of TextureTools library. + Enables also building of @ref TextureTools library. - `WITH_FONTCONVERTER` - @ref magnum-fontconverter "magnum-fontconverter" executable for converting fonts to raster ones. Enables also building of - Text library. + @ref Text library. Magnum also contains a set of dependency-less plugins for importing essential file formats. Additional plugins are provided in separate plugin repository, From 92083ea9e3f03d6f802e50c97314eb05eb4c9de4 Mon Sep 17 00:00:00 2001 From: Alice Date: Fri, 7 Oct 2016 18:49:39 -0400 Subject: [PATCH 228/290] WavAudioImporter: Shrink example WAV files --- .../WavAudioImporter/Test/mono24.wav | Bin 2816 -> 88 bytes .../WavAudioImporter/Test/mono8ALaw.wav | Bin 23948 -> 4188 bytes .../WavAudioImporter/Test/mono8MuLaw.wav | Bin 23948 -> 4188 bytes .../WavAudioImporter/Test/stereo16.wav | Bin 4100 -> 82 bytes .../WavAudioImporter/Test/stereo8ALaw.wav | Bin 47210 -> 4242 bytes .../WavAudioImporter/Test/stereo8MuLaw.wav | Bin 47210 -> 4242 bytes .../Test/surround51Channel16.wav | Bin 329980 -> 4194 bytes .../Test/surround71Channel24.wav | Bin 9273320 -> 4182 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/MagnumPlugins/WavAudioImporter/Test/mono24.wav b/src/MagnumPlugins/WavAudioImporter/Test/mono24.wav index 5d733ec46954aaf87046fec9f885943a3a26e847..4afeca1d16056379ffdf50e6c13db5d4eb404615 100644 GIT binary patch literal 88 zcmWIYbaM+}U|(RcqZ{6G4imEp;M0R1Kw0RR91 literal 2816 zcmWlbc{r8%8;76o`<^9xB)hbz%(O63Bcim}vJ}FpM3iKvEK_Mp+6$p6(ndpNom4Xk zO{196VnmXXL_bA06z!c6`|X9Odbya!T1INyIOZDZ(>^xi$==2RP+-D9OY-9$dc#DXbtS z8R!!NzZ3FvCrMP$4YhQQJEok*v@3XEm``xTEuCm!gEk_jsF!h00uLz&KElWVzdo3I z8^9|yP%RTUeTJ?0qOjr>vo)~V-Jb5ht_oA%lsx0`Dyt#{TG0f?7eL2Ikak@V8Ne#Lk`_nBByVX|l(clFw6s`i<05~(RQ{lI zG_hsu`=?_oBD(eubc9=eaklIa34yA6(j{F3qgN-eZ!CJ8v~pi{Tdt;mSQsuzm>pPa z;Coo_vcRd-%r5DswtT)iF@=~dZKjzGkDj)uylRJCU8n6n26vF-Yc-a5N?kwoT@rI5 zM}2wY%(`Yg658t4A#iTeF1p_4=5l}Ky!Q?6YK}$1jLL!56rGh7b_?9UO$}Asw?o^; zLpkH@=rRi`p`Yij>`Y4-v0pXhKSU=kCqLwYsPxFcJFN;S-ntjekn;;5!L6bmX&Jc-Pg^p)0TxP9honVR~D8k5u-=) zt)IUf7xmoE9G>>P=i+zWT_y7MmO_u|yys5-^mOH&yVd_{6nO83JVR0A|F~IIL#O7l zJ;vkK9)Zi*76P0s4BZx@?wed93EgW9-(&qZ4DKlM5C8_qb|z zenu9XuPw~zR#;jL*);XfxH{S?5KS#qt#MVc_E8&4Q@WSTyfop;Ol8g1^5Wi+pNj{A zevoR{E8cYQQJG-z4f`fjNvx+F48rAfoKCJ%*e*2NGj=jX>LHZgYM0u-ldiIp7i)75 z8W3KKU9O1h^w^Eo!p>~rYCq_p{Qbpv@+^&;%OCCK)Am8JlHh5C=unB6e>E;ATzoV` z@HP(2UMNfo6t-#n$s^o0F*mcEfAKvSE+HqA!94?}T0-7hI`JsoHOj9OaPfQT+b}Y+ z2u?U+i4=UZSuJm2SD5h7pkRXz+o(@sI`NSub<^jLZ&s`_=DNN3)!t}&g^7M9kmRzQ z35i+)NBkgTgs%}RJeP2(3DjJhR$7R`#>T-t3ffOyhQ98VUh-ae){0Z{>}x z>E=Rin>P)aPuA`sDL;{e_N43p(^Aha$|f>Hh|U2s8?dUSvybvtx2S9xiA^E@m_k`L zI;3F#?^G?Hx0u8C@8xO}xU0wbE&5bDfNqyiTR9)LlLl?V>VBN#1X0a+CyyGX^RX#> z$yBQTimL0vg;#Lio~#RG40kf&&xvy{`MHH~E+kQpybC0$56JCOk}M{hD&Y7{&WSlW3j~ zHC;s;s`>aHp7p1Ck#zG-YF0*l{n7qM5FG=@5U{-sxAuYBHaNW*lEvWG`}L0Xw@}j- zs%C@27vrVWWChx7!*oYDzVm_;p%PiZ|}y301sNj!Bu276HLk z=vRP>X`tx_*%P2`0;Cr~kOfgSBEOVE@Hx1lLktrMKb3sRgRw!_B_#F>K&v04tUAi)t$&cpeW7&EV+DbGXN&QX8-2gGY zc+DOC+UcWa8vK#&m(o4%xK#yCmcy|>z;7w6HGv1Sp?N-Ra|X#YIPnlW0t;~C?tdf*h6m@ z-cG@V5=@zol`K|&gSwHpED^uDIpPZ9^PrUirTze3z;A+-#bELp?c;F739Uw{cM*MD zOPT5DwgJtm@EXQ58v&^opaH^5}zAlZv)-; zoW74l$y9LJ24#V8(+2uAz`hctS*V|j>Lr-13?3ZHafr5yKaz@%AFCjsq1SZWK8 z33TP7WHV~n;Xgj8RfIVPaIY2O{YkM2ng0nyfBr|lTnI0%pw|%wH$cKN=#$}s9K0Qd iG2s}Mh;3Q_C2I|jP391z1u9wCFTtWfWG`V?8~z^(a+P)f diff --git a/src/MagnumPlugins/WavAudioImporter/Test/mono8ALaw.wav b/src/MagnumPlugins/WavAudioImporter/Test/mono8ALaw.wav index bc3ff161e53a3a0f5133888a234fda7f6441d20d..80ed96f1036684b57885fa55c030f7916fb7baca 100644 GIT binary patch delta 63 zcmeC#&3H$FEy&Z&Eks}SJ?UPuRW@@HqVxVVe RV91b?Sdz#fu+f4^008MH4uSvx literal 23948 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 RV91b?Sdz#fu+f4^008MH4uSvx delta 19979 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%0AhBvOxPfo2( z&C_+!qK20*fCnh9u5Shn!}6MXReO3xYlQQYpiZl8B;cK=$nEyNaqHx0Te~(twYW01 zd#-7y#S|12=NH0mWE>keS5#{oTSwRA&K4*?pwR6^iuLSn|Md1a8ukwe82;;{jg{&7 zm2u6%a(gqe2-uGNqS8_ft^Yu~4WyIq;EprYhG}lVw6}LNlz#K2(ZuNlwpzc}4fZO$)DPiv+($Qzv%gu;TC5L_zCo27kw>h0x~jaAjw@i`rjL&Isd z#?H=uNy2e{>%56Fq`ic`E(F(&AE0m(?wbq4@xksc97)w_wI_y?0ZKm#(@<4cSJTkk zjAwIfM$_Tm(f;8noU-6h2v}?f2m!H_KB}MRzV+SQIIRx9+i`Ebx;2~3@L?b4ch0zo z2A}YO$K!~-LrgfTZN0v_IEPR8h=`b^J_3m6ySi`)o-i;#7s;KrGsB@?ui5|)ysp06 zjkgWeSJu2N0Y0^^v61fg?Cor;p?tLk`j)tY)eUQc#p8)&GAkByS!__Oc6maH1QZ4( ziD)7i2nRxd2zhKK6^_M1% z9GYzoY7f2{18VvD`i90<9Es(=F`pbA9UdD@7gl#f%w|x?sUiny2<8LiLe%fFS#B;b z&d<)y&Y_fVvAKc>97iJc^%9}l-#192Gr54ZKzneT`gE6bIC6A(Yq3J1#qs|abMH!R z15p^q{U|DvhDS)_8D~7hBqSJ8Fhk;if;`B`NNXutUG_!E1Eeq*gpKaX|4^h%8;uLO z*ww{u_WZs*tQ*%Xj_q?p0q10PJUgKw#kU`;xQ1gko9(U~x;*Riu4Fj+Bh6v%e%(=x z{at8#es+5L>FDzjy7bjqwX)-hi1_Bd9I`Of$xu-x5XvDme!u0#72C(+q1Zix$|SLo z8P|24>uU#zG2YE8q6f;*?O%2eM8KaI!RL{;SsSVbI`EYjtOMvgh;*3$4D(RODuZR9 z3>~LK+}8PX)$Vgr0BMAThl({_u9DQ()I8SE2SM=V>h=cyhtfqYFr2Qhv#iIzQv{sf z62q@BFA;vBbwv}CrFZKQ-$p)$wr|SjrQ*MZdJw=)a0sZMujn>n&*pjVk(**mR9#Y* z;Q@+0fo4(xiurV;2SZ(@6337H;I%-6%b5gyL3W0mc(~{LUf{9EUZp9E(`qNHE9{{v zTSCwKs+Cv+=#4(Y3>G5Rtj`PXF xwXF-^o-6y(`W{>FJ@@ju{Xa wJ4v04(j~du$jWJs$v>@O2q1s}0tg_000IagfB*srAn-4Nz0_jcw#0RR91 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/stereo8ALaw.wav b/src/MagnumPlugins/WavAudioImporter/Test/stereo8ALaw.wav index 9f24fc07ca8411f37f8eaddc31615fe4937b6017..543cf4d00601c5dc08970471875070f3f4f3c88c 100644 GIT binary patch delta 87 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:eM@mJ_mgPP*DYq96mhPgXG!)aPqd#Wcd@?hF4h_GmFsPkSl{k`opmzA?};xH z)V=jmRDq+{ebh; zy)fGwi+<;0akh63V*Mwl_Ew-npY9lVkU0LjZUS+l~C+6=PgE_xt z_p?rg{G4uqzq~$gRg&{nWE1PmPUm#{hQci`)6Xdsx4VSO@NO znf>hgnz`8SGvq(ZevYli_2*Q5=1&T;PN^i$S2xlAlpoJJW7l!ITuVH`&kBOy+Y$JF{ABJQNe_W0R6u-~2oKdFT+wr>hw6JrVPZ0mb>d z&NJe4?}~NQX<~f4ek%KUUG&#)I&l379>D(04&k^>EX3_k;{~h}Cf@NlHG}n^oMB$M zFYDJ@&2ji4%6GGPSFpHvS2;eF{aNyeA12NtnSS9o6d1`mxdpjCoPNeSZyGbdCH4_2 zzT$MBi0{I#7Jt{f4eaNtKFnX1;qq#}fq8ea?!D$B+Ydd-yr7sDci+tRSJrTRqQri5 zQ*qAFc@Nj;0^)n=Gmg{!EzSq-7yFWnvp8QSuI!J`G*0(r4%aL5imZRM7VEqBV*RUi zS-)j7=C@9;P8qR2Y?{G3nc{)4PHkBKqj*oLj@Tc0aEa4xzk>BAAK`dwd z&ieN8?9YAio<^vcU$nc#6wGr!f3xnniv;liJs(;VkTKCII#mCL=dSZ`b}?!C4Z>sRWY{!c&lGy5*{ z*ckRRZY#&%wFc|76#l>VWS!GznST`LEt98ky642XuSeoukB^vd&TqgKE2tZnZ{|z> zzVeCj@RtLe-@bQP-)A)Q>_@EgRMhioqF=Te$K}2zocV~u>`$A6?9a(ltaIQc>(mhY z8tV7TjkmK-y*&13qd506c{%&pLYxo$BhD53j^K2k4`DuDoL4zt4)pK{+g z4j0mxr@UhQG2%W~juco6YBJ<5P z`1^f-o#Q-g80+MSb%Ucf*?zycADvK~>s8}w>}MHA)=#%!o+s8z_h+;ILb1-4+LrbI z_TlPD*)pH~G+xB^mu@o; z?8iE1#Cq(5C9LCeoOSNhVIEkAb^eHPX$F7RhJxaJi?t}n`{MkV%~JN~kqsyOGm`W5 z;TzYJMSDfLJ2P)7=BH7GxZUU@<~1(y?7u|->ukNl`v^1Q+0W{mSl|6K>t|HqxJ}*4 z`i_N}e~;qwnkm*j@={sHx;l>&x{LjeYx}u;V_vd9J;lAewnNx{vDnwRB;H?LQJv#? zSFDS^75nw2#Jf)}i_KOB_zOIXX(o>z;KDsCC|Hol4B>D4q`YoFI?4c|)=MwYh zS*+vUn*H})#5&9Vas4Tj%=+2l9TKwyE|Tij3CS+Kr| zIHz$vlkJy_eltS6$5L!C>rAW1^)_DAhfLAljylZc*!2MGZxiL)TfArGFZMw)?y`OZ zaSv|tY_6Z<-8nuNE3>|vAM! z{jAiI{SOlNfIM3BceK}x`7E(7oFn?34zt+*t74z}vly2)Kgap97yUwpm}kwr!2WDD zVtq3)KEL&cbzY0{=XUYVe8C$WXJ;`U%RR(?4m!#@$1ky;je0Oo5#yrg;(lL_80Rz+ z?^?Ku_Yj%{aK3(s_&gBz*OrL!?HKXy#9uK^9x;;RbF(b_IccomRavLCINy~h&Uwa( zb%5&PoOYHNpYLA6?QNR4|MK@Kx2sFva(oFyBj)}^Lu$LmrIdrY=2RVZ+C^TpWnoL4vT^~ z-F70~6HQpZ?{(I>Ys~(49K<>gg4jOhKJ$sz1KIy&V*NS&BimheuyQHw=eeRI8+w*P|DWed{r0gLbt^4WHo%te*P!Uf&6~M z_K!sUY--NyU>|m~&gxHm(JrSn=QpZ7$A5r7$J1jQm+vNP_UESfJ)l-0oNg)6Urcz- z^U7#3-l%$#{c$36?#%IAAb!`+xe?nZiutvdAGaGV+Hk%ucVPW3Vm<%1*muY$&V!9A$NF!| zaNK4*;PTxh%F#~DM;7*D{Y6{YpXBn)7i{2mW8ibvcfZ2%zww#du}Q6&=Z)Yv%n^L^ z6ZX?!!Syg++%MQto$Y;Ju)dWi*Q?U!Sf@x2j@vOYkZLH#hdm8kUPHCv9A_(W9%)K0>s-9XeC7l8C$l8mUth%ets?Gmlo$8ScZ+d#fqbmrQuRCHJj2%@ zE=NDHUOi8|pS(e=TN=cANQRh4RGr0fJ|f1wpT&2yQH-Api2D>@#W~N|lU%+-#W}PB z;`~yIST``vV*Q)q{n8s#IX)edxnKCxjd@l>u0K7+{jzlN`z#@1y!TF=gS{Ee`8Dz6 z@7E+Nyz9#Lp1j>F1u_NRdu@1=-wNUIjClej_nFWyh+Hj2x4lUP6bbB5Es zD9*Q3^JRZV8ne#o&1~Q2F~`4rHrqSp=kg6+!uAWqc_eG``aP^9M6Md{VH=M z`{~-1xr=C57m9tl<+WL-x_IBuOMLGcn>qeBcXAvqh;c|{U-l>UA?q{>S>HwKFH(s!S-pGz-u9GZ#oq^VesJulw7Xfu-Ym9dQDFt``nw{&8DdKc>~y~_2r zhBxb!6#LqxU0A=zYt|nb$oA_@nI9Anrq8I!ey%X(bUPGfUi}5@#QAc4Q0EZrMSU1t zhxJQ{cY}8fXFt=$`681&JZ>*OmE*Zf+=Je?gY$b)w9lWevVQn;=6j29943f)aeL7} zdd*>-3UzKM61?(XAy@=l!hQ}0GT6Z;)s^0WTb?;OvacQ_7X_HcfWi23ZbovbrWybE`0 zBiEndVqbo_=udOSdn}X1I^?4>obD~L?{-$4AIMAL__(#?0~zmv*giIv_m$3mW!~!+ z>-&1lG%QS zct>b_Am{hnZPuwP)-i52;Cxl~;(ESsJ*V5)h|}HHi}i1b^B%L7vVHeZ*5CM(d7}qh zE~P57{(=wu9c}8!_SROc|4p1{cyfewsyeX$^~5^x4zXX>)1Av@jXS4%UHtCP39&Ae zEzT2~O=SNq`*S=mh<8^OH)Q`K#QezpEbGq|?^6DG$oluiyf{Ogv$`{b%RMrkdcan#*e)GMo6H%La^$hlB*J`$3I*oZ!b&lI+@t*B~rmS;$KbKeC`kdcGV!l&B ztm9Q_#yXzE*quZ?}Wv@I>rmHXF?Ca7WR<=j+S;%huZL zPcKo=Z82I*W+W{Y*{&=jtpH{DtPPZZlf7W>iO13AuiLs`GSI49OzoC8d` z$nkj-#_4t~#p!-(&EuJSVxK6$gX8?(gmnhA<#ca|c}-LCp714cpCT}a>)YUhTwXEa zyLQgU_LT#fN7vvuSNXvHG~35<`?-L5)qKobS{h+M2S@XKq@oYo8(lyd!_xQ6R}|s$ zO+Unb_L|7;Mxq1zGrb7&EuuZV-IB}YcM^XWeqz11%~sYKAkGh)ihCBHj&Zu%Ke7Hg z@%vVfeAs@Cco*e*2G_#^C)l4BR$N|NpR#@J`dsej^SGY;b!GqUi*mZ<$FjcPf2`B+ zIDcQ;XRv-}asJ_{*gu^yf#VP$<)tZ!=1+&PQ=4C}+?azO0!ew)W}b1KFD5AVm{V|pd_(@pgI zh9I`T-i`BB`WgE(vMc9zz)@~zW>;hToy9m`D>t*w#KO$IZn93{gY5s>a;#JB2m9IU z9LKF@b1p}-R;=^+0`o+%54+Nm?SFZ3c~$UZKZlEVZ)VluIBXQ}Fa77m@vL{2(c{{_p9`ypA|GQsE}+|Mp^?ZY`Kc zh~I_T_nGyJII&I{vCm}?^Si;~`~7o<<5{T!`%_cwvkVjGou((S|6$@jMc{5u_lNj> z`QKuHVbxTwhug)w1TzP4x<2APCF5wG2Zf9KFWpaa9HP6hPD(BQF0w@Y`-XD6>f^)w zu9%0enaX}HZ^b7u+5epWY#$iP{+tx`CuJS$%n|Esabn!wxCX~(patvK7w4b*iFZxQi1RQf z#d@++YfiVfxEE$4`rj>Le484<^{{PKPWPBN$L=Y9uVkDUKcqF{@6k`(+v+FQb6Sc0 znnz!`zD*YUfWhMTt;}X|J>0&Q_2=|pUgjY4fnxp=T!70fXPx`vKFH%=JYJn!h0`_e$nhU0#`D4RxIVY4&b;$$)}MHm`B*Xkx;u%> zCG`mFxQO#MjdySy29@G+TqfH2(_()-JC6PI?aqFFF=6`<@yLN(t=eTyf8Lpg0E-_KNGzs-^6|*(hEoFV&8}-_k9Ap`)u>ar{HY{;a8Z@1nUQ z`#;5vxurL!+bsMy`g!^^=j)?0fA1FJUe$Q<4%mwOtTQ~8+wH35IQ|30KIRRvt{AtI z;}C4Z{>&ElaDNPAomUe$ZmmRrohROd`YO()+_U5I%{QLo_REsD z!d>`#xf99pG1O*$=^<7_gP{=f*F`uE^Tc_KZsI&lia56rF`xDCh<7#riuUK}H`ehL z=Y%Uv=KNL`%Z0XLtpy=NVEM)yj3Cz2-<9c}e zG22fS=e|1nv7chO!f-Q}_1pd8IM1HK+-o$a`{g6+cOJ?*yLPd?V^h{&*_Z8qj$-?U zVjpBfXVxk6j(I_G4nMUxr(1U*^E9!4WH+7dlk#&tc_n_|^Lt&^`SgpwuUrc*myu$; zy-?iyIJ1lWoL-FM*{d?oQ@r}JKcmIEU%qRc?#vkGsZTi${$l<(E{t`~4P!pnf#ZKp zthX#L#Qj~=9oDZU&V#wV;kaE9{tU0o`W|9mqrJF4zF;8hbP&G>@mbu%S}yuWD{rnp z@yX0b&1T+B@Py**fAP&+jv-Sy&PF3R-R)w(pwAtyhb_duNz-=h&%*bdZf#%Y4HmOb z)ovVzRckrFmXWN#>J;m^#>@#><#?0*k2&d(?A zvlJ2Qw~pfcdCB?gfAi{`-^b!zK7&{{ShbwvU{;*@chT=ZDa7`V*0KLa^O*k>-@BK1 zFC}Ri>%11fm$au1m*Xw5?q?y+T|BpAomv~%pSlU$uT2;GP!sQS`=2M)jVGPvd2a3r zZci49@zOdmZlAK0>)V~V9EXCPxIPrv%kjD8#Pi?RR$L)^i~E3$8*;kYdF-c25~mxr znC*Lt_U+*owoerAFb9frylJc0|1!@w{>NW&Jo|}zyFXX4eXZx5Zf!T_xtF;<_aDXe zZOS6n`8}5X*;s&e0>r+Ik00yLcV#~}bmDY3L~@+}Sur1P%zpk1=5!ZcWk0tpXMb9W z{qb#O*q^6+nD4&L>9#M;=|+5HesL_<^I2j)H${xco{4)mk>WdgwUzVbGLd=N!`yzp z{m%YRILJKzZq`34zN1(%o^LPiPYr9$`isQ72V=xK)$v+fzH3Ciy-|VV<0;a;-In9C z;xN|}C-I))a&aDSZ3Xs!TvgUDSAy*m_OtzE(GH&y-{YdftiMFu=Y4XU+X4ITtn*_j z$1}JI^VyZTo{Saur_PA^UC<@guPgj{`k2!#ZpHOytXMxUe35nbCNSSG#?}9cem_B+ z|12l^od@+e-3co>KE~qQyS2D))mxPB`@O9HPTc3+Fo5k>*)TsS&dIzx z$^PG|#5$KoFkgG0`FL@Up#ObNw}W^;ytR0LxYIjs2ZqjPfBv20bUnm;r@mN+-{Hgh z9mMZ*MT}rS8*gNPLJV9#=ZO2f?L@!Ope*~@-kj|-|InGza zdSRDE^f|FU5GU>-7J9?}^cU;W13R;yLt3)Vv>4`n9C#nl zMf`s5^G#eo&3dyxBUW;MTKo%h%jMh-EOBG|-J99}=o{?M1q1uvc?RqIO=A7}6*!(& z;{5it5KedgZ_aP&boR%*Kc^engY(-$tcUEiXZs^!y|Hd6`?<)D{mB*gk6b2j9A1iX z)CN9|VYob<{h!%`^(%<`dVRLA|Hm7!zHK7&2V(qLWjpJ4w&(WTtu^~!(4FHS@P>JW zxTiKwv`g78>}S9B%wxoQluZ@3A121n&SG9*BhFV3xX$_gDc&b(AkME=uE%knvzW{G zv3Mso_Bwy3HkKTRZ{l28KQXR2TZjF8YRv6YC2!`Y;yrVZYrMW%^$pigYcVe<8q9I4 zaG(A69?SM|;=DnMIJdKZGV3Rb^%JjuoUY>^)@kj<_P(c>AHBjl^Gh(d6zz;%2G^ee zaenXVb}si;4Oqv`jmtMpoMT)T&-L6|%$KYA^LP4C{BCCEWwx&{gZbrMoUbTxpJ=-c zmzRyWm#5~x@5Zn{7ye^DwI}u>a;yS!alNH~v=*wqGFT%L7+(J*icf z{b?!Ik<6cQ{U0LcaW0}CEY*i~y2Nw7tmm+wC&jt$;O%T5>Br@JZULuTVHE4UD9bwS z3o*Yc#&0$Gb2QWtInGrcv7c&wef%ZsjC;?#nK;kmEBcF7;(pV` zW9(+=~{HDh2Pmd$4pF5KIVt4j4_#NAu zia4h&;`Sj+9+>PVbD3ke8@jgk^b+$jegyS}PJlj_j z=U|;9`MdZi){&ybd4^mM)^SW^?sJ~Gx`$HvJD1Cmzs%jNI1YK@UZlf(wm&4=)gt1( zjv*V^pM`6=ydqjKkICcseDPs@Be9P0w*Y^4<;6X5hd|bEDAvJRit~zj;(S7gsBiDY zyt{G)$EW5BF0aB-?EeI@?^aO!KH$|sobF+9f4`;pJ+FHOSjR=2^WS}z^YvEr%RXZN zy|~z?i)hFCnW-GN5dmBe{fycEZv^YV7v}(bi+l8S`f<9~?{T^bow=T$E6nFohKP40 z(mHW@RV~Q*`sUC69BIb9;xg7T7v~atM6k|!G0**1i}i1> z;&gY5-|gz=#Pi4h93}gE-Jk2$%65}Gf9jr4|yi5FWF4x-w zn^`Buf%zsYF2@%lZoY@PUKJAicelhi2{7-eco|uVq^$y}()>6){p>HqFZ!NKJQt>?d zvse6%OjaDnZB#mQH}N}4=IhzM(Qx+X_9f6{)xG#cxT4B3;S7Ev_C%`S%0HAKeJ8DbC-$w z++sfK_ZRzO^+bEp?H+$fzT$g-l*4iOnaBPV8qfU2bLLmPnLlmE+&P~8nIzhivEsgD z(=?7lz2>Zcr5V@rWO44U>QUBzA;wq!C3zh3_Zg?V;tKou<`vs7naTPK#Jp_Q7uN4# z!TJW#-fk_%I$blld~-^&eWEGzs~N15)RFDii+4v|v$(us#5zOT0k&U%hQ|-j#qWR| z>csYAAG7{uaX!%P2FKy0371z^62~W>Xs^nO@vy&WAHu)0{#$YWFj#W?46Z`R3ogVQY|-dFh`&MmYR=|2C=`p%Ke ztwp(K{bc()$;_)2y1q^S?7Z2N7jgaUPsXm#PGEz!zD5QifPRCt=J&u>$oBK8JFrunKMyhIbeD+rs3do` zPhZ7+ix`K;iE-moGu9a;&V_yv^}M1uhhI(9|NUFI9@Y`({mO~`ro6RWzCW9BzK$Ja z9&>{EP%%z0-p}cJi1W9#tFwN*s3$RBSii$7*2%W!cKaKf8$7%@{^c7oUt!MvoUXyV zy|_2zD(+L17UOxl5Y|r}&AgZB7Yd(X`)IMxJ8wD%ZhR>7e!||bF5CAI{cp_?T#l7n zGH)u@Rl1dA`=i^L*J;gswOGe+7VVW-CN!KA`}^blxLg7nGG9HH`K)mq=jS%e+qPw$ z!>yS25a$?Im~-4FiTA^8#CqnxEKc{IH~VjVp6wIA@b~LpkL^G4wBE4#G~0Ks#Qfq) z=APExo4PU|q1bv}!Iq9UH`XNyJ5^XD=jVBmDEMStWW?%O^nz&cZ6 zIo*#JnD5%iI?bb)uV~JE&;jPF#Q5-U1^!+}-C>=lE0`~+!#d3mF*k_ykjE?7zFGqF z4WfNs7R!D<3Sho@D{~i--_m0IU~kVlXNE8zbc6Zj{LJ$oEU~UNXg1rQ{>JIn5&G}N_{v<=x7}j@@nRY7mn(f>9{Q5` zyH8x7D~or8k{7W3P;q{HZZWp6E7p1T3}rv-h;d->c-Ft@!@ST{<^vr$-G#x-jV3ZL zb)WUU{F$2#W8S|n^R1JaXNY^dH`lZM*_q5+?B;rICHnC`Ke+xEea1Sg#5$*aFZSo7 zn7`)}?dK=aPnpNCKjp|Ax?y{lGdsb~B$`jPB%SAepFZHW7~23XO-bN4Dx0BKVtsqf06CCEn)pK zU73eOF@N!pxt}=C-+4Ft)9Whp_QD^dshn=%5zI?OGPmx){7fSIGrB$V-xIier+no4 zwx}Z8&lBU8A@A9K)NAGg&M`k*mHmGv?h$zGWc$wI-K5fA*#7q(=AR85|4zf1$L(bu zkBZFK9$^0cGxLG{ng0_yy%(~dqk@@V7WLEUF56or@IrjqnaqEzVx9dt%x6w#o#j{A z{%0%Zq2gS}bWx6T#l4~JJvjcBg*e^&RoVXqy_wr~Vt)Ay>pO_|BpuK3cRgbd^DknY z>{Xxhn;Or&qj;ahJ%hjZqhcI>N2~`<6XSmyv95cmEBpC&0Q2utnMaRgp0I%Vh+14; z*`=6g1Tw!7&h_DII`c0lnfseDw-opFicaTz9WTM$qY(4$^O=_x^QK!1xt@4D;CefP zvt_6%=9>X=tTR)rdlW6h{;bMookn8(7WUMw43dt#DVX($2e}~#qWZB2>63>KIg`~?HT5Q=A7=p6t=%!fq4U8 zzJEP`1oPevnSXxp3-i@{8uJqcn71Fw6XptWKT*HtTILUHGe2>LJGL)Bnb$7MIyE1% z{ggw@n~i4PT^wi*TAqXXjoQTAau)NSKfy^TeeE-y|C-Ze~%!@cMZ`y--lNro^b!MJWhWVUK&R6AQ%%6$**C6r! zUaq)@TXi{)+uMu#lEYTBeaw31)kiX4CC2RqO0&JU3-hBJn9odR{@#M)S>B&{-@DA0 zzh)j=h08a?hxz3D%q!a$#P)pk0p@k{@d4cGHq1A-Vt%GA^X46y4-@vjjoAL11M_Ch zm`^Fnyvloy!-RO|Hba>k8#6z6n#(10A@gUwndg7O^~9ks^U4>v-aZod?lbRkd%H)x zTNT}u?fpMubu$>xW`0Y&W3c)^o|pNE^DRb~xIcO{B ze`+y>d56#3FW(7cUN?Ywqafy&)-kuA&)j4p^I0>P?-Tya+06E1b}?`Cf%$>)9Jj~f z9c<%@TrO+G@47Bs&-TUzxSmWF=V?>LzVHOG-Z);|yD90(-%BNNFJp-~w_sj}ztg&6 z{rqMK+ne2DURAtLJFP6YKc&r?AFjgulGtZ-GGY7g>Fnp1`^?KeWnM(QV`ePg4SONp z&+jmd_4~GAenXu5{nefA6Xr2*C-&(&6z8}ZwPkJ*z}zK``6FBIkNgiX?^lQWyUGdyr8(if4U*t2S4HOz1|My%~P4%v}FDCF3dLw zZqb{_c1d^HA~rTcw|DZ!7dWihb?my6opVJLX>E z_oqUIKR3kr7E`frXe`DL9(_2!Kg9dVRziQIC+k=aVZM}y^M;I7*xeaymN6eDbTVBy z-ACeGoeG`UK4&KLBr%S9`IhZBiF(_AKGz4=%gmqNVt!GqI|YdI68(p9do^0T6Q0n7 z?PrK~HC6on#qjN{Q+FZrqeGdy^kLq1B=fqRndgb~Cob6>=QiTq{>$sw{`&ythpICF zberqXv`x(0i+BGb#W{qhCalx{F@Ik^;(J^s&Qag9WSwMjj`xQXujlxQ`#wEOv%RC3 zUz=a#dAi+f=HJBcfXo*6=$o`-og3!Nho$g(g4bK-A>wz~ySlP{SS+uHOdQF)TQ%n1 zPq<-SD%Ojxw_y8TH+dgwKo#b>+j&3h_&DbM@-sg^ocGI`UEqB;OIPMa#s1x%2E4B~ zD}wg{Z#XkAk;waumn$(JFqdy~+g|*NA71}z%(ssEg7%k(^MfN#8u3DsS%ECnnOcSy zd}~;LK>O%!naE?u^1<1koif<|!&~H`Cd^00zd?IHSLP3QzDE1tLd>_ldxiEsYuNr+ z0H^!77W+SD9djrDcbM)LPmbq*i@97DHszjZ3k{F=uy`_*ZD^eQyo+r$U*X0AOo^H$=on^l6BlG#PwinoX)p6V3CtU&FyEWSd{#;JKdCG8O-Gscv*38Tdoy3~ ziurYMjxjxh%h4`~%e{jG*Pl1fm?wsEJ&c*b_14jy$4ln*x&GHlVSZ>2kFRdd;_qu^ z8~z@1-!b3d#q;7y;`gbW4(9p(#>31@igP1B|FHep3i#O>Qp+(9`@%Y&;vJ78{n`He zUyj2M@jD%1Mr>~t$Z?Kr$h_=RF30tYnBS|#{FxE+Xkou)9oxrMU_X0^^ZAP>a~yoV zIL_r)b2+xU!TnCHDm-4YSj*$d)*ZMX-13IUOHbzTcqyg~_sdZMJYF*S$^H8hM;;G^ zkKysd*2$(Apk{qaBX9bV`7g^dXkV*5^W+rPv7gC&`4RT>ZY1X`B8cM<(VgcziH|wX z1sZUi`tjudR2B9kLR~u$1oc{x^w+^uFBubvJ(8=wXMhB>H9g{ zFH|ySo_T@$m$dE7=SMKFkC{FkIFXqhyIbT5yI1VAk9JfI6&Q+S|k2Xx?@|sbb z+n+aLzpq>b*N6LJU!%FW7r929E52vN_3&8(=I)lvhdt!>bM`#ue@&U!7W>x)#J=#G zr5w)&A36S0U77z%?!o5%e~R%srGT-(9CO+D_X&W14`|B88BdtM)Ce~|fA1NWO_ z8!_+Jf%(B<%;Lcx%vXx@X0Hpg{TgwuZ02+RPEWmJUPr7`MU>%m zlf=2T{hn;!YaR2ax0tv1%e+(*j&t}B=6180n=fTvbsh8QmCPH8_4YAh{4iCVODuYb z^Xu=xJTjKc@nu8iK0COb&lbNMQf?CW7w+P{P2ZY4eh3lo?YoP61Od~z-<)hKkeFUm7-`ku$ni^T7JKR(6wZ*DW+nauo4HuL|i*w2PznRh+K{8mYhTj2rB-Ig$a z@{sx33Ot^fRG?^lg^wHq8CTRY}q zceuPZFJ?ZhAoD(Lxc)TS!1G7f^32Q4<#p6^zj@s?U;^_Nhk5=&;m zpBMMgJ!bQ|bp23X->y}e`Jsfb*zoQC!|V2gu6{=QMSngaH;!e#*MhnKYo5q8zWM?6 z%Q!L5eV&Q-ZF@0KwBhp-n|{AToxmf^170)VJBE43Hg8ei>)0FQS+AHM>%clyotQ6- zVx6n=neVh_ojPSXU!jwk*WAtg=e!Ke?~eyuF3UP|xldfm^(Sd}7V2+q!S(siF8(f- z7UA!-OgMknJDYL4(fb6qOVQoA{j4m0x3OJi9_Lgz&*P$ckvy&&m|6(q(4^j(O!z?0@4R<_F(! z9Kx$Je>IcWrCl#@oYQQXd*0^q8q|jQ_^Vv*y+fJj9%JtNjJe}4=3geVKN;!F9p-R; zw|3*Wc{y;Lr$1-DzA2aEr0>k*UUEI@Gn(t$_(0~C>CE5u=Y5cW)0um_Fb~UPeTS9I z&AxKJinU_iv=YZ>ZUC3dBO5M9LlW1MGBpZgyD{z;w{KzMJ%kb;P{vTL9?$P~mgn|4 z$-v{%)3tb<*?J_88*A+5{$+s~kM}nDaX;1d5BF;mUVOp~`xj+yVUdOQDNQ~iH#^1w zZS2Y1OcX$yk33F$QJi&#STXPH%Dl!k=K1<^zUJIx?$DRxGuxcw>6D+#<QL_eINjoWFl6*B@6gzo=l#iKv z?k@LJFJgJzViL*yUC06MA9HpW!wTU(hx^%vq|&hOzkJ zwBjdAqyJls_}s|iTFjlTnNNDn`VM}~_rGEPzvg3}{+;7i{x-+?x+j-QP70Ur{!UyU z7VP1A^mlK#zl+8dC`gD zUf%ektnYr5^Lw@%a}Ti|cw`Qj%h(()-$CP;m%7LGC$AZE%R^ib=a@3@KZEOe>G%9y zoN#8I8NuIIU`6Jkd-(gcZN$9Z4xTUMw`D&24!0+pXE1lF$$WDrw^zo8n4g}{yp%ih zp)Hx$7VqrYiTT~Ma;y_2-ZKdo@1MLB?*u+N!|i;U_EP*SFV+T>qC%Vcw)Z^X+$eJilx!^CedlzB6B8$vmX}2h_=b zA`|%(JLbJUyhnSVJmXg z0RAQJy*{19{Y4GY58nRH^Md&YcwW=rhUZzf(|LaPacOa^SH9;dS-( zGt5wbYx8s z>vQHAjd(m`){yxf@jl+7A*}Deo&7vTtP>vOqGy2ItzWd@gf zviQBQ?9be8*A%~#a_AWryW#T}ZqJ?VncE)V`hQHUL+;DR_I?@sebo@}4%IEfIxTuJ ze|?Ji9~;hBtAotl+i={jA7Z|Sn-hce2p(U(eZ~Bec+c>Z_?@o~4Y)qM6u-Z7`!T0G z(VzKz?nVsjDsvnHTW~xZiTh~vdvkp_{*wcm_>|jo?<`(lx_6KJh1K!gkDPnU{mywa z=Ke!@T=6f7#}$J|G9OZ&x%*4*H+>&4&wI?gVsX|_n7}+QjrqeVoZrsnI6lq9@9lb@ z=J=mD#N{=0AD8c!Gh81gXL9{fzaw_AHMbkCGq^sNkLLRSBA36T8|`@<9yglD?X8z` zzwqr0_aonvc)r;)k^7@L`?>$xwwn99S$(*FjQqy@+bZs7?MrdL>=M9y%LnHBnsUE? zZaDJ~;=Dl(H@5HJg!vjP=5@ZZpC5KHU)z;=@l=kRqc|^Gt1H_lrgFJ>EM#tE%e;LF z<_VX%o+S7(f8)&jmJ{>uJ(+u#VIKaP>vQ|N%>5rTFL00f$j!_hCNMu?%{)=upE@+1 zztf3N`MaLek$J9YA0E}`b|YjGw=>lPxLq1?jN7rIZ+RT@r7H8rUAdj?HGtdIwd1%Q zu5^ss?P{jX7tP}F#>vmTALqQ5xuYBNCk>e|EzLZy1oP7Em@f}!zNQH0tBDWuhT?Zo z{|n@}`Pg#&+odu0T*>7)pt&e_@jFdz#d}RXN^w23*uwm>c+bT76xZ`Qw)|b#FJM0N zDs!Kb{N4SV%{=4{^Vj0tr|9n74%qZ%-f}VX-8Y#ViT5xEJYf5fWac?J%pDEf?&Zs5 z`@7efPmf^!a5eK$lbBDnVO~C-%cbK2=7;+;?@*2T_nlmSDz;^A^nvSb*jDB_W0?Oj zWqvS*zoT8VnAh}TUZV~32Oqg#_!`MPQoJiz=?vQs5IkWc+XoM3-nuvQHo|^;7q<7z z<92WQV&<*Ixg&!e+aG<$?X5|7=1Zcv-EL^d{CyJl3oAM^zrBw8ozLR;oqKw5zjmY| z^GVBjes}W~&j(-kWIiW9^K-j+zInSP^K0Vwj6NOb`RuQb%-4&19GhFRefB?|M<<6d zA2)^h*x}4~_hH_62=n}6{UoObuMe!t;`IdE;%uMl!}eMJyk4_yNaweng%T`vLjf0?bFQ%|!dZpWh?@SCRSY z_zbiU-@tsZf%$Rq`$v|++`v_fVSf7}bB907kA7pm`Z)8X`RsqKAdXM#Da=c4V%{i? z%jH2mF85n?xSpJM<$Cq_5ZBMcmARhR4&d*rP%~}^{4%+{8j;8C?ND+4*(aR)yBcCV zzj_LfukIR~VEsJ5vMBN~6?mPe`=U~4Kj)$;@;BL~kzXuU7WtT_<&ak#%sg!m^ETnk zWB+3wKZ<#ejqGRYw=(Ew{56r^s?1-_<9Ozb<@kTu!s}hN6N{ifkLq!`&pN~7{KfBh zyxpw=kCVUW@px}~SLVHV_+T*I#pAAM@h;_mF+A?NHkNri@owST+HC*x1CQU{bYuI< zU6}{}WSvFH%ncuzPZReS>`$`&yZOwGIx!znk9lM9Zs+VxJTCoElezaT94n4{7Su~jAnQ)oMSKX^{ zfBk8$F;<|?;{43XzFbe%72^Kd+@Jep@pH$9TRXX5elU{j|7l0=NBXzn?e|I)J zxqWUZ-eEYA!r%2CH|9CU%zd)BJ(=);xnB}B`({1aof>=E*ad z*9~IcO8lPn$OCNuF`4e;S zyD{(5iTTJ%%(tbn|5gW?yDev)If?l@C+4fGGtchL{HiFge!JQJeHQbKt{jKBPt14h z|s5teFoMzl*U-{9cc>4cAYLeO#Y!_GkW4)c@bV zcziqIBlC{py}o+lJ%=k|AL`&D_A~nm^VYRF4m-Cp?=IFodT-$G+O{H>m+da*1*>y? z_!Y#w!3*Z!ZMog}?#$hZy%+P6Ih@}LYnXf4FmD~s z@n4q9<+!;&^Va9No)oZPUUv}J!&Bn-TwJ(&G#vHd{wOMm`>%+B%+oWuAKZ78`9$&i zFEc~f{^5S+D_=9OJc9l7yuA=l9kbcbxvQC1Zo<5AGJn7I z+?l6~^C5TrxV)n4Fwg&l%f0pn=G!_kpCEq!D^#2Vas0vcGoK0TH!@>>*ok@Sc;>_R zFn7*ke$kra7U{}7dK>fJUzsnh&*i(cKl5$=%mc)I(kJ3xYR4?rIVZU37q;L1m${)h z*Yg4SnVVc;oxwiLcQj-k{F39mcOLTz;&=)*s5R=K(>l4$SN1@;XdH1oM;Q znfLT%er+xDfJV&S5_ui$*(K&q`B>*^8r#1U_g<%*Wc!zsnU@~Pyp;#@cQ<)I;x%I`dt?@pD~lU$;OYUv(1lr3wP!*eLtX1g7}>X=T5BSn8Z4Nr)Hvlz!c`Y z9x$I*jd|-VK8NG*midZl%&o35w-)EDwhv@~Zrd;~?#}V)xrXD}uQ!)_-TPdx_Ih%C z9$bmPm&dR9JDrij?Z(@a+-~1W;C{rLyG=v&Tl|OE9^CIA6u;;Dp;%F@SIcvG-Rxuc zl4x%-f%nnQE))B4Q+fZc!*?^(Zy!+>dAIY-zrAFha)o*5aOV3rvOl(q+5egyIKOXG zct5ezB#!6tawRaoeSNrG28eab5(|0VvVmCVnJDgYn0(^#e^K$SPDAm#9-lVxIBi>7 z9*@mS=kLNMn#WPs!}$A}-J8c1UY+?n&A)^D@!uVocS`4eJa#;D)4I%GTQQFx%KY&e z=6<)C4-@y1_b%alrETT-gpcERw#jDhoWkW2yqU}KcU3O;Q!&hq9x;D>i+L~cyM&*Q z@%Z1X|DW4GYuZ?!xZg`3N9qRr_@&fKpccgH;*Le*0vlrg-{QYq)-X}U2#_jWj zy4)|f^W^qFaY=FPFaDd({fKKt?su{eFmK$1`>%r&nMV#}9x#mgf#%E~U0{D^HDF$P zH0QVRY>rRM%^c4(jxYZt*dJBio8YBxPA_ZM|TX{#k<^x zowyzQvx>jRx!3r6ztn~M1=H``@63t%j*fQn;CXA@NFHy89p?Gz^3u##Jmm5G)%(n? z-Y`GXh4mNxVcu>(`+uqr=Qn-`$ESxc$Fq(*_t*VaaJke-;Bp*$n%nKlDO?|(q;UTg zwvy{rMGJ19hreLnaXgO?zsE7RtA^Fekm|*J-3;bu7BY7WV1C(^`KJ!d;|4ST?Z*5= zd*(*{nfLc$ZXLwD=2hlyMS0zIV}0fee3|E(a(fjzhxzWi%=1s;{@2sM?PTs8<^}U} ze|;d3`3Lbk9U0fT-L~7v?R+uu9$IbjE=}lMF&-$w{Z7%r%;%kBzD=A9GHt~D-NmlV z=Tu`Joxth#?#=x59nSAQ@q5Z6zi^yqe&upWOylx(I>hy4#W1dKw&M2);xF=dw9${- ztH0v+FJ@Nf_H%zVZf}?N;`aGn6u0N^&6!8WaKG?p6?4NJ=KaO*pFViP_P51(!oXkb z=da(K-#{@hSZ~bz%k!38E*F+?IkptP|8h~B_t+Z5^=fPi*F*PeT%S));rYUyE&RQV z+RERTVJUy7?MCpp_uM4qHe^DI& z*kn|w>};7yBC-{dkw``*D|?rbk(Is6mh~ko86jk)tjZo)*(!yyGK#+c!1ML%^K%~O zbKm!#d+xdSo_p^tvHqM-l+)@b|8I&|&q){ey%>pnzuC#Gf225f<7O$o*Ms@^{r@`3 zeypE(x7|37{czf0_U9J+IIas7_bSh~)sE9OF3ir7`nm;{9KzZyfhtU(9@~ zc#rsIF_v$g!s|Tg5zMd5VSaQ5^FkraT@EsT9>cuGUFJ1S`MaJEU_NRk^SzPGb4u|% zqV_oEju)8+6y|nMZOnYjbmpe1%#A9u9rpUb@;gs4@3)0{74fe0;{E)+KUZ^o+GTP( zHuhuwpAWB3{wc=mnJdkC{c~eCUM~&s<@ME$i+Me^WjL?veyqyeW&j_aq%Pv&l`xn24mVtY8hi|x(nJKOW0=iFb`?B#wM zF^2s~c6lC8d++1jp@8({h7`CIa*hdRnR2=0ibmRGZuY1f_CzeD# z`7?N(!Ev}T%D2yA?o`|q<;(YAe#nJ+-wVuBrZeAum-k6Gi2Dk*eBkdLvzzND!h`G6 z*tF-^BZTG zFB!n~@8Zq8Tp#AcoS0XzVg5m^Gfx-q%pNGt<$rmM>u3Lb<{fJ=&j{jnX}6I1r3~h~ zeOdpYTg=^D`MX9}6ZIC!ylg}6UtX7(ZyU<}v}+FYQLa3$S%^Htf`3^)ehmAKnMUkq z-iY^WW{Q2xCrLbC&iliD?~hm??skg(>d4#dhkKP{zn#&K$Jv=}+5cyYbM!wd@i>wa z&O9=kd0r}WC-HuS>0p+(i|6v^UE%MIyv6l%SG=b%?-ti{;4E$zhg@D)899O5ea&|s z?;;1Y9hORDdw%D{{U!M`_fwmd+}|VWv441z%i~TZW9DYAJRdw9!tw2k!puJ$<#}SY zjm)EhnYV~xUZw>9@26qR@1ACE|CxE4I$RIurZS(K!rXEq*K;v(kIk{XO_sO0&D{Jm^N+S%{-Bx6hd*L&)0W4<)HTeFKQiyy zjQwZN^~^heXTC@5x7J$4emgFXdFc{7ugU4k{NQ}%BSn6Z|0k9oQG~~xDZg2M!*k{n z!kHfx?>GdC{UZ}suAiHtU5eb`_C5ZC?Z>qy^GCjHx68uWpA^bw|Krh``8@GXdZqpB z_eTF=KRK)$bCX5vZ=c7re|}bzdDa&8^QFbSucVk)4!OwV%i^cZN zXA!Q4%_X?r3W|GcCyVplqo#2CzWa~ur13MhtJUHj2A`_zXQJA0zbMz8`&}1j?$;ab zIsV*l!Ru^`N^*RAvJ%I`ck6NdY}%OP?OrClzBC|>d6{rtPrKEV*R_ToVeWRFd9^U+ z+gdX}yOYaP`!tu|?h4mK%n`1)g+W};51hDNJ{IP7OnA@saP%qLPmgrAw>H1nK7(`F z4|gcR+*HH^ExT}kIqA#&>%}hakL&Yz{_;-TRURm6a9p9Vf`_Ewh z^$7Ed#kriFrZaE+iFw0;TyIAoFt;1Z^*=RAi#lX*+A zA2G|G?QQH><_8xsUon_@W=-Z1DO}E|9n4!dVIFdY>&#^2{dA&FO4zDve4dlG0oN1f~GRA@P zn(Cg{z5p3IB>Nyq;kT7=~ziZhQn#(K)yGB+y3{EN6}DJz-fV=8cY_B%80eTwo_ylp4j{}MCqM~yCVziUx}`*q$?_A}SSxNu<$7SrH%kmH%6 zaU3tLXv6Wa#Uzd!8_{9Z<@QD*DL%h@VdvsJm%q>Iq#_Z%F z^6+NNJCtD_5X<@>n=>y`j?4KrhrjpAIbQ#1Rg3F0cVr3tuHAc$kS9Llcz*m3j?X8H z`%WJPb6j0j?E3_r;W)vtkH_(bWq7=H+`{8*dL!;%^~JqO&X(LyEBxbeaD*%K_Jx@{ z-(|m1ybjCvc*cB0ANDgV2Qn|QfO$v({@zm?m`60^xMK4%<~v?6&l$pT%MWpm;Las( z#|G=T-EWJ$_ch`jx8Ez+uHI)dulSX@y|{m=_;0r7Mr}C0-Oz&h7h~q3{h23!WA z`JQ53?wv2X4MX3;JpY~9oB90!=G_yS7ZdL$cur?O^GWQtZi(mdZkD)Lp~*D%dq2E+ zd_3>P{^k#;=KQ~BmocwY zm&?ET9`gZbxgLVPaJ?<6#`T|H++WwOKDX}~u|DQu&vr7nFWZ&xG>)UZXR+TtE&T8n zZ?^w471-adzs~%qFZZvcOy<`H@Vf3aao+R&JeGG5e9dx}U%rC5`yA#O9?UZ>n490> z?|muOtE+Wl`TbRx-^=0pZ+naR=+(>%h;#bi#d{6&O<2#YD$G6Ym=_T5P&oRqy!`;? zJ%xOY5iIXEhNKlzqhHFkC<)X`rPcn^*`E;+i}ZOZupGTY*)U;xnDHs#r`Vg82ibmr8$0c z8O8Bl?Ffz!C;sGkajyJ$*MYfN*T>g|}9EzP_`0{el1vCNC#U_SX7^FP0s`_$v| z6q&<(+XLozyKucNzRWzdE!Y3?Tg(ge&}P!22E9-Y%>YT%5!D zuL%3qd|jBYo5B3#UgoQwGVfoO{r3Hy%>Rive3*FOYH}v)v2DWreW%Dv@BM(~TUX`r zW$SR}Z#OfadX0Hh7W07>*^e3ZU|wS;^G2JQx4FyQq8R&CpGM3dwq?G$G4r)1%#-7} zJpVkIn_lO7dn)d0iU{TQ{VVRz+);(?s)?ANc0a`Z(Z#?#Nz9isF0emoT!;CYF!on1 z+c0+)_sg~QWIt(_kNJi;_QNrYnGYPve2XV@dl7%$>&EgSt(iN!GruhIQ4=Cr{>%;L zR@uy*8gae#nauq4G3KH7nU`R5Fg)Y!O+(E}Y!CgbG8fAy2LBga9;5TjTZ?-RcTH#c zjONTQe&>45758QJ>&Wt(vN;a1iDEu#5%Z>XncocK`Im*4;AYGVihcZV6L~&3s}J+d zKY1N^M{DLij_~^Ak!j3t*JIxC81K^s6k)#5f!9krP2}~}IM2wu-y5~7sY-?dE=j)mtyyxxs3_yS>V9@Z~^8EzkbB> zTpY{1_ABNE&M?1vCj<4D5$~q$v1R$w1DWr5!aV9B^Vq)3*Ux4iW6a-G;xfzUZ^ryY zDD#`2nYZf5|GUzO?ZKoWw{O}wVTTpi&NtNKeiSu?`{Uj~?(c=_u-`jyi2b&0JerB& zsaRi~Ifmo63I{lDyf~QS(i7s|>DJXsV1Y)T;PnvCKc!H9h8gGWj0oU?Jf}n%)Z_ex z`Qm+LQU1G)8SJ_wI1w`q?G+ukUu{dBI^Pj`Lrcusys! z&++*gasN`4B^;k@%iwsR=MJ`WuQ5FSe(KNt#q|@9gXyEV-)(8nDgv zI*)7p{8)ZhFzesbh5d$mQ7-5768v2b<+&c}?&tWS=P$0$d*VL-2OiumuAiCv=jXWV z-5KVNX>1P>X>32kuCYH1y2^Gqei?RaL$d?S<6kiE(v~L}d*?9^7yC;63iEo`&tTRQ zGM{<$lGI<=d%wxYA{*%YYS$}wazCfSiXjqNfGxsmg{GlE5d*a-2?r4^e5bwMc_`>Dy zKaqJS8|Dv#xqf;N!OPNn^fj7nd__ z6@RbeGp?UVYaZ9)_w#&wR#zU6jN-Z7lf`*~ef@dd8MzX>yJ7Gdw$Cyb*&k+xu$`~% z%YLuU7v^hSxF5Bc&wTM6<^!!bo;=c&;+3(u?^K2j-`$F+b3qc}5uX7baZ(`60|Z+&`I1!^m!QT8D-1dTfAd(`W2VoJ&gI_k<9a~n9sPw_54!Y z%h5ozd%of9m%fiD2Q~Vms@p<(L>_5xwWPh7gjrqk?9%oIHn78`Pe1RM5-zMID z*i(zk|NJ5IV|%zBF0bIY;>=R6=RrZ-E|oTMKg|;F2Ytz6`>|`y{`2uZ_RnL>ahw+I z&2e4CDvkrY?&A2f&n{jsDn6gri^jL)^^iq}nOFJC+^Qz$|2WrX-s2zZsT$6_aU_riCtXJv&8)sbHceDvyXASJzLnrpF= zUvj^wR*U(>VD4XTjhP=P#@ziU_uqXbSiXQAb3Z@k4i}l%`%h1m^->LU$}>P-O@Zx{h7{u{afa~t=W%du4JC?4)gQk-jYG3*={Q~V1C|#`D<6^ zIU+u3K8599ig%ZKiaese<+wj?@5Oxa0p{PuJ(kS^d0ePnkp0GjK;{+SF`p^cs~2rz zf3-Cqk2}A+Gk>~~`QH!BD;u+4-6z&JmNjDeDRr2KR$@NrF_-7XOy(8DduQ>dx!xwV zWnOa)w@YR5?ptIE+fQr}<|*ab&TrJ_epB#Jt-W_Va*!@=J{8`3Fa+bnSaXT`Q83W%paWKb-y~pnQy7hJbEv$ zE2e(tb=~Vu%$JIDk*%xpdge%Rzx`@kUKd@G$m^(MH!zQU%ImRht1$1J#p}HlcQf~B z#eDAw-X}Hr$os0Jhcf@Vk@GbA{QZmr!{Euxr*HX$^7(Q(pJa^4Gs(9y1ND51XWnWB zbB~+ps3)N<^UYU2puGKH=Isp3Z62nfo{8SfbK_D`{!bm2ce~6y!;H&wH;Q@d`&eC{w)ERR`wY2@`fmPP*UHuI@}n7=&B{C-*HtK+#m zCA|5&4z%F)oZ&S%&VSXKt;XKZ^isbTtyv6aujsMs` z*o$|vW^d(oY`KBky`cqGk70No%Rj%%e7kr*t3VHyuPe?kpJ>bSoy0x-;aq$}PiOvN zxDWH{4$OVcnTLJgas~!6k9x}OvPZ<>t0!`t{JS#q-sibLj)-M$-GTLdvEp(T8qVJ} zYz^1Xz~$_Jra$3%da)(!$0}y?xb~|A`@^o{-ShKvdAvKfi2ZHHF+2_qvEy;D+k57z zi`mbAe8N2OHuJRW%*|gh-*kw1qbkfl&*SpH2r}bp82Lv%=Z@N@h;7c$M-@}+%64!b368`!R8CbMuMJ7rtk{YCM;-rMR!4P*tvn24%SZZ=^DB zeTn_&DUp}e(wP15VR4ST^midYnaAJFam+8IG4ChtmzZ3M$B{r|=0{$${sLm3;{FwRT5FRh459N4xgBVBRi}E-!EkFB#>tcKvJ(=6L zK|0$*8If;xRlFk;wTn zFXCA9sa&5sPH?-l68Gvv)a7=+JdN$=ZXDZNtP%4Wow+~uJ;e6^paS#ktsKY3*)q?I zIDFwj<_9J-?`q3DDL?ZDuX$b&ai00mZOn_VWe%m6>C7F5heE)4@UQY;i z=Jkq3Vt;V^PnM7MDTVE_WhC>SdpHkg%X<^lGpIc0+a&lguUUn;Q+w9`Vlr2{c!sL9tX=e;&E`X2lFA~oy7M$SpMQT z=2=F}J}&>+$zHj>tRVp z=7rWXcMy57Lsqe0T0esQQeAPrW?CS(`(tsg`QU7}pJ$EPU&U`{zWWsO&f?yZ#BMC# z{W6!QgLvP~s1^I$%Hp24j5b_9A!1#tQVx$((6SZ#=N#eBkEF5xe_odLybok< zE6(i}`Of9Hy2#(#WEc1MovXNC|Cr0|;ysPq(OT^PdiG~KDInfS+18ltuwX5=+eW5r z|LaA**^fBxUpXQ_+_gBzfqVU!e?H3m=tbrQ#rl$c3zmPJ#PR3FVa%)lCJD<~yn|j}`r>O+A(mEYAG(JuYXPMa^5WmA(`vp<2>de!v9PV?~&DW;P%=T%kA5_ zJ@dFowjZPV%)M{09o`+nynIdO0U2!n{lq(WOAoMoUvb}N_suL{Rot)DSn$*09`b#j ztUt(txy5_-4|h*85BF#O#D;nAbdFb7>}S5ygLz6G$HV)AnQy7e{P`J1cFIXDQ14)BE%r89Qb*&G+%$>_JKl+2$-)u{=d`~mxza5zSEnq%kCv)pV z%)4J@UOkg}`5flczA(>shk2wp$DLoSD@LTVo`B2D8wE0d)`Iz~cidhc6PORV!FexV zJ20Pgf%9R?edYcAW2Kp|DZzO%SM50;rc)T_6Jp98O|fy{SJVm`Pv^G<20_`g<9n8(gwJqKHJ`NPG1 zGS%C#{HQSIwX3CLInR1CPyfNZ@_nv<$I0A|HU6@lgwACinOP-B$0^fyJmu0Uzz4@)yoU(b4+D{>x4eJ{>eX&}z^G_T9wRU?M? z@814oKE504>2`x9Wo z*$xLr^0+YHo_XhN<^|WW{^aUho`~rjM zydz(F1p9&5x!k@L1K2M$w_*Qqb2;19yacw-nAU91S59+3`rDrSV{kt1*XgC%KTO`u z^PLOgU7^{BS&!Fy{@?Z!x%^w(@%OgR$NkjCo9narEbK0ZN42?Ko{wT)y9)E8<5>T& zL@v+ffy|x7Jz%>BvHXc^%nv(qd74KspI?x_Yk?_q=S!?-ZA<3=#QC)~;vKQPo!su# zta*I&73&EupV{6z3}n8yDf6HO%(sa5%S!#^eplod+j+Zk{Jn1~uphWD?tiW&@_$MN zvYpKA&h1sDHMjd`FZOTNVjn6?tXF6K<+$rf6ZYG=9of%MvEy+est}JOHXE2{zh<7E z#C*~W=I_LL+tXqk|7yqIW$n!MP|uaeuWNm{KHG?UGCv>S@$2$OZr?*)nY&(NJ4q7n zZRHDLd+W{W4bIcqZr6(Yi_#A9xNu6GORXaA{Vsi#`<-PH^U`9S+)?z$$m9H7W1n*U z_!i*`8drhaF|Z`ZEy+)qoBFZ+w7k!Jka*XiaWc!hL^EGCjrlO~9!G9VmLJ%Vd96Ck ze>Y%$)|&Z|D$F|-U~U)3^?Y+E^Oot{j@7#{4~=1aF!o?x$AYaGe5eW{a$-l_LGN2-ry3E=kszW`{BzUm=`X{hp5j9P zg)$F*#=LN0w$G_zo$z0NmiKtX`lFXK-`$+~ z*aWVh(_YNWiuXf{o#ggvE8bn*<<0U%hcX{Knfb$o%$-&;pEHa3F!A2mEK&X=;$Ehy z2U!0haj%r?3zpyZhxuROmzIh9jx5@7J8l*4y_#)i`6uzrKbBy-dRveA^-9dcpR@h} z;{CW{;(I@abG<#YWIj2B{n8;L<{!j7;s9?q8TQO#|6E_(Cs}$B&m(+par|Gq3Gsk{Md3__S2lMM9A12O@*BOev;dO~F=a`Q>&fF)B`5jySUx!7^Pl|giyW8;h z4ix7F`krQauQcYPUNCRIk-3++$7YHZ%U2cm%w%rjdT@Nn^=aLNd2|G?M^$lV{yU4; zW6Sqvek6|9d*jD2?~~2>Epttnzs}_RmU}grr=RA01B*_~gDg28W=I_8GnA^wJRpJd zVe)1&UwZWu25|HCe?c2&3z z$2o=Xv3+KX_upr9;Bhd11@kYnS--i6uNs}>a*pdFzUw*jS7Xqu43GOWk8H%ebsgp{ zPx1dIiu1+Ye(`rj4PiY$s`390E6eRZ=_vEnA`UMp=69F-v;R3S&IkE#M&EWVdVG8@<=4$`$E5}ir9x|`cnDu9TU_R+QmvgYVza^<7*F%RC z=HJx;lrsaV_Sr`tbk8PT+DTkK}sjVbANa*(O}izq7c#UOwgi9`T6V zeb;;L?+rK{Fl0?;KQN>S^AAJWKfJxm^X{($nZG#B{iUqfe{T}Se#T`e^K&A9@AVXx zkNd@Z=?yODzdZh~csH)M>MOZj?3Z#ot`+-4kuBIBlFKmvB+hLWF!29w>B{Bw7w_vO zig;kSc*o7*Jl9*_-puXAIi|iAEPqJcOHeT%(2XSK46~GhTA>j81qDtr?FG)JI^i3b~{@1mtle* z6!%56GiUvc#eElsIc)z9g_w^Jc_Tk#xIUZLVD7(<+i`R|<^@YJU-ygcvtKgvJ@=SD z5%b5V;vMH6uUJn*QO*JCyVmn}4Hx$?jOfAj84=6ewG-Rz)0@mI_vUuL^p?4w58K78Lf z3od`}>C7*0WM1eY^M9sXpSdHMU%SS9w0K7~%U!g)*hi=n&GO!&ADKR5`KKS5SIT8R zB7?cBi1RD0XZh|;nco+7eytJL=j2V?UMq_;51PexmGOetXSRs*J}V-4KKrf)^J|CM zaP!1H=f`4s9$kJK^M-EB>xy-ZzfLTFqX+YIj?4$uWNu=_{8A<6#wN_Wn=!9mmbuX% zUYFP**71Bq{>evi-)7GM)<4dLxo0WnZvXMRO411CPW70-ILYfa%m4AZP$N&~tzrV*k+Q8-cvw-<- z3;y2UuFRdsG4J8b^}J&fw^y?X-0oFBFt6dk_O{NO?Q{26w)1h(+>bh0a=$*gkp13_ zS3G_hiT6zBM{~S-RJ?mWu`TC&?2Imnc3b{WDdaw5nEQ%z>vm?We{ItesDFN4-oINa z-n%@on&+V%Ch~ldWzr?PebD>~Hh<6|$50xT>t@hBMp0&mJz1Ndm`X102zO3|}X5+&K9lb62t7 zy8SWBdx(5#(|E4u@UL9{OX3|UD|^=CAl_MUI?eL`mFN2LN@VU^pTGA5hXaO5V_DC{ zdt9Es;=3%jas3=S!uC+do9!o|Bima8VV|e-*gt1CV}9Wa$6cTNSpL=!?icGUxtvGE z`=R%<_^H*B^Zaf_QT9u3ZZZFn#XS2vb8B1n=UbOEuepYK z<892H4D4@H;+RjE%YM5>I`c$p&NFG_#N0`oH{88~%QHpXAKq82n+@^dcC6ow+kIYP z_5)Kw*nr{&vK{sm?*(+d&HXyHBX!0dE`UloY&@EY$vD1y7x`-e*KhPT%Jk8$j|+~;JdPxuVZQqj^B$J0 zzm>TEXURd9w~J$b;Q{k)rMVvb-I?EB!u-ok<}aFayEJ{lylX1AdpmL8#Y2(bJ0h6v z|L1%5tH;E7Raajg?_T}Ky!&P5{@a*GmSMi99nTls8gu!3wde0`A@29C(VhGCJ4@zS zHJGm`&)iqUpU>RPu6m_x5iUA?lNREj}rG0H5kb8&+K64$HaRv;ip;NavAfo z4Vkxl$mKsVhk4B$uAiCnnHQ|Z+)dmkle~`G<&!(}#TLvbUuQpHDe{Zfi2dR!BA@E0 zGuvU}UAAY-?aW7=XI@0ypB63dXLvY*?SH1o2MB-7_4D5>uFq;sxgA?QVQ$fl?dM%6 zbH6y|Ma6p=<5F4v{T1d#b_za{d9yyu2XtkgRh#)i@eWbIS+2LkuFOl_;CA^Y&guV{ z$?aQF+=tx158F@Ok8J17S2E8L``z0(yfVbzVEZ4&%kTyVNB-ZZo0)en!QWL`+#?ZG zlIyLHxTkJd9?RG6!|k<3+&5C}7t0^4$M#@8i21Uy%umc^UM+~Z_WxMAZL}f!r=<4zoQter5YMaGPYZ*zZ~bx67Q`TFJk#Eg8x~= z^0wl=QID4_U%w`ozq%{)8S9xB0KQ7)&+Iy7cC-^a6Uy*sn6)yjyvCLi5xIRC0V*X_hw{PlKwx8p@m^Zw{ z^MadV{l_|l=d%a1dH#EHEAv;Qm^T{4+)Cu1?6YL~|IC@U75OBcO0oRLD$LjQVP1a& zbANHp+Uz;YKTBi2&6MlkO{_1S66=Z|(pk^$aOPg!nWvRv{{0e{|ADA~x0<}(a>9lK z5l?a7^~JutKT>=EJ3h~8yl=krI#2k0Y?)W?#{2R$dh$MgmjcXx7h>M`BIgM#uE%`d zXwEm-DBcNr-Iwzjo@H?UL)n|0FHu6=i}GzP2Z+1-F;B?PJTK`ZIzFe9%ya)SH~GW* z&xZ4NT|3V_YB1MNnYmn_ooaHsIK(oKapU%lS;zcDdA6TJpP2u-#&%o29`}pPRPJ9_ z+jDT%99`MZaCJs9?h`#jsP<+#Z47{^7sJ21cYf%$%OE>E0zCt|dS16zr_<)3r89=wg& zPNvObzDe9OT&f<&pCx?xyTtR1h5@x$kJ~e@|EHqmlE$s{Hx1x%aC;T zV_U1S{J#mz-#Ifsb)NORS781$gX5x@d&~=e<9O-QGv23Lwv_qEc;?~xS%0=O^IO%p zoYoWhdzU=mdNZ%YcG7Gn+u_s(+%Gn!v;Cj3VSo5<^w8z;<={0^8w>Va%J0`#M~%vV67+|8Lhx%q_+E@_8fcf3kvkh03gd_EF~c z_n4nyH(+oP=fAu}{WoRzV6f#d*|46&VZ;6mF6aD2=0m42_vdtDLp||cm@kJ*hUKE3 zjpDdn%8GlOUN_}&&}Sn1&vGZZLhXODf4*OvdDF?TcCSMS`} z&dnQhoc87^^ND`!R}VjD{z%*#<}`@?`59;C?O(J0p5h*luG_i%`HC?gJ%j6~ITy#^ ze1z-SuRHT2Z@9f~1TnW7%e>7h=B^?hek|_YdgjRGT)K^UY9{lljk(_Xi*c=aKbGI! zk-5JebK~aBYxiUxb&>hCv1|{GtFgV=ihERwIk2HT5&I6y>TsMhPR!pcTxI!pCzuZ$ z$lU%Om-C#s$Ns_*t_MqR<`p_IzcPjSoL9`7i~D@?#Jfl);vSEU;vSWJt+;-ctzur` zBJ(7%AL@06`X-ZRV`UT&zchmE-Sye3}GyXEb4PLi zWM^ZRcM|v2e1F63wM*px-xuwhCU}##tY5vmRC+bb&zs78s>qKL&)XV`ALqEG^9JVe zhnTMw^WxyDT+a4QnHTEKe9kuJAB%JQwh?hcqz}ut7WdtSuVwkI@yySjWWHM5$6_b$ zL(4nB-&<)C^TPR=7uwA2HK-f&NWqWyVEOaaneUI}cz)#+=8Hu>$uKeB8QzHX*u3KT zi|-NUiGj?AiuqBnJ$H#N|JB#yE{W`OJf3Y4i{0*<4)DB}F-IICLV_q-1Eb^BE zy0Uz1Mdq8tIiusjysqUtiFt|P%op`%eyYe`dg9*Tx#u~r zAi5XxkvBM>r;82q+rv1Yp?)mq^JKX)Zx_Y+5`|kaUw4i3E|SMGuVT#H)`u6kO(*k$ zxJfwYpVYg}Jnt`apV7=GwPSwZDD$9QT+aI2_`6!9Fu!Zd^|R^&^HVn5jxCMY9;&-D zAC<@aiwE21KTqx#t;D@sJH)zuW<&OS0n2$DFCWVBe90J|hnAkr^VxiDd0t$r9_M?s z=*xVpc(?a^2A5}93Fd3Wz0hr}_b=zEtS9~-^F)!i{A3c#o8&O} zc*fu5zLU9!JL?&LmcKV~HOsdW^?Bce zGx2Uh??)Wx#EAQ*UN&a={UT4ecz%}8N#S_LUcB>opdrhLyE5-{o_X~>%s01U9@L5X zo&x+`ZsOjRhgZ2>79ZyEBI_2%;Va5<|7|4Z<2y6iuJ&8A{kw^KdJ87A`~zYCMaB87 zk>$9*_~fwu165f5*k6`66X!v03}^XiV&7-JxX*d6xFt<#?-1stIx|0?&HA^_VQwz$^PyPReL95eVPiDc+j=MFm)>&y zm+}|<3;Vaq)0s~Y>pTIQ*?+qHWj}mp67vlunST}UyWMhN|L>5=^M&W>%xjlpJ-0oX zR}5v|^(b?DF`jyN=kHAt=bJwC;(9KW$h_k;ZpUbm|JmX^+eyo2Y;VrnnFsQ+fnmS6 z*CO1E?SG2!8^I!rfFJBqnsH1pa6n8(y(9-hqY zTiS>DkPmDpjaD%)F@m{a9CQ1n%ts6R{NTpr+%4`={63TGp^>?0cVVBuYO=kJ3}s$j z%ztMN|-<|*@-H*{t`?=RO|8*vZ( zuvRQzftP;_JMVG(_KINc8_fLF2+iPLqq&(=}QZJshuufqQuDg0jU zTb6$$;)*xZm)?Vezu9`cJJ0z za52w4vWo4kfD`ivVjU)b0ha$yytnecCd-d*%REr52fm!m@_P<4e|CiVj|0rDmoQHf z_a1~#WBJnSnEQq?&)LlU-T5w!rOy}XMtS*FY7R0F6`vnUbde$qF=nL!t&w8nRork^Nw(F4`l8G zmT!~Je3}{m?=!(u1aD@=dK!s-ov@zeA0K6&bB*~Z(JsRqay!~AVBS=mAI~4p@}1L} zuQ6vk+-J?afH)7HE_h-i)>FcP`Af0RU!1q)4X@ttca3|?-2FcD<)O^2dNF@nnt3#1 z!^dB2539tvy!yg^eulB0vIm$C6ywNiao<-*ac_CK4AviClRtP%bLQV$GN0Lkd6hBD zt1e{Tcq;RDy_x^ljQMmk=Dv&#sp3Agq*YvRsm9FX@3Y@Kd4c)5Zp^>FbF?T%5{N*Gr=bE1UT|b6! z{j?gv^_=O=?b2pCx9`XqY(Go0nXm86c6igD`PP2Sv)?j*dzAZ2yYk$>s%&L$BJy&# zh4RH0IfyW@R|_m;K&9UY;>HlwXa4UG z^K)X}w6-7r?_W`G`O9#eWAUE#e80wg3}4@6ND%iDgzn@2ojjlCFQ>mVpDOl+yL@2z z=AC(+s_qizMZ|fZG9th0rr;gTS-*ui2>rmHM=|)WqV#E)}8uSXL%p-4&B`+T%KpUnA;9#p1|8FhMr=cWh2fX?P;~usG-Pt3B&kFo$`yVCHKBm}gIAo;aVmLCl*9Dt?&t_}*lm^NqQo z2DfjhhzEX%d8pq@*0a6|+viy)<`=|!F%jZk%IL1F=d}y-i(Qx}3H>1=U)qPmUPIPx zu7}s_nD=sHe!MF4AL4!wXR+=PH<{bLoLK+=(t_nv#C@T!L_W!X4OmaGaC~PxSw3h8 z^Ol2|pB3wwxdT|v`R&kHYD{r=+-R+oP z7W0l+;Ws)x<#M(W-*tNj%R2~v7(0;VkJ>TcRfl#e`ozq1o|UP-L$wikAlScUC#mGG06 zOIY4Q_+dX0N4*=z<3h_5%)>u0-zx6Y@TtJ_mlGlnp}fcwDzSVlV18r}^PmpQoyGa4(UwrA4; z%s+cEujqzM$PiD0*>#=rY{>z1VdvR`VoiWQ>#&G@5p1^!vTjpcS zGY>Roo+$cP`>*Vu_XuuCVtFI6p3~+K%kO)}yo30zTdn!KdW(MT-jn4guV%he_|+-@ zSUyd>*E3PPujD53nr_r!J8@~sJf=1C>mJNc&td*8l)0nGSE)RKR0Oqdim`C4aUX8cW3=PEjxRuqoy_`gQRT$0k4`wlU6X*C&E@t_8`+D(C_<#e=ikm$SO4|92wK_S-_% zQ(LT~+6S?`xjXaeA`fKNNe;Yn?=XM=p7~|*-p%;dEFW8x`AHMzhqE~EC449Ifga3f z37+iF@>Pd2w=KzhVgl#$%oXn;+7@Cx9X_z065?HeRn{z@GnV;_rOcamVZJTg1H4KIZe*G4I)j`EhanefmU}_ZRwS3}yN1^_g3W zdsiBY`e`ce**iFZ^_N@Dyip?a2jcyvLKj%R)>*+%G0ze9Ff@YYuZwpyl2@|)rB%%9 zh*wC(O4LWIH!*&ip_}<}G_OH($xzD31AtYs^c$WA0a&{n9IY=B>sv-?W?g zqeskhKQix;pT~uIHq57bGM~|ldCkGhzn*1YTAXun7x_OE#rqV!MIObWmpqQQ7Wt50 zL|(e3CC8I@8!@lmpLqw7Z~u5I%cl-u{$U>Ti(-AUmpHew{4VS1^NP7oA&&FQSu)SE zW!}6N^Eq{x2Z;G{8?ld*GKKX#SiwAU9djG8A93qG%g?>RJWA~A)!)tX>HC=HiS?7K z5iCFWEb||?nJ2wx{xygBZZn>@E;MESORO`G6YI>s|M35g%w)b$tZUsA_4#Hc>!~H| zWS3Z9@)PTL<3_Old0xzS2|Yi=dB!^3SWk`a%v*M3-dC&(xrllF6R}QpPUxQ~^miM~ zmMZa{5P8AON+e9lu;~iC**rfWci)G%nymYwIxDN zf~fz9m8{=Iv~TcEmQUTz{G2$qHAe87LQmiZ*8gt-^8}HHnJ|*&lf0QH_hs(anfYCj zhreB%uc;%>1=J9Eo@LAO|CTMlJpT`#7r%SQ{JXf%Vd!m^zbwxC1l?fyLy63D#kuJ! zPgy>{xZkf@2FrI5_jw*F$o2N70`rv(ng4TQzR;6-&)LkK)-f+2`pcZtEN>RW{BZ*F zXR*vzi~W~3*IC{~>=VU3Vfi7?m|LeXpC))Yk?-;EE9+73iYBJ9yk#o$NiUe+6YD}V z#d!Tx>{~U@V*PD?G50d!IHZ!uhxcsC@&~#xj~00^`9*x_IDz%-*us4KLFR6knD4vD z{PQ{HKi@L9W4B>2ZpiZj7ct-LKa}OKih0fIb#98ji4F?SI6Tb>o? zRYNbco*KE#e~EiL9qzLHiOI};#l3UkBA@oL$b${r#`=SAFke-e&;S0a$y~iByI$NQ zcTJoZF6zPh4KJ7%&t%^8J@bu)I6=WgynEs%_``gxXUSFmU(Gj_9l>(R{9 zy_r|u!u*nW2Xl%jPlqn7XJlpO)p|1b7Wblm6ZiZNYsh-qmt<}v&Zlob#dcm>7bnyoj#`iFoX9P1chx*2fx%{NzX6-3@g`{J-H0$CF879?|3i z%UhjdzWM}nzj)@6NzB(CVP1YU^9->bQp=y^Ux+-eg)>-w(@5qw#QM?+kw3O@E$ayp z>qSpGuzVpK=JlE||0(vzUBx{cS0{0x{6^%D4J*s?7gITZ;D)&0>`ptD5Btb@5l(xV z+XplE8_oQHBlGgM%qIzcQ@m%9?!{|%;#TcKC=+p|Kv{0 z6ZSAS`@_6UUG___doVYf%DihR^WYoIJA7yUw-Ec=VV2B)30}Vq%aHv zo4`D=7LQZiMlk=koB8~^%u9>?xD}nzEg7^D(zs{=g;X1Me|EQIO{^fen~{>%_cZALdDOm>Y>arQ`&bpCsn9;qO@f zqd1rPNxYj-S)3X1-ONSNbK^19MNap0Z-Sal2Rt z%N6&xXNmH(U&a5sK%Cq48^ZE?#rgF7;(XI}WujWpyr&3quW^T;834gM!H_N~CVeTaI z!FJAO`Axzv4G`-^vEu%aCL&KSSkzBQO)gI>k&m>7uk|$;r?EfJJj?vJ$S>M9o#i(V zW}dGvbN^P%m)B;VZOOcWSZ`?}^0a&X=J;Ww*ryvK_Vo%qU_Bqj{^=UA4pT0S^&AoT z5|zbzNQ1eoXN<^uF`LZtd1C)MeGSV$6LFed1j~;*%e<~QKluJK%YPO5PS5^h`TFAC zC%45c-`0&ir{U$Ip|*J*ZwuEZ;)pUCa>Y3M*e>JwGlnA1lr+ zz7Y3-ofhv(Ul+X6Y5rfobIkk2FyAWXBYVXCV3y*Ma5z+cDqNjk%*U^M>M_j*+u6!-DmDC@{TI}V|h!ljxkx> zFTF`Q=5voSKQ8u*hrDNb`|r$$ihcQ5 zaqe%8c(1BbTb>7&V%`2k%v}D%o96_ ze2G&c|Dkgg{@*fXm~UZsW!Nj){rxMphvko$*T2bpQylXcvA_Q=jOF|7VBUNU^ApRM zUl#nJ;48#Dy2%FCAF`c!>0QhRioD7skw?+yIO}mf#k`2%RZg>fq|o1SH_N+iW^THY z`L)^1%T8kcQ{-Em+UjTFkdpWWGk6_xUXHmW#dO4z^vaC%9i=`AjkYZMKc& zr;2%TTp-KOoW*>eI2SWq#A6M`xtoDwSpQ6Mp6K@!mJgoK{K_ikjl_AV3gIljORP(H ziM*HbVjXG6Th<>Y^3pGfym9yMtj9K+d3|xO_2C~Z@BW#2?JvyFWiT%&zW0c*|631O z&ppAP#<6^exJN5m#QEOB9-i%D{nM5)&lPsKdn(I!75yksYai-k$?41_?azp`G0$e^KLzsuzcMO%-04pcN2axNCZY>gq~(Q zSbv((^J_iJ{}BAMC}-WxtY_mU=CNX(IYs>M4PpOwqW(tI4?usho}j)rNt7qrga5a#C-Yxjna6cup4o=^VzGYJO4!?~=By{MBXf_Q z%$E&h-a@R~B#L^z63BY$i}`6r2+NNU^WRZoou}J5))OGse=c8R`BL|pFBN%5O&+rR z{in=x#k#?Y2P_|*!2G-5*5bQ5Tw*;NM7<3Z^I~5ykM0%4`g6p+ACCK3e)~S=cXu#P z*~|RJ2IiNThF|N$d_vv&hp`+zZ^cx^6sj=gq^2c zXFc7-{b@0xADy|wdQLuL?j_CvwZ6yl*73{>B{Clr!`%D~^RN@l-->n_A?$p)uphhC ztUqTS^Lb*uX!3BD4-n&;NgtLk+MW46v0w0{CCle)%KS)s<}Iz6PZ9eg_pMm|eO2Zc z#6DCXGnQBP=d38h@_+gGqv2U`mfv55`LmxQzWvDjpWv|~9^U+t^*nvdy!s2~OP(;# zyT^RYb>?9=nBTv~{QG_8&S}j1iT~}kk>wwVd0g!^EN{1hd4gCc{N&B@jzgJSiFL)K z0W80?Kl7^nm?w(zEEDS??ZkS^*1oJ?{jZT&U%I)Q^?cgL++T33Lo8oW*xO%WSNWc@ zoVSZTX z*(u_s3OiZPZNZ<5edO00SfqywK#`vEB1dcS7!Y`Dloq){HdiFwC>L##hj_@%AOS-!XMZ~Ygte8bVqPkA#xqWt+3mM<^n3pvg#-%E@y zfnxp2tuE^c5pn6Jn>;?|7jfno5wDgz$a)$MWL{Y0XWDtNe6Q}zr+?zS!A%>Pe+y+^ z?mY9di<$Q=z`SH4cd)n|=0gmur|~kD-(tjkYEkAN`ZG6kVV)%3LkXMB4rQ5mzo4lN z>+fESdC_gG|KkegcJG<*uFU#x-eCC_)0h_tWqwxNGcf!!%lFyH++;ZO2Ai3izGmL( z7V{6QnI8{gelwPNc@wVBZ1LWNaXRbC$81qq%%zrjw-lsEjqd?~U=P@5M zg!vwC=Kdkf?_6fy>mu`q*O(VdW4^E|`;*0;m_P5$d~*Qvj#13*#Q70-kq7?o73(Qh zlKuSl`pg$wFi$dPe!L!YBQNG{hcP!6>jM?VzU`vptmois=HK5jACt@cLscI4w~BSe zwIf*GX&`g=k<6b=V}3;BF}7RA^7Usk-?D)DSFx^}DCTR97gK?w%+Ef$HtU-3Y(9i%1180y_j$2C9`~**e@`>!15O7n7jPI= z{(xv-W3j)J6~=mI>|nePi^zIqY!pG%oL%wXPq5c4`>-@)3K&4P}1Lllh;{%&)X%zR8(+a)0Lb4$K#c`~TlPOCEdw^BTeruNC>UWuCAe7vcX`iSfemF6*%n%<9~Se41PhkmRfBmOVOM#g9e0cR zKPUF5o{IV1jILasPXm~zdoy1m^7Q`AW%*N!nZFKUp0$g4@&V?zqL>fA!n~4LcM3{k z`3J9=7ffNkIF)%)7V~{ynGgHIJXWkDm3YhYp>LQEf5rU1Sa&)kc#G$(r-vxdCh@=K zqW*&g{~+42_jN9h<7MWtCz&@B`T5>qEWdjn^VsdopNBGUD%R6-HnRK=p=aePmVdN@ zd8Gx+j|VWfn$0|IJoA7t%#Fl4)iZaN&*;JYT1V!2&6pd+_*FxUvtA`x&w=91-~GwM zAGZEr{`x!fDPlpn=m(a+B-TS7zF_&x`^=Y#^^Kw;9-b-U-d7@?H@n0C>n7xziSjHH zasFG85A5-l|97RRpP8avI%Tk)En;2EMYOw>$e)}l;*dUKJu_9rnWrnG85&B9IIw*k zmN(RA9#@t5drRh{#QNl)GAuvQoVj?e%21^M%Xb&;(p#)swii6?6}S5j(NE`!JX?2R zZ&yYC-TRFHcbb^rcvE(XZc#`RqxtUK%O$jm|zc~3b*K^)i=D}iqT~pX+DIvc`*k`Kv-v*+bV}<^_Ph9@dUzk@EdMb-@ zb`;-RJe&20<>P)`O!!GFW0p4)`ylInUcN&k_5Q8I4&!Lg@c1%K2Et=LeebP^S1XA9^u|KZ9T86sGUamaEX{nF_}}GaS^lILM-qiSlo57SQN-I# zg#8y5>x7R5_YwW8fauqjcKp2|f~PfQ`7Ppq9hv@*d=2!*3Szui_6`ew$b)NfGm!As1QCX0dPhGn(bU zh<(_~=UKkk5$1Em{_nOEEI(c7X>*e0ukUBxHG=uf1I%4^3cj1U`8wva)-rFfn0e|9 z<~wFGx0=Y@W-{}vk<1(WGG8;8d4}LyJy|~4gZaY&%uBj4Unb-S^<(+p?#%0o^33YX z@|XHEKO+7&Tj-xH^q1|;`v0fv92@o8wJ^GC^VGI&+dj2zoZ7Z++qP}o+O}=)`v=D8 z$FZNz=Tfdp#5dUrJh&cTQ42aBpMoi`xWxcdh_KCJmi!JNnZFxD} zJq4LhF3G%T3FZ~bF<&D7gp*=Fy6CSJV*7E5F+VN8D{Fq%mk@n%iDw8e{JHos)=It9 z5&y#sS%?1=KSS$8{JVn7{yL}ZTcb+*EFtZAVhB!GKED=_`Um%~W^$g@Sp2$mpR=8d za{ic8*5OxVdJ%_E$4BoezE?)ugtHC{Yx^w-IjVu6;kRq zDD$?`9s=cjaH8z*-i!aFllU>xh@a=Z_=O&(=KSB5{uo>0&@PC-qNDIgG7gWF@#KH9 zPhTT;){EbxdOrTWMa937Ptt8H<7XYoPxr!{?ty~Li;F*`x6BIxqAxAy7Xgx=|HQ8{ zR{Scpq&&k(xrLYZa7M=S8RF;cE`HImvVI7Z^+ONoUvtFH5b=wKlXLLI(Ybz0iJ#}E zj2lTpvz=N&m=Bim@cU05Cx^>;en!@ZHDw<8Eqc9(##*oIJr~S$w8a3opSQKVjW=p zB+!hsz^_lbk_B!)9+nAqT$b9u& z=6lvK@A8y+PI)iuw%l`n{)+8Hzr}pe7v^`;aJhx~m-!?44p)XEtY4Xjd0Ba9?3|QC ztRI~J6la+?JHkBQR_3c@95}s!^}QD{kG7h5o*m4?oMHa&L*^IWGw&Cf%XzZAlXfLM z>pzBOUiSm18%p}uP8lDjOFjNR&-RDRU>$7}d{z>}9){y+W@@8g!q!{y%m6&g<$$Uq9 z<_YEf$-JvsA40xUzwrp`qsjN^@5;MsgRZijYloRP*vS0u8s?ki`{V!pkM%R;-Ol;p zc${CAhWXfn%pa9vp0pnG@p5kaN9NxPN7&BntIYe~VE*C^^Mex4^F-`-5r0%GIUgzT zj?--}{{P>ha5@T@l#F>z@skHB!TN^vn9uLY{F3-XcF6iR$vU=U@5QB+{mAH3Z0CXO zry4C}eRRoZ&E>3bBKrSkvOf6&=CL<3pLLXZ(tXVT$UbhIlv`)nr~m%W_AAK#uE8_b z=Y7e1py*3pW&H`+FE`)M`nvLar%1UKlzs7&v24G_Nap2dGmkfyc`n&!jg$5nO7fXi z`~yQ5aJt9DZ`OVc>n{&sKD`U`H&51nXzVX5Lx&MB#%a-F0$alUU9XvP!(r z%2zx;CYE!Ay>gDwDLnt)`%*rGq&*apbO*>eerT~%JZ^P~Q9e)K@pqE98i>#vM6e&Uw?SO_4`};dmK4mE-2@}c_ePCyPP|B zmw2kW!r#iiChK4RU896w7dy!%{}-hE-^n35HW|B-U;CHb`V%pDn5=LO+` zW50}_-DG`rUE+lzW?=gXGc&)EiFrbaH(OSO_4A4|A6t=mimJ@3HfH{$8S|N)ng82^ zdD5QD$Mt94VF2?FW0`l6{ZyPqtWUp*d0g>V1d)CHFVUaa$@YuyXTIzN^RmKIpJM&M zW6a0N{{6S;a~@?o4K6VMbdGuEo6J*OXC78~dExQI{)ZcEf6`s%vF{b%vF!PBvuGlR6q?{KdlJ#dD;h7%ux_Y+oadNM@ z@-4Pg@jCO7a&8j-66>Q}VSea5^Urc#Q}#IP=N@3*W;gRK`x6fd{YYQg=kAgHU`*M6y^?)mCGr1s7CUKVKk_&zk7Ijef4w{e>(2#ao?ZMflf@5H zH!|Bf5|jB2;jiPc{)+h7g2!Tg#e~eSBx9aj=BYZe|9TU0INMuKdhz zmSA43!5;1Df_;+V&`L9w$rpV^Th3#7wo`1`G3qO_hEjb zC-Z;$Gmq1cdC4KnD~@EoeKhl?lbQdS$h@|!Z==dOw$voH6JrMRcjKAYo5g&n?5`_H zK68nkT6VrUh12aPzxRRs-YAmp3bFr1^abR1)tbrq%pm$fQtxGicOK66e~)5bLfU6> zY0pFZvYq16?>=^6{i!z0-?U)=FeoDDJkRRjaqD{hm4=AE3tk? zP39{qFke!Y`Gj)J!<1xh?`3U~d1qlBwzEyGm zmW_E5N%y|+aGBUnnY7HCrDwiF_R+CYvOZQ4=D89uZ!COJeAWlZdg+O*ukK1dFC}OD z6@`zL_1HnNKTgWCg4n4hb~eiIO_G@Ne=8C5EAg0bm2w*xhxJROd`^n}y;6_%-N5Fe zkClS+(^ASIi_A})t{aha!<{#Z!rcdz6p zf~4C*^7%pRw3PBWBKjmUKKzc&zqf#tLmbi1iOzPCMP_bsP(dTGK7V-T-$FBQF8kT2 zAz5EV_#oLwUzGj+VbQ0OeSQ8AoS%|mmBUYs@f%c@{B#w+XcqCKj+JuACcL5e zL+;7B_8!sOyX6BVt|q4VZK}(=2SbH#5I^u<@grRozta-=z2QWkO#EGggtw6M`WF(f z@>_U+iLdA-e!{V$FDr3_IV7&*v+$APZ@evj#f}n}cwWjavDEK#iBDK7`V!K9tbV6R zJ2$`OHtDCqq#cfx_TN+bOLEbVm2_Lk@BPceSio}8Kaz3drTngoQf}iV&a;V(W6LC; z$As^e@wUJCb-x5*Ltmvl|6zGRb4hnkaQ+Y5WFGk-^X4>}H%H0*TSn&h$Fd#>Cp@jJ zd!Nd>rM9ed_NC);h$Q=kuNhgtS@whJM887zo707tk^O8u;h|)o{x%=y|B>)TMOc4D zc$t!{4_}ITSg~_T?EEOkb{ZCCzN<9zB*mEzm2?9n|92(bZlaGM_HPT1EdHMz^1HH% zU+9|H$s+!!SK^PVBl?7OxjfTXXFjzK^Bto9Q=9euML$~NB|?e*TxGVuP|EXH8P<;y zeOu9QE5~+DmuEgy+Ev>UtiLM#C1gR?KNmix0PC-azwUA_*7uilv?v)^A5_NAcH&Pf zordj<6~EAE8RtWY{Ul=lc5+TPMk?kv#LiSn_gYG}lR)OLabiD)*l8{4<`e%+N3q{0 zDd%&J*jbl|^@+uA5J&tTePjVtRMrU#qj0(-Wqooc8tcbLWIkEeEsG@GLE^_KCiYv3 z|KXwV$H6(Df&+fbe!mu*30NuX*gvA5F8YYF4v#JRIkFzEDEoq=vYsC%`->uC|C{VD zLdgCoz1UAC`=&M$4_{LD`xWKB)pOa;wh$g5aXYPKzkKyhAlC34i8t#d`}CgI*iQO; z%$wX`-s>Fm{F2Z35^r|x3fnm)_Jf>YeQn9-0f}e3De2yj__4+kcNgk^oS!!mclTV< zjU@UWav!jq{N9|mI6t{0-fW`ye?m$73?_c0M&frWBkg~u+_zdH{VRp|&C*DmXGZDQ z$Ho3<@jDfixV1OpUz#TV!!R1G31((^mL`a5&5a%nidlK-L4x zBeDK}GB0P8dAz%<2LfWT{dRIbGB_dY7bjsJPS$TbWgYuO*3~iO9K5XXfZUv)TjFQ< zCjNwbdD+g5{LGt)ov5OpD)tk}{w0>!`7OVzr05gLK4`P}H{!|fN?C}@p;$5I5ehTU zF8+iy;;%R-{*b=1ulykP2gv@ky72h2&;26l78d;y@rO((!{zg$ixX;k@V{$bNjY=o`uWQY;0RTW2YUeWHJs zitS`b#(bdUzk=}FvOozNpY4Aa9wiRz)5tvjUFPwuV&}f--^Ao}6H2j@_A3}7m;!+ zEDo^aZ6JKg;imCw!~eIU?NJe`Lx307-Jl}=kc34=(hq_|Fq>LL!#Qs{T zmkeTOzKn;*q@3f(JlIXf=e9D=*OPg3t*keu$UHbn=Gm+9xcqy|I&ex-)(56zo+CZ; z(3zOu%E&xqZsw~!YUXEX0Ng?Xtt%nM0=)(L+wmhIR*uf4-qAJ~`qv;NFS^N@j^a&9$7^snSR?jL#gV3C|pr8&&`xhZx=%KHz$ z4v8J%CHJ#_uDlnqURtTx_VE#|28iNG#|03#C6+7CUhz-I&7fN_pCQm3ib`GPRuJ|06uN zw4XV0K3i3IT{-8yF6l;+xcx8E4xh+5c(1eEzlL96zEAYuuCm_FwNJ}AcuOhIVVBu{ zei*D8zKjF=MgLIpV{tF*s@U_Cf%Dys0LbiWO{IOkyKa~CTNZA+15`IqFRVP`0 zewTLpMEb=UY0u|`9~b|_e#uX2@w4q0`)kFYwn*$`6#q#oDYuE@$2cVVlj8Rt5Ru!- z7qOE{{PRo2-?CNm8C2|)l79V7cra<717!TE8;5`IN9ix;g@;PSc1}q@U6GviyJY-{ zBm9~0T9U4P$7h9%8xiF9W{}_8LdL^gDfst(lX@8^`V=yL){}IXN&QY2K0wN?gv>|Z zBtNaB9S)Ipn_Jqyy^}vr#-%GVo+Os>Eld!umwe*yEh_7c)iMsJ5Wet7ASRqSkokRC zFNK%=+K4Y~XQjjkZu!Rg`C=!etkdjW`qpB9tn3pbhrvu{0We8&(0I;iJjrX*NgoP zGHx6bJApF(w2*!sUd|;G$awM>N8x~gZQ@_*A@+|-K39vsYpRU@!DWB_SnO{R|G)=% z_aL3@$J2{{V5Im7+lc+vGEe=I@-%%Zu@fkEI?6oqO4`Y9X@_$B6(GZTKv0>lze{^g zBD|0!P(bFFXfh6@l5sDFjBhtZUqQy<2*S6?e6d2-jT2@3k0JZ+_OhPbApVe6vaYTu zQe>gQ3L%?jYQ#1|h^9a9?iuJoQG7l?uYKgvx@cWtA{=KZs zLx{es=tE~?J5|L_C$SSp^tt4BTB%r{o@P)VqP$ zfzL`D!cRH>eJ1D5rA1#<&OKMl@0u>ZE3Kq^Ue00vNV)-Xo_kcv;jpBeRr3Ew>M@Aa z%PcvUza#B%f#kEAwEq&){y)e*w4U_ec4B9|j1O(4zpobimu0+KD&xQ<*vHwZ@lYyeo7zDdrz@Jf>ZaQWFzguKjWOFmypIfNCxy;rbF@|joiQ(5fKl>F=z`@2QoBRiMFS<#o2 z_7hY1G1*Urm-Zh*_tD%ybl>JvnFo)^e3~@`r~60j*m;(n z<6M%splNcRQeW0Tt!3SkLCysli~YH>9$O;o&oy$6a7@;dtAsz4bic@YJE7>qi~TS1 z9#Ljlhc}UZ#4kzrqUa+?xwVjUqLpH2s;uXG$Uex

p|=Z^Vq$_{0!ZbIexf!Pc>hRhk1F8uT#@_88n0ZVcbs^dcxPQoh`ZFF86@@`Oaco zNeF+uw4ENf?@h2*?A8g0hsZoRY`uqGo|E^L_?A}+neKvcuj}!CbjS_X2 z4eD~9zSiuAs<2=F%GcTMd)Q-L*_(^;22rVe{EQa!cz>P9`6n9j_8$vlKf8$cOOO~h zd&Pv0haqC!vFx=RU&EPwxR@7u#TMSqPtEvu&AGzudDfoK-xp#%>y0hAe~2~Y`Fg$J*zK;fuQKKBIk%AAJc<2F3;w-JC$rb~V=s4$G&_h`w}tlba)E?-e56) z*ljz;=U8AHTzV{(cwr?|wbFf9O1%`x(Q5{GMk>XYQ{Kw&VWo z%S7%EgT(jxWHFDT{Uh$5ZO*V4xy5du$$nDIe|UQ(_wxtevpb3PES^l^b{KVrJ?1a_ zd*=D37_wW*RfCe%Wm11`wTH z%%4*XIt6mScXTBC>{jgA*6em--Gm11IKIq4_B!tDOFFPei|^)Qx{@v&JN1|@UP^_;JlFxbWiTVy>u^z{Vu6$lkYQp}g6uV&#Z;xd> z`vlPr=3u(KmSg% zU)axnPV^6(M{<0)sI#yab#~qxI8T`9uimWW_^G14rlII3KZ`mPlV+U1PI30Qcihhx zzQKNY4ZFoi_B*}VH@9R@ugISFkFRU*GT8I(v#%BN9z1W$@qfj-iklMnd4H9t*QnK* zg_9(nv- zrkf4NzwOHY#Dm?T6T4j-_P^`d?}+z}qe40UtC)wd>{gB+afiKeDtjBT&P&r*93L*e zXI1FI$It9G>{FVu-|Nd>N1R_RJ8*onI_zo1*av^+-)k-217|Pf_;_)gthD3!!&!XX zb`am4yN7Um+9mcLVm;zuTaGVToxS&1_LIHY(?0X}+?|uzYmQ)Vc7;7o)K96przJ`J zoq9`a&hI{i{b*YQx9RhFEt0X?)(De9zu%G@rjN|JcLl@_ooA zF^)HHG4~q}8*x7~GmhP8EB9AJmhgQ})$!c#r8sjxIjIr%w-KWLC0UFMHJ;1;{4B8! zT^}({)o~+VUwnMnM~Zr)s5Tt$CFZer>B;evy0SN@%l^6?`{b(ZYcjdrJhroU5aXXM zzVh`nSd0srR-5DV#PxUA2|i9PiTTXO7;^r_=ImJm*r%LiFCfMh|EkUHwzdL$NDk-U z8^wNIjI#}R!tFDp9(%p%d_JmqR(<36e7ECn*dV+L_Zu%drK54^#d@c9q^TmC_-v)fW$luKkF@GHUa!>ZYq8>J98OOKz&3?#_x3ffX{=Kif z*b~L`@|N=4p3A$iU+lqNT)YP!XTkB)L_JQMjvU`f_)cez_Z!3Bd_8-%@W4eJUr*#W zp1|?rz1V+>_<@r+zC{50!=ij1)m_Z~qcoq7HsS1V$MbnzzZLfbzT9mXtc>J8beYWk zQi=oLhg|#0{`)`f51+Yl|M^nXAN^g+{q_hkUrN^)zAg-R;_G#C2>XwU{Jd;6n|;}1 z_9=Pn^(*o7dr~|009*Dt-#NeK1@_+I?CuNM<7%*nKIV4o9nPK~%wBgF`}CRYCB=HX z`Bogiswn%scYK_; zokRHijWc6!(U1Fqf;+h1sGGw5&&Xcv;YYY1bIRua@TD8O*>mn!x6fq%mBsz@hIQ=A znz4^DU?28@uNT$C_x&&t-#wf21UBLS>#~^L{2KeX(%e4(#5&RYvp9Z;s29tg!TamQ zCH9MAzkkZ*_$?{y{U5Ne3TF2e^Iy4)=J*#q*z?=7&k^xICUU&TcJ?f>&Q6O&j;~Xb z&#$^Y*^6voUv;1To;jb_EyTFWA4c47>{!R{SBCqaB4XU^-S*s%T@>rmJ}b`sWSk58 zTk-t<=rG4O6YIU++R5=dm#}9oV0WLv{@RtjY7_R671__0X1|ri?Yuy|mpHVP2J7ym@d`@sJ@!xH;Z}r5A@^s`gZIas<9hZU{8tXey{5R z_WqODE3{%4%SRXlUF7~eOVsrk?&A3MC)hiQb=lIgIKF!w-u?oj?$!Dl$KOk1x3uB* zcNF!)aRD6v<`uh3bv`~lC$bOwk9|c!KEHm8^SZV-$FE<_o*KeF@G$#M(O*rT!tq98 zJKz2hzxO7)jSsu)2=`N-Kk0{NaA?ldY>T-OqcI?lmuwOpKKJ*Lwc(IO*k?8;J zCi8yD*v@|c6nnv|?5D1?`-u9Z!SNh__CEUnaXr1ffa7O~@c_@CaeF?P!T#HXz0n>% z-^ZG~Z#-3+xtA z?3b^xdtPDhF4mp@B-Z6I6ze8i9pwC$VeA98uy3EteqFSGCsCi3Cyuv1;y6hY-yhHH z=HujU5c^&~_EhoyDtZsc_ex+d`hoq6Sa0a&IgUSbnZ4RY_A39ekDbiE&V{|lc=mwq z><_B47qny_*O|ScExXYleh;}hnf+o8`}I%k?IPHH7O-c`XE#5_?kDQG4$kFx7g0}i zLFDgxkMq0pB@Z za{M8&UjiO-{4sy_#!cBR8nHk3W?wg!{nATrpEoY-hrQV^#<3swU?1(&!4mC!6U)vhP@r7@&Pf287@{Ij{Pxc{;c>ABc=JxUK&pzV}w|`VQ_NHQ<8H=vG z-*5V`Pb$dy%{s8h%wjJl-usm*%`gOA+=fCaC zenN~-p1hU!%ZzfoALngiFA>F_FXo@=d7a~5i|5~pbvb_2Hs1cO?(F$(*&o(pKa|ex zSyHUSWp{}46pLrCk;op?mVa-L*X%ng^ZD4;kbSn8zo>wCzi0c0^Zc&M{X?Mu_9uP# zz9mD<)3tv)_e(n_aX)s*ny*JjAKA}r<9>CNIrqcMrn6TKU>_*zcLs@dh%*0jo~b$P z8^t&rzv_H{a%V96npy1G^Vy$lVSgj$)qg7f@8t~sUCvwCe|2DAc#ijDq`1EdEXVO{ z#c@*U0v|tjud#O!;{@`|`Tt%O<9sZwIR3#X_UVJzYc^pw%;D{?k<4x?#zj2#BG3LPj!!e@?YwKpzO*xY(TVKm#JWO7#C_)Kmz*cr zgxlYF9Q)@>?61UpeSJlp^3_;A9$c#MaW%@B{jwYT)lTeXs(vHc{+e{ap_W8Gx-b94B7U(UPTV2c=6R$25*L1Vce^AzJ)b~WYxwtEo!&!&7` zn;gOZPmEjsC)RIjSeENb3?{N$u4Xqo%3d#)-8Py1j+mdvY7NKV9Krrj%=cm;)@67q z)=P>C;QN_+8`~AgD zTQ~~$U|-r*rr>t#6A<~$WG*o#+XUuec&SNLRe zjxW=i-DDcOQ3(5~cy=3pZDz1oj59Cd$>-h9+3W{5v)4SpUi3M8r83+_q-pQUSiML$nHIteZ_G07LXJIDRb$Two1C~9=|99gi_K|_? z(Yx6*L|x4OmK?vbB)hLzr=xZl_lFK*-HmgVIlk^=?*H4LVP6r!-ry8_*j4ri$Js|+ zV0TPq53b93qSUb3)rvDXWub}{is-P zsALK9N$qqm$m%M&ztkVusghGpDNZD?!ATM|BYau zDZZPy*mHb{ky0e+V0Nr3){0V5#KM&a``(#Qd!RPvmE<&F>lYxB+ef!;tfRI z)9`f8lak8b_$zzs>b(6unz2WUdceOP9DjB!d(v)pgTw3%_pvt$We?lQ?mnNrNncMBUsFk-y1p{=aQS z9iLwU$9K$OFJQ*)KU%C$S3>jyzeL^W6>+{y6zkc2{>j^!@Q>X%p1sI?c9-_-11qt6 zfBSL4<5yS zQmmWiCgM{>ec#IzZnw6!{C@|HV?QU>Uvsa?@ugn#|NY&9lXnCK~g3SL+)4wNHG#*xQ`%XKpX#`@N(fetvff!rLE%Dqj2^ zY5X_#VdDK>CoztFhcG*e{9o)GS-@I5eZm>=9X_WRgd2tVh|@o$^4mrdt(tGk@t>Lu@&u)lnq z^nJp|!(s7W_l_I)Cq`ws{~2q{{Z+6TKW8Nl;(pJj0(+7rdk+Wp#jV)C^kcW*%>Lyl z`?#L$7GnO5?04M%X9lwGnaO_1hrQT6;l+77ZN+*GRu4J8gjj#!dkV*gh|;mp`ELA<{iB#KD?p6vb1>oimIgQ24Tf|7=A6vl+>`ss`{H|L z>3ZDX#yYaE^<@9KgT2c&_8p==-8P@&ySnl9;$6ZSQdjV(m8)BSTZefluEGB54HIC2gm8skh&tA=mz0DN%GsoEf`_7);huiJuf9%zact6&2V6WbTy^RO^08uC2 zrzFQaJ?8B+Il$g+8GCCnKi-I~9N*vy`>cMvok`+5uk&a=kGg$iKPBc}-!zQR>$~sS zTXy39p_W)jW1kcEKOW+_Y}qpI-z>%W;XR+Z-<~ekVXQfwpMS4sv7a5u>pIy*uzMe2 zzcQD-ZbfzzQFj(OgSXSF7W>8&zCLyn^A0&Z;dt*f_F@J2|DH8tkF;PntHj2w@-$+ zKTH+xyWA)6`5XL%`++yL*{f{ge&%K~b}>xMAUTHnv5&LaH??DLUX%UcFTT%7JHl=} zi2Yh)_Om6~vklnYOR#sY!|p4_#SIkedgTA)JnmJveH=uc*C%U^_buBr~btNXT+|Oj2aDP>%8~aI7XLNNf#}C-W9(0D? z@(TNfd+c34vlkcNiM;yo{gSDe4{&=R$4|V)Zk*3PR@6ri6YpDmQ#jAiyX;}7*u6yE zTraVn*V9p)XR-Lcmb8WAy9Kc?Kga&|A$$5A_EeGIbvDPBaAx0>%g4{*i|n8GurCnr zJz6c|_(jv$2d-hCAnM$!MREKpOnwPD_hiO z<$vb*3*|Zg+#2le;`p3x!0}}=`Ty<_$L;1@9N%IK`$Tb^{2k5lv&XSloW~xypM881 zdx$x=gOwZme^c0>tzoZqj6F)!|4t0!_%wg^t<%{p#e3|><2l|y#J?KM@lETn5BkOJ z-1a4VA2EOR>SY{n(t^EB2Hz*!gtG5i&u$><%c6R5{PlM1|LU?A6wh&M+H-vFX!fjS z?6>{d?1C+uM~CJW@0;?*KnSNbJ*_-4-xa{)b7T4R+_Uv z6Ynuh#P^+YA^e=!T&xp4){5ip^7;8XKAzoHtcT?$JXLr{v3}Msu|C>=k9m92zp|GQ z9&(=JBLmsX?qwf&lzm1JyZa9I2HV-+i1o|fByfDM*X%xGz57}(IR2Yh2d#ZD$LIR7 z$IfDR?!oS9!=725{o*(NUh_|^PZ#rqr(9xSQS4hyBY;c9*{F0|&BK8OmPA zo;^2}zjKXAV6XaxeVAB>YeFu^+g@YO4QF2=*0XT4;olWu!M?F3d;4Gfe^)+bAN-#E zpcr>#7|-z^#QfWnHgJ6FjqI`c?1RPnZXrv#9bP-L&w0-IttxQ*T(R!nl+_&nu@(D* zSNwm6er4Y^i1UnC!~Wiz-AbHyv&}fZadGzGChWaU*>glYM+tu>j-TCoxP1~YV53ZuY{@*we-KWDV!|O;7Uh2CKaoXE;-gGc^3lc^RWi-cITxU;t!hSrAy;o6g|DlHL$-6nvoE&z)C7j1jti#wTk>iV6 zu)iw8?jnxQl>lk}<0Q*?c-^Pe~=X+cD{Ph&|zaxKg{7qZFzRWtx@popi&yQnY zCFZ?fBd({JL42Lf6ZhNY#C#ol*7N&^F|K&IHkfmW-Rlwip9cIMuly?Z?czQ23I~1< z+4dBB6Y(9Yn)n{)H;}&rt`gs2%Zv5n-t^`1LN!I5;A!!F*`PdcPxJ=?*+VD?HfCA7YQ&#=cK{f9Wf}>p6|)Jcq=0qEI7_FD&N!UA2_kVd7=> za*x@q#ryE7HFVj=X>aB?oT{(_Kz_$v|XV_mkMIkFYAza1C-zx4x-KhT)_=dWVi-D7dz^6DYyaZO>j zD8csw-lDF`TFf(G`<3&&YQ^^1I#j_#zeAtbPK!jVfN>N><4GFr&nY5KgY*UX)(@We>D-G!pHxEYwTG!*z3i! zd;VnKCDt`It;pM1MBJ~2iTgK`1^j<&)Mod&!~IDaF@7Kikej6dSK9LauZ4f}|(?9T?W=g(qy-^uQH zpMAKv|C~FTe{aN1cHckjMi#tZlH0OBp2wbXjNR%8`{@VlbzAUpI3j}mi&$UAbuynv zjt|)##QI8eqWC=Z%w>-j>mAH!#r;W9G5`7RwH&{23%k)h_V*3A-(Dr=)rmgH@q-fB zXLjW4W67iJ4lmi0Kd|2w^CMZ5=Jz3&nzOg+!EP$vtBmmC_`>_y``=;DOl2P^)~9ow z&GllbJJ`Jru%`sDx7)&gY$HNg{gB_-D`wZ&O-lRUeQz9Qf)5N%a zmn9tkSga#F<|7~fzs3EMe{qiQCdOxu?#1Wt!*uRvssyu}__2Rm%RYA@yPG$A*Jk)hv^<|HK@OAd6SYOrh8OIlU$$sHC`@2TG{UiFZ?_a@w>oU75-(DHC7x&?r zP5C%nIEa1OTz1bx?ES>NdFEn0jyL7Ff0#9h{p&vVA<^tL3UGhbz7_inG4En~v98>Q z9-OCkTlVV??9J-3cP_*}%$VJ-0{a!Q&Q~R|PTAhxoF{uUdq*+fLb6zAZKQa94?Dp5 z`}?s6i#n{}|#IIpTY0+)$1mE9%z@ujBY*LF_)_K4i*uj<0x^Jx+YTFnPxD<3F(ni20w- z{N?x=C3ycX6yL#Js&o7wk*AiZN3#<1+3wuQ+vy>mcmB)a`&EO(>`8Okk2hvNo6Yyz zb04w?9$IgB-tI)IF6K-|60;~PrvW{LS*<=_RgZdY`ZPzAMeCIvjF>}JpR9z>vO#2 ze)iS(*x!nJy`qyjzQHQ?jvLr74`V-U$9}c}yRB%?bTKb$u&9qq7XSCLAOGJh@m;m& zV2*bi&%SjI`@=o#mBe~^rKfOw^^NQWBG2XAxTaLeYfjv*u=Vs30{T?XlE62X${L>e) zf1JvmE9UjRD8@yc&fsyO3nSTM#X5s;%JKFz`@wlyiuI4i7;v6md7NjeImdTy&mJ^} z{lhr+SDx(S7PH?K_1$H2INn^$BR%#Z$FHc%$JM2t?1p0eYJ1V2+!f<`7w1#i649@r4n$&y3fcztL~@ zduut*zqjm%d+>gLdYip@Q9gby3}Ih9m)&^>`&Ucu-*)=5&l1;>W3M>>Pf=eV)0p#n z4`Vm3&t9w&`-t)E4aI%bR&kv=U!Jc=j?369C$abb!v5$Ddk<^AZ+AV!{^2wGw3hsS zBh8onoFl&vv@_)Q(r?AMg@0xEJ$cki_6@c8dytnS`;mU^T?VngSj?Wgial&Idv`Iu zvA`pa-xS3jd5b;q7yJF9{JnMDbB@33%0A#dw|}Cj@0cp;L4G=Mp4&y)TYu%_=kpJC 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≈<;M!WQsZx$@PChp&wcUS{KC$0 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

8Y%D0 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 *_%=@FV= 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
ckP!7?*wU>b2{->q$OW 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

sRbyetk9b7V_R` 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∓XW|0uq~|l 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 Date: Fri, 7 Oct 2016 20:12:00 +0200 Subject: [PATCH 229/290] Trade: added clever ImageConverter::exportTo*() ImageData overloads. They call either the compressed or the uncompressed version based on whether the image is compressed or not. --- src/Magnum/Trade/AbstractImageConverter.cpp | 9 +++ src/Magnum/Trade/AbstractImageConverter.h | 21 +++++++ .../Trade/Test/AbstractImageConverterTest.cpp | 63 ++++++++++++++++++- 3 files changed, 92 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Trade/AbstractImageConverter.cpp b/src/Magnum/Trade/AbstractImageConverter.cpp index d3589bf7d..1bbb92cc0 100644 --- a/src/Magnum/Trade/AbstractImageConverter.cpp +++ b/src/Magnum/Trade/AbstractImageConverter.cpp @@ -30,6 +30,7 @@ #include #include "Magnum/Image.h" +#include "Magnum/Trade/ImageData.h" namespace Magnum { namespace Trade { @@ -87,6 +88,10 @@ Containers::Array AbstractImageConverter::doExportToData(const CompressedI return nullptr; } +Containers::Array AbstractImageConverter::exportToData(const ImageData2D& image) { + return image.isCompressed() ? exportToData(CompressedImageView2D(image)) : exportToData(ImageView2D(image)); +} + bool AbstractImageConverter::exportToFile(const ImageView2D& image, const std::string& filename) { CORRADE_ASSERT(features() & Feature::ConvertFile, "Trade::AbstractImageConverter::exportToFile(): feature not supported", {}); @@ -131,4 +136,8 @@ bool AbstractImageConverter::doExportToFile(const CompressedImageView2D& image, return true; } +bool AbstractImageConverter::exportToFile(const ImageData2D& image, const std::string& filename) { + return image.isCompressed() ? exportToFile(CompressedImageView2D(image), filename) : exportToFile(ImageView2D(image), filename); +} + }} diff --git a/src/Magnum/Trade/AbstractImageConverter.h b/src/Magnum/Trade/AbstractImageConverter.h index 735a4f1ec..facb2eaad 100644 --- a/src/Magnum/Trade/AbstractImageConverter.h +++ b/src/Magnum/Trade/AbstractImageConverter.h @@ -33,6 +33,7 @@ #include "Magnum/Magnum.h" #include "Magnum/visibility.h" +#include "Magnum/Trade/Trade.h" #include "MagnumExternal/Optional/optional.hpp" namespace Magnum { namespace Trade { @@ -162,6 +163,16 @@ class MAGNUM_EXPORT AbstractImageConverter: public PluginManager::AbstractManagi */ Containers::Array exportToData(const CompressedImageView2D& image); + /** + * @brief Export image to raw data + * + * Based on whether the image is compressed or not, calls either + * @ref exportToData(const ImageView2D&) or + * @ref exportToData(const CompressedImageView2D&). See documentation + * of those two functions for details. + */ + Containers::Array exportToData(const ImageData2D& image); + /** * @brief Export image to file * @@ -184,6 +195,16 @@ class MAGNUM_EXPORT AbstractImageConverter: public PluginManager::AbstractManagi */ bool exportToFile(const CompressedImageView2D& image, const std::string& filename); + /** + * @brief Export image to file + * + * Based on whether the image is compressed or not, calls either + * @ref exportToFile(const ImageView2D&, const std::string&) or + * @ref exportToFile(const CompressedImageView2D&, const std::string&). + * See documentation of those two functions for details. + */ + bool exportToFile(const ImageData2D& image, const std::string& filename); + #ifndef DOXYGEN_GENERATING_OUTPUT private: #else diff --git a/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp b/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp index d70edd92c..a081a262c 100644 --- a/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp +++ b/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp @@ -25,12 +25,14 @@ #include #include +#include #include #include #include "Magnum/ImageView.h" #include "Magnum/PixelFormat.h" #include "Magnum/Trade/AbstractImageConverter.h" +#include "Magnum/Trade/ImageData.h" #include "configure.h" @@ -41,10 +43,16 @@ class AbstractImageConverterTest: public TestSuite::Tester { explicit AbstractImageConverterTest(); void exportToFile(); + + void exportToDataImageData(); + void exportToFileImageData(); }; AbstractImageConverterTest::AbstractImageConverterTest() { - addTests({&AbstractImageConverterTest::exportToFile}); + addTests({&AbstractImageConverterTest::exportToFile, + + &AbstractImageConverterTest::exportToDataImageData, + &AbstractImageConverterTest::exportToFileImageData}); /* Create testing dir */ Utility::Directory::mkpath(TRADE_TEST_OUTPUT_DIR); @@ -71,6 +79,59 @@ void AbstractImageConverterTest::exportToFile() { "\xFE\xED", TestSuite::Compare::FileToString); } +namespace { + +class ImageDataExporter: public Trade::AbstractImageConverter { + private: + Features doFeatures() const override { return Feature::ConvertData; } + + Containers::Array doExportToData(const ImageView2D&) override { + return Containers::Array::from('B'); + }; + + Containers::Array doExportToData(const CompressedImageView2D&) override { + return Containers::Array::from('C'); + }; +}; + +} + +void AbstractImageConverterTest::exportToDataImageData() { + ImageDataExporter exporter; + + { + /* Should get "B" when converting uncompressed */ + ImageData2D image{PixelFormat::RGBA, PixelType::UnsignedByte, {}, nullptr}; + CORRADE_COMPARE_AS(exporter.exportToData(image), + Containers::Array::from('B'), + TestSuite::Compare::Container); + } { + /* Should get "C" when converting compressed */ + ImageData2D image{PixelFormat::RGBA, PixelType::UnsignedByte, {}, nullptr}; + CORRADE_COMPARE_AS(exporter.exportToData(image), + Containers::Array::from('B'), + TestSuite::Compare::Container); + } +} + +void AbstractImageConverterTest::exportToFileImageData() { + ImageDataExporter exporter; + + { + /* Should get "B" when converting uncompressed */ + ImageData2D image{PixelFormat::RGBA, PixelType::UnsignedByte, {}, nullptr}; + CORRADE_VERIFY(exporter.exportToFile(image, Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out"))); + CORRADE_COMPARE_AS(Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out"), + "B", TestSuite::Compare::FileToString); + } { + /* Should get "B" when converting uncompressed */ + ImageData2D image{PixelFormat::RGBA, PixelType::UnsignedByte, {}, nullptr}; + CORRADE_VERIFY(exporter.exportToFile(image, Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out"))); + CORRADE_COMPARE_AS(Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out"), + "B", TestSuite::Compare::FileToString); + } +} + }}} CORRADE_TEST_MAIN(Magnum::Trade::Test::AbstractImageConverterTest) From ae4c8f55b628c629d89dd67c1be6799fb85cf509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 20:15:55 +0200 Subject: [PATCH 230/290] Avoid unwanted decay to deprecated functions in Image constructors. Only possible to hit this in tests, otherwise I don't see much point in creating a 0x0 image. --- src/Magnum/Image.h | 5 +++++ src/Magnum/Trade/ImageData.h | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/Magnum/Image.h b/src/Magnum/Image.h index 4bbbfdbe0..a725c83ed 100644 --- a/src/Magnum/Image.h +++ b/src/Magnum/Image.h @@ -72,6 +72,11 @@ template class Image { * instead. */ explicit CORRADE_DEPRECATED("use Image(PixelFormat, PixelType, const VectorTypeFor&, Containers::Array&&) instead") Image(PixelFormat format, PixelType type, const VectorTypeFor& size, void* data) noexcept: Image{{}, format, type, size, Containers::Array{reinterpret_cast(data), Implementation::imageDataSizeFor(format, type, size)}} {} + #ifndef DOXYGEN_GENERATING_OUTPUT + /* To avoid decay of nullptr to const void* and unwanted use of + deprecated function */ + explicit Image(PixelFormat format, PixelType type, const VectorTypeFor& size, std::nullptr_t) noexcept: Image{{}, format, type, size, nullptr} {} + #endif #endif /** diff --git a/src/Magnum/Trade/ImageData.h b/src/Magnum/Trade/ImageData.h index fc38a63bc..33b1d3dd7 100644 --- a/src/Magnum/Trade/ImageData.h +++ b/src/Magnum/Trade/ImageData.h @@ -80,6 +80,11 @@ template class ImageData { * @deprecated Use @ref ImageData(PixelFormat, PixelType, const VectorTypeFor&, Containers::Array&&, const void*) instead. */ explicit CORRADE_DEPRECATED("use ImageData(PixelFormat, PixelType, const VectorTypeFor&, Containers::Array&&) instead") ImageData(PixelFormat format, PixelType type, const VectorTypeFor& size, void* data) noexcept: ImageData{format, type, size, Containers::Array{reinterpret_cast(data), Magnum::Implementation::imageDataSizeFor(format, type, size)}} {} + #ifndef DOXYGEN_GENERATING_OUTPUT + /* To avoid decay of nullptr to const void* and unwanted use of + deprecated function */ + explicit ImageData(PixelFormat format, PixelType type, const VectorTypeFor& size, std::nullptr_t) noexcept: ImageData{{}, format, type, size, nullptr} {} + #endif #endif #ifndef MAGNUM_TARGET_GLES From 7dca1cdcbcd660eaafe735f4680bd1f036b2783c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 20:29:51 +0200 Subject: [PATCH 231/290] Synchronized windowless app dependencies of all utilities. And document them properly. --- doc/building.dox | 12 ++++++----- src/Magnum/Audio/magnum-al-info.cpp | 2 -- src/Magnum/Text/CMakeLists.txt | 20 +++++++++++++++---- src/Magnum/Text/fontconverter.cpp | 11 +++++++++- src/Magnum/TextureTools/CMakeLists.txt | 20 +++++++++++++++---- .../TextureTools/distancefieldconverter.cpp | 11 +++++++++- 6 files changed, 59 insertions(+), 17 deletions(-) diff --git a/doc/building.dox b/doc/building.dox index 018c07f41..a4b6db335 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -235,19 +235,21 @@ information): - `WITH_GLXCONTEXT` -- GLX context - `WITH_WGLCONTEXT` -- WGL context -There are also a few command-line utilities. They are currently available only -on Linux, Mac OS X and Windows, also disabled by default: +There are also a few command-line utilities, also disabled by default: - `WITH_MAGNUMINFO` - @ref magnum-info "magnum-info" executable, provides - information about the engine and OpenGL capabilities. + information about the engine and OpenGL capabilities. Depends on some + windowless application library. - `WITH_AL_INFO` -- @ref magnum-al-info "magnum-al-info" executable, provides information about OpenAL capabilities. - `WITH_DISTANCEFIELDCONVERTER` - @ref magnum-distancefieldconverter "magnum-distancefieldconverter" executable for converting black&white images to distance field textures. - Enables also building of @ref TextureTools library. + Enables also building of @ref TextureTools library. Available only on + desktop GL, depends on some windowless application library. - `WITH_FONTCONVERTER` - @ref magnum-fontconverter "magnum-fontconverter" executable for converting fonts to raster ones. Enables also building of - @ref Text library. + @ref Text library. Available only on desktop GL, depends on some windowless + application library. Magnum also contains a set of dependency-less plugins for importing essential file formats. Additional plugins are provided in separate plugin repository, diff --git a/src/Magnum/Audio/magnum-al-info.cpp b/src/Magnum/Audio/magnum-al-info.cpp index e3c3c41b2..2910fb77c 100644 --- a/src/Magnum/Audio/magnum-al-info.cpp +++ b/src/Magnum/Audio/magnum-al-info.cpp @@ -50,8 +50,6 @@ Arguments: | Information about Magnum engine and OpenAL capabilities | +---------------------------------------------------------+ -connect(2) call to /dev/shm/jack-1000/default/jack_0 failed (err=No such file or directory) -attempt to connect to server failed Audio Renderer: OpenAL Soft by OpenAL Community OpenAL version: 1.1 ALSOFT 1.17.2 Available devices: diff --git a/src/Magnum/Text/CMakeLists.txt b/src/Magnum/Text/CMakeLists.txt index 0f97736d9..5190538b4 100644 --- a/src/Magnum/Text/CMakeLists.txt +++ b/src/Magnum/Text/CMakeLists.txt @@ -65,12 +65,24 @@ if(WITH_FONTCONVERTER) target_link_libraries(magnum-fontconverter Magnum MagnumText) if(MAGNUM_TARGET_HEADLESS) target_link_libraries(magnum-fontconverter MagnumWindowlessEglApplication) + elseif(CORRADE_TARGET_IOS) + target_link_libraries(magnum-fontconverter MagnumWindowlessIosApplication) elseif(CORRADE_TARGET_APPLE) target_link_libraries(magnum-fontconverter MagnumWindowlessCglApplication) - elseif(CORRADE_TARGET_UNIX AND NOT TARGET_GLES) - target_link_libraries(magnum-fontconverter MagnumWindowlessGlxApplication) - elseif(CORRADE_TARGET_WINDOWS AND NOT TARGET_GLES) - target_link_libraries(magnum-fontconverter MagnumWindowlessWglApplication) + elseif(CORRADE_TARGET_NACL) + target_link_libraries(magnum-fontconverter MagnumWindowlessNaClApplication) + elseif(CORRADE_TARGET_UNIX) + if(MAGNUM_TARGET_GLES AND NOT MAGNUM_TARGET_DESKTOP_GLES) + target_link_libraries(magnum-fontconverter MagnumWindowlessEglApplication) + else() + target_link_libraries(magnum-fontconverter MagnumWindowlessGlxApplication) + endif() + elseif(CORRADE_TARGET_WINDOWS) + if(NOT MAGNUM_TARGET_GLES OR MAGNUM_TARGET_DESKTOP_GLES) + target_link_libraries(magnum-fontconverter MagnumWindowlessWglApplication) + else() + target_link_libraries(magnum-fontconverter MagnumWindowlessWindowsEglApplication) + endif() else() message(FATAL_ERROR "magnum-fontconverter is not available on this platform. Set WITH_FONTCONVERTER to OFF to suppress this warning.") endif() diff --git a/src/Magnum/Text/fontconverter.cpp b/src/Magnum/Text/fontconverter.cpp index cfb866eec..74111c13a 100644 --- a/src/Magnum/Text/fontconverter.cpp +++ b/src/Magnum/Text/fontconverter.cpp @@ -34,6 +34,10 @@ #ifdef MAGNUM_TARGET_HEADLESS #include "Magnum/Platform/WindowlessEglApplication.h" +#elif defined(CORRADE_TARGET_NACL) +#include "Magnum/Platform/WindowlessNaClApplication.h" +#elif defined(CORRADE_TARGET_IOS) +#include "Magnum/Platform/WindowlessIosApplication.h" #elif defined(CORRADE_TARGET_APPLE) #include "Magnum/Platform/WindowlessCglApplication.h" #elif defined(CORRADE_TARGET_UNIX) @@ -43,8 +47,12 @@ #include "Magnum/Platform/WindowlessGlxApplication.h" #endif #elif defined(CORRADE_TARGET_WINDOWS) +#if !defined(MAGNUM_TARGET_GLES) || defined(MAGNUM_TARGET_DESKTOP_GLES) #include "Magnum/Platform/WindowlessWglApplication.h" #else +#include "Magnum/Platform/WindowlessWindowsEglApplication.h" +#endif +#else #error no windowless application available on this platform #endif @@ -58,7 +66,7 @@ namespace Magnum { @section magnum-fontconverter-usage Usage - magnum-fontconverter [-h|--help] --font FONT --converter CONVERTER [--plugin-dir DIR] [--characters CHARACTERS] [--font-size N] [--atlas-size "X Y"] [--output-size "X Y"] [--radius N] [--] input output + magnum-fontconverter [--magnum-...] [-h|--help] --font FONT --converter CONVERTER [--plugin-dir DIR] [--characters CHARACTERS] [--font-size N] [--atlas-size "X Y"] [--output-size "X Y"] [--radius N] [--] input output Arguments: @@ -76,6 +84,7 @@ Arguments: - `--output-size "X Y"` -- output atlas size. If set to zero size, distance field computation will not be used. (default: `"256 256"`) - `--radius N` -- distance field computation radius (default: `24`) +- `--magnum-...` -- engine-specific options (see @ref Context for details) The resulting font files can be then used as specified in the documentation of `converter` plugin. diff --git a/src/Magnum/TextureTools/CMakeLists.txt b/src/Magnum/TextureTools/CMakeLists.txt index e93c999c6..883ed4c87 100644 --- a/src/Magnum/TextureTools/CMakeLists.txt +++ b/src/Magnum/TextureTools/CMakeLists.txt @@ -55,12 +55,24 @@ if(WITH_DISTANCEFIELDCONVERTER) target_link_libraries(magnum-distancefieldconverter Magnum MagnumTextureTools) if(MAGNUM_TARGET_HEADLESS) target_link_libraries(magnum-distancefieldconverter MagnumWindowlessEglApplication) + elseif(CORRADE_TARGET_IOS) + target_link_libraries(magnum-distancefieldconverter MagnumWindowlessIosApplication) elseif(CORRADE_TARGET_APPLE) target_link_libraries(magnum-distancefieldconverter MagnumWindowlessCglApplication) - elseif(CORRADE_TARGET_UNIX AND NOT TARGET_GLES) - target_link_libraries(magnum-distancefieldconverter MagnumWindowlessGlxApplication) - elseif(CORRADE_TARGET_WINDOWS AND NOT TARGET_GLES) - target_link_libraries(magnum-distancefieldconverter MagnumWindowlessWglApplication) + elseif(CORRADE_TARGET_NACL) + target_link_libraries(magnum-distancefieldconverter MagnumWindowlessNaClApplication) + elseif(CORRADE_TARGET_UNIX) + if(MAGNUM_TARGET_GLES AND NOT MAGNUM_TARGET_DESKTOP_GLES) + target_link_libraries(magnum-distancefieldconverter MagnumWindowlessEglApplication) + else() + target_link_libraries(magnum-distancefieldconverter MagnumWindowlessGlxApplication) + endif() + elseif(CORRADE_TARGET_WINDOWS) + if(NOT MAGNUM_TARGET_GLES OR MAGNUM_TARGET_DESKTOP_GLES) + target_link_libraries(magnum-distancefieldconverter MagnumWindowlessWglApplication) + else() + target_link_libraries(magnum-distancefieldconverter MagnumWindowlessWindowsEglApplication) + endif() else() message(FATAL_ERROR "magnum-distancefieldconverter is not available on this platform. Set WITH_DISTANCEFIELDCONVERTER to OFF to suppress this warning.") endif() diff --git a/src/Magnum/TextureTools/distancefieldconverter.cpp b/src/Magnum/TextureTools/distancefieldconverter.cpp index e64d0b52d..47d5e9d90 100644 --- a/src/Magnum/TextureTools/distancefieldconverter.cpp +++ b/src/Magnum/TextureTools/distancefieldconverter.cpp @@ -40,6 +40,10 @@ #ifdef MAGNUM_TARGET_HEADLESS #include "Magnum/Platform/WindowlessEglApplication.h" +#elif defined(CORRADE_TARGET_NACL) +#include "Magnum/Platform/WindowlessNaClApplication.h" +#elif defined(CORRADE_TARGET_IOS) +#include "Magnum/Platform/WindowlessIosApplication.h" #elif defined(CORRADE_TARGET_APPLE) #include "Magnum/Platform/WindowlessCglApplication.h" #elif defined(CORRADE_TARGET_UNIX) @@ -49,8 +53,12 @@ #include "Magnum/Platform/WindowlessGlxApplication.h" #endif #elif defined(CORRADE_TARGET_WINDOWS) +#if !defined(MAGNUM_TARGET_GLES) || defined(MAGNUM_TARGET_DESKTOP_GLES) #include "Magnum/Platform/WindowlessWglApplication.h" #else +#include "Magnum/Platform/WindowlessWindowsEglApplication.h" +#endif +#else #error no windowless application available on this platform #endif @@ -63,7 +71,7 @@ namespace Magnum { @section magnum-distancefieldconverter-usage Usage - magnum-distancefieldconverter [-h|--help] [--importer IMPORTER] [--converter CONVERTER] [--plugin-dir DIR] --output-size "X Y" --radius N [--] input output + magnum-distancefieldconverter [--magnum-...] [-h|--help] [--importer IMPORTER] [--converter CONVERTER] [--plugin-dir DIR] --output-size "X Y" --radius N [--] input output Arguments: @@ -76,6 +84,7 @@ Arguments: Magnum install location) - `--output-size "X Y"` -- size of output image - `--radius N` -- distance field computation radius +- `--magnum-...` -- engine-specific options (see @ref Context for details) Images with @ref PixelFormat::Red, @ref PixelFormat::RGB or @ref PixelFormat::RGBA are accepted on input. From 0e2d28130c60fbc999e98879ffc51ced34c64207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 21:45:34 +0200 Subject: [PATCH 232/290] New magnum-imageconverter utility. Converts images of different formats. --- CMakeLists.txt | 3 + doc/building.dox | 2 + doc/cmake.dox | 1 + doc/utilities.dox | 2 + modules/FindMagnum.cmake | 3 +- src/Magnum/Trade/CMakeLists.txt | 14 +++ src/Magnum/Trade/imageconverter.cpp | 107 ++++++++++++++++++ .../Trade/imageconverterConfigure.h.cmake | 30 +++++ 8 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 src/Magnum/Trade/imageconverter.cpp create mode 100644 src/Magnum/Trade/imageconverterConfigure.h.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 985b82227..65d7027ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,6 +65,9 @@ if(CORRADE_TARGET_UNIX OR CORRADE_TARGET_WINDOWS) cmake_dependent_option(WITH_DISTANCEFIELDCONVERTER "Build magnum-distancefieldconverter utility" OFF "NOT TARGET_GLES" OFF) endif() +# API-independent utilities +option(WITH_IMAGECONVERTER "Build magnum-imageconverter utility" OFF) + # Plugins option(WITH_WAVAUDIOIMPORTER "Build WavAudioImporter plugin" OFF) option(WITH_MAGNUMFONT "Build MagnumFont plugin" OFF) diff --git a/doc/building.dox b/doc/building.dox index a4b6db335..04bbc28f1 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -250,6 +250,8 @@ There are also a few command-line utilities, also disabled by default: executable for converting fonts to raster ones. Enables also building of @ref Text library. Available only on desktop GL, depends on some windowless application library. +- `WITH_IMAGECONVERTER` - @ref magnum-imageconverter "magnum-imageconverter" + executable for converting images of different formats. Magnum also contains a set of dependency-less plugins for importing essential file formats. Additional plugins are provided in separate plugin repository, diff --git a/doc/cmake.dox b/doc/cmake.dox index d491fc795..9bd1fbce7 100644 --- a/doc/cmake.dox +++ b/doc/cmake.dox @@ -142,6 +142,7 @@ Lastly, a few utility executables are available: - `distancefieldconverter` -- @ref magnum-distancefieldconverter executable - `fontconverter` -- @ref magnum-fontconverter executable +- `imageconverter` -- @ref magnum-imageconverter executable - `info` -- @ref magnum-info executable - `al-info` -- @ref magnum-al-info executable diff --git a/doc/utilities.dox b/doc/utilities.dox index 8533fa386..f5d1ecaff 100644 --- a/doc/utilities.dox +++ b/doc/utilities.dox @@ -28,8 +28,10 @@ namespace Magnum { @brief Command-line utilities for system information and data conversion - @subpage magnum-info -- @copybrief magnum-info +- @subpage magnum-al-info -- @copybrief magnum-al-info - @subpage magnum-distancefieldconverter -- @copybrief magnum-distancefieldconverter - @subpage magnum-fontconverter -- @copybrief magnum-fontconverter +- @subpage magnum-imageconverter -- @copybrief magnum-imageconverter */ } diff --git a/modules/FindMagnum.cmake b/modules/FindMagnum.cmake index 846ed9da0..7ee1a6916 100644 --- a/modules/FindMagnum.cmake +++ b/modules/FindMagnum.cmake @@ -72,6 +72,7 @@ # WavAudioImporter - WAV audio importer plugin # distancefieldconverter - magnum-distancefieldconverter executable # fontconverter - magnum-fontconverter executable +# imageconverter - magnum-imageconverter executable # info - magnum-info executable # al-info - magnum-al-info executable # @@ -345,7 +346,7 @@ endif() # components from other repositories) set(_MAGNUM_LIBRARY_COMPONENTS "^(Audio|DebugTools|MeshTools|Primitives|SceneGraph|Shaders|Shapes|Text|TextureTools|AndroidApplication|GlfwApplication|GlutApplication|GlxApplication|NaClApplication|Sdl2Application|XEglApplication|WindowlessCglApplication|WindowlessEglApplication|WindowlessGlxApplication|WindowlessIosApplication|WindowlessNaClApplication|WindowlessWglApplication|WindowlessWindowsEglApplication|CglContext|EglContext|GlxContext|WglContext)$") set(_MAGNUM_PLUGIN_COMPONENTS "^(MagnumFont|MagnumFontConverter|ObjImporter|TgaImageConverter|TgaImporter|WavAudioImporter)$") -set(_MAGNUM_EXECUTABLE_COMPONENTS "^(distancefieldconverter|fontconverter|info|al-info)$") +set(_MAGNUM_EXECUTABLE_COMPONENTS "^(distancefieldconverter|fontconverter|imageconverter|info|al-info)$") # Find all components foreach(_component ${Magnum_FIND_COMPONENTS}) diff --git a/src/Magnum/Trade/CMakeLists.txt b/src/Magnum/Trade/CMakeLists.txt index 59f0b8d44..e3d997aa6 100644 --- a/src/Magnum/Trade/CMakeLists.txt +++ b/src/Magnum/Trade/CMakeLists.txt @@ -46,6 +46,20 @@ add_custom_target(MagnumTrade SOURCES ${MagnumTrade_HEADERS}) install(FILES ${MagnumTrade_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Trade) +if(WITH_IMAGECONVERTER) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/imageconverterConfigure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/imageconverterConfigure.h) + + add_executable(magnum-imageconverter imageconverter.cpp) + target_include_directories(magnum-imageconverter PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(magnum-imageconverter Magnum) + + install(TARGETS magnum-imageconverter DESTINATION ${MAGNUM_BINARY_INSTALL_DIR}) + + # Magnum imageconverter target alias for superprojects + add_executable(Magnum::imageconverter ALIAS magnum-imageconverter) +endif() + if(BUILD_TESTS) add_subdirectory(Test) endif() diff --git a/src/Magnum/Trade/imageconverter.cpp b/src/Magnum/Trade/imageconverter.cpp new file mode 100644 index 000000000..f1fbd138a --- /dev/null +++ b/src/Magnum/Trade/imageconverter.cpp @@ -0,0 +1,107 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include +#include +#include + +#include "Magnum/PixelFormat.h" +#include "Magnum/Trade/AbstractImporter.h" +#include "Magnum/Trade/AbstractImageConverter.h" +#include "Magnum/Trade/ImageData.h" + +#include "imageconverterConfigure.h" + +namespace Magnum { + +/** +@page magnum-imageconverter Image conversion utility +@brief Converts images of different formats + +@section magnum-imageconverter-usage Usage + + magnum-imageconverter [-h|--help] [--importer IMPORTER] [--converter CONVERTER] [--plugin-dir DIR] [--] input output + +Arguments: + +- `input` -- input image +- `output` -- output image +- `-h`, `--help` -- display this help message and exit +- `--importer IMPORTER` -- image importer plugin (default: + @ref Trade::AnyImageImporter "AnyImageImporter") +- `--converter CONVERTER` -- image converter plugin (default: + @ref Trade::AnyImageConverter "AnyImageConverter") +- `--plugin-dir DIR` -- base plugin dir (defaults to plugin directory in + Magnum install location) + +@section magnum-imageconverter-example Example usage + +Converting a JPEG file to a PNG: + + magnum-imageconverter image.jpg image.png + +*/ + +} + +using namespace Magnum; + +int main(int argc, char** argv) { + Utility::Arguments args; + args.addArgument("input").setHelp("input", "input image") + .addArgument("output").setHelp("output", "output image") + .addOption("importer", "AnyImageImporter").setHelp("importer", "image importer plugin") + .addOption("converter", "AnyImageConverter").setHelp("converter", "image converter plugin") + .addOption("plugin-dir", MAGNUM_PLUGINS_DIR).setHelp("plugin-dir", "base plugin dir", "DIR") + .setHelp("Converts images of different formats.") + .parse(argc, argv); + + /* Load importer plugin */ + PluginManager::Manager importerManager(Utility::Directory::join(args.value("plugin-dir"), "importers/")); + if(!(importerManager.load(args.value("importer")) & PluginManager::LoadState::Loaded)) + return 1; + std::unique_ptr importer = importerManager.instance(args.value("importer")); + + /* Load converter plugin */ + PluginManager::Manager converterManager(Utility::Directory::join(args.value("plugin-dir"), "imageconverters/")); + if(!(converterManager.load(args.value("converter")) & PluginManager::LoadState::Loaded)) + return 1; + std::unique_ptr converter = converterManager.instance(args.value("converter")); + + /* Open input file */ + std::optional image; + if(!importer->openFile(args.value("input")) || !(image = importer->image2D(0))) { + Error() << "Cannot open file" << args.value("input"); + return 1; + } + + Debug() << "Converting image of size" << image->size() << Debug::nospace << ", format" << image->format() << "and type" << image->type() << "to" << args.value("output"); + + /* Save output file */ + if(!converter->exportToFile(*image, args.value("output"))) { + Error() << "Cannot save file" << args.value("output"); + return 1; + } +} diff --git a/src/Magnum/Trade/imageconverterConfigure.h.cmake b/src/Magnum/Trade/imageconverterConfigure.h.cmake new file mode 100644 index 000000000..895e33c28 --- /dev/null +++ b/src/Magnum/Trade/imageconverterConfigure.h.cmake @@ -0,0 +1,30 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#ifdef CORRADE_IS_DEBUG_BUILD +#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}" +#else +#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_INSTALL_DIR}" +#endif From dfc7dfd0dc8944e9c27aabeb0cb026e700b17764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 21:46:07 +0200 Subject: [PATCH 233/290] package: added magnum-imageconverter to all packages and CIs. --- package/archlinux/PKGBUILD | 1 + package/archlinux/PKGBUILD-clang | 1 + package/archlinux/PKGBUILD-clang-libc++ | 1 + package/archlinux/PKGBUILD-es2 | 1 + package/archlinux/PKGBUILD-es2desktop | 1 + package/archlinux/PKGBUILD-es3 | 1 + package/archlinux/PKGBUILD-es3desktop | 1 + package/archlinux/PKGBUILD-gcc47 | 1 + package/archlinux/PKGBUILD-mingw-w64 | 2 ++ package/archlinux/PKGBUILD-release | 2 ++ package/archlinux/magnum-git/PKGBUILD | 1 + package/ci/appveyor-desktop-gles.bat | 1 + package/ci/appveyor-desktop-mingw.bat | 1 + package/ci/appveyor-desktop.bat | 1 + package/ci/travis-desktop-gles.sh | 1 + package/ci/travis-desktop.sh | 1 + package/debian/rules | 1 + package/gentoo/dev-libs/magnum/magnum-9999.ebuild | 1 + package/homebrew/magnum.rb | 2 +- 19 files changed, 21 insertions(+), 1 deletion(-) diff --git a/package/archlinux/PKGBUILD b/package/archlinux/PKGBUILD index 37e52624f..d3a836627 100644 --- a/package/archlinux/PKGBUILD +++ b/package/archlinux/PKGBUILD @@ -41,6 +41,7 @@ build() { -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-clang b/package/archlinux/PKGBUILD-clang index 210432cb0..66912ca4f 100644 --- a/package/archlinux/PKGBUILD-clang +++ b/package/archlinux/PKGBUILD-clang @@ -44,6 +44,7 @@ build() { -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-clang-libc++ b/package/archlinux/PKGBUILD-clang-libc++ index 709bf1906..cb00c89be 100644 --- a/package/archlinux/PKGBUILD-clang-libc++ +++ b/package/archlinux/PKGBUILD-clang-libc++ @@ -47,6 +47,7 @@ build() { -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-es2 b/package/archlinux/PKGBUILD-es2 index f7cc98005..3b13bc5f8 100644 --- a/package/archlinux/PKGBUILD-es2 +++ b/package/archlinux/PKGBUILD-es2 @@ -31,6 +31,7 @@ build() { -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-es2desktop b/package/archlinux/PKGBUILD-es2desktop index 155e00821..a85da86df 100644 --- a/package/archlinux/PKGBUILD-es2desktop +++ b/package/archlinux/PKGBUILD-es2desktop @@ -36,6 +36,7 @@ build() { -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-es3 b/package/archlinux/PKGBUILD-es3 index 70d571031..927a9d978 100644 --- a/package/archlinux/PKGBUILD-es3 +++ b/package/archlinux/PKGBUILD-es3 @@ -31,6 +31,7 @@ build() { -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-es3desktop b/package/archlinux/PKGBUILD-es3desktop index 7bc5ec800..a50298c31 100644 --- a/package/archlinux/PKGBUILD-es3desktop +++ b/package/archlinux/PKGBUILD-es3desktop @@ -36,6 +36,7 @@ build() { -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-gcc47 b/package/archlinux/PKGBUILD-gcc47 index 49725c087..9789e14b2 100644 --- a/package/archlinux/PKGBUILD-gcc47 +++ b/package/archlinux/PKGBUILD-gcc47 @@ -49,6 +49,7 @@ build() { -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-mingw-w64 b/package/archlinux/PKGBUILD-mingw-w64 index f423d9c6c..61087015c 100644 --- a/package/archlinux/PKGBUILD-mingw-w64 +++ b/package/archlinux/PKGBUILD-mingw-w64 @@ -33,6 +33,7 @@ build() { -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ @@ -60,6 +61,7 @@ build() { -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/archlinux/PKGBUILD-release b/package/archlinux/PKGBUILD-release index d3c5a2dba..bc2afa661 100644 --- a/package/archlinux/PKGBUILD-release +++ b/package/archlinux/PKGBUILD-release @@ -37,6 +37,7 @@ build() { -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ @@ -64,6 +65,7 @@ build() { -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/archlinux/magnum-git/PKGBUILD b/package/archlinux/magnum-git/PKGBUILD index d46afdf97..d0d135244 100644 --- a/package/archlinux/magnum-git/PKGBUILD +++ b/package/archlinux/magnum-git/PKGBUILD @@ -38,6 +38,7 @@ build() { -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON make diff --git a/package/ci/appveyor-desktop-gles.bat b/package/ci/appveyor-desktop-gles.bat index b26c664cf..bd5ee13dc 100644 --- a/package/ci/appveyor-desktop-gles.bat +++ b/package/ci/appveyor-desktop-gles.bat @@ -35,6 +35,7 @@ cmake .. ^ -DWITH_WAVAUDIOIMPORTER=ON ^ -DWITH_DISTANCEFIELDCONVERTER=OFF ^ -DWITH_FONTCONVERTER=OFF ^ + -DWITH_IMAGECONVERTER=ON ^ -DWITH_MAGNUMINFO=ON ^ -DWITH_AL_INFO=ON ^ -DBUILD_TESTS=ON ^ diff --git a/package/ci/appveyor-desktop-mingw.bat b/package/ci/appveyor-desktop-mingw.bat index 38d69e027..f8675dbff 100644 --- a/package/ci/appveyor-desktop-mingw.bat +++ b/package/ci/appveyor-desktop-mingw.bat @@ -33,6 +33,7 @@ cmake .. ^ -DWITH_WAVAUDIOIMPORTER=ON ^ -DWITH_DISTANCEFIELDCONVERTER=ON ^ -DWITH_FONTCONVERTER=ON ^ + -DWITH_IMAGECONVERTER=ON ^ -DWITH_MAGNUMINFO=ON ^ -DWITH_AL_INFO=ON ^ -DBUILD_TESTS=ON ^ diff --git a/package/ci/appveyor-desktop.bat b/package/ci/appveyor-desktop.bat index 09a1918d1..8de5d0cd7 100644 --- a/package/ci/appveyor-desktop.bat +++ b/package/ci/appveyor-desktop.bat @@ -32,6 +32,7 @@ cmake .. ^ -DWITH_WAVAUDIOIMPORTER=ON ^ -DWITH_DISTANCEFIELDCONVERTER=ON ^ -DWITH_FONTCONVERTER=ON ^ + -DWITH_IMAGECONVERTER=ON ^ -DWITH_MAGNUMINFO=ON ^ -DWITH_AL_INFO=ON ^ -DBUILD_TESTS=ON ^ diff --git a/package/ci/travis-desktop-gles.sh b/package/ci/travis-desktop-gles.sh index 45b4e95fa..918c710ab 100755 --- a/package/ci/travis-desktop-gles.sh +++ b/package/ci/travis-desktop-gles.sh @@ -34,6 +34,7 @@ cmake .. \ -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=OFF \ -DWITH_FONTCONVERTER=OFF \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/ci/travis-desktop.sh b/package/ci/travis-desktop.sh index ba64b12de..0b3b0b155 100755 --- a/package/ci/travis-desktop.sh +++ b/package/ci/travis-desktop.sh @@ -31,6 +31,7 @@ cmake .. \ -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON \ -DBUILD_TESTS=ON \ diff --git a/package/debian/rules b/package/debian/rules index 35c5855f9..037062d7d 100755 --- a/package/debian/rules +++ b/package/debian/rules @@ -17,6 +17,7 @@ override_dh_auto_configure: -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ -DWITH_DISTANCEFIELDCONVERTER=ON \ + -DWITH_IMAGECONVERTER=ON \ -DWITH_FONTCONVERTER=ON \ -DWITH_MAGNUMINFO=ON \ -DWITH_AL_INFO=ON diff --git a/package/gentoo/dev-libs/magnum/magnum-9999.ebuild b/package/gentoo/dev-libs/magnum/magnum-9999.ebuild index 11801e1b7..2bd4cb643 100644 --- a/package/gentoo/dev-libs/magnum/magnum-9999.ebuild +++ b/package/gentoo/dev-libs/magnum/magnum-9999.ebuild @@ -40,6 +40,7 @@ src_configure() { -DWITH_TGAIMPORTER=ON -DWITH_WAVAUDIOIMPORTER=ON -DWITH_DISTANCEFIELDCONVERTER=ON + -DWITH_IMAGECONVERTER=ON -DWITH_FONTCONVERTER=ON -DWITH_MAGNUMINFO=ON -DWITH_AL_INFO=ON diff --git a/package/homebrew/magnum.rb b/package/homebrew/magnum.rb index 1dfdbcc92..8eb0261e0 100644 --- a/package/homebrew/magnum.rb +++ b/package/homebrew/magnum.rb @@ -12,7 +12,7 @@ class Magnum < Formula def install system "mkdir build" cd "build" do - system "cmake", "-DCMAKE_BUILD_TYPE=Release", "-DCMAKE_INSTALL_PREFIX=#{prefix}", "-DWITH_AUDIO=ON", "-DWITH_SDL2APPLICATION=ON", "-DWITH_WINDOWLESSCGLAPPLICATION=ON", "-DWITH_CGLCONTEXT=ON", "-DWITH_MAGNUMFONT=ON", "-DWITH_MAGNUMFONTCONVERTER=ON", "-DWITH_OBJIMPORTER=ON", "-DWITH_TGAIMAGECONVERTER=ON", "-DWITH_TGAIMPORTER=ON", "-DWITH_WAVAUDIOIMPORTER=ON", "-DWITH_DISTANCEFIELDCONVERTER=ON", "-DWITH_FONTCONVERTER=ON", "-DWITH_MAGNUMINFO=ON", "-DWITH_AL_INFO=ON", ".." + system "cmake", "-DCMAKE_BUILD_TYPE=Release", "-DCMAKE_INSTALL_PREFIX=#{prefix}", "-DWITH_AUDIO=ON", "-DWITH_SDL2APPLICATION=ON", "-DWITH_WINDOWLESSCGLAPPLICATION=ON", "-DWITH_CGLCONTEXT=ON", "-DWITH_MAGNUMFONT=ON", "-DWITH_MAGNUMFONTCONVERTER=ON", "-DWITH_OBJIMPORTER=ON", "-DWITH_TGAIMAGECONVERTER=ON", "-DWITH_TGAIMPORTER=ON", "-DWITH_WAVAUDIOIMPORTER=ON", "-DWITH_DISTANCEFIELDCONVERTER=ON", "-DWITH_FONTCONVERTER=ON", "-DWITH_IMAGECONVERTER=ON", "-DWITH_MAGNUMINFO=ON", "-DWITH_AL_INFO=ON", ".." system "cmake", "--build", "." system "cmake", "--build", ".", "--target", "install" end From a3bcae928b49f2d66c156a406f8d354e163faea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 21:54:29 +0200 Subject: [PATCH 234/290] Doc++ --- src/Magnum/Math/RectangularMatrix.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Math/RectangularMatrix.h b/src/Magnum/Math/RectangularMatrix.h index a433736b9..e492d8208 100644 --- a/src/Magnum/Math/RectangularMatrix.h +++ b/src/Magnum/Math/RectangularMatrix.h @@ -201,7 +201,7 @@ template class RectangularMatrix { * Consider using @ref transposed() when accessing rows frequently, as * this is slower than accessing columns due to the way the matrix is * stored. - * @see @ref row(), @ref operator()[] + * @see @ref row(), @ref operator[]() */ void setRow(std::size_t row, const Vector& data); From 8cb82c7ab7cccfd8ccf6d03a60a558519c714b90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 8 Oct 2016 00:36:20 +0200 Subject: [PATCH 235/290] Remove all mentions of GCC < 4.7 and MSVC < 2015 compatibility. No longer I'm willing to go through that pain. --- CMakeLists.txt | 9 --------- README.md | 8 +++----- doc/building.dox | 15 +++------------ doc/getting-started.dox | 8 -------- 4 files changed, 6 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 65d7027ff..2993f66f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -163,15 +163,6 @@ if(BUILD_TESTS) enable_testing() endif() -# Check compiler compatibility -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7.0") - message(FATAL_ERROR "Compatibility branch of Magnum is needed for use with GCC < 4.7. See the documentation for more information.") -elseif(MSVC) - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.0") - message(FATAL_ERROR "Compatibility branch of Magnum is needed for use with MSVC < 2015. See the documentation for more information.") - endif() -endif() - # If targeting NaCl, set explicit OpenGL ES 2.0 support. For Android and # Emscripten the decision between ES 2.0 / WebGL 1.0 and ES 3.0 / WebGL 2.0 # must be done by the user. diff --git a/README.md b/README.md index 7bf455e59..14d7c0705 100644 --- a/README.md +++ b/README.md @@ -89,11 +89,9 @@ comprehensive guide for building, packaging and crosscompiling. Minimal dependencies -------------------- -- C++ compiler with good C++11 support. Compilers which are tested to have - everything needed are **GCC** >= 4.7, **Clang** >= 3.1 and **MSVC** 2015. - On Windows you can also use **MinGW-w64**. GCC 4.6, 4.5, 4.4 and MSVC 2013 - support involves some ugly workarounds and thus is available only in - `compatibility` branch. +* C++ compiler with good C++11 support. Compilers which are tested to have + everything needed are **GCC** >= 4.7, **Clang** >= 3.1 and **MSVC** >= + 2015. On Windows you can also use **MinGW-w64**. * **CMake** >= 2.8.12 * **Corrade** - Plugin management and utility library. You can get it at https://github.com/mosra/corrade. diff --git a/doc/building.dox b/doc/building.dox index 04bbc28f1..ae8ce2c9e 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -33,10 +33,8 @@ namespace Magnum { Minimal set of tools and libraries required for building is: - C++ compiler with good C++11 support. Compilers which are tested to have - everything needed are **GCC** >= 4.7, **Clang** >= 3.1 and **MSVC** 2015. - On Windows you can also use **MinGW-w64**. GCC 4.6, 4.5, 4.4 and MSVC 2013 - support involves some ugly workarounds and thus is available only in - `compatibility` branch. + everything needed are **GCC** >= 4.7, **Clang** >= 3.1 and **MSVC** >= + 2015. On Windows you can also use **MinGW-w64**. - **CMake** >= 2.8.12 - **Corrade** - Plugin management and utility library. See @ref building-corrade "Corrade download and installation guide" for more @@ -52,12 +50,6 @@ compressed archive or use the command line: git clone git://github.com/mosra/magnum.git -If you need to use the `compatibility` branch, check it out as following from -the cloned repository or download the particular archive from -https://github.com/mosra/magnum/tree/compatibility. - - git checkout compatibility - @section building-compilation Compilation, installation Relevant information about CMake usage was described in @@ -103,8 +95,7 @@ value to that directory (e.g. `-DCMAKE_INSTALL_PREFIX=C:/Sys`). @subsubsection building-windows-msvc Using Visual Studio -On Windows CMake by default creates Visual Studio project files. You need to -use `compatibility` branch to compile with MSVC 2013, as said above. +On Windows CMake by default creates Visual Studio project files. The most straightforward way to build and install the library is again via the command-line. The bonus point is that you don't even need to wait for Visual diff --git a/doc/getting-started.dox b/doc/getting-started.dox index 5a8aca671..e2e761e9c 100644 --- a/doc/getting-started.dox +++ b/doc/getting-started.dox @@ -59,14 +59,6 @@ dependencies means just cloning them into your project tree: git clone git://github.com/mosra/corrade.git git clone git://github.com/mosra/magnum.git -The `master` branch supports GCC 4.7+, Clang and MSVC 2015 compilers, for older -versions you need to use `compatibility` branches, please see -@ref building-corrade "Corrade" and @ref building "Magnum" installation guides -for detailed information. If you are using `compatibility` branch of Magnum and -Corrade, replace `modules/FindCorrade.cmake` from the bootstrap project with -[the one from compatibility branch](https://github.com/mosra/corrade/blob/compatibility/modules/FindCorrade.cmake) -so the compatibility mode gets properly detected and used. - Then open the `CMakeLists.txt` file in the root of bootstrap project and add these two new subdirectories using `add_subdirectory()` so the file looks like this: From a4d67fcc2985ebf7d27770f90f1ad54f1712d29d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 17:48:07 +0200 Subject: [PATCH 236/290] PrimitiveQuery::Target::PrimitivesGenerated *is* available in GLES. In AEP or in 3.2 (I suppose). --- src/Magnum/PrimitiveQuery.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Magnum/PrimitiveQuery.h b/src/Magnum/PrimitiveQuery.h index 0e84eba61..811a07120 100644 --- a/src/Magnum/PrimitiveQuery.h +++ b/src/Magnum/PrimitiveQuery.h @@ -70,14 +70,20 @@ class PrimitiveQuery: public AbstractQuery { public: /** @brief Query target */ enum class Target: GLenum { - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 /** * Count of primitives generated from vertex shader or geometry * shader. - * @requires_gl Only transform feedback query is available in - * OpenGL ES and WebGL. + * @requires_gles30 Not defined in OpenGL ES 2.0. + * @requires_es_extension Extension @es_extension{ANDROID,extension_pack_es31a}/ + * @es_extension{EXT,geometry_shader} + * @requires_gles Geometry shaders are not available in WebGL. */ + #ifndef MAGNUM_TARGET_GLES PrimitivesGenerated = GL_PRIMITIVES_GENERATED, + #else + PrimitivesGenerated = GL_PRIMITIVES_GENERATED_EXT, + #endif #endif /** Count of primitives written to transform feedback buffer. */ From 0749afa2eb1a51c75584947ce9a106713e248792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 18:46:59 +0200 Subject: [PATCH 237/290] Improve query documentation, document type of all query targets. --- src/Magnum/AbstractQuery.h | 5 ++--- src/Magnum/PrimitiveQuery.h | 9 +++++++-- src/Magnum/SampleQuery.h | 15 +++++++++------ src/Magnum/TimeQuery.h | 14 ++++++++++++-- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/Magnum/AbstractQuery.h b/src/Magnum/AbstractQuery.h index ea2b20e86..1b9d0f19f 100644 --- a/src/Magnum/AbstractQuery.h +++ b/src/Magnum/AbstractQuery.h @@ -136,11 +136,10 @@ class MAGNUM_EXPORT AbstractQuery: public AbstractObject { * See @ref resultAvailable(). * @see @fn_gl{GetQueryObject} with @def_gl{QUERY_RESULT} * @requires_gl33 Extension @extension{ARB,timer_query} for result - * type @ref Magnum::UnsignedInt "UnsignedInt" and @ref Magnum::Long - * "Long" + * type @ref Magnum::UnsignedLong "UnsignedLong" and @ref Magnum::Long "Long" * @requires_es_extension Extension @es_extension{EXT,disjoint_timer_query} * for result types @ref Magnum::Int "Int", @ref Magnum::UnsignedLong "UnsignedLong" - * @ref Magnum::Long "Long". + * and @ref Magnum::Long "Long". * @requires_gles Only @ref Magnum::UnsignedInt "UnsignedInt" result * type is available in WebGL. */ diff --git a/src/Magnum/PrimitiveQuery.h b/src/Magnum/PrimitiveQuery.h index 811a07120..588fe21c5 100644 --- a/src/Magnum/PrimitiveQuery.h +++ b/src/Magnum/PrimitiveQuery.h @@ -73,7 +73,8 @@ class PrimitiveQuery: public AbstractQuery { #ifndef MAGNUM_TARGET_GLES2 /** * Count of primitives generated from vertex shader or geometry - * shader. + * shader. Use @ref result() or @ref result() to + * retrieve the result. * @requires_gles30 Not defined in OpenGL ES 2.0. * @requires_es_extension Extension @es_extension{ANDROID,extension_pack_es31a}/ * @es_extension{EXT,geometry_shader} @@ -86,7 +87,11 @@ class PrimitiveQuery: public AbstractQuery { #endif #endif - /** Count of primitives written to transform feedback buffer. */ + /** + * Count of primitives written to transform feedback buffer. Use + * @ref result() or @ref result() to retrieve the + * result. + */ TransformFeedbackPrimitivesWritten = GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN }; diff --git a/src/Magnum/SampleQuery.h b/src/Magnum/SampleQuery.h index 00432c687..608ee4da5 100644 --- a/src/Magnum/SampleQuery.h +++ b/src/Magnum/SampleQuery.h @@ -86,7 +86,9 @@ class SampleQuery: public AbstractQuery { enum class Target: GLenum { #ifndef MAGNUM_TARGET_GLES /** - * Count of samples passed from fragment shader + * Count of samples passed from fragment shader. Use + * @ref result() or @ref result() to retrieve the + * result. * @requires_gl Only boolean query is available in OpenGL ES and * WebGL. */ @@ -94,7 +96,8 @@ class SampleQuery: public AbstractQuery { #endif /** - * Whether any samples passed from fragment shader + * Whether any samples passed from fragment shader. Use + * @ref result() to retrieve the result. * @requires_gl33 Extension @extension{ARB,occlusion_query2} */ #ifndef MAGNUM_TARGET_GLES2 @@ -104,10 +107,10 @@ class SampleQuery: public AbstractQuery { #endif /** - * Whether any samples passed from fragment shader (conservative) - * - * An implementation may choose a less precise version of the - * test at the expense of some false positives. + * Whether any samples passed from fragment shader (conservative). + * An implementation may choose a less precise version of the test + * at the expense of some false positives. Use @ref result() + * to retrieve the result. * @requires_gl43 Extension @extension{ARB,ES3_compatibility} */ #ifndef MAGNUM_TARGET_GLES2 diff --git a/src/Magnum/TimeQuery.h b/src/Magnum/TimeQuery.h index 890f1adf3..5a137e435 100644 --- a/src/Magnum/TimeQuery.h +++ b/src/Magnum/TimeQuery.h @@ -81,14 +81,22 @@ class TimeQuery: public AbstractQuery { public: /** @brief Query target */ enum class Target: GLenum { - /** Elapsed time */ + /** + * Elapsed time. Use @ref result() or @ref result() + * to retrieve the result. + * @see @ref timestamp() + */ #ifndef MAGNUM_TARGET_GLES TimeElapsed = GL_TIME_ELAPSED, #else TimeElapsed = GL_TIME_ELAPSED_EXT, #endif - /** Timestamp (for use with @ref timestamp() only) */ + /** + * Timestamp. For use with @ref timestamp() only, use + * @ref result() or @ref result() to retrieve + * the result. + */ #ifndef MAGNUM_TARGET_GLES Timestamp = GL_TIMESTAMP #else @@ -144,6 +152,8 @@ class TimeQuery: public AbstractQuery { /** * @brief Query timestamp * + * Use @ref result() or @ref result() to retrieve + * the result. * @see @fn_gl{QueryCounter} with @def_gl{TIMESTAMP} */ void timestamp() { From 9a7d3a1becb3b21212e6864f55cc83ea09078d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 19:33:53 +0200 Subject: [PATCH 238/290] Added TransformFeedback::maxVertexStreams() limit query. --- doc/opengl-mapping.dox | 1 + src/Magnum/Implementation/TransformFeedbackState.cpp | 2 +- src/Magnum/Implementation/TransformFeedbackState.h | 3 ++- src/Magnum/Platform/magnum-info.cpp | 1 + src/Magnum/TransformFeedback.cpp | 12 ++++++++++++ src/Magnum/TransformFeedback.h | 12 ++++++++++++ 6 files changed, 29 insertions(+), 2 deletions(-) diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index 4fd9ab6f0..6a0ca874c 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -478,6 +478,7 @@ OpenGL function | Matching API @def_gl{MAX_VERTEX_ATTRIB_STRIDE} | | @def_gl{MAX_VERTEX_ATTRIB_BINDINGS} | | @def_gl{MAX_VERTEX_ATTRIB_RELATIVE_OFFSET} | | +@def_gl{MAX_VERTEX_STREAMS} | @ref TransformFeedback::maxVertexStreams() @def_gl{MAX_VIEWPORTS} | | @def_gl{MAX_VIEWPORT_DIMS} | @ref AbstractFramebuffer::maxViewportSize() @def_gl{MIN_FRAGMENT_INTERPOLATION_OFFSET}, \n @def_gl{MAX_FRAGMENT_INTERPOLATION_OFFSET} | | diff --git a/src/Magnum/Implementation/TransformFeedbackState.cpp b/src/Magnum/Implementation/TransformFeedbackState.cpp index 020269ab8..4484cb837 100644 --- a/src/Magnum/Implementation/TransformFeedbackState.cpp +++ b/src/Magnum/Implementation/TransformFeedbackState.cpp @@ -10,7 +10,7 @@ namespace Magnum { namespace Implementation { TransformFeedbackState::TransformFeedbackState(Context& context, std::vector& extensions): maxInterleavedComponents{0}, maxSeparateAttributes{0}, maxSeparateComponents{0} #ifndef MAGNUM_TARGET_GLES - , maxBuffers{0} + , maxBuffers{0}, maxVertexStreams{0} #endif { #ifndef MAGNUM_TARGET_GLES diff --git a/src/Magnum/Implementation/TransformFeedbackState.h b/src/Magnum/Implementation/TransformFeedbackState.h index 93047d51a..e9cd227c6 100644 --- a/src/Magnum/Implementation/TransformFeedbackState.h +++ b/src/Magnum/Implementation/TransformFeedbackState.h @@ -53,7 +53,8 @@ struct TransformFeedbackState { maxSeparateAttributes, maxSeparateComponents; #ifndef MAGNUM_TARGET_GLES - GLint maxBuffers; + GLint maxBuffers, + maxVertexStreams; #endif GLuint binding; diff --git a/src/Magnum/Platform/magnum-info.cpp b/src/Magnum/Platform/magnum-info.cpp index 17bcc8cf9..630a6c81e 100644 --- a/src/Magnum/Platform/magnum-info.cpp +++ b/src/Magnum/Platform/magnum-info.cpp @@ -612,6 +612,7 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat _h(ARB::transform_feedback3) _l(TransformFeedback::maxBuffers()) + _l(TransformFeedback::maxVertexStreams()) } #endif diff --git a/src/Magnum/TransformFeedback.cpp b/src/Magnum/TransformFeedback.cpp index 1ec6160c0..89546dd50 100644 --- a/src/Magnum/TransformFeedback.cpp +++ b/src/Magnum/TransformFeedback.cpp @@ -94,6 +94,18 @@ Int TransformFeedback::maxBuffers() { return value; } + +Int TransformFeedback::maxVertexStreams() { + if(!Context::current().isExtensionSupported()) + return 1; + + GLint& value = Context::current().state().transformFeedback->maxVertexStreams; + + if(value == 0) + glGetIntegerv(GL_MAX_VERTEX_STREAMS, &value); + + return value; +} #endif TransformFeedback::TransformFeedback(): _flags{ObjectFlag::DeleteOnDestruction} { diff --git a/src/Magnum/TransformFeedback.h b/src/Magnum/TransformFeedback.h index 602d3ba2a..3e3fa5cd2 100644 --- a/src/Magnum/TransformFeedback.h +++ b/src/Magnum/TransformFeedback.h @@ -147,6 +147,18 @@ class MAGNUM_EXPORT TransformFeedback: public AbstractObject { * WebGL. */ static Int maxBuffers(); + + /** + * @brief Max supported vertex stream count + * + * The result is cached, repeated queries don't result in repeated + * OpenGL calls. If extension @extension{ARB,transform_feedback3} (part + * of OpenGL 4.0) is not available, returns `1`. + * @see @fn_gl{Get} with @def_gl{MAX_VERTEX_STREAMS} + * @requires_gl Multiple vertex streams are not available in OpenGL ES + * and WebGL. + */ + static Int maxVertexStreams(); #endif /** From 356846943029c871afc3e53694b848222979254e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 19:35:28 +0200 Subject: [PATCH 239/290] Minor code reordering. No functional change. --- src/Magnum/TimeQuery.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Magnum/TimeQuery.h b/src/Magnum/TimeQuery.h index 5a137e435..23c1649d2 100644 --- a/src/Magnum/TimeQuery.h +++ b/src/Magnum/TimeQuery.h @@ -149,6 +149,18 @@ class TimeQuery: public AbstractQuery { */ explicit TimeQuery(NoCreateT) noexcept: AbstractQuery{NoCreate, GLenum(Target::TimeElapsed)} {} + /* Overloads to remove WTF-factor from method chaining order */ + #if !defined(DOXYGEN_GENERATING_OUTPUT) && !defined(MAGNUM_TARGET_WEBGL) + TimeQuery& setLabel(const std::string& label) { + AbstractQuery::setLabel(label); + return *this; + } + template TimeQuery& setLabel(const char(&label)[size]) { + AbstractQuery::setLabel(label); + return *this; + } + #endif + /** * @brief Query timestamp * @@ -178,18 +190,6 @@ class TimeQuery: public AbstractQuery { using AbstractQuery::begin; #endif - /* Overloads to remove WTF-factor from method chaining order */ - #if !defined(DOXYGEN_GENERATING_OUTPUT) && !defined(MAGNUM_TARGET_WEBGL) - TimeQuery& setLabel(const std::string& label) { - AbstractQuery::setLabel(label); - return *this; - } - template TimeQuery& setLabel(const char(&label)[size]) { - AbstractQuery::setLabel(label); - return *this; - } - #endif - private: explicit TimeQuery(GLuint id, Target target, ObjectFlags flags) noexcept: AbstractQuery{id, GLenum(target), flags} {} }; From f275143e9f7e740e37cbed9796e66b65b82c1de8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 19:40:22 +0200 Subject: [PATCH 240/290] Support for indexed primitive queries. Amazing how it all still fits my original design without needing to rewrite half of the API. --- doc/opengl-mapping.dox | 2 +- doc/opengl-support.dox | 2 +- src/Magnum/AbstractQuery.h | 5 +- src/Magnum/CMakeLists.txt | 1 + src/Magnum/PrimitiveQuery.cpp | 69 ++++++++++++++++++++++++ src/Magnum/PrimitiveQuery.h | 58 ++++++++++++++++---- src/Magnum/Test/PrimitiveQueryGLTest.cpp | 63 ++++++++++++++++++++++ 7 files changed, 186 insertions(+), 14 deletions(-) create mode 100644 src/Magnum/PrimitiveQuery.cpp diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index 6a0ca874c..f00875510 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -52,7 +52,7 @@ OpenGL function | Matching API --------------------------------------- | ------------ @fn_gl{BeginConditionalRender}, `glEndConditionalRender()` | @ref SampleQuery::beginConditionalRender(), \n @ref SampleQuery::endConditionalRender() @fn_gl{BeginQuery}, `glEndQuery()` | @ref PrimitiveQuery::begin(), \n @ref SampleQuery::begin(), \n @ref TimeQuery::begin(), \n @ref AbstractQuery::end() -@fn_gl{BeginQueryIndexed}, `glEndQueryIndexed()` | | +@fn_gl{BeginQueryIndexed}, `glEndQueryIndexed()` | @ref PrimitiveQuery::begin(UnsignedInt), \n @ref PrimitiveQuery::end() @fn_gl{BeginTransformFeedback}, `glEndTransformFeedback()` | @ref TransformFeedback::begin(), @ref TransformFeedback::end() @fn_gl{BindAttribLocation} | @ref AbstractShaderProgram::bindAttributeLocation() @fn_gl{BindBuffer} | not needed, handled internally in @ref Buffer and elsewhere diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index a9bf219f6..81cc932ed 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -132,7 +132,7 @@ GLSL 4.00 | done @extension{ARB,tessellation_shader} | missing some limit queries and patch parameter specification function @extension{ARB,texture_buffer_object_rgb32} | done @extension{ARB,transform_feedback2} | missing transform feedback draw -@extension{ARB,transform_feedback3} | only advanced interleaving +@extension{ARB,transform_feedback3} | missing indexed properties query @subsection opengl-support-41 OpenGL 4.1 diff --git a/src/Magnum/AbstractQuery.h b/src/Magnum/AbstractQuery.h index 1b9d0f19f..0828a52a4 100644 --- a/src/Magnum/AbstractQuery.h +++ b/src/Magnum/AbstractQuery.h @@ -183,6 +183,9 @@ class MAGNUM_EXPORT AbstractQuery: public AbstractObject { void begin(GLenum target); #endif + GLuint _id; + GLenum _target; + private: #ifndef MAGNUM_TARGET_WEBGL AbstractQuery& setLabelInternal(Containers::ArrayView label); @@ -193,8 +196,6 @@ class MAGNUM_EXPORT AbstractQuery: public AbstractObject { void MAGNUM_LOCAL createImplementationDSA(); #endif - GLuint _id; - GLenum _target; ObjectFlags _flags; }; diff --git a/src/Magnum/CMakeLists.txt b/src/Magnum/CMakeLists.txt index fb728503c..6fdc91788 100644 --- a/src/Magnum/CMakeLists.txt +++ b/src/Magnum/CMakeLists.txt @@ -151,6 +151,7 @@ endif() if(NOT TARGET_GLES2) list(APPEND Magnum_SRCS BufferImage.cpp + PrimitiveQuery.cpp TextureArray.cpp TransformFeedback.cpp diff --git a/src/Magnum/PrimitiveQuery.cpp b/src/Magnum/PrimitiveQuery.cpp new file mode 100644 index 000000000..e2c989939 --- /dev/null +++ b/src/Magnum/PrimitiveQuery.cpp @@ -0,0 +1,69 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 + Vladimír Vondruš + + 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. +*/ + +#include "PrimitiveQuery.h" + +namespace Magnum { + +void PrimitiveQuery::begin() { + #ifndef MAGNUM_TARGET_GLES + _index = 0; + #endif + AbstractQuery::begin(); +} + +#ifdef MAGNUM_BUILD_DEPRECATED +void PrimitiveQuery::begin(const Target target) { + #ifndef MAGNUM_TARGET_GLES + _index = 0; + #endif + AbstractQuery::begin(GLenum(target)); +} +#endif + +#ifndef MAGNUM_TARGET_GLES +void PrimitiveQuery::begin(const UnsignedInt index) { + #ifdef MAGNUM_BUILD_DEPRECATED + CORRADE_INTERNAL_ASSERT(_target); + #endif + + glBeginQueryIndexed(_target, _index = index, _id); +} +#endif + +void PrimitiveQuery::end() { + #ifdef MAGNUM_BUILD_DEPRECATED + CORRADE_INTERNAL_ASSERT(_target); + #endif + + #ifndef MAGNUM_TARGET_GLES + if(!_index) glEndQuery(_target); + else glEndQueryIndexed(_target, _index); + #else + AbstractQuery::end(); + #endif +} + +} diff --git a/src/Magnum/PrimitiveQuery.h b/src/Magnum/PrimitiveQuery.h index 588fe21c5..bb6c7bc4f 100644 --- a/src/Magnum/PrimitiveQuery.h +++ b/src/Magnum/PrimitiveQuery.h @@ -63,18 +63,19 @@ UnsignedInt primitiveCount = q.result(); @requires_gl30 Extension @extension{EXT,transform_feedback} @requires_gles30 Only sample queries are available in OpenGL ES 2.0. @requires_webgl20 Queries are not available in WebGL 1.0. -@todo glBeginQueryIndexed @todo @extension{ARB,transform_feedback_overflow_query} */ -class PrimitiveQuery: public AbstractQuery { +class MAGNUM_EXPORT PrimitiveQuery: public AbstractQuery { public: /** @brief Query target */ enum class Target: GLenum { #ifndef MAGNUM_TARGET_GLES2 /** * Count of primitives generated from vertex shader or geometry - * shader. Use @ref result() or @ref result() to - * retrieve the result. + * shader. When used with @ref begin(UnsignedInt), the index must + * be lower than @ref TransformFeedback::maxVertexStreams(). Use + * @ref result() or @ref result() to retrieve the + * result. * @requires_gles30 Not defined in OpenGL ES 2.0. * @requires_es_extension Extension @es_extension{ANDROID,extension_pack_es31a}/ * @es_extension{EXT,geometry_shader} @@ -88,7 +89,9 @@ class PrimitiveQuery: public AbstractQuery { #endif /** - * Count of primitives written to transform feedback buffer. Use + * Count of primitives written to transform feedback buffer. When + * used with @ref begin(UnsignedInt), the index must be lower than + * @ref TransformFeedback::maxVertexStreams(). Use * @ref result() or @ref result() to retrieve the * result. */ @@ -140,18 +143,49 @@ class PrimitiveQuery: public AbstractQuery { */ explicit PrimitiveQuery(NoCreateT) noexcept: AbstractQuery{NoCreate, GLenum(Target::TransformFeedbackPrimitivesWritten)} {} + /** + * @brief Begin query + * + * Begins counting until @ref end() is called. Equivalent to calling + * @ref begin(UnsignedInt) with @p index set to `0`. + * @see @fn_gl{BeginQuery} + */ + void begin(); + #ifdef MAGNUM_BUILD_DEPRECATED /** - * @copybrief AbstractQuery::begin() + * @copybrief begin() * @deprecated Use @ref begin() instead. */ - CORRADE_DEPRECATED("use begin() instead") void begin(Target target) { - AbstractQuery::begin(GLenum(target)); - } + CORRADE_DEPRECATED("use begin() instead") void begin(Target target); + #endif - using AbstractQuery::begin; + #ifndef MAGNUM_TARGET_GLES + /** + * @brief Begin indexed query + * + * Begins counting until @ref end() is called. + * @see @fn_gl{BeginQueryIndexed} + * @requires_gl40 Extension @extension{ARB,transform_feedback3} + * @requires_gl Indexed queries are not available in OpenGL ES or WebGL. + */ + void begin(UnsignedInt index); #endif + /** + * @brief End query + * + * Ends the non-indexed or indexed query started with @ref begin() or + * @ref begin(UnsignedInt). The result can be then retrieved by calling + * @ref result(). + * @see @fn_gl{EndQuery}, @fn_gl2{EndQueryIndexed,BeginQueryIndexed} + * @requires_gl40 Extension @extension{ARB,transform_feedback3} for + * indexed queries + * @requires_gl Indexed queries are not available in OpenGL ES or + * WebGL. + */ + void end(); + /* Overloads to remove WTF-factor from method chaining order */ #if !defined(DOXYGEN_GENERATING_OUTPUT) && !defined(MAGNUM_TARGET_WEBGL) PrimitiveQuery& setLabel(const std::string& label) { @@ -166,6 +200,10 @@ class PrimitiveQuery: public AbstractQuery { private: explicit PrimitiveQuery(GLuint id, Target target, ObjectFlags flags) noexcept: AbstractQuery{id, GLenum(target), flags} {} + + #ifndef MAGNUM_TARGET_GLES + GLuint _index{}; + #endif }; } diff --git a/src/Magnum/Test/PrimitiveQueryGLTest.cpp b/src/Magnum/Test/PrimitiveQueryGLTest.cpp index 3c63d9527..0e3320716 100644 --- a/src/Magnum/Test/PrimitiveQueryGLTest.cpp +++ b/src/Magnum/Test/PrimitiveQueryGLTest.cpp @@ -48,6 +48,7 @@ struct PrimitiveQueryGLTest: AbstractOpenGLTester { #ifndef MAGNUM_TARGET_GLES void primitivesGenerated(); + void primitivesGeneratedIndexed(); #endif void transformFeedbackPrimitivesWritten(); }; @@ -58,6 +59,7 @@ PrimitiveQueryGLTest::PrimitiveQueryGLTest() { #ifndef MAGNUM_TARGET_GLES &PrimitiveQueryGLTest::primitivesGenerated, + &PrimitiveQueryGLTest::primitivesGeneratedIndexed, #endif &PrimitiveQueryGLTest::transformFeedbackPrimitivesWritten}); } @@ -158,6 +160,67 @@ void PrimitiveQueryGLTest::primitivesGenerated() { CORRADE_VERIFY(availableAfter); CORRADE_COMPARE(count, 3); } + +void PrimitiveQueryGLTest::primitivesGeneratedIndexed() { + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::transform_feedback3::string() + std::string(" is not available.")); + + /* Bind some FB to avoid errors on contexts w/o default FB */ + Renderbuffer color; + color.setStorage(RenderbufferFormat::RGBA8, Vector2i{32}); + Framebuffer fb{{{}, Vector2i{32}}}; + fb.attachRenderbuffer(Framebuffer::ColorAttachment{0}, color) + .bind(); + + struct MyShader: AbstractShaderProgram { + typedef Attribute<0, Vector2> Position; + + explicit MyShader() { + Shader vert( + #ifndef CORRADE_TARGET_APPLE + Version::GL210 + #else + Version::GL310 + #endif + , Shader::Type::Vertex); + + CORRADE_INTERNAL_ASSERT_OUTPUT(vert.addSource( + "#if __VERSION__ >= 130\n" + "#define attribute in\n" + "#endif\n" + "attribute vec4 position;\n" + "void main() {\n" + " gl_Position = position;\n" + "}\n").compile()); + + attachShader(vert); + bindAttributeLocation(Position::Location, "position"); + CORRADE_INTERNAL_ASSERT_OUTPUT(link()); + } + } shader; + + Buffer vertices; + vertices.setData({nullptr, 9*sizeof(Vector2)}, BufferUsage::StaticDraw); + + Mesh mesh; + mesh.setPrimitive(MeshPrimitive::Triangles) + .setCount(9) + .addVertexBuffer(vertices, 0, MyShader::Position()); + + MAGNUM_VERIFY_NO_ERROR(); + + PrimitiveQuery q{PrimitiveQuery::Target::PrimitivesGenerated}; + q.begin(0); + + Renderer::enable(Renderer::Feature::RasterizerDiscard); + mesh.draw(shader); + + q.end(); + const UnsignedInt count = q.result(); + + MAGNUM_VERIFY_NO_ERROR(); + CORRADE_COMPARE(count, 3); +} #endif void PrimitiveQueryGLTest::transformFeedbackPrimitivesWritten() { From 9373a2e01dd55c323a1f7663d5aa0c9cf17fca09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 19:58:00 +0200 Subject: [PATCH 241/290] Support for AMD_transform_feedback3_lines_triangles. Just adding the extension to the list, otherwise not much to do. --- doc/opengl-support.dox | 1 + src/Magnum/Context.cpp | 1 + src/Magnum/Extensions.h | 1 + 3 files changed, 3 insertions(+) diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index 81cc932ed..c4a3ff25f 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -257,6 +257,7 @@ Extension | Status Extension | Status ------------------------------------------- | ------ +@extension{AMD,transform_feedback3_lines_triangles} | done (nothing to do) @extension{AMD,vertex_shader_layer} | done (shading language only) @extension{AMD,shader_trinary_minmax} | done (shading language only) @extension{ATI,texture_mirror_once} | done (GL 4.4 subset) diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index 2d29ce0de..c1294da14 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -65,6 +65,7 @@ const std::vector& Extension::extensions(Version version) { static const std::vector empty; #ifndef MAGNUM_TARGET_GLES static const std::vector extensions{ + _extension(GL,AMD,transform_feedback3_lines_triangles), _extension(GL,AMD,vertex_shader_layer), _extension(GL,AMD,shader_trinary_minmax), _extension(GL,ARB,robustness), diff --git a/src/Magnum/Extensions.h b/src/Magnum/Extensions.h index c674846c8..71328fd4e 100644 --- a/src/Magnum/Extensions.h +++ b/src/Magnum/Extensions.h @@ -80,6 +80,7 @@ namespace GL { #ifndef MAGNUM_TARGET_GLES #line 1 namespace AMD { + _extension(GL,AMD,transform_feedback3_lines_triangles, GL210, None) // #397 _extension(GL,AMD,vertex_shader_layer, GL210, None) // #417 _extension(GL,AMD,shader_trinary_minmax, GL210, None) // #428 } namespace ARB { From 9642869c59d736382d7868da1fb0c2f3d4af56af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 19:58:51 +0200 Subject: [PATCH 242/290] Implemented ARB_transform_feedback_overflow_query. --- doc/opengl-support.dox | 2 +- src/Magnum/PrimitiveQuery.h | 26 ++++++- src/Magnum/Test/PrimitiveQueryGLTest.cpp | 94 +++++++++++++++++++++++- 3 files changed, 118 insertions(+), 4 deletions(-) diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index c4a3ff25f..9216190c8 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -244,7 +244,7 @@ Extension | Status @extension{ARB,sparse_texture} | | @extension{ARB,pipeline_statistics_query} | | @extension{ARB,sparse_buffer} | | -@extension{ARB,transform_feedback_overflow_query} | | +@extension{ARB,transform_feedback_overflow_query} | done @extension{KHR,blend_equation_advanced} | done @extension3{KHR,blend_equation_advanced_coherent,blend_equation_advanced} | done @extension{KHR,no_error} | done diff --git a/src/Magnum/PrimitiveQuery.h b/src/Magnum/PrimitiveQuery.h index bb6c7bc4f..37e75553e 100644 --- a/src/Magnum/PrimitiveQuery.h +++ b/src/Magnum/PrimitiveQuery.h @@ -63,7 +63,6 @@ UnsignedInt primitiveCount = q.result(); @requires_gl30 Extension @extension{EXT,transform_feedback} @requires_gles30 Only sample queries are available in OpenGL ES 2.0. @requires_webgl20 Queries are not available in WebGL 1.0. -@todo @extension{ARB,transform_feedback_overflow_query} */ class MAGNUM_EXPORT PrimitiveQuery: public AbstractQuery { public: @@ -95,7 +94,30 @@ class MAGNUM_EXPORT PrimitiveQuery: public AbstractQuery { * @ref result() or @ref result() to retrieve the * result. */ - TransformFeedbackPrimitivesWritten = GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN + TransformFeedbackPrimitivesWritten = GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, + + #ifndef MAGNUM_TARGET_GLES + /** + * Transform feedback overflow. When used with @ref begin(UnsignedInt), + * the index must be `0`. Use @ref result() to retrieve the + * result. + * @requires_extension Extension @extension{ARB,transform_feedback_overflow_query} + * @requires_gl Transform feedback overflow query is not available + * in OpenGL ES or WebGL. + */ + TransformFeedbackOverflow = GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB, + + /** + * Transform feedback stream overflow. When used with + * @ref begin(UnsignedInt), the index must be lower than + * @ref TransformFeedback::maxVertexStreams(). Use @ref result() + * to retrieve the result. + * @requires_extension Extension @extension{ARB,transform_feedback_overflow_query} + * @requires_gl Transform feedback overflow query is not available + * in OpenGL ES or WebGL. + */ + TransformFeedbackStreamOverflow = GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB + #endif }; /** diff --git a/src/Magnum/Test/PrimitiveQueryGLTest.cpp b/src/Magnum/Test/PrimitiveQueryGLTest.cpp index 0e3320716..4a7074643 100644 --- a/src/Magnum/Test/PrimitiveQueryGLTest.cpp +++ b/src/Magnum/Test/PrimitiveQueryGLTest.cpp @@ -51,6 +51,9 @@ struct PrimitiveQueryGLTest: AbstractOpenGLTester { void primitivesGeneratedIndexed(); #endif void transformFeedbackPrimitivesWritten(); + #ifndef MAGNUM_TARGET_GLES + void transformFeedbackOverflow(); + #endif }; PrimitiveQueryGLTest::PrimitiveQueryGLTest() { @@ -61,7 +64,11 @@ PrimitiveQueryGLTest::PrimitiveQueryGLTest() { &PrimitiveQueryGLTest::primitivesGenerated, &PrimitiveQueryGLTest::primitivesGeneratedIndexed, #endif - &PrimitiveQueryGLTest::transformFeedbackPrimitivesWritten}); + &PrimitiveQueryGLTest::transformFeedbackPrimitivesWritten, + #ifndef MAGNUM_TARGET_GLES + &PrimitiveQueryGLTest::transformFeedbackOverflow + #endif + }); } void PrimitiveQueryGLTest::constructNoCreate() { @@ -301,6 +308,91 @@ void PrimitiveQueryGLTest::transformFeedbackPrimitivesWritten() { CORRADE_COMPARE(count, 3); /* Three triangles (9 vertices) */ } +#ifndef MAGNUM_TARGET_GLES +void PrimitiveQueryGLTest::transformFeedbackOverflow() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::transform_feedback_overflow_query::string() + std::string(" is not available.")); + #endif + + /* Bind some FB to avoid errors on contexts w/o default FB */ + Renderbuffer color; + color.setStorage(RenderbufferFormat::RGBA8, Vector2i{32}); + Framebuffer fb{{{}, Vector2i{32}}}; + fb.attachRenderbuffer(Framebuffer::ColorAttachment{0}, color) + .bind(); + + struct MyShader: AbstractShaderProgram { + explicit MyShader() { + #ifndef MAGNUM_TARGET_GLES + Shader vert( + #ifndef CORRADE_TARGET_APPLE + Version::GL300 + #else + Version::GL310 + #endif + , Shader::Type::Vertex); + #else + Shader vert(Version::GLES300, Shader::Type::Vertex); + Shader frag(Version::GLES300, Shader::Type::Fragment); + #endif + + CORRADE_INTERNAL_ASSERT_OUTPUT(vert.addSource( + "out mediump vec2 outputData;\n" + "void main() {\n" + " outputData = vec2(1.0, -1.0);\n" + /* Mesa drivers complain that vertex shader doesn't write to + gl_Position otherwise */ + " gl_Position = vec4(1.0);\n" + "}\n").compile()); + #ifndef MAGNUM_TARGET_GLES + attachShader(vert); + #else + /* ES for some reason needs both vertex and fragment shader */ + CORRADE_INTERNAL_ASSERT_OUTPUT(frag.addSource("void main() {}\n").compile()); + attachShaders({vert, frag}); + #endif + + setTransformFeedbackOutputs({"outputData"}, TransformFeedbackBufferMode::SeparateAttributes); + CORRADE_INTERNAL_ASSERT_OUTPUT(link()); + } + } shader; + + Buffer output; + output.setData({nullptr, 18*sizeof(Vector2)}, BufferUsage::StaticDraw); + + Mesh mesh; + mesh.setPrimitive(MeshPrimitive::Triangles) + .setCount(9); + + MAGNUM_VERIFY_NO_ERROR(); + + TransformFeedback feedback; + /* Deliberately one vertex smaller to not fit two of them */ + feedback.attachBuffer(0, output, 0, 17*sizeof(Vector2)); + + Renderer::enable(Renderer::Feature::RasterizerDiscard); + + feedback.begin(shader, TransformFeedback::PrimitiveMode::Triangles); + PrimitiveQuery q1{PrimitiveQuery::Target::TransformFeedbackOverflow}, + q2{PrimitiveQuery::Target::TransformFeedbackOverflow}; + q1.begin(); + mesh.draw(shader); + q1.end(); + q2.begin(); + mesh.draw(shader); + q2.end(); + feedback.end(); + + const bool overflown1 = q1.result(); + const bool overflown2 = q2.result(); + + MAGNUM_VERIFY_NO_ERROR(); + CORRADE_VERIFY(!overflown1); + CORRADE_VERIFY(overflown2); /* Got space for only 17 vertices instead of 2*9 */ +} +#endif + }} MAGNUM_GL_TEST_MAIN(Magnum::Test::PrimitiveQueryGLTest) From 2519f9fc0623f7438b53a3f9b2dbd71214e30cd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 19:59:22 +0200 Subject: [PATCH 243/290] Test: don't have unnecessarily large buffer size for XFB. Caused me a few minutes figuring out what's wrong and why my overflow query doesn't work. --- src/Magnum/Test/PrimitiveQueryGLTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Test/PrimitiveQueryGLTest.cpp b/src/Magnum/Test/PrimitiveQueryGLTest.cpp index 4a7074643..ae2881894 100644 --- a/src/Magnum/Test/PrimitiveQueryGLTest.cpp +++ b/src/Magnum/Test/PrimitiveQueryGLTest.cpp @@ -280,7 +280,7 @@ void PrimitiveQueryGLTest::transformFeedbackPrimitivesWritten() { } shader; Buffer output; - output.setData({nullptr, 18*sizeof(Vector2)}, BufferUsage::StaticDraw); + output.setData({nullptr, 9*sizeof(Vector2)}, BufferUsage::StaticDraw); Mesh mesh; mesh.setPrimitive(MeshPrimitive::Triangles) From b6dbc8fc585acf9f5439f69126e991d2cb1034a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 22:22:11 +0200 Subject: [PATCH 244/290] Check for mesh emptiness even before binding the shader. Prevents unnecessary state touching. --- src/Magnum/Mesh.cpp | 6 +++--- src/Magnum/MeshView.cpp | 6 ++++++ src/Magnum/Test/MeshGLTest.cpp | 18 +++++++++++------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/Magnum/Mesh.cpp b/src/Magnum/Mesh.cpp index 938f1915e..507d58c5b 100644 --- a/src/Magnum/Mesh.cpp +++ b/src/Magnum/Mesh.cpp @@ -245,6 +245,9 @@ Mesh& Mesh::setIndexBuffer(Buffer& buffer, GLintptr offset, IndexType type, Unsi } void Mesh::draw(AbstractShaderProgram& shader) { + /* Nothing to draw, exit without touching any state */ + if(!_count || !_instanceCount) return; + shader.use(); #ifndef MAGNUM_TARGET_GLES @@ -266,9 +269,6 @@ void Mesh::drawInternal(Int count, Int baseVertex, Int instanceCount, GLintptr i { const Implementation::MeshState& state = *Context::current().state().mesh; - /* Nothing to draw */ - if(!count || !instanceCount) return; - (this->*state.bindImplementation)(); /* Non-instanced mesh */ diff --git a/src/Magnum/MeshView.cpp b/src/Magnum/MeshView.cpp index aa863dca9..e1a55c7a4 100644 --- a/src/Magnum/MeshView.cpp +++ b/src/Magnum/MeshView.cpp @@ -130,6 +130,9 @@ void MeshView::multiDrawImplementationDefault(std::initializer_list> meshes) { for(MeshView& mesh: meshes) { + /* Nothing to draw in this mesh */ + if(!mesh._count) continue; + #ifndef MAGNUM_TARGET_GLES2 mesh._original.get().drawInternal(mesh._count, mesh._baseVertex, mesh._instanceCount, mesh._indexOffset, mesh._indexStart, mesh._indexEnd); #else @@ -145,6 +148,9 @@ MeshView& MeshView::setIndexRange(Int first) { } void MeshView::draw(AbstractShaderProgram& shader) { + /* Nothing to draw, exit without touching any state */ + if(!_count || !_instanceCount) return; + shader.use(); #ifndef MAGNUM_TARGET_GLES diff --git a/src/Magnum/Test/MeshGLTest.cpp b/src/Magnum/Test/MeshGLTest.cpp index 41b4543cc..e798a7423 100644 --- a/src/Magnum/Test/MeshGLTest.cpp +++ b/src/Magnum/Test/MeshGLTest.cpp @@ -1853,19 +1853,23 @@ MultiChecker::MultiChecker(AbstractShaderProgram&& shader, Mesh& mesh): framebuf mesh.setPrimitive(MeshPrimitive::Points) .setCount(2); + /* Set zero count so we test mesh skipping */ + MeshView a{mesh}; + a.setCount(0); + /* Skip first vertex so we test also offsets */ - MeshView a(mesh); - a.setCount(1) + MeshView b{mesh}; + b.setCount(1) .setBaseVertex(mesh.baseVertex()); - MeshView b(mesh); - b.setCount(1); + MeshView c{mesh}; + c.setCount(1); if(mesh.isIndexed()) { - b.setBaseVertex(mesh.baseVertex()) + c.setBaseVertex(mesh.baseVertex()) .setIndexRange(1); - } else b.setBaseVertex(1); + } else c.setBaseVertex(1); - MeshView::draw(shader, {a, b}); + MeshView::draw(shader, {a, b, c}); } template T MultiChecker::get(PixelFormat format, PixelType type) { From 7b60cad9b041ce0f7c45dfdc95370a86dc95aeb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 22:31:21 +0200 Subject: [PATCH 245/290] Properly handle instance count in the fallback multi draw implementation. --- src/Magnum/MeshView.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Magnum/MeshView.cpp b/src/Magnum/MeshView.cpp index e1a55c7a4..1bc587204 100644 --- a/src/Magnum/MeshView.cpp +++ b/src/Magnum/MeshView.cpp @@ -133,10 +133,12 @@ void MeshView::multiDrawImplementationFallback(std::initializer_list Date: Sun, 9 Oct 2016 22:39:25 +0200 Subject: [PATCH 246/290] Added missing getters to MeshView to match Mesh API. --- src/Magnum/MeshView.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Magnum/MeshView.h b/src/Magnum/MeshView.h index 516391fa3..3137e38a8 100644 --- a/src/Magnum/MeshView.h +++ b/src/Magnum/MeshView.h @@ -105,6 +105,9 @@ class MAGNUM_EXPORT MeshView { /** @brief Movement is not allowed */ MeshView& operator=(MeshView&& other) = delete; + /** @brief Vertex/index count */ + Int count() const { return _count; } + /** * @brief Set vertex/index count * @return Reference to self (for method chaining) @@ -116,6 +119,9 @@ class MAGNUM_EXPORT MeshView { return *this; } + /** @brief Base vertex */ + Int baseVertex() const { return _baseVertex; } + /** * @brief Set base vertex * @return Reference to self (for method chaining) From 40205b47de4be93f152e6ae29f7799c3e040d54a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 9 Oct 2016 22:40:19 +0200 Subject: [PATCH 247/290] Explicitly mention extension requirements of Mesh[View]::draw(). They were mentioned in various setters, but never together in a single place. --- src/Magnum/Mesh.h | 15 ++++++++++++++- src/Magnum/MeshView.h | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Mesh.h b/src/Magnum/Mesh.h index 8ae102e73..7239fa1a6 100644 --- a/src/Magnum/Mesh.h +++ b/src/Magnum/Mesh.h @@ -850,9 +850,22 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * @fn_gl{DrawElementsInstancedBaseInstance}/ * @fn_gl{DrawElementsInstancedBaseVertex}/ * @fn_gl{DrawElementsInstancedBaseVertexBaseInstance} + * @requires_gl32 Extension @extension{ARB,draw_elements_base_vertex} + * if the mesh is indexed and @ref baseVertex() is not `0`. + * @requires_gl33 Extension @extension{ARB,instanced_arrays} if + * @ref instanceCount() is more than `1`. + * @requires_gl42 Extension @extension{ARB,base_instance} if + * @ref baseInstance() is not `0`. + * @requires_gles30 Extension @es_extension{ANGLE,instanced_arrays}, + * @es_extension{EXT,instanced_arrays} or + * @es_extension{NV,instanced_arrays} in OpenGL ES 2.0 if + * @ref instanceCount() is more than `1`. + * @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays} + * in WebGL 1.0 if @ref instanceCount() is more than `1`. + * @requires_gl Specifying base vertex for indexed meshes is not + * available in OpenGL ES or WebGL. */ void draw(AbstractShaderProgram& shader); - void draw(AbstractShaderProgram&& shader) { draw(shader); } /**< @overload */ private: diff --git a/src/Magnum/MeshView.h b/src/Magnum/MeshView.h index 3137e38a8..011dca7be 100644 --- a/src/Magnum/MeshView.h +++ b/src/Magnum/MeshView.h @@ -210,6 +210,20 @@ class MAGNUM_EXPORT MeshView { * * See @ref Mesh::draw() for more information. * @see @ref draw(AbstractShaderProgram&, std::initializer_list>) + * @requires_gl32 Extension @extension{ARB,draw_elements_base_vertex} + * if the mesh is indexed and @ref baseVertex() is not `0`. + * @requires_gl33 Extension @extension{ARB,instanced_arrays} if + * @ref instanceCount() is more than `1`. + * @requires_gl42 Extension @extension{ARB,base_instance} if + * @ref baseInstance() is not `0`. + * @requires_gles30 Extension @es_extension{ANGLE,instanced_arrays}, + * @es_extension{EXT,instanced_arrays} or + * @es_extension{NV,instanced_arrays} in OpenGL ES 2.0 if + * @ref instanceCount() is more than `1`. + * @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays} + * in WebGL 1.0 if @ref instanceCount() is more than `1`. + * @requires_gl Specifying base vertex for indexed meshes is not + * available in OpenGL ES or WebGL. */ void draw(AbstractShaderProgram& shader); void draw(AbstractShaderProgram&& shader) { draw(shader); } /**< @overload */ From 93f841b9220e423a3a8f9d111f8b525df20a5fea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 10 Oct 2016 00:08:33 +0200 Subject: [PATCH 248/290] doc: updated OpenGL mapping table. The "LSB first" is not a part of Core. --- doc/opengl-mapping.dox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index f00875510..963caaa5f 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -489,7 +489,7 @@ OpenGL function | Matching API @def_gl{NUM_EXTENSIONS} | @ref Context::supportedExtensions() @def_gl{NUM_PROGRAM_BINARY_FORMATS}, \n @def_gl{PROGRAM_BINARY_FORMATS} | | @def_gl{NUM_SHADER_BINARY_FORMATS}, \n @def_gl{SHADER_BINARY_FORMATS} | | -@def_gl{PACK_ALIGNMENT}, \n @def_gl{PACK_IMAGE_HEIGHT}, \n @def_gl{PACK_LSB_FIRST}, \n @def_gl{PACK_ROW_LENGTH}, \n @def_gl{PACK_SKIP_IMAGES}, \n @def_gl{PACK_SKIP_PIXELS}, \n @def_gl{PACK_SKIP_ROWS}, \n @def_gl{PACK_SWAP_BYTES}, \n @def_gl{UNPACK_ALIGNMENT}, \n @def_gl{UNPACK_IMAGE_HEIGHT}, \n @def_gl{UNPACK_LSB_FIRST}, \n @def_gl{UNPACK_ROW_LENGTH}, \n @def_gl{UNPACK_SKIP_IMAGES}, \n @def_gl{UNPACK_SKIP_PIXELS}, \n @def_gl{UNPACK_SKIP_ROWS}, \n @def_gl{UNPACK_SWAP_BYTES} | not queryable +@def_gl{PACK_ALIGNMENT}, \n @def_gl{PACK_IMAGE_HEIGHT}, \n @def_gl{PACK_ROW_LENGTH}, \n @def_gl{PACK_SKIP_IMAGES}, \n @def_gl{PACK_SKIP_PIXELS}, \n @def_gl{PACK_SKIP_ROWS}, \n @def_gl{PACK_SWAP_BYTES}, \n @def_gl{UNPACK_ALIGNMENT}, \n @def_gl{UNPACK_IMAGE_HEIGHT}, \n @def_gl{UNPACK_ROW_LENGTH}, \n @def_gl{UNPACK_SKIP_IMAGES}, \n @def_gl{UNPACK_SKIP_PIXELS}, \n @def_gl{UNPACK_SKIP_ROWS}, \n @def_gl{UNPACK_SWAP_BYTES} | not queryable, @ref PixelStorage setters only @def_gl{POINT_FADE_THRESHOLD_SIZE} | | @def_gl{POINT_SIZE_GRANULARITY}, \n @def_gl{POINT_SIZE_RANGE} | | @def_gl{POINT_SIZE} | not queryable, @ref Renderer::setPointSize() setter only From a60dc74dac1a2417e387be067bd6380c0317e706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 10 Oct 2016 00:07:12 +0200 Subject: [PATCH 249/290] Implemented Mesh::draw(..., TransformFeedback&). Supports classic, instanced, stream and stream instanced draw. With this I consider the transform feedback implementation complete. --- doc/opengl-mapping.dox | 4 +- doc/opengl-support.dox | 4 +- src/Magnum/Mesh.cpp | 39 +++++ src/Magnum/Mesh.h | 61 ++++++- src/Magnum/MeshView.cpp | 11 ++ src/Magnum/MeshView.h | 41 ++++- src/Magnum/Test/TransformFeedbackGLTest.cpp | 166 +++++++++++++++++++- 7 files changed, 312 insertions(+), 14 deletions(-) diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index 963caaa5f..cb2563022 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -124,10 +124,10 @@ OpenGL function | Matching API @fn_gl{DispatchCompute} | @ref AbstractShaderProgram::dispatchCompute() @fn_gl_extension{DispatchComputeGroupSize,ARB,compute_variable_group_size} | | @fn_gl{DispatchComputeIndirect} | | -@fn_gl{DrawArrays}, \n @fn_gl{DrawArraysInstanced}, \n @fn_gl{DrawArraysInstancedBaseInstance}, \n @fn_gl{DrawElements}, \n @fn_gl{DrawRangeElements}, \n @fn_gl{DrawElementsBaseVertex}, \n @fn_gl{DrawRangeElementsBaseVertex}, \n @fn_gl{DrawElementsInstanced}, \n @fn_gl{DrawElementsInstancedBaseInstance}, \n @fn_gl{DrawElementsInstancedBaseVertex}, \n @fn_gl{DrawElementsInstancedBaseVertexBaseInstance} | @ref Mesh::draw(), \n @ref MeshView::draw() +@fn_gl{DrawArrays}, \n @fn_gl{DrawArraysInstanced}, \n @fn_gl{DrawArraysInstancedBaseInstance}, \n @fn_gl{DrawElements}, \n @fn_gl{DrawRangeElements}, \n @fn_gl{DrawElementsBaseVertex}, \n @fn_gl{DrawRangeElementsBaseVertex}, \n @fn_gl{DrawElementsInstanced}, \n @fn_gl{DrawElementsInstancedBaseInstance}, \n @fn_gl{DrawElementsInstancedBaseVertex}, \n @fn_gl{DrawElementsInstancedBaseVertexBaseInstance} | @ref Mesh::draw(AbstractShaderProgram&), \n @ref MeshView::draw(AbstractShaderProgram&) @fn_gl{DrawArraysIndirect}, \n @fn_gl{DrawElementsIndirect}, \n @fn_gl{MultiDrawArraysIndirect}, \n @fn_gl{MultiDrawElementsIndirect} | | @fn_gl{DrawBuffer}, \n `glNamedFramebufferDrawBuffer()`, \n @fn_gl_extension{FramebufferDrawBuffer,EXT,direct_state_access}, \n @fn_gl{DrawBuffers}, \n `glNamedFramebufferDrawBuffers()`, \n @fn_gl_extension{FramebufferDrawBuffers,EXT,direct_state_access} | @ref DefaultFramebuffer::mapForDraw(), \n @ref Framebuffer::mapForDraw() -@fn_gl{DrawTransformFeedback}, \n @fn_gl{DrawTransformFeedbackInstanced}, \n @fn_gl{DrawTransformFeedbackStream}, \n @fn_gl{DrawTransformFeedbackStreamInstanced} | | +@fn_gl{DrawTransformFeedback}, \n @fn_gl{DrawTransformFeedbackInstanced}, \n @fn_gl{DrawTransformFeedbackStream}, \n @fn_gl{DrawTransformFeedbackStreamInstanced} | @ref Mesh::draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt), \n @ref MeshView::draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt) @subsection opengl-mapping-functions-e E diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index 9216190c8..ea6d1f582 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -131,7 +131,7 @@ GLSL 4.00 | done @extension{ARB,shader_subroutine} | | @extension{ARB,tessellation_shader} | missing some limit queries and patch parameter specification function @extension{ARB,texture_buffer_object_rgb32} | done -@extension{ARB,transform_feedback2} | missing transform feedback draw +@extension{ARB,transform_feedback2} | done @extension{ARB,transform_feedback3} | missing indexed properties query @subsection opengl-support-41 OpenGL 4.1 @@ -154,7 +154,7 @@ GLSL 4.20 | done @extension{ARB,texture_compression_bptc} | done @extension{ARB,base_instance} | done @extension{ARB,shading_language_420pack} | done (shading language only) -@extension{ARB,transform_feedback_instanced} | | +@extension{ARB,transform_feedback_instanced} | done @extension{ARB,compressed_texture_pixel_storage} | done @extension{ARB,conservative_depth} | done (shading language only) @extension{ARB,internalformat_query} | | diff --git a/src/Magnum/Mesh.cpp b/src/Magnum/Mesh.cpp index 507d58c5b..bc4da4c0a 100644 --- a/src/Magnum/Mesh.cpp +++ b/src/Magnum/Mesh.cpp @@ -31,6 +31,9 @@ #include "Magnum/Buffer.h" #include "Magnum/Context.h" #include "Magnum/Extensions.h" +#ifndef MAGNUM_TARGET_GLES +#include "Magnum/TransformFeedback.h" +#endif #ifndef MAGNUM_TARGET_WEBGL #include "Implementation/DebugState.h" @@ -363,6 +366,42 @@ void Mesh::drawInternal(Int count, Int baseVertex, Int instanceCount, GLintptr i (this->*state.unbindImplementation)(); } +#ifndef MAGNUM_TARGET_GLES +void Mesh::drawInternal(TransformFeedback& xfb, const UnsignedInt stream, const Int instanceCount) { + const Implementation::MeshState& state = *Context::current().state().mesh; + + (this->*state.bindImplementation)(); + + /* Default stream */ + if(stream == 0) { + /* Non-instanced mesh */ + if(instanceCount == 1) glDrawTransformFeedback(GLenum(_primitive), xfb.id()); + + /* Instanced mesh */ + else glDrawTransformFeedbackInstanced(GLenum(_primitive), xfb.id(), instanceCount); + + /* Specific stream */ + } else { + /* Non-instanced mesh */ + if(instanceCount == 1) glDrawTransformFeedbackStream(GLenum(_primitive), xfb.id(), stream); + + /* Instanced mesh */ + else glDrawTransformFeedbackStreamInstanced(GLenum(_primitive), xfb.id(), stream, instanceCount); + } + + (this->*state.unbindImplementation)(); +} + +void Mesh::draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream) { + /* Nothing to draw, exit without touching any state */ + if(!_instanceCount) return; + + shader.use(); + + drawInternal(xfb, stream, _instanceCount); +} +#endif + void Mesh::bindVAO() { GLuint& current = Context::current().state().mesh->currentVAO; if(current != _id) { diff --git a/src/Magnum/Mesh.h b/src/Magnum/Mesh.h index 7239fa1a6..9cf148540 100644 --- a/src/Magnum/Mesh.h +++ b/src/Magnum/Mesh.h @@ -602,7 +602,9 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * * If the mesh is indexed, the value is treated as index count, * otherwise the value is vertex count. If set to `0`, no draw commands - * are issued when calling @ref draw(). Default is `0`. + * are issued when calling @ref draw(AbstractShaderProgram&). Ignored + * when calling @ref draw(AbstractShaderProgram, TransformFeedback&, UsingnedInt). + * Default is `0`. * @see @ref isIndexed(), @ref setBaseVertex(), @ref setInstanceCount() */ Mesh& setCount(Int count) { @@ -618,7 +620,8 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * @return Reference to self (for method chaining) * * Sets number of vertices of which the vertex buffer will be offset - * when drawing. Default is `0`. + * when drawing. Ignored when calling + * @ref draw(AbstractShaderProgram, TransformFeedback&) Default is `0`. * @see @ref setCount(), @ref setBaseInstance() * @requires_gl32 Extension @extension{ARB,draw_elements_base_vertex} * for indexed meshes @@ -638,11 +641,15 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * @return Reference to self (for method chaining) * * If set to `1`, non-instanced draw commands are issued when calling - * @ref draw(). If set to `0`, no draw commands are issued altogether. - * Default is `1`. + * @ref draw(AbstractShaderProgram&) or + * @ref draw(AbstractShaderProgram&, TransformFeedback&). If set to + * `0`, no draw commands are issued altogether. Default is `1`. * @see @ref setBaseInstance(), @ref setCount(), * @ref addVertexBufferInstanced() - * @requires_gl31 Extension @extension{ARB,draw_instanced} + * @requires_gl31 Extension @extension{ARB,draw_instanced} if using + * @ref draw(AbstractShaderProgram&) + * @requires_gl42 Extension @extension{ARB,transform_feedback_instanced} + * @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt) * @requires_gles30 Extension @es_extension{ANGLE,instanced_arrays}, * @es_extension2{EXT,draw_instanced,draw_instanced} or * @es_extension{NV,draw_instanced} in OpenGL ES 2.0. @@ -662,6 +669,7 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * @brief Set base instance * @return Reference to self (for method chaining) * + * Ignored when calling @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). * Default is `0`. * @see @ref setInstanceCount(), @ref setBaseVertex() * @requires_gl42 Extension @extension{ARB,base_instance} @@ -803,6 +811,8 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * ES 2.0 or @webgl_extension{OES,vertex_array_object} in WebGL 1.0 is * available, the vertex array object is used to hold the parameters. * + * Ignored when calling @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt). + * * @see @ref maxElementIndex(), @ref maxElementsIndices(), * @ref maxElementsVertices(), @ref setCount(), @ref isIndexed(), * @fn_gl{BindVertexArray}, @fn_gl{BindBuffer} @@ -868,6 +878,43 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { void draw(AbstractShaderProgram& shader); void draw(AbstractShaderProgram&& shader) { draw(shader); } /**< @overload */ + #ifndef MAGNUM_TARGET_GLES + /** + * @brief Draw the mesh with vertices coming out of transform feedback + * @param shader Shader to use for drawing + * @param xfb Transform feedback to use for vertex count + * @param stream Transform feedback stream ID + * + * Expects that the @p shader is compatible with this mesh, is fully + * set up and that the output buffer(s) from @p xfb are used as vertex + * buffers in this mesh. Everything set by @ref setCount(), + * @ref setBaseInstance(), @ref setBaseVertex() and @ref setIndexBuffer() + * is ignored, the mesh is drawn as non-indexed and the vertex count is + * taken from the @p xfb object. If @p stream is `0`, non-stream draw + * command is used. If @extension{ARB,vertex_array_object} (part of + * OpenGL 3.0) is available, the associated vertex array object is + * bound instead of setting up the mesh from scratch. + * @see @ref setInstanceCount(), + * @ref MeshView::draw(AbstractShaderProgram, TransformFeedback& xfb, UnsignedInt), + * @fn_gl{UseProgram}, @fn_gl{EnableVertexAttribArray}, + * @fn_gl{BindBuffer}, @fn_gl{VertexAttribPointer}, + * @fn_gl{DisableVertexAttribArray} or @fn_gl{BindVertexArray}, + * @fn_gl{DrawTransformFeedback}/@fn_gl{DrawTransformFeedbackInstanced} or + * @fn_gl{DrawTransformFeedbackStream}/@fn_gl{DrawTransformFeedbackStreamInstanced} + * @requires_gl40 Extension @extension{ARB,transform_feedback2} + * @requires_gl40 Extension @extension{ARB,transform_feedback3} if + * @p stream is not `0` + * @requires_gl42 Extension @extension{ARB,transform_feedback_instanced} + * if @ref instanceCount() is more than `1`. + */ + void draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream = 0); + + /** @overload */ + void draw(AbstractShaderProgram&& shader, TransformFeedback& xfb, UnsignedInt stream = 0) { + draw(shader, xfb, stream); + } + #endif + private: enum class AttributeKind { Generic, @@ -961,6 +1008,10 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { void drawInternal(Int count, Int baseVertex, Int instanceCount, GLintptr indexOffset); #endif + #ifndef MAGNUM_TARGET_GLES + void drawInternal(TransformFeedback& xfb, UnsignedInt stream, Int instanceCount); + #endif + void MAGNUM_LOCAL createImplementationDefault(); void MAGNUM_LOCAL createImplementationVAO(); #ifndef MAGNUM_TARGET_GLES diff --git a/src/Magnum/MeshView.cpp b/src/Magnum/MeshView.cpp index 1bc587204..9d84adefa 100644 --- a/src/Magnum/MeshView.cpp +++ b/src/Magnum/MeshView.cpp @@ -164,4 +164,15 @@ void MeshView::draw(AbstractShaderProgram& shader) { #endif } +#ifndef MAGNUM_TARGET_GLES +void MeshView::draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream) { + /* Nothing to draw, exit without touching any state */ + if(!_instanceCount) return; + + shader.use(); + + _original.get().drawInternal(xfb, stream, _instanceCount); +} +#endif + } diff --git a/src/Magnum/MeshView.h b/src/Magnum/MeshView.h index 011dca7be..2f7c4e6b5 100644 --- a/src/Magnum/MeshView.h +++ b/src/Magnum/MeshView.h @@ -79,6 +79,10 @@ class MAGNUM_EXPORT MeshView { * @fn_gl{VertexAttribPointer}, @fn_gl{DisableVertexAttribArray} * or @fn_gl{BindVertexArray}, @fn_gl{MultiDrawArrays} or * @fn_gl{MultiDrawElements}/@fn_gl{MultiDrawElementsBaseVertex} + * @requires_gl32 Extension @extension{ARB,draw_elements_base_vertex} + * if the mesh is indexed and @ref baseVertex() is not `0`. + * @requires_gl Specifying base vertex for indexed meshes is not + * available in OpenGL ES or WebGL. */ static void draw(AbstractShaderProgram& shader, std::initializer_list> meshes); @@ -112,6 +116,7 @@ class MAGNUM_EXPORT MeshView { * @brief Set vertex/index count * @return Reference to self (for method chaining) * + * Ignored when calling @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). * Default is `0`. */ MeshView& setCount(Int count) { @@ -127,7 +132,8 @@ class MAGNUM_EXPORT MeshView { * @return Reference to self (for method chaining) * * Sets number of vertices of which the vertex buffer will be offset - * when drawing. Default is `0`. + * when drawing. Ignored when calling @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). + * Default is `0`. * @requires_gl32 Extension @extension{ARB,draw_elements_base_vertex} * for indexed meshes * @requires_gl Base vertex cannot be specified for indexed meshes in @@ -149,7 +155,8 @@ class MAGNUM_EXPORT MeshView { * performance, as only a portion of vertex buffer needs to be * acccessed. On OpenGL ES 2.0 this function behaves the same as * @ref setIndexRange(Int), as index range functionality is not - * available there. + * available there. Ignored when calling + * @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). * @see @ref setCount() */ /* MinGW/MSVC needs inline also here to avoid linkage conflicts */ @@ -161,7 +168,8 @@ class MAGNUM_EXPORT MeshView { * @return Reference to self (for method chaining) * * Prefer to use @ref setIndexRange(Int, UnsignedInt, UnsignedInt) for - * better performance. + * better performance. Ignored when calling + * @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). * @see @ref setCount() */ MeshView& setIndexRange(Int first); @@ -194,6 +202,7 @@ class MAGNUM_EXPORT MeshView { * @brief Set base instance * @return Reference to self (for method chaining) * + * Ignored when calling @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). * Default is `0`. * @requires_gl42 Extension @extension{ARB,base_instance} * @requires_gl Base instance cannot be specified in OpenGL ES or @@ -208,7 +217,7 @@ class MAGNUM_EXPORT MeshView { /** * @brief Draw the mesh * - * See @ref Mesh::draw() for more information. + * See @ref Mesh::draw(AbstractShaderProgram&) for more information. * @see @ref draw(AbstractShaderProgram&, std::initializer_list>) * @requires_gl32 Extension @extension{ARB,draw_elements_base_vertex} * if the mesh is indexed and @ref baseVertex() is not `0`. @@ -228,6 +237,30 @@ class MAGNUM_EXPORT MeshView { void draw(AbstractShaderProgram& shader); void draw(AbstractShaderProgram&& shader) { draw(shader); } /**< @overload */ + #ifndef MAGNUM_TARGET_GLES + /** + * @brief Draw the mesh with vertices coming out of transform feedback + * + * Everything set by @ref setCount(), @ref setBaseInstance(), + * @ref setBaseVertex(), @ref setIndexRange() and @ref Mesh::setIndexBuffer() + * is ignored, the mesh is drawn as non-indexed and the vertex count is + * taken from the @p xfb object. See + * @ref Mesh::draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt) + * for more information. + * @requires_gl40 Extension @extension{ARB,transform_feedback2} + * @requires_gl40 Extension @extension{ARB,transform_feedback3} if + * @p stream is not `0` + * @requires_gl42 Extension @extension{ARB,transform_feedback_instanced} + * if @ref instanceCount() is more than `1`. + */ + void draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream = 0); + + /** @overload */ + void draw(AbstractShaderProgram&& shader, TransformFeedback& xfb, UnsignedInt stream = 0) { + draw(shader, xfb, stream); + } + #endif + private: #ifndef MAGNUM_TARGET_WEBGL static MAGNUM_LOCAL void multiDrawImplementationDefault(std::initializer_list> meshes); diff --git a/src/Magnum/Test/TransformFeedbackGLTest.cpp b/src/Magnum/Test/TransformFeedbackGLTest.cpp index 396ef680e..f122c4c57 100644 --- a/src/Magnum/Test/TransformFeedbackGLTest.cpp +++ b/src/Magnum/Test/TransformFeedbackGLTest.cpp @@ -26,7 +26,11 @@ #include "Magnum/AbstractShaderProgram.h" #include "Magnum/Buffer.h" #include "Magnum/Framebuffer.h" +#include "Magnum/Image.h" #include "Magnum/Mesh.h" +#include "Magnum/PixelFormat.h" +#include "Magnum/PrimitiveQuery.h" +#include "Magnum/SampleQuery.h" #include "Magnum/Renderbuffer.h" #include "Magnum/RenderbufferFormat.h" #include "Magnum/Shader.h" @@ -54,9 +58,31 @@ struct TransformFeedbackGLTest: AbstractOpenGLTester { #ifndef MAGNUM_TARGET_GLES void interleaved(); + + void draw(); #endif }; +namespace { + +enum: std::size_t { DrawDataCount = 4 }; + +const struct { + const char* name; + UnsignedInt stream; + Int instances; + UnsignedInt countStream0; + UnsignedInt countStreamN; + UnsignedInt countDraw; +} DrawData[DrawDataCount] = { + {"basic", 0, 1, 6, 6, 6}, + {"instanced", 0, 5, 6, 6, 30}, + {"stream", 1, 1, 0, 6, 6}, + {"streamInstanced", 1, 5, 0, 6, 30} +}; + +} + TransformFeedbackGLTest::TransformFeedbackGLTest() { addTests({&TransformFeedbackGLTest::construct, &TransformFeedbackGLTest::constructNoCreate, @@ -72,9 +98,13 @@ TransformFeedbackGLTest::TransformFeedbackGLTest() { &TransformFeedbackGLTest::attachRanges, #ifndef MAGNUM_TARGET_GLES - &TransformFeedbackGLTest::interleaved + &TransformFeedbackGLTest::interleaved, #endif }); + + #ifndef MAGNUM_TARGET_GLES + addInstancedTests({&TransformFeedbackGLTest::draw}, DrawDataCount); + #endif } void TransformFeedbackGLTest::construct() { @@ -530,6 +560,140 @@ void TransformFeedbackGLTest::interleaved() { CORRADE_COMPARE(data[3].y(), 3.0f); output.unmap(); } + +void TransformFeedbackGLTest::draw() { + /* ARB_transform_feedback2 needed as base, other optional */ + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::transform_feedback2::string() + std::string(" is not supported.")); + if(DrawData[testCaseInstanceId()].stream && !Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::transform_feedback3::string() + std::string(" is not supported.")); + if(DrawData[testCaseInstanceId()].instances && !Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::transform_feedback_instanced::string() + std::string(" is not supported.")); + + setTestCaseDescription(DrawData[testCaseInstanceId()].name); + + /* Bind some FB to avoid errors on contexts w/o default FB */ + Renderbuffer color; + color.setStorage(RenderbufferFormat::RGBA8, Vector2i{1}); + Framebuffer fb{{{}, Vector2i{1}}}; + fb.attachRenderbuffer(Framebuffer::ColorAttachment{0}, color) + .bind(); + + struct XfbShader: AbstractShaderProgram { + explicit XfbShader(UnsignedInt stream) { + Shader vert{stream ? Version::GL400 : Version::GL320, Shader::Type::Vertex}, + geom{stream ? Version::GL400 : Version::GL320, Shader::Type::Geometry}; + vert.addSource( + "out mediump vec2 vertexOutput;\n" + "void main() {\n" + " vertexOutput = vec2(0.3);\n" + " gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n" + "}\n"); + if(stream) geom.addSource( + "#define STREAM " + std::to_string(stream) + "\n" + + "layout(stream = 0) out mediump float otherOutput;\n" + + "layout(stream = STREAM) out mediump vec2 geomOutput;\n"); + else geom.addSource( + "out mediump vec2 geomOutput;\n"); + geom.addSource( + "layout(points) in;\n" + "layout(points, max_vertices = 1) out;\n" + "in mediump vec2 vertexOutput[];\n" + "void main() {\n" + " geomOutput = vertexOutput[0] - vec2(0.1);\n"); + if(stream) geom.addSource( + " EmitStreamVertex(STREAM);\n"); + else geom.addSource( + " EmitVertex();\n"); + geom.addSource("}\n"); + CORRADE_INTERNAL_ASSERT_OUTPUT(Shader::compile({vert, geom})); + attachShaders({vert, geom}); + setTransformFeedbackOutputs({"geomOutput"}, TransformFeedbackBufferMode::SeparateAttributes); + CORRADE_INTERNAL_ASSERT_OUTPUT(link()); + } + } xfbShader{DrawData[testCaseInstanceId()].stream}; + + Buffer outputBuffer; + outputBuffer.setData({nullptr, 32*sizeof(Vector2)}, BufferUsage::StaticDraw); + + Mesh inputMesh; + inputMesh.setPrimitive(MeshPrimitive::Points) + .setCount(6); + + TransformFeedback feedback; + feedback.attachBuffer(0, outputBuffer); + + MAGNUM_VERIFY_NO_ERROR(); + + PrimitiveQuery queryStream0{PrimitiveQuery::Target::TransformFeedbackPrimitivesWritten}, + queryStreamN{PrimitiveQuery::Target::TransformFeedbackPrimitivesWritten}; + + queryStream0.begin(); + if(DrawData[testCaseInstanceId()].stream) + queryStreamN.begin(DrawData[testCaseInstanceId()].stream); + + Renderer::enable(Renderer::Feature::RasterizerDiscard); + feedback.begin(xfbShader, TransformFeedback::PrimitiveMode::Points); + inputMesh.draw(xfbShader); + feedback.end(); + Renderer::disable(Renderer::Feature::RasterizerDiscard); + + if(DrawData[testCaseInstanceId()].stream) + queryStreamN.end(); + queryStream0.end(); + + MAGNUM_VERIFY_NO_ERROR(); + + CORRADE_COMPARE(queryStream0.result(), DrawData[testCaseInstanceId()].countStream0); + if(DrawData[testCaseInstanceId()].stream) + CORRADE_COMPARE(queryStreamN.result(), DrawData[testCaseInstanceId()].countStreamN); + + struct DrawShader: AbstractShaderProgram { + typedef Attribute<0, Vector2> Input; + + explicit DrawShader() { + Shader vert{Version::GL320, Shader::Type::Vertex}, + frag{Version::GL320, Shader::Type::Fragment}; + vert.addSource( + "in mediump vec2 inputData;\n" + "out mediump vec2 interleaved;\n" + "void main() {\n" + " interleaved = inputData;\n" + " gl_Position = vec4(1.0);\n" + "}\n"); + frag.addSource( + "in mediump vec2 interleaved;\n" + "out mediump float outputData;\n" + "void main() {\n" + " outputData = interleaved.x + 2*interleaved.y;\n" + "}\n"); + + CORRADE_INTERNAL_ASSERT_OUTPUT(Shader::compile({vert, frag})); + attachShaders({vert, frag}); + bindAttributeLocation(Input::Location, "inputData"); + CORRADE_INTERNAL_ASSERT_OUTPUT(link()); + } + } drawShader; + + Renderer::setPointSize(2.0f); + + Mesh outputMesh; + outputMesh.setPrimitive(MeshPrimitive::Points) + .setInstanceCount(DrawData[testCaseInstanceId()].instances) + .addVertexBuffer(outputBuffer, 0, DrawShader::Input{}); + + PrimitiveQuery q{PrimitiveQuery::Target::PrimitivesGenerated}; + q.begin(); + outputMesh.draw(drawShader, feedback, DrawData[testCaseInstanceId()].stream); + q.end(); + + MAGNUM_VERIFY_NO_ERROR(); + + CORRADE_COMPARE(q.result(), DrawData[testCaseInstanceId()].countDraw); + CORRADE_COMPARE(fb.read({{}, Vector2i{1}}, {PixelFormat::RGBA, PixelType::UnsignedByte}).data()[0], 153); + + MAGNUM_VERIFY_NO_ERROR(); +} #endif }} From 5ca4e2e517108e700f7752d192af4cc24e773ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 10 Oct 2016 00:46:41 +0200 Subject: [PATCH 250/290] Fix compilation on WebGL 2. --- src/Magnum/PrimitiveQuery.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/PrimitiveQuery.h b/src/Magnum/PrimitiveQuery.h index 37e75553e..344dfdae4 100644 --- a/src/Magnum/PrimitiveQuery.h +++ b/src/Magnum/PrimitiveQuery.h @@ -68,7 +68,7 @@ class MAGNUM_EXPORT PrimitiveQuery: public AbstractQuery { public: /** @brief Query target */ enum class Target: GLenum { - #ifndef MAGNUM_TARGET_GLES2 + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) /** * Count of primitives generated from vertex shader or geometry * shader. When used with @ref begin(UnsignedInt), the index must From 71f57b5378856de4c1c815cb415c6c840c23d725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 10 Oct 2016 13:28:24 +0200 Subject: [PATCH 251/290] Shaders: fixed default Phong light color in ES builds. The cause was careless coding in da2ac0047867d4a3fa9383236d8c61e1e05b256b. I desperately need those shader output tests :/ --- src/Magnum/Shaders/Phong.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magnum/Shaders/Phong.cpp b/src/Magnum/Shaders/Phong.cpp index bf0c5d2b9..5431be52c 100644 --- a/src/Magnum/Shaders/Phong.cpp +++ b/src/Magnum/Shaders/Phong.cpp @@ -119,7 +119,7 @@ Phong::Phong(const Flags flags): transformationMatrixUniform(0), projectionMatri if(flags & Flag::DiffuseTexture) setDiffuseColor(Color4{1.0f}); setSpecularColor(Color4{1.0f}); - setLightColor(Color4{.0f}); + setLightColor(Color4{1.0f}); setShininess(80.0f); #endif } From e9a2623e026a12801a7b7fd86be4006fd3e4ac0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 10 Oct 2016 14:02:48 +0200 Subject: [PATCH 252/290] Math: expect NoInit test failures on GCC 6.1+ with optimizations enabled. It's nothing harmful, just inefficient. --- src/Magnum/Math/Test/AngleTest.cpp | 17 +++++++++++++++-- src/Magnum/Math/Test/BezierTest.cpp | 7 ++++++- src/Magnum/Math/Test/BoolVectorTest.cpp | 7 ++++++- src/Magnum/Math/Test/ColorTest.cpp | 9 +++++++-- src/Magnum/Math/Test/ComplexTest.cpp | 7 ++++++- src/Magnum/Math/Test/DualComplexTest.cpp | 7 ++++++- src/Magnum/Math/Test/DualQuaternionTest.cpp | 7 ++++++- src/Magnum/Math/Test/DualTest.cpp | 9 +++++++-- src/Magnum/Math/Test/Matrix3Test.cpp | 11 ++++++++--- src/Magnum/Math/Test/Matrix4Test.cpp | 13 +++++++++---- src/Magnum/Math/Test/MatrixTest.cpp | 13 +++++++++---- src/Magnum/Math/Test/QuaternionTest.cpp | 7 ++++++- src/Magnum/Math/Test/RangeTest.cpp | 11 ++++++++--- src/Magnum/Math/Test/RectangularMatrixTest.cpp | 11 ++++++++--- src/Magnum/Math/Test/UnitTest.cpp | 7 ++++++- src/Magnum/Math/Test/Vector2Test.cpp | 7 ++++++- src/Magnum/Math/Test/Vector3Test.cpp | 7 ++++++- src/Magnum/Math/Test/Vector4Test.cpp | 7 ++++++- src/Magnum/Math/Test/VectorTest.cpp | 7 ++++++- 19 files changed, 137 insertions(+), 34 deletions(-) diff --git a/src/Magnum/Math/Test/AngleTest.cpp b/src/Magnum/Math/Test/AngleTest.cpp index 5cc6056be..f27d646e9 100644 --- a/src/Magnum/Math/Test/AngleTest.cpp +++ b/src/Magnum/Math/Test/AngleTest.cpp @@ -105,8 +105,21 @@ void AngleTest::constructNoInit() { Rad b{3.14f}; new(&a) Deg{NoInit}; new(&b) Rad{NoInit}; - CORRADE_COMPARE(Float(a), 25.0f); - CORRADE_COMPARE(Float(b), 3.14f); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 + /* The warning is reported for both debug and release build */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #ifdef __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + #endif + CORRADE_COMPARE(Float(a), 25.0f); + CORRADE_COMPARE(Float(b), 3.14f); + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 + #pragma GCC diagnostic pop + #endif + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); CORRADE_VERIFY((std::is_nothrow_constructible::value)); diff --git a/src/Magnum/Math/Test/BezierTest.cpp b/src/Magnum/Math/Test/BezierTest.cpp index 86354a47c..04afa111d 100644 --- a/src/Magnum/Math/Test/BezierTest.cpp +++ b/src/Magnum/Math/Test/BezierTest.cpp @@ -108,7 +108,12 @@ void BezierTest::constructDefault() { void BezierTest::constructNoInit() { QuadraticBezier2D a{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}}; new(&a) QuadraticBezier2D{NoInit}; - CORRADE_COMPARE(a, (QuadraticBezier2D{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, (QuadraticBezier2D{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/BoolVectorTest.cpp b/src/Magnum/Math/Test/BoolVectorTest.cpp index a380b34f8..a5777762f 100644 --- a/src/Magnum/Math/Test/BoolVectorTest.cpp +++ b/src/Magnum/Math/Test/BoolVectorTest.cpp @@ -100,7 +100,12 @@ void BoolVectorTest::constructDefault() { void BoolVectorTest::constructNoInit() { BoolVector19 a{0xa5, 0x5f, 0x07}; new(&a) BoolVector19{NoInit}; - CORRADE_COMPARE(a, BoolVector19(0xa5, 0x5f, 0x07)); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, BoolVector19(0xa5, 0x5f, 0x07)); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/ColorTest.cpp b/src/Magnum/Math/Test/ColorTest.cpp index eb7dd5a9b..014a2cb8a 100644 --- a/src/Magnum/Math/Test/ColorTest.cpp +++ b/src/Magnum/Math/Test/ColorTest.cpp @@ -185,8 +185,13 @@ void ColorTest::constructNoInit() { Color4 b{1.0f, 0.5f, 0.75f, 0.5f}; new(&a) Color3{Math::NoInit}; new(&b) Color4{Math::NoInit}; - CORRADE_COMPARE(a, (Color3{1.0f, 0.5f, 0.75f})); - CORRADE_COMPARE(b, (Color4{1.0f, 0.5f, 0.75f, 0.5f})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, (Color3{1.0f, 0.5f, 0.75f})); + CORRADE_COMPARE(b, (Color4{1.0f, 0.5f, 0.75f, 0.5f})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); CORRADE_VERIFY((std::is_nothrow_constructible::value)); diff --git a/src/Magnum/Math/Test/ComplexTest.cpp b/src/Magnum/Math/Test/ComplexTest.cpp index b5ca99653..8c46d13e1 100644 --- a/src/Magnum/Math/Test/ComplexTest.cpp +++ b/src/Magnum/Math/Test/ComplexTest.cpp @@ -175,7 +175,12 @@ void ComplexTest::constructZero() { void ComplexTest::constructNoInit() { Complex a{0.5f, -3.7f}; new(&a) Complex{NoInit}; - CORRADE_COMPARE(a, Complex(0.5f, -3.7f)); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, Complex(0.5f, -3.7f)); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/DualComplexTest.cpp b/src/Magnum/Math/Test/DualComplexTest.cpp index 033f4d710..026a5ca56 100644 --- a/src/Magnum/Math/Test/DualComplexTest.cpp +++ b/src/Magnum/Math/Test/DualComplexTest.cpp @@ -178,7 +178,12 @@ void DualComplexTest::constructZero() { void DualComplexTest::constructNoInit() { DualComplex a{{-1.0f, 2.5f}, {3.0f, -7.5f}}; new(&a) DualComplex{NoInit}; - CORRADE_COMPARE(a, DualComplex({-1.0f, 2.5f}, {3.0f, -7.5f})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, DualComplex({-1.0f, 2.5f}, {3.0f, -7.5f})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/DualQuaternionTest.cpp b/src/Magnum/Math/Test/DualQuaternionTest.cpp index 338ededaf..372eaf572 100644 --- a/src/Magnum/Math/Test/DualQuaternionTest.cpp +++ b/src/Magnum/Math/Test/DualQuaternionTest.cpp @@ -200,7 +200,12 @@ void DualQuaternionTest::constructZero() { void DualQuaternionTest::constructNoInit() { DualQuaternion a{{{1.0f, 2.0f, 3.0f}, -4.0f}, {{0.5f, -3.1f, 3.3f}, 2.0f}}; new(&a) DualQuaternion{NoInit}; - CORRADE_COMPARE(a, DualQuaternion({{1.0f, 2.0f, 3.0f}, -4.0f}, {{0.5f, -3.1f, 3.3f}, 2.0f})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, DualQuaternion({{1.0f, 2.0f, 3.0f}, -4.0f}, {{0.5f, -3.1f, 3.3f}, 2.0f})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/DualTest.cpp b/src/Magnum/Math/Test/DualTest.cpp index 973b56f7c..d7cd29c4c 100644 --- a/src/Magnum/Math/Test/DualTest.cpp +++ b/src/Magnum/Math/Test/DualTest.cpp @@ -137,8 +137,13 @@ void DualTest::constructNoInit() { Math::Dual> b{{{3.0f, 0.1f, 1.0f}, 1.0f}, {{0.1f, 0.0f, 1.0f}, 0.3f}}; new(&a) Dual{NoInit}; new(&b) Math::Dual>{NoInit}; - CORRADE_COMPARE(a, Dual(2.0f, -7.5f)); - CORRADE_COMPARE(b, (Math::Dual>{{{3.0f, 0.1f, 1.0f}, 1.0f}, {{0.1f, 0.0f, 1.0f}, 0.3f}})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, Dual(2.0f, -7.5f)); + CORRADE_COMPARE(b, (Math::Dual>{{{3.0f, 0.1f, 1.0f}, 1.0f}, {{0.1f, 0.0f, 1.0f}, 0.3f}})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); CORRADE_VERIFY((std::is_nothrow_constructible>, NoInitT>::value)); diff --git a/src/Magnum/Math/Test/Matrix3Test.cpp b/src/Magnum/Math/Test/Matrix3Test.cpp index 322181471..25758233e 100644 --- a/src/Magnum/Math/Test/Matrix3Test.cpp +++ b/src/Magnum/Math/Test/Matrix3Test.cpp @@ -175,9 +175,14 @@ void Matrix3Test::constructNoInit() { {4.5f, 4.0f, 7.0f}, {7.9f, -1.0f, 8.0f}}; new(&a) Matrix3{NoInit}; - CORRADE_COMPARE(a, Matrix3({3.0f, 5.0f, 8.0f}, - {4.5f, 4.0f, 7.0f}, - {7.9f, -1.0f, 8.0f})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, Matrix3({3.0f, 5.0f, 8.0f}, + {4.5f, 4.0f, 7.0f}, + {7.9f, -1.0f, 8.0f})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/Matrix4Test.cpp b/src/Magnum/Math/Test/Matrix4Test.cpp index 7cce470c9..e33f9bda7 100644 --- a/src/Magnum/Math/Test/Matrix4Test.cpp +++ b/src/Magnum/Math/Test/Matrix4Test.cpp @@ -207,10 +207,15 @@ void Matrix4Test::constructNoInit() { {1.0f, 2.0f, 3.0f, -1.0f}, {7.9f, -1.0f, 8.0f, -1.5f}}; new(&a) Matrix4{NoInit}; - CORRADE_COMPARE(a, Matrix4({3.0f, 5.0f, 8.0f, -3.0f}, - {4.5f, 4.0f, 7.0f, 2.0f}, - {1.0f, 2.0f, 3.0f, -1.0f}, - {7.9f, -1.0f, 8.0f, -1.5f})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, Matrix4({3.0f, 5.0f, 8.0f, -3.0f}, + {4.5f, 4.0f, 7.0f, 2.0f}, + {1.0f, 2.0f, 3.0f, -1.0f}, + {7.9f, -1.0f, 8.0f, -1.5f})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/MatrixTest.cpp b/src/Magnum/Math/Test/MatrixTest.cpp index 8b124f0a7..974bebe35 100644 --- a/src/Magnum/Math/Test/MatrixTest.cpp +++ b/src/Magnum/Math/Test/MatrixTest.cpp @@ -166,10 +166,15 @@ void MatrixTest::constructNoInit() { Vector4(1.0f, 2.0f, 3.0f, -1.0f), Vector4(7.9f, -1.0f, 8.0f, -1.5f)}; new(&a) Matrix4x4{NoInit}; - CORRADE_COMPARE(a, Matrix4x4(Vector4(3.0f, 5.0f, 8.0f, -3.0f), - Vector4(4.5f, 4.0f, 7.0f, 2.0f), - Vector4(1.0f, 2.0f, 3.0f, -1.0f), - Vector4(7.9f, -1.0f, 8.0f, -1.5f))); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, Matrix4x4(Vector4(3.0f, 5.0f, 8.0f, -3.0f), + Vector4(4.5f, 4.0f, 7.0f, 2.0f), + Vector4(1.0f, 2.0f, 3.0f, -1.0f), + Vector4(7.9f, -1.0f, 8.0f, -1.5f))); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/QuaternionTest.cpp b/src/Magnum/Math/Test/QuaternionTest.cpp index e85fd26dc..814b0d558 100644 --- a/src/Magnum/Math/Test/QuaternionTest.cpp +++ b/src/Magnum/Math/Test/QuaternionTest.cpp @@ -182,7 +182,12 @@ void QuaternionTest::constructZero() { void QuaternionTest::constructNoInit() { Quaternion a{{1.0f, 2.0f, 3.0f}, -4.0f}; new(&a) Quaternion{NoInit}; - CORRADE_COMPARE(a, Quaternion({1.0f, 2.0f, 3.0f}, -4.0f)); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, Quaternion({1.0f, 2.0f, 3.0f}, -4.0f)); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/RangeTest.cpp b/src/Magnum/Math/Test/RangeTest.cpp index d1efadc7e..ad869b6e2 100644 --- a/src/Magnum/Math/Test/RangeTest.cpp +++ b/src/Magnum/Math/Test/RangeTest.cpp @@ -216,9 +216,14 @@ void RangeTest::constructNoInit() { new(&b) Range2Di{NoInit}; new(&c) Range3Di{NoInit}; - CORRADE_COMPARE(a, (Range1Di{3, 23})); - CORRADE_COMPARE(b, (Range2Di{{3, 5}, {23, 78}})); - CORRADE_COMPARE(c, (Range3Di{{3, 5, -7}, {23, 78, 2}})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, (Range1Di{3, 23})); + CORRADE_COMPARE(b, (Range2Di{{3, 5}, {23, 78}})); + CORRADE_COMPARE(c, (Range3Di{{3, 5, -7}, {23, 78, 2}})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); CORRADE_VERIFY((std::is_nothrow_constructible::value)); diff --git a/src/Magnum/Math/Test/RectangularMatrixTest.cpp b/src/Magnum/Math/Test/RectangularMatrixTest.cpp index d1adf3735..c26676375 100644 --- a/src/Magnum/Math/Test/RectangularMatrixTest.cpp +++ b/src/Magnum/Math/Test/RectangularMatrixTest.cpp @@ -175,9 +175,14 @@ void RectangularMatrixTest::constructNoInit() { Vector4(5.0f, 6.0f, 7.0f, 8.0f), Vector4(9.0f, 10.0f, 11.0f, 12.0f)}; new(&a) Matrix3x4{NoInit}; - CORRADE_COMPARE(a, Matrix3x4(Vector4(1.0f, 2.0f, 3.0f, 4.0f), - Vector4(5.0f, 6.0f, 7.0f, 8.0f), - Vector4(9.0f, 10.0f, 11.0f, 12.0f))); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, Matrix3x4(Vector4(1.0f, 2.0f, 3.0f, 4.0f), + Vector4(5.0f, 6.0f, 7.0f, 8.0f), + Vector4(9.0f, 10.0f, 11.0f, 12.0f))); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/UnitTest.cpp b/src/Magnum/Math/Test/UnitTest.cpp index 0bbf1a7ed..4cb58e33a 100644 --- a/src/Magnum/Math/Test/UnitTest.cpp +++ b/src/Magnum/Math/Test/UnitTest.cpp @@ -91,7 +91,12 @@ void UnitTest::constructDefault() { void UnitTest::constructNoInit() { Sec a{25.0f}; new(&a) Sec{NoInit}; - CORRADE_COMPARE(a, Sec{25.0f}); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, Sec{25.0f}); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/Vector2Test.cpp b/src/Magnum/Math/Test/Vector2Test.cpp index 55bee65e3..774f584fd 100644 --- a/src/Magnum/Math/Test/Vector2Test.cpp +++ b/src/Magnum/Math/Test/Vector2Test.cpp @@ -121,7 +121,12 @@ void Vector2Test::constructDefault() { void Vector2Test::constructNoInit() { Vector2 a{1.5f, 2.5f}; new(&a) Vector2{NoInit}; - CORRADE_COMPARE(a, (Vector2{1.5f, 2.5f})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, (Vector2{1.5f, 2.5f})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/Vector3Test.cpp b/src/Magnum/Math/Test/Vector3Test.cpp index 72c5be4c1..044f87ef8 100644 --- a/src/Magnum/Math/Test/Vector3Test.cpp +++ b/src/Magnum/Math/Test/Vector3Test.cpp @@ -119,7 +119,12 @@ void Vector3Test::constructDefault() { void Vector3Test::constructNoInit() { Vector3 a{1.0f, 2.5f, -3.0f}; new(&a) Vector3{NoInit}; - CORRADE_COMPARE(a, (Vector3{1.0f, 2.5f, -3.0f})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, (Vector3{1.0f, 2.5f, -3.0f})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/Vector4Test.cpp b/src/Magnum/Math/Test/Vector4Test.cpp index 2dcce57b8..e89ee1382 100644 --- a/src/Magnum/Math/Test/Vector4Test.cpp +++ b/src/Magnum/Math/Test/Vector4Test.cpp @@ -134,7 +134,12 @@ void Vector4Test::constructDefault() { void Vector4Test::constructNoInit() { Vector4 a{1.0f, -2.5f, 3.0f, 4.1f}; new(&a) Vector4{NoInit}; - CORRADE_COMPARE(a, (Vector4{1.0f, -2.5f, 3.0f, 4.1f})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, (Vector4{1.0f, -2.5f, 3.0f, 4.1f})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } diff --git a/src/Magnum/Math/Test/VectorTest.cpp b/src/Magnum/Math/Test/VectorTest.cpp index 5c754a3b6..5204a0b2e 100644 --- a/src/Magnum/Math/Test/VectorTest.cpp +++ b/src/Magnum/Math/Test/VectorTest.cpp @@ -208,7 +208,12 @@ void VectorTest::constructDefault() { void VectorTest::constructNoInit() { Vector4 a{1.0f, 2.0f, -3.0f, 4.5f}; new(&a) Vector4{NoInit}; - CORRADE_COMPARE(a, (Vector4{1.0f, 2.0f, -3.0f, 4.5f})); + { + #if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__ + CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value."); + #endif + CORRADE_COMPARE(a, (Vector4{1.0f, 2.0f, -3.0f, 4.5f})); + } CORRADE_VERIFY((std::is_nothrow_constructible::value)); } From cc4322f55665edf6d20db37b8893484d5219d6cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 10 Oct 2016 17:18:34 +0200 Subject: [PATCH 253/290] doc: updated outdated information in the Getting Started Guide. --- doc/getting-started.dox | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/getting-started.dox b/doc/getting-started.dox index e2e761e9c..58534ab1b 100644 --- a/doc/getting-started.dox +++ b/doc/getting-started.dox @@ -64,7 +64,7 @@ these two new subdirectories using `add_subdirectory()` so the file looks like this: @code -cmake_minimum_required(VERSION 2.8.9) +cmake_minimum_required(VERSION 2.8.12) project(MyApplication) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/modules/") @@ -75,7 +75,7 @@ add_subdirectory(src) @endcode If you want to install Corrade and Magnum separately instead of cloning them -into your project tree, just follow the installation guides mentioned above. +into your project tree, just follow @ref building "the full installation guide". Don't forget to enable `WITH_SDL2APPLICATION` (or `WITH_GLUTAPPLICATION`, if you are using GLUT) when building Magnum so the bootstrap project can use it later. From fc356a3122f1524f30d3f5beb760355795b06246 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 10 Oct 2016 17:20:39 +0200 Subject: [PATCH 254/290] I never thought Markdown would be *this* fragile. Having `2015.` at beginning of a line treated is as a start of ordered list. WTF. --- README.md | 4 ++-- doc/building.dox | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 14d7c0705..197edf772 100644 --- a/README.md +++ b/README.md @@ -90,8 +90,8 @@ Minimal dependencies -------------------- * C++ compiler with good C++11 support. Compilers which are tested to have - everything needed are **GCC** >= 4.7, **Clang** >= 3.1 and **MSVC** >= - 2015. On Windows you can also use **MinGW-w64**. + everything needed are **GCC** >= 4.7, **Clang** >= 3.1 and **MSVC** >= 2015. + On Windows you can also use **MinGW-w64**. * **CMake** >= 2.8.12 * **Corrade** - Plugin management and utility library. You can get it at https://github.com/mosra/corrade. diff --git a/doc/building.dox b/doc/building.dox index ae8ce2c9e..54ac96445 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -33,8 +33,8 @@ namespace Magnum { Minimal set of tools and libraries required for building is: - C++ compiler with good C++11 support. Compilers which are tested to have - everything needed are **GCC** >= 4.7, **Clang** >= 3.1 and **MSVC** >= - 2015. On Windows you can also use **MinGW-w64**. + everything needed are **GCC** >= 4.7, **Clang** >= 3.1 and **MSVC** >= 2015. + On Windows you can also use **MinGW-w64**. - **CMake** >= 2.8.12 - **Corrade** - Plugin management and utility library. See @ref building-corrade "Corrade download and installation guide" for more From ddf6cd27f0d92fc5ed0435ecdb136ffae3b700a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 11 Oct 2016 13:49:13 +0200 Subject: [PATCH 255/290] CMake: install plugin binary / library to different places. In order to have it correct on Windows where DLLs should be next to executables. --- CMakeLists.txt | 55 ++++++++---- modules/FindMagnum.cmake | 86 +++++++++++++------ .../Text/fontconverterConfigure.h.cmake | 4 +- .../distancefieldconverterConfigure.h.cmake | 4 +- .../Trade/imageconverterConfigure.h.cmake | 4 +- src/MagnumPlugins/CMakeLists.txt | 6 +- src/MagnumPlugins/MagnumFont/CMakeLists.txt | 4 +- .../MagnumFontConverter/CMakeLists.txt | 4 +- src/MagnumPlugins/ObjImporter/CMakeLists.txt | 4 +- .../TgaImageConverter/CMakeLists.txt | 4 +- src/MagnumPlugins/TgaImporter/CMakeLists.txt | 4 +- .../WavAudioImporter/CMakeLists.txt | 4 +- 12 files changed, 122 insertions(+), 61 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2993f66f5..22f25a4ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -262,27 +262,46 @@ set(MAGNUM_EXTERNAL_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/MagnumEx set(MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/MagnumPlugins) # Separate install dirs for debug and release plugins -set(MAGNUM_PLUGINS_DEBUG_INSTALL_DIR ${MAGNUM_LIBRARY_INSTALL_DIR}/magnum-d) -set(MAGNUM_PLUGINS_RELEASE_INSTALL_DIR ${MAGNUM_LIBRARY_INSTALL_DIR}/magnum) - -# Plugin installation dirs based on wheter we are in debug or release build, -# needed by some command-line tools +set(MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_BINARY_INSTALL_DIR}/magnum-d) +set(MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_LIBRARY_INSTALL_DIR}/magnum-d) +set(MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_BINARY_INSTALL_DIR}/magnum) +set(MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_LIBRARY_INSTALL_DIR}/magnum) + +set(MAGNUM_PLUGINS_FONT_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONT_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONT_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONT_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/fontconverters) +set(MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/fontconverters) +set(MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/fontconverters) +set(MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/fontconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_IMPORTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_IMPORTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/audioimporters) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/audioimporters) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/audioimporters) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/audioimporters) + +# Plugin dirs based on wheter we are in debug or release build, needed by some +# command-line tools +if(CORRADE_TARGET_WINDOWS) + set(MAGNUM_PLUGINS_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}) + set(MAGNUM_PLUGINS_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}) +else() + set(MAGNUM_PLUGINS_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}) + set(MAGNUM_PLUGINS_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}) +endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(MAGNUM_PLUGINS_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}) + set(MAGNUM_PLUGINS_DIR ${MAGNUM_PLUGINS_DEBUG_DIR}) else() - set(MAGNUM_PLUGINS_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_INSTALL_DIR}) + set(MAGNUM_PLUGINS_DIR ${MAGNUM_PLUGINS_RELEASE_DIR}) endif() -set(MAGNUM_PLUGINS_FONT_DEBUG_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}/fonts) -set(MAGNUM_PLUGINS_FONT_RELEASE_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_INSTALL_DIR}/fonts) -set(MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}/fontconverters) -set(MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_INSTALL_DIR}/fontconverters) -set(MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}/imageconverters) -set(MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_INSTALL_DIR}/imageconverters) -set(MAGNUM_PLUGINS_IMPORTER_DEBUG_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}/importers) -set(MAGNUM_PLUGINS_IMPORTER_RELEASE_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_INSTALL_DIR}/importers) -set(MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}/audioimporters) -set(MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_INSTALL_DIR}/audioimporters) - add_subdirectory(modules) add_subdirectory(src) diff --git a/modules/FindMagnum.cmake b/modules/FindMagnum.cmake index 7ee1a6916..24214821e 100644 --- a/modules/FindMagnum.cmake +++ b/modules/FindMagnum.cmake @@ -129,17 +129,30 @@ # MAGNUM_BINARY_INSTALL_DIR - Binary installation directory # MAGNUM_LIBRARY_INSTALL_DIR - Library installation directory # MAGNUM_DATA_INSTALL_DIR - Data installation directory -# MAGNUM_PLUGINS_[DEBUG|RELEASE]_INSTALL_DIR - Plugin installation directory -# MAGNUM_PLUGINS_FONT_[DEBUG|RELEASE]_INSTALL_DIR - Font plugin installation -# directory -# MAGNUM_PLUGINS_FONTCONVERTER_[DEBUG|RELEASE]_INSTALL_DIR - Font converter -# plugin installation directory -# MAGNUM_PLUGINS_IMAGECONVERTER_[DEBUG|RELEASE]_INSTALL_DIR - Image converter -# plugin installation directory -# MAGNUM_PLUGINS_IMPORTER_[DEBUG|RELEASE]_INSTALL_DIR - Importer plugin +# MAGNUM_PLUGINS_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Plugin binary # installation directory -# MAGNUM_PLUGINS_AUDIOIMPORTER_[DEBUG|RELEASE]_INSTALL_DIR - Audio importer -# plugin installation directory +# MAGNUM_PLUGINS_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Plugin library +# installation directory +# MAGNUM_PLUGINS_FONT_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Font plugin binary +# installation directory +# MAGNUM_PLUGINS_FONT_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Font plugin +# library installation directory +# MAGNUM_PLUGINS_FONTCONVERTER_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Font +# converter plugin binary installation directory +# MAGNUM_PLUGINS_FONTCONVERTER_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Font +# converter plugin library installation directory +# MAGNUM_PLUGINS_IMAGECONVERTER_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Image +# converter plugin binary installation directory +# MAGNUM_PLUGINS_IMAGECONVERTER_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Image +# converter plugin library installation directory +# MAGNUM_PLUGINS_IMPORTER_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Importer +# plugin binary installation directory +# MAGNUM_PLUGINS_IMPORTER_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Importer +# plugin library installation directory +# MAGNUM_PLUGINS_AUDIOIMPORTER_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Audio +# importer plugin binary installation directory +# MAGNUM_PLUGINS_AUDIOIMPORTER_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Audio +# importer plugin library installation directory # MAGNUM_INCLUDE_INSTALL_DIR - Header installation directory # MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR - Plugin header installation directory # @@ -238,17 +251,24 @@ if(NOT TARGET Magnum::Magnum) # information to guess also build type of dynamic plugins if(MAGNUM_LIBRARY_DEBUG AND MAGNUM_LIBRARY_RELEASE) set(MAGNUM_LIBRARY ${MAGNUM_LIBRARY_RELEASE}) - get_filename_component(_MAGNUM_LIBRARY_PATH ${MAGNUM_LIBRARY_DEBUG} PATH) + get_filename_component(_MAGNUM_PLUGINS_DIR_PREFIX ${MAGNUM_LIBRARY_DEBUG} PATH) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(_MAGNUM_PLUGINS_DIR_SUFFIX "-d") endif() elseif(MAGNUM_LIBRARY_DEBUG) set(MAGNUM_LIBRARY ${MAGNUM_LIBRARY_DEBUG}) - get_filename_component(_MAGNUM_LIBRARY_PATH ${MAGNUM_LIBRARY_DEBUG} PATH) + get_filename_component(_MAGNUM_PLUGINS_DIR_PREFIX ${MAGNUM_LIBRARY_DEBUG} PATH) set(_MAGNUM_PLUGINS_DIR_SUFFIX "-d") elseif(MAGNUM_LIBRARY_RELEASE) set(MAGNUM_LIBRARY ${MAGNUM_LIBRARY_RELEASE}) - get_filename_component(_MAGNUM_LIBRARY_PATH ${MAGNUM_LIBRARY_RELEASE} PATH) + get_filename_component(_MAGNUM_PLUGINS_DIR_PREFIX ${MAGNUM_LIBRARY_RELEASE} PATH) + endif() + + # On DLL platforms the plugins are stored in bin/ instead of lib/, modify + # _MAGNUM_PLUGINS_DIR_PREFIX accordingly + if(CORRADE_TARGET_WINDOWS) + get_filename_component(_MAGNUM_PLUGINS_DIR_PREFIX ${_MAGNUM_PLUGINS_DIR_PREFIX} PATH) + set(_MAGNUM_PLUGINS_DIR_PREFIX ${_MAGNUM_PLUGINS_DIR_PREFIX}/bin) endif() if(MAGNUM_LIBRARY_RELEASE) @@ -749,27 +769,37 @@ include(${CORRADE_LIB_SUFFIX_MODULE}) set(MAGNUM_BINARY_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin) set(MAGNUM_LIBRARY_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) set(MAGNUM_DATA_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/magnum) -set(MAGNUM_PLUGINS_DEBUG_INSTALL_DIR ${MAGNUM_LIBRARY_INSTALL_DIR}/magnum-d) -set(MAGNUM_PLUGINS_RELEASE_INSTALL_DIR ${MAGNUM_LIBRARY_INSTALL_DIR}/magnum) -set(MAGNUM_PLUGINS_FONT_DEBUG_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}/fonts) -set(MAGNUM_PLUGINS_FONT_RELEASE_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_INSTALL_DIR}/fonts) -set(MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}/fontconverters) -set(MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_INSTALL_DIR}/fontconverters) -set(MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}/imageconverters) -set(MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_INSTALL_DIR}/imageconverters) -set(MAGNUM_PLUGINS_IMPORTER_DEBUG_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}/importers) -set(MAGNUM_PLUGINS_IMPORTER_RELEASE_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_INSTALL_DIR}/importers) -set(MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}/audioimporters) -set(MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_INSTALL_DIR}/audioimporters) +set(MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_BINARY_INSTALL_DIR}/magnum-d) +set(MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_LIBRARY_INSTALL_DIR}/magnum-d) +set(MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_BINARY_INSTALL_DIR}/magnum) +set(MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_LIBRARY_INSTALL_DIR}/magnum) +set(MAGNUM_PLUGINS_FONT_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONT_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONT_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONT_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/fontconverters) +set(MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/fontconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_IMPORTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_IMPORTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/audioimporters) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/audioimporters) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/audioimporters) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/audioimporters) set(MAGNUM_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/Magnum) set(MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/MagnumPlugins) # Get base plugin directory from main library location -set(MAGNUM_PLUGINS_DEBUG_DIR ${_MAGNUM_LIBRARY_PATH}/magnum-d +set(MAGNUM_PLUGINS_DEBUG_DIR ${_MAGNUM_PLUGINS_DIR_PREFIX}/magnum-d CACHE PATH "Base directory where to look for Magnum plugins for debug builds") -set(MAGNUM_PLUGINS_RELEASE_DIR ${_MAGNUM_LIBRARY_PATH}/magnum +set(MAGNUM_PLUGINS_RELEASE_DIR ${_MAGNUM_PLUGINS_DIR_PREFIX}/magnum CACHE PATH "Base directory where to look for Magnum plugins for release builds") -set(MAGNUM_PLUGINS_DIR ${_MAGNUM_LIBRARY_PATH}/magnum${_MAGNUM_PLUGINS_DIR_SUFFIX} +set(MAGNUM_PLUGINS_DIR ${_MAGNUM_PLUGINS_DIR_PREFIX}/magnum${_MAGNUM_PLUGINS_DIR_SUFFIX} CACHE PATH "Base directory where to look for Magnum plugins") # Plugin directories diff --git a/src/Magnum/Text/fontconverterConfigure.h.cmake b/src/Magnum/Text/fontconverterConfigure.h.cmake index 895e33c28..7411d07a9 100644 --- a/src/Magnum/Text/fontconverterConfigure.h.cmake +++ b/src/Magnum/Text/fontconverterConfigure.h.cmake @@ -24,7 +24,7 @@ */ #ifdef CORRADE_IS_DEBUG_BUILD -#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}" +#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_DEBUG_DIR}" #else -#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_INSTALL_DIR}" +#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_DIR}" #endif diff --git a/src/Magnum/TextureTools/distancefieldconverterConfigure.h.cmake b/src/Magnum/TextureTools/distancefieldconverterConfigure.h.cmake index 895e33c28..7411d07a9 100644 --- a/src/Magnum/TextureTools/distancefieldconverterConfigure.h.cmake +++ b/src/Magnum/TextureTools/distancefieldconverterConfigure.h.cmake @@ -24,7 +24,7 @@ */ #ifdef CORRADE_IS_DEBUG_BUILD -#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}" +#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_DEBUG_DIR}" #else -#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_INSTALL_DIR}" +#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_DIR}" #endif diff --git a/src/Magnum/Trade/imageconverterConfigure.h.cmake b/src/Magnum/Trade/imageconverterConfigure.h.cmake index 895e33c28..7411d07a9 100644 --- a/src/Magnum/Trade/imageconverterConfigure.h.cmake +++ b/src/Magnum/Trade/imageconverterConfigure.h.cmake @@ -24,7 +24,7 @@ */ #ifdef CORRADE_IS_DEBUG_BUILD -#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_DEBUG_INSTALL_DIR}" +#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_DEBUG_DIR}" #else -#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_INSTALL_DIR}" +#define MAGNUM_PLUGINS_DIR "${MAGNUM_PLUGINS_DIR}" #endif diff --git a/src/MagnumPlugins/CMakeLists.txt b/src/MagnumPlugins/CMakeLists.txt index 13b85f2f9..75deddec1 100644 --- a/src/MagnumPlugins/CMakeLists.txt +++ b/src/MagnumPlugins/CMakeLists.txt @@ -24,11 +24,11 @@ # # Wrapper for creating given plugin type -macro(add_plugin plugin_name debug_install_dir release_install_dir metadata_file) +macro(add_plugin plugin_name debug_install_dirs release_install_dirs metadata_file) if(NOT BUILD_PLUGINS_STATIC) - corrade_add_plugin(${plugin_name} ${debug_install_dir} ${release_install_dir} ${metadata_file} ${ARGN}) + corrade_add_plugin(${plugin_name} "${debug_install_dirs}" "${release_install_dirs}" ${metadata_file} ${ARGN}) else() - corrade_add_static_plugin(${plugin_name} ${release_install_dir} ${metadata_file} ${ARGN}) + corrade_add_static_plugin(${plugin_name} "${release_install_dirs}" ${metadata_file} ${ARGN}) endif() endmacro() diff --git a/src/MagnumPlugins/MagnumFont/CMakeLists.txt b/src/MagnumPlugins/MagnumFont/CMakeLists.txt index 5d3777628..35ce546f7 100644 --- a/src/MagnumPlugins/MagnumFont/CMakeLists.txt +++ b/src/MagnumPlugins/MagnumFont/CMakeLists.txt @@ -49,7 +49,9 @@ if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) endif() # MagnumFont plugin -add_plugin(MagnumFont ${MAGNUM_PLUGINS_FONT_DEBUG_INSTALL_DIR} ${MAGNUM_PLUGINS_FONT_RELEASE_INSTALL_DIR} +add_plugin(MagnumFont + "${MAGNUM_PLUGINS_FONT_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_FONT_DEBUG_LIBRARY_INSTALL_DIR}" + "${MAGNUM_PLUGINS_FONT_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_FONT_RELEASE_LIBRARY_INSTALL_DIR}" MagnumFont.conf $ pluginRegistration.cpp) diff --git a/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt b/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt index a89ae6e88..86a0a98a8 100644 --- a/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt +++ b/src/MagnumPlugins/MagnumFontConverter/CMakeLists.txt @@ -49,7 +49,9 @@ if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) endif() # MagnumFontConverter plugin -add_plugin(MagnumFontConverter ${MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_INSTALL_DIR} ${MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_INSTALL_DIR} +add_plugin(MagnumFontConverter + "${MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_LIBRARY_INSTALL_DIR}" + "${MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_LIBRARY_INSTALL_DIR}" MagnumFontConverter.conf $ pluginRegistration.cpp) diff --git a/src/MagnumPlugins/ObjImporter/CMakeLists.txt b/src/MagnumPlugins/ObjImporter/CMakeLists.txt index 7726b2e33..7b3c1cdf7 100644 --- a/src/MagnumPlugins/ObjImporter/CMakeLists.txt +++ b/src/MagnumPlugins/ObjImporter/CMakeLists.txt @@ -49,7 +49,9 @@ if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) endif() # ObjImporter plugin -add_plugin(ObjImporter ${MAGNUM_PLUGINS_IMPORTER_DEBUG_INSTALL_DIR} ${MAGNUM_PLUGINS_IMPORTER_RELEASE_INSTALL_DIR} +add_plugin(ObjImporter + "${MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" + "${MAGNUM_PLUGINS_IMPORTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_RELEASE_LIBRARY_INSTALL_DIR}" ObjImporter.conf $ pluginRegistration.cpp) diff --git a/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt b/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt index 3228c3c70..6241bdeca 100644 --- a/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt +++ b/src/MagnumPlugins/TgaImageConverter/CMakeLists.txt @@ -49,7 +49,9 @@ if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) endif() # TgaImageConverter plugin -add_plugin(TgaImageConverter ${MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_INSTALL_DIR} ${MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_INSTALL_DIR} +add_plugin(TgaImageConverter + "${MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_LIBRARY_INSTALL_DIR}" + "${MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_LIBRARY_INSTALL_DIR}" TgaImageConverter.conf $ pluginRegistration.cpp) diff --git a/src/MagnumPlugins/TgaImporter/CMakeLists.txt b/src/MagnumPlugins/TgaImporter/CMakeLists.txt index 1a62d4e8d..651a33a0c 100644 --- a/src/MagnumPlugins/TgaImporter/CMakeLists.txt +++ b/src/MagnumPlugins/TgaImporter/CMakeLists.txt @@ -50,7 +50,9 @@ if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) endif() # TgaImporter plugin -add_plugin(TgaImporter ${MAGNUM_PLUGINS_IMPORTER_DEBUG_INSTALL_DIR} ${MAGNUM_PLUGINS_IMPORTER_RELEASE_INSTALL_DIR} +add_plugin(TgaImporter + "${MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" + "${MAGNUM_PLUGINS_IMPORTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_RELEASE_LIBRARY_INSTALL_DIR}" TgaImporter.conf $ pluginRegistration.cpp) diff --git a/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt index b17bcb8ea..a3a13fe9f 100644 --- a/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/CMakeLists.txt @@ -53,7 +53,9 @@ if(NOT BUILD_PLUGINS_STATIC OR BUILD_STATIC_PIC) endif() # WavAudioImporter plugin -add_plugin(WavAudioImporter ${MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_INSTALL_DIR} ${MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_INSTALL_DIR} +add_plugin(WavAudioImporter + "${MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" + "${MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_LIBRARY_INSTALL_DIR}" WavAudioImporter.conf $ pluginRegistration.cpp) From 8b06913534e305037682b6e81010025482d89b4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 11 Oct 2016 16:43:53 +0200 Subject: [PATCH 256/290] CMake: make the plugin directories used in utilities more configurable. In particular it is now possible to override the MAGNUM_PLUGINS_DIR variables and even specify them relative, which will make them relative to executable location. It's nice when everything clicks together :) --- CMakeLists.txt | 20 +++++++++++++------ doc/building.dox | 8 ++++++++ src/Magnum/Text/fontconverter.cpp | 2 +- .../TextureTools/distancefieldconverter.cpp | 2 +- src/Magnum/Trade/imageconverter.cpp | 2 +- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 22f25a4ae..870f9803d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -291,17 +291,25 @@ set(MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RE # Plugin dirs based on wheter we are in debug or release build, needed by some # command-line tools if(CORRADE_TARGET_WINDOWS) - set(MAGNUM_PLUGINS_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}) - set(MAGNUM_PLUGINS_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}) + set(MAGNUM_PLUGINS_DEBUG_DIR_INIT ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}) + set(MAGNUM_PLUGINS_RELEASE_DIR_INIT ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}) else() - set(MAGNUM_PLUGINS_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}) - set(MAGNUM_PLUGINS_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}) + set(MAGNUM_PLUGINS_DEBUG_DIR_INIT ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}) + set(MAGNUM_PLUGINS_RELEASE_DIR_INIT ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}) endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(MAGNUM_PLUGINS_DIR ${MAGNUM_PLUGINS_DEBUG_DIR}) + set(MAGNUM_PLUGINS_DIR_INIT ${MAGNUM_PLUGINS_DEBUG_DIR}) else() - set(MAGNUM_PLUGINS_DIR ${MAGNUM_PLUGINS_RELEASE_DIR}) + set(MAGNUM_PLUGINS_DIR_INIT ${MAGNUM_PLUGINS_RELEASE_DIR}) endif() +# Make these paths configurable from outside +set(MAGNUM_PLUGINS_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_DIR_INIT} + CACHE PATH "Base directory where to look for Magnum plugins for debug builds") +set(MAGNUM_PLUGINS_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_DIR_INIT} + CACHE PATH "Base directory where to look for Magnum plugins for release builds") +set(MAGNUM_PLUGINS_DIR ${MAGNUM_PLUGINS_DIR_INIT} + CACHE PATH "Base directory where to look for Magnum plugins") + add_subdirectory(modules) add_subdirectory(src) diff --git a/doc/building.dox b/doc/building.dox index 54ac96445..90beea486 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -244,6 +244,14 @@ There are also a few command-line utilities, also disabled by default: - `WITH_IMAGECONVERTER` - @ref magnum-imageconverter "magnum-imageconverter" executable for converting images of different formats. +Some of these utilities operate with plugins and they search for them in the +default plugin locations. You can override those locations using +`MAGNUM_PLUGINS_DIR` and `MAGNUM_PLUGINS_[DEBUG|RELEASE]_DIR` variables, much +like when using Magnum from dependent projects -- see @ref cmake for more +information. In particular, if you specify them as relative paths, the path +will be taken relative to executable location, which is useful for making +relocatable installations. + Magnum also contains a set of dependency-less plugins for importing essential file formats. Additional plugins are provided in separate plugin repository, see @ref building-plugins for more information. None of the plugins is built by diff --git a/src/Magnum/Text/fontconverter.cpp b/src/Magnum/Text/fontconverter.cpp index 74111c13a..5482b47f5 100644 --- a/src/Magnum/Text/fontconverter.cpp +++ b/src/Magnum/Text/fontconverter.cpp @@ -119,7 +119,7 @@ FontConverter::FontConverter(const Arguments& arguments): Platform::WindowlessAp .addArgument("output").setHelp("output", "output filename prefix") .addNamedArgument("font").setHelp("font", "font plugin") .addNamedArgument("converter").setHelp("converter", "font converter plugin") - .addOption("plugin-dir", MAGNUM_PLUGINS_DIR).setHelp("plugin-dir", "base plugin dir", "DIR") + .addOption("plugin-dir", Utility::Directory::join(Utility::Directory::path(Utility::Directory::executableLocation()), MAGNUM_PLUGINS_DIR)).setHelp("plugin-dir", "base plugin dir", "DIR") .addOption("characters", "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789?!:;,. ").setHelp("characters", "characters to include in the output") diff --git a/src/Magnum/TextureTools/distancefieldconverter.cpp b/src/Magnum/TextureTools/distancefieldconverter.cpp index 47d5e9d90..45a042aa1 100644 --- a/src/Magnum/TextureTools/distancefieldconverter.cpp +++ b/src/Magnum/TextureTools/distancefieldconverter.cpp @@ -120,7 +120,7 @@ DistanceFieldConverter::DistanceFieldConverter(const Arguments& arguments): Plat .addArgument("output").setHelp("output", "output image") .addOption("importer", "AnyImageImporter").setHelp("importer", "image importer plugin") .addOption("converter", "AnyImageConverter").setHelp("converter", "image converter plugin") - .addOption("plugin-dir", MAGNUM_PLUGINS_DIR).setHelp("plugin-dir", "base plugin dir", "DIR") + .addOption("plugin-dir", Utility::Directory::join(Utility::Directory::path(Utility::Directory::executableLocation()), MAGNUM_PLUGINS_DIR)).setHelp("plugin-dir", "base plugin dir", "DIR") .addNamedArgument("output-size").setHelp("output-size", "size of output image", "\"X Y\"") .addNamedArgument("radius").setHelp("radius", "distance field computation radius", "N") .addSkippedPrefix("magnum", "engine-specific options") diff --git a/src/Magnum/Trade/imageconverter.cpp b/src/Magnum/Trade/imageconverter.cpp index f1fbd138a..9821ddcac 100644 --- a/src/Magnum/Trade/imageconverter.cpp +++ b/src/Magnum/Trade/imageconverter.cpp @@ -74,7 +74,7 @@ int main(int argc, char** argv) { .addArgument("output").setHelp("output", "output image") .addOption("importer", "AnyImageImporter").setHelp("importer", "image importer plugin") .addOption("converter", "AnyImageConverter").setHelp("converter", "image converter plugin") - .addOption("plugin-dir", MAGNUM_PLUGINS_DIR).setHelp("plugin-dir", "base plugin dir", "DIR") + .addOption("plugin-dir", Utility::Directory::join(Utility::Directory::path(Utility::Directory::executableLocation()), MAGNUM_PLUGINS_DIR)).setHelp("plugin-dir", "base plugin dir", "DIR") .setHelp("Converts images of different formats.") .parse(argc, argv); From f719bad4f3c726ca92eb5a8ffd4155295d224d42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 12 Oct 2016 12:46:56 +0200 Subject: [PATCH 257/290] CMake: properly init the MAGNUM_PLUGINS_DIR cache variable. I messed up and my stale cache still showed the correct thing. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 870f9803d..66eeb8386 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -298,9 +298,9 @@ else() set(MAGNUM_PLUGINS_RELEASE_DIR_INIT ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}) endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(MAGNUM_PLUGINS_DIR_INIT ${MAGNUM_PLUGINS_DEBUG_DIR}) + set(MAGNUM_PLUGINS_DIR_INIT ${MAGNUM_PLUGINS_DEBUG_DIR_INIT}) else() - set(MAGNUM_PLUGINS_DIR_INIT ${MAGNUM_PLUGINS_RELEASE_DIR}) + set(MAGNUM_PLUGINS_DIR_INIT ${MAGNUM_PLUGINS_RELEASE_DIR_INIT}) endif() # Make these paths configurable from outside From 806ad4fda317f41274ea2018741f37ff25fda903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 12 Oct 2016 12:47:35 +0200 Subject: [PATCH 258/290] CMake: make MAGNUM_PLUGINS[_DEBUG|_RELEASE|]_DIR a STRING cache entry. The PATH entry is always converted to absolute, making it impossible to specify a relative path (e.g. relative to executable location). --- CMakeLists.txt | 11 +++++++---- modules/FindMagnum.cmake | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 66eeb8386..01ca71250 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -303,13 +303,16 @@ else() set(MAGNUM_PLUGINS_DIR_INIT ${MAGNUM_PLUGINS_RELEASE_DIR_INIT}) endif() -# Make these paths configurable from outside +# Make these paths configurable from outside. This is *not* PATH, because CMake +# always converts the path to an absolute location internally, making it +# impossible to specify relative paths there. Sorry in advance for not having +# the dir selection button in CMake GUI. set(MAGNUM_PLUGINS_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_DIR_INIT} - CACHE PATH "Base directory where to look for Magnum plugins for debug builds") + CACHE STRING "Base directory where to look for Magnum plugins for debug builds") set(MAGNUM_PLUGINS_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_DIR_INIT} - CACHE PATH "Base directory where to look for Magnum plugins for release builds") + CACHE STRING "Base directory where to look for Magnum plugins for release builds") set(MAGNUM_PLUGINS_DIR ${MAGNUM_PLUGINS_DIR_INIT} - CACHE PATH "Base directory where to look for Magnum plugins") + CACHE STRING "Base directory where to look for Magnum plugins") add_subdirectory(modules) add_subdirectory(src) diff --git a/modules/FindMagnum.cmake b/modules/FindMagnum.cmake index 24214821e..439e87413 100644 --- a/modules/FindMagnum.cmake +++ b/modules/FindMagnum.cmake @@ -794,13 +794,16 @@ set(MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RE set(MAGNUM_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/Magnum) set(MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/MagnumPlugins) -# Get base plugin directory from main library location +# Get base plugin directory from main library location. This is *not* PATH, +# because CMake always converts the path to an absolute location internally, +# making it impossible to specify relative paths there. Sorry in advance for +# not having the dir selection button in CMake GUI. set(MAGNUM_PLUGINS_DEBUG_DIR ${_MAGNUM_PLUGINS_DIR_PREFIX}/magnum-d - CACHE PATH "Base directory where to look for Magnum plugins for debug builds") + CACHE STRING "Base directory where to look for Magnum plugins for debug builds") set(MAGNUM_PLUGINS_RELEASE_DIR ${_MAGNUM_PLUGINS_DIR_PREFIX}/magnum - CACHE PATH "Base directory where to look for Magnum plugins for release builds") + CACHE STRING "Base directory where to look for Magnum plugins for release builds") set(MAGNUM_PLUGINS_DIR ${_MAGNUM_PLUGINS_DIR_PREFIX}/magnum${_MAGNUM_PLUGINS_DIR_SUFFIX} - CACHE PATH "Base directory where to look for Magnum plugins") + CACHE STRING "Base directory where to look for Magnum plugins") # Plugin directories set(MAGNUM_PLUGINS_FONT_DIR ${MAGNUM_PLUGINS_DIR}/fonts) From 832289f7c33d7b74618a9350a039f6aa87b8c9e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 12 Oct 2016 14:12:49 +0200 Subject: [PATCH 259/290] SceneGraph: ability to access parent from AbstractObject. Didn't do any tests because there's nothing for AbstractObject anyway (it's on my TODO list, though). --- src/Magnum/SceneGraph/AbstractObject.h | 9 +++++++++ src/Magnum/SceneGraph/Object.h | 3 +++ src/Magnum/SceneGraph/Object.hpp | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/src/Magnum/SceneGraph/AbstractObject.h b/src/Magnum/SceneGraph/AbstractObject.h index 4f0c60adf..bb752f4e3 100644 --- a/src/Magnum/SceneGraph/AbstractObject.h +++ b/src/Magnum/SceneGraph/AbstractObject.h @@ -170,6 +170,12 @@ template class AbstractObject /** @overload */ const AbstractObject* scene() const { return doScene(); } + /** @brief Parent object or `nullptr`, if this is root object */ + AbstractObject* parent() { return doParent(); } + + /** @overload */ + const AbstractObject* parent() const { return doParent(); } + /** @{ @name Object transformation */ /** @@ -269,6 +275,9 @@ template class AbstractObject virtual AbstractObject* doScene() = 0; virtual const AbstractObject* doScene() const = 0; + virtual AbstractObject* doParent() = 0; + virtual const AbstractObject* doParent() const = 0; + virtual MatrixType doTransformationMatrix() const = 0; virtual MatrixType doAbsoluteTransformationMatrix() const = 0; virtual std::vector doTransformationMatrices(const std::vector>>& objects, const MatrixType& initialTransformationMatrix) const = 0; diff --git a/src/Magnum/SceneGraph/Object.h b/src/Magnum/SceneGraph/Object.h index dbc4497ee..79fc084e2 100644 --- a/src/Magnum/SceneGraph/Object.h +++ b/src/Magnum/SceneGraph/Object.h @@ -363,6 +363,9 @@ template class Object: public AbstractObject* doScene() override final; const Object* doScene() const override final; + Object* doParent() override final; + const Object* doParent() const override final; + MatrixType MAGNUM_SCENEGRAPH_LOCAL doTransformationMatrix() const override final { return transformationMatrix(); } diff --git a/src/Magnum/SceneGraph/Object.hpp b/src/Magnum/SceneGraph/Object.hpp index e3ceaeaa4..8a2b0e5f9 100644 --- a/src/Magnum/SceneGraph/Object.hpp +++ b/src/Magnum/SceneGraph/Object.hpp @@ -69,6 +69,14 @@ template const Object* Object Object* Object::doParent() { + return parent(); +} + +template const Object* Object::doParent() const { + return parent(); +} + template Object& Object::setParent(Object* parent) { /* Skip if parent is already parent or this is scene (which cannot have parent) */ /** @todo Assert for setting parent to scene */ From 56e75295bea66c03a92a752cb6cdc7993c43d4f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 15 Oct 2016 15:34:23 +0200 Subject: [PATCH 260/290] Math: mention more useful dot product and determinant properties. --- src/Magnum/Math/Matrix.h | 3 ++- src/Magnum/Math/Vector.h | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Magnum/Math/Matrix.h b/src/Magnum/Math/Matrix.h index b2b391aa7..8d204b59f 100644 --- a/src/Magnum/Math/Matrix.h +++ b/src/Magnum/Math/Matrix.h @@ -163,7 +163,8 @@ template class Matrix: public RectangularMatrix 0` when two vectors are in +the same general direction, `1` when two *normalized* vectors are parallel, +`< 0` when two vectors are in opposite general direction and `-1` when two +*normalized* vectors are antiparallel. @f[ \boldsymbol a \cdot \boldsymbol b = \sum_{i=0}^{n-1} \boldsymbol a_i \boldsymbol b_i @f] @see @ref Vector::dot() const, @ref Vector::operator-(), @ref Vector2::perpendicular() From 6422a27b466cb090602d8cedb581eb2ac49117a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 15 Oct 2016 15:34:52 +0200 Subject: [PATCH 261/290] Math: improve Matrix4::lookAt() test. It now verifies all assumptions about how the resulting matrix should look like. --- src/Magnum/Math/Test/Matrix4Test.cpp | 52 ++++++++++------------------ 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/src/Magnum/Math/Test/Matrix4Test.cpp b/src/Magnum/Math/Test/Matrix4Test.cpp index e33f9bda7..94553a450 100644 --- a/src/Magnum/Math/Test/Matrix4Test.cpp +++ b/src/Magnum/Math/Test/Matrix4Test.cpp @@ -612,41 +612,27 @@ void Matrix4Test::transformProjection() { } void Matrix4Test::lookAt() { - Matrix4 a = Matrix4::lookAt({0.0f, 0.0f, 0.0f}, - {0.0f, 1.0f, 0.0f}, - {0.0f, 0.0f, 1.0f}); + Vector3 translation{5.3f, -8.9f, -10.0f}; + Vector3 target{19.0f, 29.3f, 0.0f}; + Matrix4 a = Matrix4::lookAt(translation, target, Vector3::xAxis()); + + /* It's just a translation and rotation */ CORRADE_VERIFY(a.isRigidTransformation()); - CORRADE_COMPARE(a, Matrix4({1.0f, 0.0f, 0.0f, 0.0f}, - {0.0f, 0.0f, 1.0f, 0.0f}, - {0.0f, -1.0f, 0.0f, 0.0f}, - {0.0f, 0.0f, 0.0f, 1.0f})); - Matrix4 b = Matrix4::lookAt({100.0f, 200.0f, 300.0f}, - { 0.0f, 0.0f, 0.0f}, - { 0.0f, 1.0f, 0.0f}); - CORRADE_VERIFY(b.isRigidTransformation()); - CORRADE_COMPARE(b, Matrix4({ 0.948683f, 0.0f, -0.316228f, 0.0f}, - {-0.169031f, 0.845154f, -0.507093f, 0.0f}, - { 0.267261f, 0.534522f, 0.801784f, 0.0f}, - { 100.0f, 200.0f, 300.0f, 1.0f})); - - Matrix4 c = Matrix4::lookAt({3.0f, 0.0f, 0.0f}, - {0.0f, 4.0f, 5.0f}, - {0.0f, 0.0f, 1.0f}); - CORRADE_VERIFY(c.isRigidTransformation()); - CORRADE_COMPARE(c, Matrix4({ 0.8f, 0.6f, 0.0f, 0.0f}, - {0.424264f, -0.565685f, 0.707107f, 0.0f}, - {0.424264f, -0.565685f, -0.707107f, 0.0f}, - { 3.0f, 0.0f, 0.0f, 1.0f})); - - Matrix4 d = Matrix4::lookAt({ 0.0f, 3.0f, 0.0f}, - {-5.0f, 0.0f, -4.0f}, - { 0.0f, 1.0f, 0.0f}); - CORRADE_VERIFY(d.isRigidTransformation()); - CORRADE_COMPARE(d, Matrix4({ 0.624695f, 0.0f, -0.780869f, 0.0f}, - {-0.331295f, 0.905539f, -0.265036f, 0.0f}, - { 0.707107f, 0.424264f, 0.565685f, 0.0f}, - { 0.0f, 3.0f, 0.0f, 1.0f})); + /* The matrix should translate to the position */ + CORRADE_COMPARE(a.translation(), translation); + + /* Forward vector should point in direction of the target */ + CORRADE_COMPARE(dot(-a.backward(), (target - translation).normalized()), 1.0f); + + /* Up vector should be in the same direction as X axis */ + CORRADE_VERIFY(dot(Vector3::xAxis(), a.up()) > 0.0f); + + /* Just to be sure */ + CORRADE_COMPARE(a, Matrix4({ 0.0f, 0.253247f, -0.967402f, 0.0f}, + {0.944754f, -0.317095f, -0.0830092f, 0.0f}, + {-0.32778f, -0.913957f, -0.239256f, 0.0f}, + { 5.3f, -8.9f, -10.0f, 1.0f})); } void Matrix4Test::debug() { From 5c7b1a0eb20077674bddaf8a91d6610c3e1edb71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 15 Oct 2016 15:35:27 +0200 Subject: [PATCH 262/290] Math: simplify Matrix4::lookAt(). --- src/Magnum/Math/Matrix4.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Magnum/Math/Matrix4.h b/src/Magnum/Math/Matrix4.h index c7dc88f91..8313aa081 100644 --- a/src/Magnum/Math/Matrix4.h +++ b/src/Magnum/Math/Matrix4.h @@ -680,11 +680,7 @@ template Matrix4 Matrix4::lookAt(const Vector3& eye, const Vec const Vector3 backward = (eye - target).normalized(); const Vector3 right = cross(up, backward).normalized(); const Vector3 realUp = cross(backward, right); - - return {{ right, T(0)}, - { realUp, T(0)}, - {backward, T(0)}, - { eye, T(1)}}; + return from({right, realUp, backward}, eye); } template inline Matrix3x3 Matrix4::rotation() const { From 90b005cfa32718d2f64caa8fb1e69f322e9742c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 15 Oct 2016 19:04:49 +0200 Subject: [PATCH 263/290] Doc++ I have no idea what I was doing here. Insufficient focus again. --- src/Magnum/Mesh.h | 19 +++++++++++-------- src/Magnum/MeshView.h | 19 ++++++++++++------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/Magnum/Mesh.h b/src/Magnum/Mesh.h index 9cf148540..f20c3e342 100644 --- a/src/Magnum/Mesh.h +++ b/src/Magnum/Mesh.h @@ -603,7 +603,7 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * If the mesh is indexed, the value is treated as index count, * otherwise the value is vertex count. If set to `0`, no draw commands * are issued when calling @ref draw(AbstractShaderProgram&). Ignored - * when calling @ref draw(AbstractShaderProgram, TransformFeedback&, UsingnedInt). + * when calling @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt). * Default is `0`. * @see @ref isIndexed(), @ref setBaseVertex(), @ref setInstanceCount() */ @@ -621,7 +621,8 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * * Sets number of vertices of which the vertex buffer will be offset * when drawing. Ignored when calling - * @ref draw(AbstractShaderProgram, TransformFeedback&) Default is `0`. + * @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt). + * Default is `0`. * @see @ref setCount(), @ref setBaseInstance() * @requires_gl32 Extension @extension{ARB,draw_elements_base_vertex} * for indexed meshes @@ -642,14 +643,15 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * * If set to `1`, non-instanced draw commands are issued when calling * @ref draw(AbstractShaderProgram&) or - * @ref draw(AbstractShaderProgram&, TransformFeedback&). If set to - * `0`, no draw commands are issued altogether. Default is `1`. + * @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt). + * If set to `0`, no draw commands are issued altogether. Default is + * `1`. * @see @ref setBaseInstance(), @ref setCount(), * @ref addVertexBufferInstanced() * @requires_gl31 Extension @extension{ARB,draw_instanced} if using * @ref draw(AbstractShaderProgram&) * @requires_gl42 Extension @extension{ARB,transform_feedback_instanced} - * @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt) + * if using @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt) * @requires_gles30 Extension @es_extension{ANGLE,instanced_arrays}, * @es_extension2{EXT,draw_instanced,draw_instanced} or * @es_extension{NV,draw_instanced} in OpenGL ES 2.0. @@ -669,7 +671,7 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * @brief Set base instance * @return Reference to self (for method chaining) * - * Ignored when calling @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). + * Ignored when calling @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt). * Default is `0`. * @see @ref setInstanceCount(), @ref setBaseVertex() * @requires_gl42 Extension @extension{ARB,base_instance} @@ -848,6 +850,7 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * WebGL 1.0 is available, the associated vertex array object is bound * instead of setting up the mesh from scratch. * @see @ref setCount(), @ref setInstanceCount(), + * @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt), * @ref MeshView::draw(AbstractShaderProgram&), * @ref MeshView::draw(AbstractShaderProgram&, std::initializer_list>), * @fn_gl{UseProgram}, @fn_gl{EnableVertexAttribArray}, @@ -894,8 +897,8 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * command is used. If @extension{ARB,vertex_array_object} (part of * OpenGL 3.0) is available, the associated vertex array object is * bound instead of setting up the mesh from scratch. - * @see @ref setInstanceCount(), - * @ref MeshView::draw(AbstractShaderProgram, TransformFeedback& xfb, UnsignedInt), + * @see @ref setInstanceCount(), @ref draw(AbstractShaderProgram&), + * @ref MeshView::draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt), * @fn_gl{UseProgram}, @fn_gl{EnableVertexAttribArray}, * @fn_gl{BindBuffer}, @fn_gl{VertexAttribPointer}, * @fn_gl{DisableVertexAttribArray} or @fn_gl{BindVertexArray}, diff --git a/src/Magnum/MeshView.h b/src/Magnum/MeshView.h index 2f7c4e6b5..a0570202c 100644 --- a/src/Magnum/MeshView.h +++ b/src/Magnum/MeshView.h @@ -116,7 +116,7 @@ class MAGNUM_EXPORT MeshView { * @brief Set vertex/index count * @return Reference to self (for method chaining) * - * Ignored when calling @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). + * Ignored when calling @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt). * Default is `0`. */ MeshView& setCount(Int count) { @@ -132,7 +132,7 @@ class MAGNUM_EXPORT MeshView { * @return Reference to self (for method chaining) * * Sets number of vertices of which the vertex buffer will be offset - * when drawing. Ignored when calling @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). + * when drawing. Ignored when calling @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt). * Default is `0`. * @requires_gl32 Extension @extension{ARB,draw_elements_base_vertex} * for indexed meshes @@ -156,7 +156,7 @@ class MAGNUM_EXPORT MeshView { * acccessed. On OpenGL ES 2.0 this function behaves the same as * @ref setIndexRange(Int), as index range functionality is not * available there. Ignored when calling - * @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). + * @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt). * @see @ref setCount() */ /* MinGW/MSVC needs inline also here to avoid linkage conflicts */ @@ -169,7 +169,7 @@ class MAGNUM_EXPORT MeshView { * * Prefer to use @ref setIndexRange(Int, UnsignedInt, UnsignedInt) for * better performance. Ignored when calling - * @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). + * @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt). * @see @ref setCount() */ MeshView& setIndexRange(Int first); @@ -182,7 +182,10 @@ class MAGNUM_EXPORT MeshView { * @return Reference to self (for method chaining) * * Default is `1`. - * @requires_gl31 Extension @extension{ARB,draw_instanced} + * @requires_gl31 Extension @extension{ARB,draw_instanced} if using + * @ref draw(AbstractShaderProgram&) + * @requires_gl42 Extension @extension{ARB,transform_feedback_instanced} + * if using @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt) * @requires_gles30 Extension @es_extension{ANGLE,instanced_arrays}, * @es_extension2{EXT,draw_instanced,draw_instanced} or * @es_extension{NV,draw_instanced} in OpenGL ES 2.0. @@ -202,7 +205,7 @@ class MAGNUM_EXPORT MeshView { * @brief Set base instance * @return Reference to self (for method chaining) * - * Ignored when calling @ref draw(AbstractShaderProgram, TransformFeedback&, UnsignedInt). + * Ignored when calling @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt). * Default is `0`. * @requires_gl42 Extension @extension{ARB,base_instance} * @requires_gl Base instance cannot be specified in OpenGL ES or @@ -218,7 +221,8 @@ class MAGNUM_EXPORT MeshView { * @brief Draw the mesh * * See @ref Mesh::draw(AbstractShaderProgram&) for more information. - * @see @ref draw(AbstractShaderProgram&, std::initializer_list>) + * @see @ref draw(AbstractShaderProgram&, std::initializer_list>), + * @ref draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt) * @requires_gl32 Extension @extension{ARB,draw_elements_base_vertex} * if the mesh is indexed and @ref baseVertex() is not `0`. * @requires_gl33 Extension @extension{ARB,instanced_arrays} if @@ -247,6 +251,7 @@ class MAGNUM_EXPORT MeshView { * taken from the @p xfb object. See * @ref Mesh::draw(AbstractShaderProgram&, TransformFeedback&, UnsignedInt) * for more information. + * @see @ref draw(AbstractShaderProgram&) * @requires_gl40 Extension @extension{ARB,transform_feedback2} * @requires_gl40 Extension @extension{ARB,transform_feedback3} if * @p stream is not `0` From cf185b00fa929c09a13294b899bef834c0d23377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 15 Oct 2016 19:15:53 +0200 Subject: [PATCH 264/290] Math: add explicit boolean conversion to BoolVector. --- src/Magnum/Math/BoolVector.h | 26 ++++++++++++++++++++++--- src/Magnum/Math/Test/BoolVectorTest.cpp | 11 +++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/Magnum/Math/BoolVector.h b/src/Magnum/Math/BoolVector.h index c2dab37a6..578e625a0 100644 --- a/src/Magnum/Math/BoolVector.h +++ b/src/Magnum/Math/BoolVector.h @@ -134,13 +134,33 @@ template class BoolVector { return !operator==(other); } - /** @brief Whether all bits are set */ + /** + * @brief Boolean conversion + * + * Equivalent to @ref all(). + * @see @ref any(), @ref none() + */ + explicit operator bool() const { return all(); } + + /** + * @brief Whether all bits are set + * + * @see @ref none(), @ref any(), @ref operator bool() + */ bool all() const; - /** @brief Whether no bits are set */ + /** + * @brief Whether no bits are set + * + * @see @ref all(), @ref any(), @ref operator bool() + */ bool none() const; - /** @brief Whether any bit is set */ + /** + * @brief Whether any bit is set + * + * @see @ref all(), @ref none(), @ref operator bool() + */ bool any() const { return !none(); } /** @brief Bitwise inversion */ diff --git a/src/Magnum/Math/Test/BoolVectorTest.cpp b/src/Magnum/Math/Test/BoolVectorTest.cpp index a5777762f..0325a644d 100644 --- a/src/Magnum/Math/Test/BoolVectorTest.cpp +++ b/src/Magnum/Math/Test/BoolVectorTest.cpp @@ -43,6 +43,7 @@ struct BoolVectorTest: Corrade::TestSuite::Tester { void compare(); void compareUndefined(); + void convertBool(); void all(); void none(); void any(); @@ -70,6 +71,7 @@ BoolVectorTest::BoolVectorTest() { &BoolVectorTest::compare, &BoolVectorTest::compareUndefined, + &BoolVectorTest::convertBool, &BoolVectorTest::all, &BoolVectorTest::none, &BoolVectorTest::any, @@ -193,6 +195,15 @@ void BoolVectorTest::compareUndefined() { CORRADE_VERIFY(a != c); } +void BoolVectorTest::convertBool() { + /* The ! operation should *just work* using the bool conversion operator */ + CORRADE_VERIFY(BoolVector19(0xff, 0xff, 0x07)); + CORRADE_VERIFY(!BoolVector19(0xff, 0xff, 0x04)); + + /* Implicit conversion is not allowed */ + CORRADE_VERIFY(!(std::is_convertible::value)); +} + void BoolVectorTest::all() { CORRADE_VERIFY(BoolVector19(0xff, 0xff, 0x07).all()); From a2c8435edebecf16e0468938a842b0541a7ec366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 15 Oct 2016 23:46:37 +0200 Subject: [PATCH 265/290] Use new TestSuite numeric comparators where appropriate. --- src/Magnum/Audio/Test/ContextALTest.cpp | 2 +- .../DebugTools/Test/ForceRendererTest.cpp | 9 ++++++-- src/Magnum/Math/Test/Matrix4Test.cpp | 3 ++- src/Magnum/Math/Test/QuaternionTest.cpp | 21 ++++++++++++------- src/Magnum/Test/TimeQueryGLTest.cpp | 8 ++++--- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/Magnum/Audio/Test/ContextALTest.cpp b/src/Magnum/Audio/Test/ContextALTest.cpp index 095c8e3f8..cdb7d0879 100644 --- a/src/Magnum/Audio/Test/ContextALTest.cpp +++ b/src/Magnum/Audio/Test/ContextALTest.cpp @@ -48,7 +48,7 @@ ContextALTest::ContextALTest() { void ContextALTest::extensionsString() { std::vector extensions = _context.extensionStrings(); - CORRADE_VERIFY(extensions.size() > 0); + CORRADE_VERIFY(!extensions.empty()); } void ContextALTest::isExtensionEnabled() { diff --git a/src/Magnum/DebugTools/Test/ForceRendererTest.cpp b/src/Magnum/DebugTools/Test/ForceRendererTest.cpp index 4f6693860..8206b76f6 100644 --- a/src/Magnum/DebugTools/Test/ForceRendererTest.cpp +++ b/src/Magnum/DebugTools/Test/ForceRendererTest.cpp @@ -24,6 +24,7 @@ */ #include +#include #include "../Implementation/ForceRendererTransformation.h" @@ -104,10 +105,14 @@ void ForceRendererTest::arbitrary3D() { CORRADE_COMPARE(Math::dot(m.right(), m.backward()), 0.0f); #else /* Emscripten -O1 has slightly lower precision. -O2 works fine. */ - CORRADE_VERIFY(Math::abs(Math::dot(m.right(), m.backward())) < Math::TypeTraits::epsilon()); + CORRADE_COMPARE_AS(Math::abs(Math::dot(m.right(), m.backward())), + Math::TypeTraits::epsilon(), + TestSuite::Compare::Less); #endif /** @todo This shouldn't be too different */ - CORRADE_VERIFY(Math::abs(Math::dot(m.up(), m.backward())) < Math::TypeTraits::epsilon()); + CORRADE_COMPARE_AS(Math::abs(Math::dot(m.up(), m.backward())), + Math::TypeTraits::epsilon(), + TestSuite::Compare::Less); } }}}} diff --git a/src/Magnum/Math/Test/Matrix4Test.cpp b/src/Magnum/Math/Test/Matrix4Test.cpp index 94553a450..cb62fc792 100644 --- a/src/Magnum/Math/Test/Matrix4Test.cpp +++ b/src/Magnum/Math/Test/Matrix4Test.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include "Magnum/Math/Matrix4.h" @@ -626,7 +627,7 @@ void Matrix4Test::lookAt() { CORRADE_COMPARE(dot(-a.backward(), (target - translation).normalized()), 1.0f); /* Up vector should be in the same direction as X axis */ - CORRADE_VERIFY(dot(Vector3::xAxis(), a.up()) > 0.0f); + CORRADE_COMPARE_AS(dot(Vector3::xAxis(), a.up()), 0.0f, Corrade::TestSuite::Compare::Greater); /* Just to be sure */ CORRADE_COMPARE(a, Matrix4({ 0.0f, 0.253247f, -0.967402f, 0.0f}, diff --git a/src/Magnum/Math/Test/QuaternionTest.cpp b/src/Magnum/Math/Test/QuaternionTest.cpp index 814b0d558..2c2f5caf2 100644 --- a/src/Magnum/Math/Test/QuaternionTest.cpp +++ b/src/Magnum/Math/Test/QuaternionTest.cpp @@ -25,6 +25,7 @@ #include #include +#include #include "Magnum/Math/Matrix4.h" #include "Magnum/Math/Quaternion.h" @@ -421,30 +422,36 @@ void QuaternionTest::matrix() { CORRADE_COMPARE(o.str(), "Math::Quaternion::fromMatrix(): the matrix is not orthogonal\n"); /* Trace > 0 */ - CORRADE_VERIFY(m.trace() > 0.0f); + CORRADE_COMPARE_AS(m.trace(), 0.0f, Corrade::TestSuite::Compare::Greater); CORRADE_COMPARE(Quaternion::fromMatrix(m), q); /* Trace < 0, max is diagonal[2] */ Matrix3x3 m2 = Matrix4::rotation(Deg(130.0f), axis).rotationScaling(); Quaternion q2 = Quaternion::rotation(Deg(130.0f), axis); - CORRADE_VERIFY(m2.trace() < 0.0f); - CORRADE_VERIFY(m2.diagonal()[2] > std::max(m2.diagonal()[0], m2.diagonal()[1])); + CORRADE_COMPARE_AS(m2.trace(), 0.0f, Corrade::TestSuite::Compare::Less); + CORRADE_COMPARE_AS(m2.diagonal()[2], + std::max(m2.diagonal()[0], m2.diagonal()[1]), + Corrade::TestSuite::Compare::Greater); CORRADE_COMPARE(Quaternion::fromMatrix(m2), q2); /* Trace < 0, max is diagonal[1] */ Vector3 axis2 = Vector3(-3.0f, 5.0f, 1.0f).normalized(); Matrix3x3 m3 = Matrix4::rotation(Deg(130.0f), axis2).rotationScaling(); Quaternion q3 = Quaternion::rotation(Deg(130.0f), axis2); - CORRADE_VERIFY(m3.trace() < 0.0f); - CORRADE_VERIFY(m3.diagonal()[1] > std::max(m3.diagonal()[0], m3.diagonal()[2])); + CORRADE_COMPARE_AS(m3.trace(), 0.0f, Corrade::TestSuite::Compare::Less); + CORRADE_COMPARE_AS(m3.diagonal()[1], + std::max(m3.diagonal()[0], m3.diagonal()[2]), + Corrade::TestSuite::Compare::Greater); CORRADE_COMPARE(Quaternion::fromMatrix(m3), q3); /* Trace < 0, max is diagonal[0] */ Vector3 axis3 = Vector3(5.0f, -3.0f, 1.0f).normalized(); Matrix3x3 m4 = Matrix4::rotation(Deg(130.0f), axis3).rotationScaling(); Quaternion q4 = Quaternion::rotation(Deg(130.0f), axis3); - CORRADE_VERIFY(m4.trace() < 0.0f); - CORRADE_VERIFY(m4.diagonal()[0] > std::max(m4.diagonal()[1], m4.diagonal()[2])); + CORRADE_COMPARE_AS(m4.trace(), 0.0f, Corrade::TestSuite::Compare::Less); + CORRADE_COMPARE_AS(m4.diagonal()[0], + std::max(m4.diagonal()[1], m4.diagonal()[2]), + Corrade::TestSuite::Compare::Greater); CORRADE_COMPARE(Quaternion::fromMatrix(m4), q4); } diff --git a/src/Magnum/Test/TimeQueryGLTest.cpp b/src/Magnum/Test/TimeQueryGLTest.cpp index 4860ccc16..292c50acc 100644 --- a/src/Magnum/Test/TimeQueryGLTest.cpp +++ b/src/Magnum/Test/TimeQueryGLTest.cpp @@ -23,6 +23,8 @@ DEALINGS IN THE SOFTWARE. */ +#include + #include "Magnum/TimeQuery.h" #include "Magnum/Test/AbstractOpenGLTester.h" @@ -112,7 +114,7 @@ void TimeQueryGLTest::queryTime() { const auto result2 = q2.result(); MAGNUM_VERIFY_NO_ERROR(); - CORRADE_VERIFY(result2 >= result1); + CORRADE_COMPARE_AS(result2, result1, TestSuite::Compare::GreaterOrEqual); } void TimeQueryGLTest::queryTimestamp() { @@ -139,8 +141,8 @@ void TimeQueryGLTest::queryTimestamp() { const auto result2 = q2.result(); MAGNUM_VERIFY_NO_ERROR(); - CORRADE_VERIFY(result2 >= result1); - CORRADE_VERIFY(result2-result1 >= result); + CORRADE_COMPARE_AS(result2, result1, TestSuite::Compare::GreaterOrEqual); + CORRADE_COMPARE_AS(result2 - result1, result, TestSuite::Compare::GreaterOrEqual); } }} From c93030ef0abee34f89b41e04cec9c707427552d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 15 Oct 2016 23:54:11 +0200 Subject: [PATCH 266/290] Updated toolchains submodule. --- toolchains | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolchains b/toolchains index 587043dda..2867dd164 160000 --- a/toolchains +++ b/toolchains @@ -1 +1 @@ -Subproject commit 587043dda17485cdea2c133359c53125af3bbac6 +Subproject commit 2867dd16455ed010a4a495a440a7c0d3bc2b43f1 From 4e142f3fa74d0e59f7ca78f651416b9cdd365f43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 16 Oct 2016 01:47:00 +0200 Subject: [PATCH 267/290] package/archlinux: use Ninja for Emscripten builds. --- package/archlinux/PKGBUILD-emscripten | 9 +++++---- package/archlinux/PKGBUILD-emscripten-webgl2 | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package/archlinux/PKGBUILD-emscripten b/package/archlinux/PKGBUILD-emscripten index e11e05b0a..b7f99e3a9 100644 --- a/package/archlinux/PKGBUILD-emscripten +++ b/package/archlinux/PKGBUILD-emscripten @@ -7,7 +7,7 @@ arch=('any') url="http://mosra.cz/blog/magnum.php" license=('MIT') depends=('emscripten-corrade') -makedepends=('cmake' 'emscripten' 'corrade') +makedepends=('cmake' 'emscripten' 'corrade' 'ninja') options=('!strip' '!buildflags') _rootdir=$startdir/../../ @@ -19,7 +19,8 @@ build() { cmake .. \ -DCMAKE_TOOLCHAIN_FILE="$_rootdir/toolchains/generic/Emscripten.cmake" \ - -DCMAKE_PREFIX_PATH=/usr/lib/emscripten/system + -DCMAKE_PREFIX_PATH=/usr/lib/emscripten/system \ + -G Ninja fi cd "$_rootdir/build-emscripten" @@ -35,7 +36,7 @@ build() { -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ -DBUILD_TESTS=ON - make -j4 + ninja } check() { @@ -45,5 +46,5 @@ check() { package() { cd "$_rootdir/build-emscripten" - DESTDIR="$pkgdir/" make install + DESTDIR="$pkgdir/" ninja install } diff --git a/package/archlinux/PKGBUILD-emscripten-webgl2 b/package/archlinux/PKGBUILD-emscripten-webgl2 index e8c83a6bd..f52f18ee2 100644 --- a/package/archlinux/PKGBUILD-emscripten-webgl2 +++ b/package/archlinux/PKGBUILD-emscripten-webgl2 @@ -7,7 +7,7 @@ arch=('any') url="http://mosra.cz/blog/magnum.php" license=('MIT') depends=('emscripten-corrade') -makedepends=('cmake' 'emscripten' 'corrade') +makedepends=('cmake' 'emscripten' 'corrade' 'ninja') options=('!strip' '!buildflags') _rootdir=$startdir/../../ @@ -19,7 +19,8 @@ build() { cmake .. \ -DCMAKE_TOOLCHAIN_FILE="$_rootdir/toolchains/generic/Emscripten.cmake" \ - -DCMAKE_PREFIX_PATH=/usr/lib/emscripten/system + -DCMAKE_PREFIX_PATH=/usr/lib/emscripten/system \ + -G Ninja fi cd "$_rootdir/build-emscripten-webgl2" @@ -36,7 +37,7 @@ build() { -DWITH_TGAIMPORTER=ON \ -DWITH_WAVAUDIOIMPORTER=ON \ -DBUILD_TESTS=ON - make -j4 + ninja } check() { @@ -46,5 +47,5 @@ check() { package() { cd "$_rootdir/build-emscripten-webgl2" - DESTDIR="$pkgdir/" make install + DESTDIR="$pkgdir/" ninja install } From 14f2093722f22efacdf6b70d98d61945254671cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 16 Oct 2016 01:47:29 +0200 Subject: [PATCH 268/290] package/ci: use Debug builds on MSVC builds that run unit tests. In order to make use of the debug heap, debug iterators and other goodness. --- package/ci/appveyor-desktop-gles.bat | 4 ++-- package/ci/appveyor-desktop.bat | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package/ci/appveyor-desktop-gles.bat b/package/ci/appveyor-desktop-gles.bat index bd5ee13dc..3dda4e281 100644 --- a/package/ci/appveyor-desktop-gles.bat +++ b/package/ci/appveyor-desktop-gles.bat @@ -6,7 +6,7 @@ git clone --depth 1 git://github.com/mosra/corrade.git || exit /b cd corrade || exit /b mkdir build && cd build || exit /b cmake .. ^ - -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_BUILD_TYPE=Debug ^ -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ -DWITH_INTERCONNECT=OFF ^ -G Ninja || exit /b @@ -17,7 +17,7 @@ cd .. && cd .. rem Build mkdir build && cd build || exit /b cmake .. ^ - -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_BUILD_TYPE=Debug ^ -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ -DCMAKE_PREFIX_PATH="%APPVEYOR_BUILD_FOLDER%/openal" ^ -DTARGET_GLES=ON ^ diff --git a/package/ci/appveyor-desktop.bat b/package/ci/appveyor-desktop.bat index 8de5d0cd7..a7d55890e 100644 --- a/package/ci/appveyor-desktop.bat +++ b/package/ci/appveyor-desktop.bat @@ -6,7 +6,7 @@ git clone --depth 1 git://github.com/mosra/corrade.git || exit /b cd corrade || exit /b mkdir build && cd build || exit /b cmake .. ^ - -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_BUILD_TYPE=Debug ^ -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ -DWITH_INTERCONNECT=OFF ^ -G Ninja || exit /b @@ -17,7 +17,7 @@ cd .. && cd .. rem Build mkdir build && cd build || exit /b cmake .. ^ - -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_BUILD_TYPE=Debug ^ -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ -DCMAKE_PREFIX_PATH="%APPVEYOR_BUILD_FOLDER%/SDL;%APPVEYOR_BUILD_FOLDER%/openal" ^ -DWITH_AUDIO=ON ^ From 971797716023aec9879032d1094d973251c951df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 16 Oct 2016 01:48:23 +0200 Subject: [PATCH 269/290] package/ci: build only the coverage report as Debug on Travis. Everything else should be release to test compiler optimization behavior. --- package/ci/travis-desktop-gles.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/ci/travis-desktop-gles.sh b/package/ci/travis-desktop-gles.sh index 918c710ab..91859ebc9 100755 --- a/package/ci/travis-desktop-gles.sh +++ b/package/ci/travis-desktop-gles.sh @@ -8,7 +8,7 @@ mkdir build && cd build cmake .. \ -DCMAKE_INSTALL_PREFIX=$HOME/deps \ -DCMAKE_INSTALL_RPATH=$HOME/deps/lib \ - -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_BUILD_TYPE=Release \ -DWITH_INTERCONNECT=OFF make -j install cd ../.. @@ -17,7 +17,7 @@ mkdir build && cd build cmake .. \ -DCMAKE_CXX_FLAGS=$COVERAGE \ -DCMAKE_PREFIX_PATH="$HOME/deps" \ - -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_BUILD_TYPE=Release \ -DTARGET_GLES=ON \ -DTARGET_GLES2=$TARGET_GLES2 \ -DTARGET_DESKTOP_GLES=ON \ From 684874dd05047bbd89877d9eb6723feb1df16660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 16 Oct 2016 01:48:57 +0200 Subject: [PATCH 270/290] package/ci: CMAKE_BUILD_TYPE has no use for Xcode generator. --- package/ci/travis-ios-simulator.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/package/ci/travis-ios-simulator.sh b/package/ci/travis-ios-simulator.sh index 8d66596f7..e770a1999 100755 --- a/package/ci/travis-ios-simulator.sh +++ b/package/ci/travis-ios-simulator.sh @@ -27,7 +27,6 @@ cmake .. \ -DCMAKE_OSX_ARCHITECTURES="x86_64" \ -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ -DCMAKE_INSTALL_PREFIX=$HOME/deps \ - -DCMAKE_BUILD_TYPE=Release \ -DBUILD_STATIC=ON \ -DTESTSUITE_TARGET_XCTEST=ON \ -DWITH_INTERCONNECT=OFF \ @@ -43,7 +42,6 @@ cmake .. \ -DCMAKE_OSX_ARCHITECTURES="x86_64" \ -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ -DCMAKE_PREFIX_PATH="$HOME/deps;$TRAVIS_BUILD_DIR/sdl2" \ - -DCMAKE_BUILD_TYPE=Release \ -DTARGET_GLES2=$TARGET_GLES2 \ -DWITH_AUDIO=ON \ -DWITH_SDL2APPLICATION=ON \ From 7415a410e11452e72c3cbbde42cb2a45c3178a1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 4 Jun 2016 23:04:25 +0200 Subject: [PATCH 271/290] modules: updated FindCorrade.cmake. --- modules/FindCorrade.cmake | 71 +++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/modules/FindCorrade.cmake b/modules/FindCorrade.cmake index c4af7f726..03285cb4f 100644 --- a/modules/FindCorrade.cmake +++ b/modules/FindCorrade.cmake @@ -73,7 +73,9 @@ # CORRADE_TARGET_UNIX - Defined if compiled for some Unix flavor # (Linux, BSD, OS X) # CORRADE_TARGET_APPLE - Defined if compiled for Apple platforms -# CORRADE_TARGET_IOS - Defined if compiled for iOS +# CORRADE_TARGET_IOS - Defined if compiled for iOS (device or +# simulator) +# CORRADE_TARGET_IOS_SIMULATOR - Defined if compiled for iOS Simulator # CORRADE_TARGET_WINDOWS - Defined if compiled for Windows # CORRADE_TARGET_WINDOWS_RT - Defined if compiled for Windows RT # CORRADE_TARGET_NACL - Defined if compiled for Google Chrome Native @@ -97,6 +99,7 @@ # CORRADE_USE_MODULE - Path to UseCorrade.cmake module (included # automatically) # CORRADE_TESTSUITE_XCTEST_RUNNER - Path to XCTestRunner.mm.in file +# CORRADE_TESTSUITE_ADB_RUNNER - Path to AdbRunner.sh file # CORRADE_PEDANTIC_COMPILER_OPTIONS - List of pedantic compiler options used # for targets with :prop_tgt:`CORRADE_USE_PEDANTIC_FLAGS` enabled # CORRADE_PEDANTIC_COMPILER_DEFINITIONS - List of pedantic compiler @@ -120,13 +123,21 @@ # # corrade_add_test( # ... -# [LIBRARIES ...]) +# [LIBRARIES ...] +# [FILES ...]) # # Test name is also executable name. You can also specify libraries to link # with instead of using :command:`target_link_libraries()`. # ``Corrade::TestSuite`` target is linked automatically to each test. Note # that the :command:`enable_testing()` function must be called explicitly. # +# You can list files needed by the test in the `FILES` section. The filenames +# are treated relatively to `CMAKE_CURRENT_SOURCE_DIR`. On desktop platforms +# the files are added to the :prop_test:`REQUIRED_FILES` target property. On +# Emscripten they are bundled to the executable and available in the virtual +# filesystem root. On Android they are copied along the executable to the +# target. +# # Unless :variable:`CORRADE_TESTSUITE_TARGET_XCTEST` is set, test cases on iOS # targets are created as bundles with bundle identifier set to CMake project # name by default. Use the cache variable :variable:`CORRADE_TESTSUITE_BUNDLE_IDENTIFIER_PREFIX` @@ -152,37 +163,60 @@ # Add dynamic plugin:: # # corrade_add_plugin( -# +# ";" +# ";" # # ...) # # The macro adds preprocessor directive ``CORRADE_DYNAMIC_PLUGIN``. Additional # libraries can be linked in via :command:`target_link_libraries(plugin_name ...) `. -# If ```` is set to :variable:`CMAKE_CURRENT_BINARY_DIR` -# (e.g. for testing purposes), the files are copied directly, without the need -# to perform install step. Note that the files are actually put into -# configuration-based subdirectory, i.e. ``${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}``. -# See documentation of :variable:`CMAKE_CFG_INTDIR` variable for more -# information. +# On DLL platforms, the plugin DLLs and metadata files are put into +# ````/```` and the +# ``*.lib`` files into ````/````. +# On non-DLL platforms everything is put into ````/ +# ````. +# +# corrade_add_plugin( +# +# +# +# ...) +# +# Unline the above version this puts everything into ```` on +# both DLL and non-DLL platforms. If ```` is set to +# :variable:`CMAKE_CURRENT_BINARY_DIR` (e.g. for testing purposes), the files +# are copied directly, without the need to perform install step. Note that the +# files are actually put into configuration-based subdirectory, i.e. +# ``${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}``. See documentation of +# :variable:`CMAKE_CFG_INTDIR` variable for more information. # # .. command:: corrade_add_static_plugin # # Add static plugin:: # # corrade_add_static_plugin( -# +# ";" # # ...) # # The macro adds preprocessor directive ``CORRADE_STATIC_PLUGIN``. Additional # libraries can be linked in via :command:`target_link_libraries(plugin_name ...) `. +# The ```` is ignored and included just for compatibility +# with the :command:`corrade_add_plugin` command, everything is installed into +# ````. Note that plugins built in debug configuration +# (e.g. with :variable:`CMAKE_BUILD_TYPE` set to ``Debug``) have ``"-d"`` +# suffix to make it possible to have both debug and release plugins installed +# alongside each other. +# +# corrade_add_static_plugin( +# +# +# ...) +# +# Equivalent to the above with ```` set to ````. # If ```` is set to :variable:`CMAKE_CURRENT_BINARY_DIR` (e.g. for # testing purposes), no installation rules are added. # -# Note that plugins built in debug configuration (e.g. with :variable:`CMAKE_BUILD_TYPE` -# set to ``Debug``) have ``"-d"`` suffix to make it possible to have both debug -# and release plugins installed alongside each other. -# # .. command:: corrade_find_dlls_for_libs # # Find corresponding DLLs for library files:: @@ -248,6 +282,7 @@ set(_corradeFlags TARGET_UNIX TARGET_APPLE TARGET_IOS + TARGET_IOS_SIMULATOR TARGET_WINDOWS TARGET_WINDOWS_RT TARGET_NACL @@ -271,6 +306,13 @@ if(CORRADE_TESTSUITE_TARGET_XCTEST) set(CORRADE_TESTSUITE_XCTEST_RUNNER_NEEDED CORRADE_TESTSUITE_XCTEST_RUNNER) endif() +# ADB runner file +if(CORRADE_TARGET_ANDROID) + find_file(CORRADE_TESTSUITE_ADB_RUNNER AdbRunner.sh + PATH_SUFFIXES share/corrade/TestSuite) + set(CORRADE_TESTSUITE_ADB_RUNNER_NEEDED CORRADE_TESTSUITE_ADB_RUNNER) +endif() + # CMake module dir find_path(_CORRADE_MODULE_DIR NAMES UseCorrade.cmake CorradeLibSuffix.cmake @@ -459,6 +501,7 @@ find_package_handle_standard_args(Corrade REQUIRED_VARS _CORRADE_MODULE_DIR _CORRADE_CONFIGURE_FILE ${CORRADE_TESTSUITE_XCTEST_RUNNER_NEEDED} + ${CORRADE_TESTSUITE_ADB_RUNNER_NEEDED} HANDLE_COMPONENTS) # Finalize the finding process From 07b3a7352d659af01f31180b976cba8eada03cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 4 Jun 2016 23:03:54 +0200 Subject: [PATCH 272/290] package/archlinux: build (but not run) tests on Android. --- package/archlinux/PKGBUILD-android-arm | 3 ++- package/archlinux/PKGBUILD-android-x86 | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package/archlinux/PKGBUILD-android-arm b/package/archlinux/PKGBUILD-android-arm index 01b7a6154..a3b7d01cf 100644 --- a/package/archlinux/PKGBUILD-android-arm +++ b/package/archlinux/PKGBUILD-android-arm @@ -34,7 +34,8 @@ build() { -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ -DWITH_ANDROIDAPPLICATION=ON \ - -DWITH_EGLCONTEXT=ON + -DWITH_EGLCONTEXT=ON \ + -DBUILD_TESTS=ON ninja } diff --git a/package/archlinux/PKGBUILD-android-x86 b/package/archlinux/PKGBUILD-android-x86 index 5862419ef..a5fdd4d47 100644 --- a/package/archlinux/PKGBUILD-android-x86 +++ b/package/archlinux/PKGBUILD-android-x86 @@ -34,7 +34,8 @@ build() { -DWITH_TGAIMAGECONVERTER=ON \ -DWITH_TGAIMPORTER=ON \ -DWITH_ANDROIDAPPLICATION=ON \ - -DWITH_EGLCONTEXT=ON + -DWITH_EGLCONTEXT=ON \ + -DBUILD_TESTS=ON ninja } From d1ce761cce6d7ccf8c54b98c5c917c7845a88483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 11 Sep 2016 23:37:45 +0200 Subject: [PATCH 273/290] Trade: conditionally disable noexcept for GCC 4.9.0 in Android NDK. It complains about singatures not matching the implicit and thus not being defaultable. Works everywhere else, even on GCC 4.7 and 5.0, so I don't bother. --- src/Magnum/Trade/MeshData2D.cpp | 12 ++++++++++-- src/Magnum/Trade/MeshData2D.h | 18 ++++++++++++++++-- src/Magnum/Trade/MeshData3D.cpp | 12 ++++++++++-- src/Magnum/Trade/MeshData3D.h | 18 ++++++++++++++++-- src/Magnum/Trade/MeshObjectData2D.h | 18 ++++++++++++++++-- src/Magnum/Trade/MeshObjectData3D.h | 18 ++++++++++++++++-- src/Magnum/Trade/ObjectData2D.cpp | 12 ++++++++++-- src/Magnum/Trade/ObjectData2D.h | 18 ++++++++++++++++-- src/Magnum/Trade/ObjectData3D.cpp | 12 ++++++++++-- src/Magnum/Trade/ObjectData3D.h | 18 ++++++++++++++++-- src/Magnum/Trade/SceneData.cpp | 14 +++++++++++--- src/Magnum/Trade/SceneData.h | 18 ++++++++++++++++-- 12 files changed, 163 insertions(+), 25 deletions(-) diff --git a/src/Magnum/Trade/MeshData2D.cpp b/src/Magnum/Trade/MeshData2D.cpp index 4333e8ee2..2e986ced1 100644 --- a/src/Magnum/Trade/MeshData2D.cpp +++ b/src/Magnum/Trade/MeshData2D.cpp @@ -33,11 +33,19 @@ MeshData2D::MeshData2D(const MeshPrimitive primitive, std::vector i CORRADE_ASSERT(!_positions.empty(), "Trade::MeshData2D: no position array specified", ); } -MeshData2D::MeshData2D(MeshData2D&&) noexcept = default; +MeshData2D::MeshData2D(MeshData2D&&) + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; MeshData2D::~MeshData2D() = default; -MeshData2D& MeshData2D::operator=(MeshData2D&&) noexcept = default; +MeshData2D& MeshData2D::operator=(MeshData2D&&) + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; std::vector& MeshData2D::indices() { CORRADE_ASSERT(isIndexed(), "Trade::MeshData2D::indices(): the mesh is not indexed", _indices); diff --git a/src/Magnum/Trade/MeshData2D.h b/src/Magnum/Trade/MeshData2D.h index bfb566f65..30bc4b4d6 100644 --- a/src/Magnum/Trade/MeshData2D.h +++ b/src/Magnum/Trade/MeshData2D.h @@ -62,7 +62,14 @@ class MAGNUM_EXPORT MeshData2D { MeshData2D(const MeshData2D&) = delete; /** @brief Move constructor */ - MeshData2D(MeshData2D&&) noexcept; + MeshData2D(MeshData2D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + ; ~MeshData2D(); @@ -70,7 +77,14 @@ class MAGNUM_EXPORT MeshData2D { MeshData2D& operator=(const MeshData2D&) = delete; /** @brief Move assignment */ - MeshData2D& operator=(MeshData2D&&) noexcept; + MeshData2D& operator=(MeshData2D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + ; /** @brief Primitive */ MeshPrimitive primitive() const { return _primitive; } diff --git a/src/Magnum/Trade/MeshData3D.cpp b/src/Magnum/Trade/MeshData3D.cpp index 549e23311..72d190930 100644 --- a/src/Magnum/Trade/MeshData3D.cpp +++ b/src/Magnum/Trade/MeshData3D.cpp @@ -33,11 +33,19 @@ MeshData3D::MeshData3D(const MeshPrimitive primitive, std::vector i CORRADE_ASSERT(!_positions.empty(), "Trade::MeshData3D: no position array specified", ); } -MeshData3D::MeshData3D(MeshData3D&&) noexcept = default; +MeshData3D::MeshData3D(MeshData3D&&) + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; MeshData3D::~MeshData3D() = default; -MeshData3D& MeshData3D::operator=(MeshData3D&&) noexcept = default; +MeshData3D& MeshData3D::operator=(MeshData3D&&) + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; std::vector& MeshData3D::indices() { CORRADE_ASSERT(isIndexed(), "Trade::MeshData3D::indices(): the mesh is not indexed", _indices); diff --git a/src/Magnum/Trade/MeshData3D.h b/src/Magnum/Trade/MeshData3D.h index eb3fea4c5..0f800f2e2 100644 --- a/src/Magnum/Trade/MeshData3D.h +++ b/src/Magnum/Trade/MeshData3D.h @@ -63,7 +63,14 @@ class MAGNUM_EXPORT MeshData3D { MeshData3D(const MeshData3D&) = delete; /** @brief Move constructor */ - MeshData3D(MeshData3D&&) noexcept; + MeshData3D(MeshData3D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + ; ~MeshData3D(); @@ -71,7 +78,14 @@ class MAGNUM_EXPORT MeshData3D { MeshData3D& operator=(const MeshData3D&) = delete; /** @brief Move assignment */ - MeshData3D& operator=(MeshData3D&&) noexcept; + MeshData3D& operator=(MeshData3D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + ; /** @brief Primitive */ MeshPrimitive primitive() const { return _primitive; } diff --git a/src/Magnum/Trade/MeshObjectData2D.h b/src/Magnum/Trade/MeshObjectData2D.h index f103fd10e..7ef931d6e 100644 --- a/src/Magnum/Trade/MeshObjectData2D.h +++ b/src/Magnum/Trade/MeshObjectData2D.h @@ -57,13 +57,27 @@ class MAGNUM_EXPORT MeshObjectData2D: public ObjectData2D { MeshObjectData2D(const MeshObjectData2D&) = delete; /** @brief Move constructor */ - MeshObjectData2D(MeshObjectData2D&&) noexcept = default; + MeshObjectData2D(MeshObjectData2D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; /** @brief Copying is not allowed */ MeshObjectData2D& operator=(const MeshObjectData2D&) = delete; /** @brief Move assignment */ - MeshObjectData2D& operator=(MeshObjectData2D&&) noexcept = default; + MeshObjectData2D& operator=(MeshObjectData2D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; /** * @brief Material ID diff --git a/src/Magnum/Trade/MeshObjectData3D.h b/src/Magnum/Trade/MeshObjectData3D.h index 082e75166..96e6dbc37 100644 --- a/src/Magnum/Trade/MeshObjectData3D.h +++ b/src/Magnum/Trade/MeshObjectData3D.h @@ -57,13 +57,27 @@ class MAGNUM_EXPORT MeshObjectData3D: public ObjectData3D { MeshObjectData3D(const MeshObjectData3D&) = delete; /** @brief Move constructor */ - MeshObjectData3D(MeshObjectData3D&&) noexcept = default; + MeshObjectData3D(MeshObjectData3D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; /** @brief Copying is not allowed */ MeshObjectData3D& operator=(const MeshObjectData3D&) = delete; /** @brief Move assignment */ - MeshObjectData3D& operator=(MeshObjectData3D&&) noexcept = default; + MeshObjectData3D& operator=(MeshObjectData3D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; /** * @brief Material ID diff --git a/src/Magnum/Trade/ObjectData2D.cpp b/src/Magnum/Trade/ObjectData2D.cpp index 8ec678f35..08b182331 100644 --- a/src/Magnum/Trade/ObjectData2D.cpp +++ b/src/Magnum/Trade/ObjectData2D.cpp @@ -31,11 +31,19 @@ ObjectData2D::ObjectData2D(std::vector children, const Matrix3& tra ObjectData2D::ObjectData2D(std::vector children, const Matrix3& transformation, const void* const importerState): _children{std::move(children)}, _transformation{transformation}, _instanceType{ObjectInstanceType2D::Empty}, _instance{-1}, _importerState{importerState} {} -ObjectData2D::ObjectData2D(ObjectData2D&&) noexcept = default; +ObjectData2D::ObjectData2D(ObjectData2D&&) + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; ObjectData2D::~ObjectData2D() = default; -ObjectData2D& ObjectData2D::operator=(ObjectData2D&&) noexcept = default; +ObjectData2D& ObjectData2D::operator=(ObjectData2D&&) + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, ObjectInstanceType2D value) { diff --git a/src/Magnum/Trade/ObjectData2D.h b/src/Magnum/Trade/ObjectData2D.h index a95cf7f1d..589119984 100644 --- a/src/Magnum/Trade/ObjectData2D.h +++ b/src/Magnum/Trade/ObjectData2D.h @@ -83,7 +83,14 @@ class MAGNUM_EXPORT ObjectData2D { ObjectData2D(const ObjectData2D&) = delete; /** @brief Move constructor */ - ObjectData2D(ObjectData2D&&) noexcept; + ObjectData2D(ObjectData2D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + ; /** @brief Destructor */ virtual ~ObjectData2D(); @@ -92,7 +99,14 @@ class MAGNUM_EXPORT ObjectData2D { ObjectData2D& operator=(const ObjectData2D&) = delete; /** @brief Move assignment */ - ObjectData2D& operator=(ObjectData2D&&) noexcept; + ObjectData2D& operator=(ObjectData2D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + ; /** @brief Child objects */ std::vector& children() { return _children; } diff --git a/src/Magnum/Trade/ObjectData3D.cpp b/src/Magnum/Trade/ObjectData3D.cpp index 900156383..0a1d2c843 100644 --- a/src/Magnum/Trade/ObjectData3D.cpp +++ b/src/Magnum/Trade/ObjectData3D.cpp @@ -31,11 +31,19 @@ ObjectData3D::ObjectData3D(std::vector children, const Matrix4& tra ObjectData3D::ObjectData3D(std::vector children, const Matrix4& transformation, const void* const importerState): _children{std::move(children)}, _transformation{transformation}, _instanceType{ObjectInstanceType3D::Empty}, _instance{-1}, _importerState{importerState} {} -ObjectData3D::ObjectData3D(ObjectData3D&&) noexcept = default; +ObjectData3D::ObjectData3D(ObjectData3D&&) + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; ObjectData3D::~ObjectData3D() = default; -ObjectData3D& ObjectData3D::operator=(ObjectData3D&&) noexcept = default; +ObjectData3D& ObjectData3D::operator=(ObjectData3D&&) + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; #ifndef DOXYGEN_GENERATING_OUTPUT Debug& operator<<(Debug& debug, ObjectInstanceType3D value) { diff --git a/src/Magnum/Trade/ObjectData3D.h b/src/Magnum/Trade/ObjectData3D.h index 0bf7a3f1f..042a91acf 100644 --- a/src/Magnum/Trade/ObjectData3D.h +++ b/src/Magnum/Trade/ObjectData3D.h @@ -84,7 +84,14 @@ class MAGNUM_EXPORT ObjectData3D { ObjectData3D(const ObjectData3D&) = delete; /** @brief Move constructor */ - ObjectData3D(ObjectData3D&&) noexcept; + ObjectData3D(ObjectData3D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + ; /** @brief Destructor */ virtual ~ObjectData3D(); @@ -93,7 +100,14 @@ class MAGNUM_EXPORT ObjectData3D { ObjectData3D& operator=(const ObjectData3D&) = delete; /** @brief Move assignment */ - ObjectData3D& operator=(ObjectData3D&&) noexcept; + ObjectData3D& operator=(ObjectData3D&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + ; /** @brief Child objects */ std::vector& children() { return _children; } diff --git a/src/Magnum/Trade/SceneData.cpp b/src/Magnum/Trade/SceneData.cpp index b51449f91..9b656e9dd 100644 --- a/src/Magnum/Trade/SceneData.cpp +++ b/src/Magnum/Trade/SceneData.cpp @@ -29,8 +29,16 @@ namespace Magnum { namespace Trade { SceneData::SceneData(std::vector children2D, std::vector children3D, const void* const importerState): _children2D{std::move(children2D)}, _children3D{std::move(children3D)}, _importerState{importerState} {} -SceneData::SceneData(SceneData&&) noexcept = default; - -SceneData& SceneData::operator=(SceneData&&) noexcept = default; +SceneData::SceneData(SceneData&&) + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; + +SceneData& SceneData::operator=(SceneData&&) + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + = default; }} diff --git a/src/Magnum/Trade/SceneData.h b/src/Magnum/Trade/SceneData.h index edaba4bff..d6707ae32 100644 --- a/src/Magnum/Trade/SceneData.h +++ b/src/Magnum/Trade/SceneData.h @@ -54,13 +54,27 @@ class MAGNUM_EXPORT SceneData { SceneData(const SceneData&) = delete; /** @brief Move constructor */ - SceneData(SceneData&&) noexcept; + SceneData(SceneData&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + ; /** @brief Copying is not allowed */ SceneData& operator=(const SceneData&) = delete; /** @brief Move assignment */ - SceneData& operator=(SceneData&&) noexcept; + SceneData& operator=(SceneData&&) + /* GCC 4.9.0 (the one from Android NDK) thinks this does not match + the implicit signature so it can't be defaulted. Works on 4.7, + 5.0 and everywhere else, so I don't bother. */ + #if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409 + noexcept + #endif + ; /** @brief Two-dimensional child objects */ const std::vector& children2D() const { return _children2D; } From 261c57355744c52484dc4af0332752ded2fc8812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 11 Sep 2016 23:39:24 +0200 Subject: [PATCH 274/290] Platform: build Android glue C source separately. So I don't include the pedantic flags for it and don't treat it as C++ source. --- src/Magnum/Platform/CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Platform/CMakeLists.txt b/src/Magnum/Platform/CMakeLists.txt index 7cef63b75..b48883ac8 100644 --- a/src/Magnum/Platform/CMakeLists.txt +++ b/src/Magnum/Platform/CMakeLists.txt @@ -70,15 +70,19 @@ if(WITH_ANDROIDAPPLICATION) set(MagnumAndroidApplication_PRIVATE_HEADERS Implementation/Egl.h) + add_library(MagnumAndroidApplicationGlue OBJECT + ${ANDROID_NATIVE_APP_GLUE_SRC}) + set_target_properties(MagnumAndroidApplicationGlue PROPERTIES CORRADE_USE_PEDANTIC_FLAGS OFF) + target_compile_options(MagnumAndroidApplicationGlue PRIVATE "-fvisibility=default") + add_library(MagnumAndroidApplication STATIC ${MagnumAndroidApplication_SRCS} ${MagnumAndroidApplication_HEADERS} ${MagnumAndroidApplication_PRIVATE_HEADERS} - ${ANDROID_NATIVE_APP_GLUE_SRC}) + $) # They just don't care, so of course the ANativeActivity_onCreate() # function is not exported and thus the app startup fails if I don't # disable hidden visibility for the file. - set_source_files_properties(${ANDROID_NATIVE_APP_GLUE_SRC} PROPERTIES COMPILE_FLAGS "-fvisibility=default") target_include_directories(MagnumAndroidApplication PUBLIC ${ANDROID_NATIVE_APP_GLUE_INCLUDE_DIR}) set_target_properties(MagnumAndroidApplication PROPERTIES DEBUG_POSTFIX "-d") # Assuming that PIC is not needed because the Application lib is always From 081f79a766fae914cede9863344906edc99f646a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 11 Sep 2016 23:40:14 +0200 Subject: [PATCH 275/290] Bundle test files for both Android and Emscripten. --- src/Magnum/Text/Test/CMakeLists.txt | 19 +++-- src/Magnum/Trade/Test/CMakeLists.txt | 14 ++-- .../ObjImporter/Test/CMakeLists.txt | 29 +++++-- .../TgaImporter/Test/CMakeLists.txt | 12 ++- .../WavAudioImporter/Test/CMakeLists.txt | 75 +++++++++---------- 5 files changed, 79 insertions(+), 70 deletions(-) diff --git a/src/Magnum/Text/Test/CMakeLists.txt b/src/Magnum/Text/Test/CMakeLists.txt index 13552d5b9..2693e77ed 100644 --- a/src/Magnum/Text/Test/CMakeLists.txt +++ b/src/Magnum/Text/Test/CMakeLists.txt @@ -23,9 +23,9 @@ # DEALINGS IN THE SOFTWARE. # -if(CORRADE_TARGET_EMSCRIPTEN) - set(TEXT_TEST_DIR "") - set(TEXT_TEST_OUTPUT_DIR "/write") +if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) + set(TEXT_TEST_DIR ".") + set(TEXT_TEST_OUTPUT_DIR "./write") else() set(TEXT_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(TEXT_TEST_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) @@ -34,17 +34,16 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -corrade_add_test(TextAbstractFontTest AbstractFontTest.cpp LIBRARIES Magnum MagnumText) +corrade_add_test(TextAbstractFontTest AbstractFontTest.cpp + LIBRARIES Magnum MagnumText + FILES data.bin) target_include_directories(TextAbstractFontTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -corrade_add_test(TextAbstractFontConverterTest AbstractFontConverterTest.cpp LIBRARIES Magnum MagnumText) +corrade_add_test(TextAbstractFontConverterTest AbstractFontConverterTest.cpp + LIBRARIES Magnum MagnumText + FILES data.bin) target_include_directories(TextAbstractFontConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) corrade_add_test(TextAbstractLayouterTest AbstractLayouterTest.cpp LIBRARIES Magnum MagnumText) -if(CORRADE_TARGET_EMSCRIPTEN) - emscripten_embed_file(TextAbstractFontTest data.bin "/data.bin") - emscripten_embed_file(TextAbstractFontConverterTest data.bin "/data.bin") -endif() - if(BUILD_GL_TESTS) corrade_add_test(TextGlyphCacheGLTest GlyphCacheGLTest.cpp LIBRARIES MagnumText ${GL_TEST_LIBRARIES}) corrade_add_test(TextRendererGLTest RendererGLTest.cpp LIBRARIES MagnumText ${GL_TEST_LIBRARIES}) diff --git a/src/Magnum/Trade/Test/CMakeLists.txt b/src/Magnum/Trade/Test/CMakeLists.txt index 674f031a3..9db022173 100644 --- a/src/Magnum/Trade/Test/CMakeLists.txt +++ b/src/Magnum/Trade/Test/CMakeLists.txt @@ -23,9 +23,9 @@ # DEALINGS IN THE SOFTWARE. # -if(CORRADE_TARGET_EMSCRIPTEN) - set(TRADE_TEST_DIR "") - set(TRADE_TEST_OUTPUT_DIR "/write") +if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) + set(TRADE_TEST_DIR ".") + set(TRADE_TEST_OUTPUT_DIR "./write") else() set(TRADE_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(TRADE_TEST_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) @@ -36,7 +36,9 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake corrade_add_test(TradeAbstractImageConverterTest AbstractImageConverterTest.cpp LIBRARIES Magnum) target_include_directories(TradeAbstractImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -corrade_add_test(TradeAbstractImporterTest AbstractImporterTest.cpp LIBRARIES Magnum) +corrade_add_test(TradeAbstractImporterTest AbstractImporterTest.cpp + LIBRARIES Magnum + FILES file.bin) target_include_directories(TradeAbstractImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) corrade_add_test(TradeCameraDataTest CameraDataTest.cpp LIBRARIES Magnum) corrade_add_test(TradeImageDataTest ImageDataTest.cpp LIBRARIES Magnum) @@ -48,7 +50,3 @@ corrade_add_test(TradeObjectData2DTest ObjectData2DTest.cpp LIBRARIES Magnum) corrade_add_test(TradeObjectData3DTest ObjectData3DTest.cpp LIBRARIES Magnum) corrade_add_test(TradeSceneDataTest SceneDataTest.cpp LIBRARIES Magnum) corrade_add_test(TradeTextureDataTest TextureDataTest.cpp LIBRARIES Magnum) - -if(CORRADE_TARGET_EMSCRIPTEN) - emscripten_embed_file(TradeAbstractImporterTest file.bin "/file.bin") -endif() diff --git a/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt b/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt index c8bf7e8b4..c6a15bcd5 100644 --- a/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/ObjImporter/Test/CMakeLists.txt @@ -23,8 +23,8 @@ # DEALINGS IN THE SOFTWARE. # -if(CORRADE_TARGET_EMSCRIPTEN) - set(OBJIMPORTER_TEST_DIR "") +if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) + set(OBJIMPORTER_TEST_DIR ".") else() set(OBJIMPORTER_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) endif() @@ -32,7 +32,26 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -corrade_add_test(ObjImporterTest Test.cpp LIBRARIES MagnumObjImporterTestLib) +corrade_add_test(ObjImporterTest Test.cpp + LIBRARIES MagnumObjImporterTestLib + FILES + emptyFile.obj + keywords.obj + lineMesh.obj + missingData.obj + mixedPrimitives.obj + moreMeshes.obj + namedMesh.obj + normals.obj + optionalCoordinates.obj + pointMesh.obj + textureCoordinatesNormals.obj + textureCoordinates.obj + triangleMesh.obj + unnamedFirstMesh.obj + wrongIndexCount.obj + wrongNumberCount.obj + wrongNumbers.obj) target_include_directories(ObjImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) # On Win32 we need to avoid dllimporting ObjImporter symbols, because it would # search for the symbols in some DLL even though they were linked statically. @@ -41,7 +60,3 @@ target_include_directories(ObjImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) if(WIN32) target_compile_definitions(ObjImporterTest PRIVATE "MAGNUM_OBJIMPORTER_BUILD_STATIC") endif() - -if(CORRADE_TARGET_EMSCRIPTEN) - emscripten_embed_file(ObjImporterTest "" "/") -endif() diff --git a/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt b/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt index d74826eac..ec9ad8ab6 100644 --- a/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/TgaImporter/Test/CMakeLists.txt @@ -23,8 +23,8 @@ # DEALINGS IN THE SOFTWARE. # -if(CORRADE_TARGET_EMSCRIPTEN) - set(TGAIMPORTER_TEST_DIR "") +if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) + set(TGAIMPORTER_TEST_DIR ".") else() set(TGAIMPORTER_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) endif() @@ -32,7 +32,9 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -corrade_add_test(TgaImporterTest TgaImporterTest.cpp LIBRARIES MagnumTgaImporterTestLib) +corrade_add_test(TgaImporterTest TgaImporterTest.cpp + LIBRARIES MagnumTgaImporterTestLib + FILES file.tga) target_include_directories(TgaImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) # On Win32 we need to avoid dllimporting TgaImporter symbols, because it would # search for the symbols in some DLL even though they were linked statically. @@ -41,7 +43,3 @@ target_include_directories(TgaImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) if(WIN32) target_compile_definitions(TgaImporterTest PRIVATE "MAGNUM_TGAIMPORTER_BUILD_STATIC") endif() - -if(CORRADE_TARGET_EMSCRIPTEN) - emscripten_embed_file(TgaImporterTest file.tga "/file.tga") -endif() diff --git a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt index b3da0dd9f..b76fab76c 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt @@ -23,8 +23,8 @@ # DEALINGS IN THE SOFTWARE. # -if(CORRADE_TARGET_EMSCRIPTEN) - set(WAVAUDIOIMPORTER_TEST_DIR "") +if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) + set(WAVAUDIOIMPORTER_TEST_DIR ".") else() set(WAVAUDIOIMPORTER_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) endif() @@ -32,7 +32,41 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) -corrade_add_test(WavAudioImporterTest WavImporterTest.cpp LIBRARIES MagnumWavAudioImporterTestLib) +corrade_add_test(WavAudioImporterTest WavImporterTest.cpp + LIBRARIES MagnumWavAudioImporterTestLib + FILES + unsupportedChannelCount.wav + unsupportedFormat.wav + wrongSignature.wav + + invalidPadding.wav + invalidLength.wav + invalidDataChunk.wav + invalidFactChunk.wav + + mono4.wav + mono8.wav + mono8junk.wav + mono8ALaw.wav + mono8MuLaw.wav + mono16.wav + mono24.wav + + stereo4.wav + stereo8.wav + stereo8ALaw.wav + stereo8MuLaw.wav + stereo12.wav + stereo16.wav + stereo24.wav + stereo32.wav + + mono32f.wav + stereo32f.wav + stereo64f.wav + + surround51Channel16.wav + surround71Channel24.wav) target_include_directories(WavAudioImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) # On Win32 we need to avoid dllimporting WavAudioImporter symbols, because it # would search for the symbols in some DLL even though they were linked @@ -41,38 +75,3 @@ target_include_directories(WavAudioImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_D if(WIN32) target_compile_definitions(WavAudioImporterTest PRIVATE "MAGNUM_WAVAUDIOIMPORTER_BUILD_STATIC") endif() - -if(CORRADE_TARGET_EMSCRIPTEN) - emscripten_embed_file(WavAudioImporterTest unsupportedChannelCount.wav "/unsupportedChannelCount.wav") - emscripten_embed_file(WavAudioImporterTest unsupportedFormat.wav "/unsupportedFormat.wav") - emscripten_embed_file(WavAudioImporterTest wrongSignature.wav "/wrongSignature.wav") - - emscripten_embed_file(WavAudioImporterTest invalidPadding.wav "/invalidPadding.wav") - emscripten_embed_file(WavAudioImporterTest invalidLength.wav "/invalidLength.wav") - emscripten_embed_file(WavAudioImporterTest invalidDataChunk.wav "/invalidDataChunk.wav") - emscripten_embed_file(WavAudioImporterTest invalidFactChunk.wav "/invalidFactChunk.wav") - - emscripten_embed_file(WavAudioImporterTest mono4.wav "/mono4.wav") - emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8.wav") - emscripten_embed_file(WavAudioImporterTest mono8junk.wav "/mono8junk.wav") - emscripten_embed_file(WavAudioImporterTest mono8ALaw.wav "/mono8ALaw.wav") - emscripten_embed_file(WavAudioImporterTest mono8MuLaw.wav "/mono8MuLaw.wav") - emscripten_embed_file(WavAudioImporterTest mono16.wav "/mono16.wav") - emscripten_embed_file(WavAudioImporterTest mono24.wav "/mono24.wav") - - emscripten_embed_file(WavAudioImporterTest stereo4.wav "/stereo4.wav") - emscripten_embed_file(WavAudioImporterTest stereo8.wav "/stereo8.wav") - emscripten_embed_file(WavAudioImporterTest stereo8ALaw.wav "/stereo8ALaw.wav") - emscripten_embed_file(WavAudioImporterTest stereo8MuLaw.wav "/stereo8MuLaw.wav") - emscripten_embed_file(WavAudioImporterTest stereo12.wav "/stereo12.wav") - emscripten_embed_file(WavAudioImporterTest stereo16.wav "/stereo16.wav") - emscripten_embed_file(WavAudioImporterTest stereo24.wav "/stereo24.wav") - emscripten_embed_file(WavAudioImporterTest stereo32.wav "/stereo32.wav") - - emscripten_embed_file(WavAudioImporterTest mono32f.wav "/mono32f.wav") - emscripten_embed_file(WavAudioImporterTest stereo32f.wav "/stereo32f.wav") - emscripten_embed_file(WavAudioImporterTest stereo64f.wav "/stereo64f.wav") - - emscripten_embed_file(WavAudioImporterTest surround51Channel16.wav "/surround51Channel16.wav") - emscripten_embed_file(WavAudioImporterTest surround71Channel24.wav "/surround71Channel24.wav") -endif() From 91e497d5620394a84d6f1bdbbbafd18e4b41b8ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 4 Jun 2016 23:05:14 +0200 Subject: [PATCH 276/290] package/ci: build for Android ES2/ES3 on Travis. --- package/ci/travis-android-arm.sh | 60 ++++++++++++++++++++++++++++++++ package/ci/travis.yml | 52 +++++++++++++++++++++------ 2 files changed, 102 insertions(+), 10 deletions(-) create mode 100755 package/ci/travis-android-arm.sh diff --git a/package/ci/travis-android-arm.sh b/package/ci/travis-android-arm.sh new file mode 100755 index 000000000..f3e696481 --- /dev/null +++ b/package/ci/travis-android-arm.sh @@ -0,0 +1,60 @@ +#!/bin/bash +set -ev + +git submodule update --init + +# Corrade +git clone --depth 1 git://github.com/mosra/corrade.git +cd corrade + +# Build native corrade-rc +mkdir build && cd build +cmake .. \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps-native \ + -DCMAKE_INSTALL_RPATH=$HOME/deps-native/lib \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_INTERCONNECT=OFF \ + -DWITH_PLUGINMANAGER=OFF \ + -DWITH_TESTSUITE=OFF +make -j install +cd .. + +# Crosscompile Corrade +mkdir build-android-arm && cd build-android-arm +ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r10e cmake .. \ + -DCMAKE_TOOLCHAIN_FILE=../toolchains/generic/Android-ARM.cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps \ + -DWITH_INTERCONNECT=OFF +make -j install +cd .. + +cd .. + +# Crosscompile +mkdir build-android-arm && cd build-android-arm +ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r10e cmake .. \ + -DCMAKE_TOOLCHAIN_FILE=../toolchains/generic/Android-ARM.cmake \ + -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ + -DCMAKE_PREFIX_PATH=$HOME/deps \ + -DCMAKE_FIND_ROOT_PATH=$HOME/deps \ + -DCMAKE_BUILD_TYPE=Release \ + -DTARGET_GLES2=$TARGET_GLES2 \ + -DWITH_AUDIO=OFF \ + -DWITH_ANDROIDAPPLICATION=ON \ + -DWITH_EGLCONTEXT=ON \ + -DWITH_MAGNUMFONT=ON \ + -DWITH_MAGNUMFONTCONVERTER=ON \ + -DWITH_OBJIMPORTER=ON \ + -DWITH_TGAIMAGECONVERTER=ON \ + -DWITH_TGAIMPORTER=ON \ + -DWITH_WAVAUDIOIMPORTER=OFF \ + -DBUILD_TESTS=ON +make -j${JOBS_LIMIT} + +# Start simulator and run tests +echo no | android create avd --force -n test -t android-19 --abi armeabi-v7a +emulator -avd test -no-audio -no-window & +android-wait-for-emulator +CORRADE_TEST_COLOR=ON ctest -V diff --git a/package/ci/travis.yml b/package/ci/travis.yml index 0d6a612d1..300f28778 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -1,16 +1,16 @@ # kate: indent-width 2; -language: cpp - matrix: include: - - os: linux + - language: cpp + os: linux compiler: gcc env: - TARGET=desktop # Otherwise the job gets killed (probably because using too much memory) - JOBS_LIMIT=4 - - os: linux + - language: cpp + os: linux compiler: gcc env: - TARGET=desktop-gles @@ -18,35 +18,65 @@ matrix: - JOBS_LIMIT=4 # Disabled because the Ubuntu 12.04 drivers are missing some ES3 entrypoints # Should be enabled after moving to 14.04 - #- os: linux + #- language: cpp + #os: linux #compiler: gcc #env: #- TARGET=desktop-gles #- TARGET_GLES2=OFF #- JOBS_LIMIT=4 - - os: osx + - language: cpp + os: osx compiler: clang env: TARGET=desktop - - os: osx + - language: cpp + os: osx osx_image: xcode7.3 env: - TARGET=ios-simulator - TARGET_GLES2=ON - - os: osx + - language: cpp + os: osx osx_image: xcode7.3 env: - TARGET=ios-simulator - TARGET_GLES2=OFF - - os: osx + - language: cpp + os: osx osx_image: xcode7.3 env: - TARGET=emscripten - TARGET_GLES2=ON - - os: osx + - language: cpp + os: osx osx_image: xcode7.3 env: - TARGET=emscripten - TARGET_GLES2=OFF + - language: android + os: linux + env: + - TARGET=android + - TARGET_GLES2=ON + # Otherwise the job gets killed (probably because using too much memory) + - JOBS_LIMIT=4 + android: + components: + - build-tools-19.0.0 + - android-19 + - sys-img-armeabi-v7a-android-19 + - language: android + os: linux + env: + - TARGET=android + - TARGET_GLES2=OFF + # Otherwise the job gets killed (probably because using too much memory) + - JOBS_LIMIT=4 + android: + components: + - build-tools-19.0.0 + - android-19 + - sys-img-armeabi-v7a-android-19 addons: apt: @@ -76,6 +106,7 @@ install: - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export CXX=g++-4.7; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export PLATFORM_GL_API=GLX; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "android" ]; then wget -nc http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin && chmod +x android-*.bin && ./android-*.bin -y | grep -v Extracting; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then export PLATFORM_GL_API=CGL; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then gem install xcpretty; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then brew install emscripten && export LLVM=/usr/local/opt/emscripten/libexec/llvm/bin && emcc; fi @@ -93,6 +124,7 @@ install: script: - if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "desktop" ]; then ./package/ci/travis-desktop.sh; fi - if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "desktop-gles" ]; then ./package/ci/travis-desktop-gles.sh; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "android" ]; then ./package/ci/travis-android-arm.sh; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then ./package/ci/travis-desktop.sh; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then ./package/ci/travis-ios-simulator.sh; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then ./package/ci/travis-emscripten.sh; fi From 60b56b09990fbf96b8edf897debc67fde8c111df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 16 Oct 2016 00:42:28 +0200 Subject: [PATCH 277/290] Math: no need for that GCC type deduction workaround anymore. --- src/Magnum/Math/Test/TypeTraitsTest.cpp | 89 ++++++++++++------------- 1 file changed, 44 insertions(+), 45 deletions(-) diff --git a/src/Magnum/Math/Test/TypeTraitsTest.cpp b/src/Magnum/Math/Test/TypeTraitsTest.cpp index fd34cfa06..68e8a7c33 100644 --- a/src/Magnum/Math/Test/TypeTraitsTest.cpp +++ b/src/Magnum/Math/Test/TypeTraitsTest.cpp @@ -94,51 +94,50 @@ struct { } TypeTraitsTest::TypeTraitsTest() { - addTests({ - &TypeTraitsTest::name, - - &TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - #ifndef CORRADE_TARGET_EMSCRIPTEN - &TypeTraitsTest::equalsIntegral, - &TypeTraitsTest::equalsIntegral, - #endif - - &TypeTraitsTest::equalsFloatingPoint0, - &TypeTraitsTest::equalsFloatingPoint0, - #ifndef CORRADE_TARGET_EMSCRIPTEN - &TypeTraitsTest::equalsFloatingPoint0, - #endif - &TypeTraitsTest::equalsFloatingPoint1, - &TypeTraitsTest::equalsFloatingPoint1, - #ifndef CORRADE_TARGET_EMSCRIPTEN - &TypeTraitsTest::equalsFloatingPoint1, - #endif - &TypeTraitsTest::equalsFloatingPointLarge, - &TypeTraitsTest::equalsFloatingPointLarge, - #ifndef CORRADE_TARGET_EMSCRIPTEN - &TypeTraitsTest::equalsFloatingPointLarge, - #endif - &TypeTraitsTest::equalsFloatingPointInfinity, - &TypeTraitsTest::equalsFloatingPointInfinity, - &TypeTraitsTest::equalsFloatingPointNaN, - &TypeTraitsTest::equalsFloatingPointNaN, - - &TypeTraitsTest::equalsZeroIntegral, - &TypeTraitsTest::equalsZeroIntegral, - &TypeTraitsTest::equalsZeroIntegral, - &TypeTraitsTest::equalsZeroIntegral, - &TypeTraitsTest::equalsZeroIntegral, - &TypeTraitsTest::equalsZeroIntegral, - #ifndef CORRADE_TARGET_EMSCRIPTEN - &TypeTraitsTest::equalsZeroIntegral, - &TypeTraitsTest::equalsZeroIntegral, - #endif - }); + addTests({&TypeTraitsTest::name, + + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + #ifndef CORRADE_TARGET_EMSCRIPTEN + &TypeTraitsTest::equalsIntegral, + &TypeTraitsTest::equalsIntegral, + #endif + + &TypeTraitsTest::equalsFloatingPoint0, + &TypeTraitsTest::equalsFloatingPoint0, + #ifndef CORRADE_TARGET_EMSCRIPTEN + &TypeTraitsTest::equalsFloatingPoint0, + #endif + &TypeTraitsTest::equalsFloatingPoint1, + &TypeTraitsTest::equalsFloatingPoint1, + #ifndef CORRADE_TARGET_EMSCRIPTEN + &TypeTraitsTest::equalsFloatingPoint1, + #endif + &TypeTraitsTest::equalsFloatingPointLarge, + &TypeTraitsTest::equalsFloatingPointLarge, + #ifndef CORRADE_TARGET_EMSCRIPTEN + &TypeTraitsTest::equalsFloatingPointLarge, + #endif + &TypeTraitsTest::equalsFloatingPointInfinity, + &TypeTraitsTest::equalsFloatingPointInfinity, + &TypeTraitsTest::equalsFloatingPointNaN, + &TypeTraitsTest::equalsFloatingPointNaN, + + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + #ifndef CORRADE_TARGET_EMSCRIPTEN + &TypeTraitsTest::equalsZeroIntegral, + &TypeTraitsTest::equalsZeroIntegral, + #endif + }); addInstancedTests({ &TypeTraitsTest::equalsZeroFloatingPoint, From c47f8e04e3d9ca6d7519b21280052c08fb260b42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 16 Oct 2016 00:56:21 +0200 Subject: [PATCH 278/290] Math: test for size of long double. In order to have predictable results in the tests. --- src/Magnum/Math/Test/TypeTraitsTest.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Math/Test/TypeTraitsTest.cpp b/src/Magnum/Math/Test/TypeTraitsTest.cpp index 68e8a7c33..cf7aa6ebe 100644 --- a/src/Magnum/Math/Test/TypeTraitsTest.cpp +++ b/src/Magnum/Math/Test/TypeTraitsTest.cpp @@ -36,6 +36,7 @@ namespace Magnum { namespace Math { namespace Test { struct TypeTraitsTest: Corrade::TestSuite::Tester { explicit TypeTraitsTest(); + void sizeOfLongDouble(); void name(); template void equalsIntegral(); @@ -94,7 +95,8 @@ struct { } TypeTraitsTest::TypeTraitsTest() { - addTests({&TypeTraitsTest::name, + addTests({&TypeTraitsTest::sizeOfLongDouble, + &TypeTraitsTest::name, &TypeTraitsTest::equalsIntegral, &TypeTraitsTest::equalsIntegral, @@ -148,6 +150,20 @@ TypeTraitsTest::TypeTraitsTest() { }, EqualsZeroDataCount); } +void TypeTraitsTest::sizeOfLongDouble() { + #ifdef CORRADE_TARGET_EMSCRIPTEN + CORRADE_SKIP("Not defined in Emscripten."); + #else + #ifdef _MSC_VER + CORRADE_COMPARE(sizeof(long double), 8); + CORRADE_EXPECT_FAIL("long double is equivalent to double on MSVC."); + #endif + + /* It's 80 bit, but has to be aligned somehow, so 128 bits / 16 bytes */ + CORRADE_COMPARE(sizeof(long double), 16); + #endif +} + void TypeTraitsTest::name() { CORRADE_COMPARE(TypeTraits::name(), "UnsignedShort"); CORRADE_COMPARE(TypeTraits::name(), "Float"); From 9590f723883b319d4a2ce2d9f4dd695d5ba22be1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 16 Oct 2016 00:56:59 +0200 Subject: [PATCH 279/290] ObjImporter: properly implement string-to-number on Android. The string stream solution that was used in case of NaCl and Android wasn't working at all, thus I discarded it in favor of less overhead-y C functions. While strtoul() and others *are* defined in the std:: namespace, strtof() isn't. What a pile of crap. I also had to emulate C++ exception behavior in order to match the std::stoul() and std::stof() behavior. This plugin needs a zero-copy rewrite anyway, but at least the test is green now on all platforms. I discarded the NaCl version because currently there's no toolchain for it and I'm not going to guess whether stof() and friends are even there. If they are, then it's just a matter of enabling the Android code path also for NaCl. --- src/MagnumPlugins/ObjImporter/ObjImporter.cpp | 81 +++++++++++-------- 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/src/MagnumPlugins/ObjImporter/ObjImporter.cpp b/src/MagnumPlugins/ObjImporter/ObjImporter.cpp index 7ccee5ed4..d2059cb16 100644 --- a/src/MagnumPlugins/ObjImporter/ObjImporter.cpp +++ b/src/MagnumPlugins/ObjImporter/ObjImporter.cpp @@ -38,10 +38,6 @@ #include "Magnum/Math/Vector3.h" #include "Magnum/Trade/MeshData3D.h" -#if defined(CORRADE_TARGET_NACL_NEWLIB) || defined(CORRADE_TARGET_ANDROID) -#include -#endif - namespace Magnum { namespace Trade { struct ObjImporter::File { @@ -66,16 +62,16 @@ template Math::Vector extractFloatData(std::strin Math::Vector output; - #if defined(CORRADE_TARGET_NACL_NEWLIB) || defined(CORRADE_TARGET_ANDROID) - std::istringstream in; - #endif - for(std::size_t i = 0; i != size; ++i) { - #if !defined(CORRADE_TARGET_NACL_NEWLIB) && !defined(CORRADE_TARGET_ANDROID) + #ifndef CORRADE_TARGET_ANDROID output[i] = std::stof(data[i]); #else - in.str(data[i]); - in >> output[i]; + /* CRAPPY ANDROID GODDAMIT! It's also not exposed in std:: namespace, + unlike std::strtoul() and others. WTF! */ + char* end{}; + output[i] = strtof(data[i].data(), &end); + if(end == data[i].data() || output[i] == HUGE_VALF) + throw std::exception{}; #endif } @@ -84,11 +80,15 @@ template Math::Vector extractFloatData(std::strin Clang Analyzer happy */ CORRADE_INTERNAL_ASSERT(extra); - #if !defined(CORRADE_TARGET_NACL_NEWLIB) && !defined(CORRADE_TARGET_ANDROID) + #ifndef CORRADE_TARGET_ANDROID *extra = std::stof(data.back()); #else - in.str(data.back()); - in >> *extra; + /* CRAPPY ANDROID GODDAMIT! It's also not exposed in std:: namespace, + unlike std::strtoul() and others. WTF! */ + char* end{}; + *extra = strtof(data.back().data(), &end); + if(end == data.back().data() || *extra == HUGE_VALF) + throw std::exception{}; #endif } @@ -370,35 +370,50 @@ std::optional ObjImporter::doMesh3D(UnsignedInt id) { return std::nullopt; } + #ifdef CORRADE_TARGET_ANDROID + char* end{}; + #endif + /* Position indices */ - #if !defined(CORRADE_TARGET_NACL_NEWLIB) && !defined(CORRADE_TARGET_ANDROID) - positionIndices.push_back(std::stoul(indices[0]) - positionIndexOffset); - #else - std::istringstream in(indices[0]); - UnsignedInt index; - in >> index; - positionIndices.push_back(index - positionIndexOffset); + positionIndices.push_back( + #ifndef CORRADE_TARGET_ANDROID + std::stoul(indices[0]) + #else + std::strtoul(indices[0].data(), &end, 10) + #endif + - positionIndexOffset); + + #ifdef CORRADE_TARGET_ANDROID + if(end == indices[0].data()) throw std::exception{}; #endif /* Texture coordinates */ if(indices.size() == 2 || (indices.size() == 3 && !indices[1].empty())) { - #if !defined(CORRADE_TARGET_NACL_NEWLIB) && !defined(CORRADE_TARGET_ANDROID) - textureCoordinateIndices.push_back(std::stoul(indices[1]) - textureCoordinateIndexOffset); - #else - in.str(indices[1]); - in >> index; - textureCoordinateIndices.push_back(index - textureCoordinateIndexOffset); + textureCoordinateIndices.push_back( + #ifndef CORRADE_TARGET_ANDROID + std::stoul(indices[1]) + #else + std::strtoul(indices[1].data(), &end, 10) + #endif + - textureCoordinateIndexOffset); + + #ifdef CORRADE_TARGET_ANDROID + if(end == indices[1].data()) throw std::exception{}; #endif } /* Normal indices */ if(indices.size() == 3) { - #if !defined(CORRADE_TARGET_NACL_NEWLIB) && !defined(CORRADE_TARGET_ANDROID) - normalIndices.push_back(std::stoul(indices[2]) - normalIndexOffset); - #else - in.str(indices[2]); - in >> index; - normalIndices.push_back(index - normalIndexOffset); + normalIndices.push_back( + #ifndef CORRADE_TARGET_ANDROID + std::stoul(indices[2]) + #else + std::strtoul(indices[2].data(), &end, 10) + #endif + - normalIndexOffset); + + #ifdef CORRADE_TARGET_ANDROID + if(end == indices[2].data()) throw std::exception{}; #endif } } From 210949f2dded452276cd41266c3e244e8ae4038e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 16 Oct 2016 01:09:46 +0200 Subject: [PATCH 280/290] Math: long double is the same as double also on Android. --- src/Magnum/Math/Test/TypeTraitsTest.cpp | 10 +++++----- src/Magnum/Math/TypeTraits.h | 9 +++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/Magnum/Math/Test/TypeTraitsTest.cpp b/src/Magnum/Math/Test/TypeTraitsTest.cpp index cf7aa6ebe..f12c40a3e 100644 --- a/src/Magnum/Math/Test/TypeTraitsTest.cpp +++ b/src/Magnum/Math/Test/TypeTraitsTest.cpp @@ -70,21 +70,21 @@ struct { long double getStep(long double) const { return cStep; } } EqualsZeroData[EqualsZeroDataCount] = { {"", -3.141592653589793f, 5.0e-5f, -3.141592653589793, 5.0e-14, -3.141592653589793l, - #ifndef _MSC_VER + #if !defined(_MSC_VER) && !defined(CORRADE_TARGET_ANDROID) 5.0e-17l #else 5.0e-14 #endif }, {"small", 1.0e-6f, 5.0e-6f, -1.0e-15, 5.0e-15, 1.0e-18l, - #ifndef _MSC_VER + #if !defined(_MSC_VER) && !defined(CORRADE_TARGET_ANDROID) 5.0e-18l #else 5.0e-15 #endif }, {"large", 12345.0f, 0.2f, 12345678901234.0, 0.2, - #ifndef _MSC_VER + #if !defined(_MSC_VER) && !defined(CORRADE_TARGET_ANDROID) -12345678901234567.0l, #else -12345678901234.0l, @@ -154,9 +154,9 @@ void TypeTraitsTest::sizeOfLongDouble() { #ifdef CORRADE_TARGET_EMSCRIPTEN CORRADE_SKIP("Not defined in Emscripten."); #else - #ifdef _MSC_VER + #if defined(_MSC_VER) || defined(CORRADE_TARGET_ANDROID) CORRADE_COMPARE(sizeof(long double), 8); - CORRADE_EXPECT_FAIL("long double is equivalent to double on MSVC."); + CORRADE_EXPECT_FAIL("long double is equivalent to double on MSVC and Android."); #endif /* It's 80 bit, but has to be aligned somehow, so 128 bits / 16 bytes */ diff --git a/src/Magnum/Math/TypeTraits.h b/src/Magnum/Math/TypeTraits.h index ae42fdfe0..13d47bbde 100644 --- a/src/Magnum/Math/TypeTraits.h +++ b/src/Magnum/Math/TypeTraits.h @@ -59,12 +59,13 @@ for more headroom. They have "at least" 18 significant digits of precision, taking one digit less for more headroom. -@attention On MSVC the precision is the same as for doubles, because - they are internally the same type. Source: - https://msdn.microsoft.com/en-us/library/9cx8xs15.aspx +@attention On MSVC the precision is the same as for doubles, because they are + internally the same type (source: https://msdn.microsoft.com/en-us/library/9cx8xs15.aspx). + The same is apparently for @ref CORRADE_TARGET_ANDROID "Android", but I + couldn't find any source for that. */ #ifndef LONG_DOUBLE_EQUALITY_PRECISION -#ifndef _MSC_VER +#if !defined(_MSC_VER) && !defined(CORRADE_TARGET_ANDROID) #define LONG_DOUBLE_EQUALITY_PRECISION 1.0e-17l #else #define LONG_DOUBLE_EQUALITY_PRECISION 1.0e-14l From 69dfc39f30508addf363d76745315e8faaf2e9fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 16 Oct 2016 02:13:41 +0200 Subject: [PATCH 281/290] Math: don't compare const char* as pointers in test by accident. --- src/Magnum/Math/Test/TypeTraitsTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Math/Test/TypeTraitsTest.cpp b/src/Magnum/Math/Test/TypeTraitsTest.cpp index f12c40a3e..1ee4f0c21 100644 --- a/src/Magnum/Math/Test/TypeTraitsTest.cpp +++ b/src/Magnum/Math/Test/TypeTraitsTest.cpp @@ -165,8 +165,8 @@ void TypeTraitsTest::sizeOfLongDouble() { } void TypeTraitsTest::name() { - CORRADE_COMPARE(TypeTraits::name(), "UnsignedShort"); - CORRADE_COMPARE(TypeTraits::name(), "Float"); + CORRADE_COMPARE(TypeTraits::name(), std::string{"UnsignedShort"}); + CORRADE_COMPARE(TypeTraits::name(), std::string{"Float"}); } template void TypeTraitsTest::equalsIntegral() { From 097134f88484389b8137ec2132b84e6cff1eb8f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 18 Oct 2016 22:22:25 +0200 Subject: [PATCH 282/290] TgaImageConverter: removed obsolete configuration header. --- .../TgaImageConverter/Test/CMakeLists.txt | 4 --- .../Test/TgaImageConverterTest.cpp | 2 -- .../TgaImageConverter/Test/configure.h.cmake | 26 ------------------- 3 files changed, 32 deletions(-) delete mode 100644 src/MagnumPlugins/TgaImageConverter/Test/configure.h.cmake diff --git a/src/MagnumPlugins/TgaImageConverter/Test/CMakeLists.txt b/src/MagnumPlugins/TgaImageConverter/Test/CMakeLists.txt index aa1cb434a..ed5f15626 100644 --- a/src/MagnumPlugins/TgaImageConverter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/TgaImageConverter/Test/CMakeLists.txt @@ -23,11 +23,7 @@ # DEALINGS IN THE SOFTWARE. # -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/configure.h) - corrade_add_test(TgaImageConverterTest TgaImageConverterTest.cpp LIBRARIES MagnumTgaImageConverterTestLib MagnumTgaImporterTestLib) -target_include_directories(TgaImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) # On Win32 we need to avoid dllimporting TgaImporter and TgaImageConverterTest # symbols, because it would search for the symbols in some DLL even though they # were linked statically. However it apparently doesn't matter that they were diff --git a/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp b/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp index 6b2628058..b05545083 100644 --- a/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp +++ b/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp @@ -36,8 +36,6 @@ #include "MagnumPlugins/TgaImageConverter/TgaImageConverter.h" #include "MagnumPlugins/TgaImporter/TgaImporter.h" -#include "configure.h" - namespace Magnum { namespace Trade { namespace Test { class TgaImageConverterTest: public TestSuite::Tester { diff --git a/src/MagnumPlugins/TgaImageConverter/Test/configure.h.cmake b/src/MagnumPlugins/TgaImageConverter/Test/configure.h.cmake deleted file mode 100644 index c2d991989..000000000 --- a/src/MagnumPlugins/TgaImageConverter/Test/configure.h.cmake +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of Magnum. - - Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 - Vladimír Vondruš - - 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. -*/ - -#define TGAIMAGECONVERTER_TEST_DIR "${CMAKE_CURRENT_BINARY_DIR}" From ea7fce2e7bdc2ebb82c1f747f0516e3830c6eaee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 18 Oct 2016 22:25:58 +0200 Subject: [PATCH 283/290] OpenGL: fix the README links. Markdown doesn't work this way. --- src/MagnumExternal/OpenGL/GL/README.md | 7 ++++--- src/MagnumExternal/OpenGL/GLES2/README.md | 6 +++--- src/MagnumExternal/OpenGL/GLES3/README.md | 7 ++++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/MagnumExternal/OpenGL/GL/README.md b/src/MagnumExternal/OpenGL/GL/README.md index 3e57e6550..c879d6f83 100644 --- a/src/MagnumExternal/OpenGL/GL/README.md +++ b/src/MagnumExternal/OpenGL/GL/README.md @@ -1,8 +1,9 @@ OpenGL header and extension loader is generated using flextGL, get it at -[](https://github.com/ginkgo/flextGL). +https://github.com/ginkgo/flextGL. -See [](extensions.txt) for requested version and a list of non-core extensions. -Call `flextGLgen.py` in this directory with the following arguments: +See [extensions.txt](extensions.txt) for requested version and a list of +non-core extensions. Call `flextGLgen.py` in this directory with the following +arguments: .../flextGLgen.py -D . -t . extensions.txt diff --git a/src/MagnumExternal/OpenGL/GLES2/README.md b/src/MagnumExternal/OpenGL/GLES2/README.md index 8750a9b45..4ea572a1b 100644 --- a/src/MagnumExternal/OpenGL/GLES2/README.md +++ b/src/MagnumExternal/OpenGL/GLES2/README.md @@ -1,9 +1,9 @@ OpenGL header and extension loader is generated using flextGL, get it at https://github.com/ginkgo/flextGL. -See [extensions.txt](extensions.txt) for requested version and a list of non-core extensions. -Call `flextGLgen.py` in this directory with the following arguments to generate -files for generic GLES2 implementations: +See [extensions.txt](extensions.txt) for requested version and a list of +non-core extensions. Call `flextGLgen.py` in this directory with the following +arguments to generate files for generic GLES2 implementations: .../flextGLgen.py -D . -t . extensions.txt diff --git a/src/MagnumExternal/OpenGL/GLES3/README.md b/src/MagnumExternal/OpenGL/GLES3/README.md index 8aa7a5d6d..e5e10d786 100644 --- a/src/MagnumExternal/OpenGL/GLES3/README.md +++ b/src/MagnumExternal/OpenGL/GLES3/README.md @@ -1,8 +1,9 @@ OpenGL header and extension loader is generated using flextGL, get it at -[](https://github.com/ginkgo/flextGL). +https://github.com/ginkgo/flextGL. -See [](extensions.txt) for requested version and a list of non-core extensions. -Call `flextGLgen.py` in this directory with the following arguments: +See [extensions.txt](extensions.txt) for requested version and a list of +non-core extensions. Call `flextGLgen.py` in this directory with the following +arguments: .../flextGLgen.py -D . -t . extensions.txt From 5fcdd48808fb2540e5ba1dd1a11c342ccd5926dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 19 Oct 2016 11:33:56 +0200 Subject: [PATCH 284/290] Math: clarify what Matrix4::lookAt() does. --- src/Magnum/Math/Matrix4.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Magnum/Math/Matrix4.h b/src/Magnum/Math/Matrix4.h index 8313aa081..fda1c3a6d 100644 --- a/src/Magnum/Math/Matrix4.h +++ b/src/Magnum/Math/Matrix4.h @@ -341,6 +341,12 @@ template class Matrix4: public Matrix4x4 { * @param target Location towards which the matrix is oriented * @param up Vector as a guide of which way is up (should not be * the same direction as `target - eye`) + * + * @attention This function transforms an object so it's at @p eye + * position and oriented towards @p target, it does *not* produce + * a camera matrix. If you want to get the same what equivalent + * call to the well-known `gluLookAt()` would produce, invert the + * result using @ref invertedRigid(). */ static Matrix4 lookAt(const Vector3& eye, const Vector3& target, const Vector3& up); From 90791c370a801659c4a49aacc9f49b30b195bf8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 21 Oct 2016 23:26:14 +0200 Subject: [PATCH 285/290] Test that nothing is added before user-specified shader version directive. Fails. --- src/Magnum/Test/ShaderGLTest.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/Magnum/Test/ShaderGLTest.cpp b/src/Magnum/Test/ShaderGLTest.cpp index be28f5345..f28601912 100644 --- a/src/Magnum/Test/ShaderGLTest.cpp +++ b/src/Magnum/Test/ShaderGLTest.cpp @@ -45,6 +45,7 @@ struct ShaderGLTest: AbstractOpenGLTester { void label(); void addSource(); + void addSourceNoVersion(); void addFile(); void compile(); }; @@ -58,6 +59,7 @@ ShaderGLTest::ShaderGLTest() { &ShaderGLTest::label, &ShaderGLTest::addSource, + &ShaderGLTest::addSourceNoVersion, &ShaderGLTest::addFile, &ShaderGLTest::compile}); } @@ -183,6 +185,36 @@ void ShaderGLTest::addSource() { #endif } +void ShaderGLTest::addSourceNoVersion() { + Shader shader(Version::None, Shader::Type::Fragment); + + #ifndef MAGNUM_TARGET_GLES + shader.addSource("#version 120\n"); + #else + shader.addSource("#version 100\n"); + #endif + shader.addSource("#define FOO BAR\n") + .addSource("void main() {}\n"); + + #ifndef MAGNUM_TARGET_GLES + CORRADE_COMPARE(shader.sources(), (std::vector{ + "#version 120\n", + "#line 1 1\n", + "#define FOO BAR\n", + "#line 1 2\n", + "void main() {}\n" + })); + #else + CORRADE_COMPARE(shader.sources(), (std::vector{ + "#version 100\n", + "#line 1 1\n", + "#define FOO BAR\n", + "#line 1 2\n", + "void main() {}\n" + })); + #endif +} + void ShaderGLTest::addFile() { #ifndef MAGNUM_TARGET_GLES Shader shader(Version::GL210, Shader::Type::Fragment); From db5e0f4e27726a1bcda64edb81db5a482768e05c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 21 Oct 2016 23:27:26 +0200 Subject: [PATCH 286/290] Don't add anything before user-specified shader version directive. Thanks @acterhd for the report. --- src/Magnum/Shader.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Magnum/Shader.cpp b/src/Magnum/Shader.cpp index 9a4ef5a8d..eb2a0f125 100644 --- a/src/Magnum/Shader.cpp +++ b/src/Magnum/Shader.cpp @@ -784,9 +784,16 @@ Shader& Shader::addSource(std::string source) { converter << (_sources.size()+1)/2; #endif - /* Fix line numbers, so line 41 of third added file is marked as 3(41). - Source 0 is the #version string added in constructor. */ - _sources.push_back("#line 1 " + + /* Fix line numbers, so line 41 of third added file is marked as 3(41) + in case shader version was not Version::None, because then source 0 + is the #version directive added in constructur. + + If version was Version::None, line 41 of third added file is marked + as 2(41). We apparently can't add even the #line directive before + the potential `#version` directive -- in that case the first source + file is not marked with any file number, but that's equivalent to + the default where first file is marked as 0. */ + if(!_sources.empty()) _sources.push_back("#line 1 " + #if !defined(CORRADE_TARGET_NACL_NEWLIB) && !defined(CORRADE_TARGET_ANDROID) std::to_string((_sources.size()+1)/2) + #else From ec8369724288ecbe8ae39fd43deee7a8339bceb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 21 Oct 2016 23:56:03 +0200 Subject: [PATCH 287/290] Test that it's possible to compile a single-file shader w/o version. It asserts. I'm having a really bad day today. --- src/Magnum/Test/ShaderGLTest.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Test/ShaderGLTest.cpp b/src/Magnum/Test/ShaderGLTest.cpp index f28601912..b2473bf22 100644 --- a/src/Magnum/Test/ShaderGLTest.cpp +++ b/src/Magnum/Test/ShaderGLTest.cpp @@ -48,6 +48,7 @@ struct ShaderGLTest: AbstractOpenGLTester { void addSourceNoVersion(); void addFile(); void compile(); + void compileNoVersion(); }; ShaderGLTest::ShaderGLTest() { @@ -61,7 +62,8 @@ ShaderGLTest::ShaderGLTest() { &ShaderGLTest::addSource, &ShaderGLTest::addSourceNoVersion, &ShaderGLTest::addFile, - &ShaderGLTest::compile}); + &ShaderGLTest::compile, + &ShaderGLTest::compileNoVersion}); } void ShaderGLTest::construct() { @@ -261,6 +263,16 @@ void ShaderGLTest::compile() { CORRADE_VERIFY(!shader2.compile()); } +void ShaderGLTest::compileNoVersion() { + Shader shader(Version::None, Shader::Type::Fragment); + #ifndef MAGNUM_TARGET_GLES + shader.addSource("#version 120\nvoid main() {}\n"); + #else + shader.addSource("#version 100\nvoid main() {}\n"); + #endif + CORRADE_VERIFY(shader.compile()); +} + }} MAGNUM_GL_TEST_MAIN(Magnum::Test::ShaderGLTest) From 94a3ae8174e0d902f9d81b80b1ce538e8ca32e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 22 Oct 2016 00:06:05 +0200 Subject: [PATCH 288/290] Final attempt to fix shaders w/o version directive. Took me insane amount of time. I blame those 12-hour working days. --- src/Magnum/Shader.cpp | 10 +++++++--- src/Magnum/Shader.h | 4 +++- src/Magnum/Test/ShaderGLTest.cpp | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Magnum/Shader.cpp b/src/Magnum/Shader.cpp index eb2a0f125..6d596a6fe 100644 --- a/src/Magnum/Shader.cpp +++ b/src/Magnum/Shader.cpp @@ -786,13 +786,15 @@ Shader& Shader::addSource(std::string source) { /* Fix line numbers, so line 41 of third added file is marked as 3(41) in case shader version was not Version::None, because then source 0 - is the #version directive added in constructur. + is the #version directive added in constructor. If version was Version::None, line 41 of third added file is marked as 2(41). We apparently can't add even the #line directive before the potential `#version` directive -- in that case the first source - file is not marked with any file number, but that's equivalent to - the default where first file is marked as 0. */ + file is not marked with any file number, thus having number 0. In + order to avoid complex logic in compile() where we assert for at + least some user-provided source, an empty string is added here + instead. */ if(!_sources.empty()) _sources.push_back("#line 1 " + #if !defined(CORRADE_TARGET_NACL_NEWLIB) && !defined(CORRADE_TARGET_ANDROID) std::to_string((_sources.size()+1)/2) + @@ -800,6 +802,8 @@ Shader& Shader::addSource(std::string source) { converter.str() + #endif '\n'); + else _sources.emplace_back(); + _sources.push_back(std::move(source)); } diff --git a/src/Magnum/Shader.h b/src/Magnum/Shader.h index 67347eaa7..c3678dff2 100644 --- a/src/Magnum/Shader.h +++ b/src/Magnum/Shader.h @@ -595,7 +595,9 @@ class MAGNUM_EXPORT Shader: public AbstractObject { * * Adds given source to source list, preceeded with @c \#line directive * marking first line of the source as `n(1)` where n is number of - * added source. If passed string is empty, the function does nothing. + * added source. The source number `0` is @c \#version directive added + * in constructor, if any. If passed string is empty, the function does + * nothing. * @see @ref addFile() */ Shader& addSource(std::string source); diff --git a/src/Magnum/Test/ShaderGLTest.cpp b/src/Magnum/Test/ShaderGLTest.cpp index b2473bf22..519bf35a1 100644 --- a/src/Magnum/Test/ShaderGLTest.cpp +++ b/src/Magnum/Test/ShaderGLTest.cpp @@ -200,6 +200,7 @@ void ShaderGLTest::addSourceNoVersion() { #ifndef MAGNUM_TARGET_GLES CORRADE_COMPARE(shader.sources(), (std::vector{ + "", "#version 120\n", "#line 1 1\n", "#define FOO BAR\n", @@ -208,6 +209,7 @@ void ShaderGLTest::addSourceNoVersion() { })); #else CORRADE_COMPARE(shader.sources(), (std::vector{ + "", "#version 100\n", "#line 1 1\n", "#define FOO BAR\n", From 842e29fd337efd62a4c91a63f5265f4957fb8231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 24 Oct 2016 12:35:43 +0200 Subject: [PATCH 289/290] YES, of course we build green also on Android. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 197edf772..4d9c4c22b 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Platforms: * **Windows** on both MSVC and MinGW, natively or using ANGLE (through SDL2, GLFW or GLUT toolkit) [![Build Status](https://ci.appveyor.com/api/projects/status/5b477m034cfaskse/branch/master?svg=true)](https://ci.appveyor.com/project/mosra/magnum/branch/master) * **OS X** (through SDL2 or GLFW toolkit) [![Build Status](https://travis-ci.org/mosra/magnum.svg?branch=master)](https://travis-ci.org/mosra/magnum) * **iOS** (through SDL2 toolkit) [![Build Status](https://travis-ci.org/mosra/magnum.svg?branch=master)](https://travis-ci.org/mosra/magnum) -* **Android** 2.3 (API Level 9) and higher +* **Android** 2.3 (API Level 9) and higher [![Build Status](https://travis-ci.org/mosra/magnum.svg?branch=master)](https://travis-ci.org/mosra/magnum) * **Windows RT** (Store/Phone) using ANGLE (through SDL2 toolkit) [![Build Status](https://ci.appveyor.com/api/projects/status/5b477m034cfaskse/branch/master?svg=true)](https://ci.appveyor.com/project/mosra/magnum/branch/master) * **Google Chrome** (through [Native Client](https://developers.google.com/native-client/), both `newlib` and `glibc` toolchains are supported) From ae24ddd39048c6ef7c6b06f9f70bee9d93f999c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 26 Oct 2016 20:17:44 +0200 Subject: [PATCH 290/290] doc: provide link to SDL2 prebuilts to make it easier for Windows users. --- doc/getting-started.dox | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/getting-started.dox b/doc/getting-started.dox index 58534ab1b..3989bdd09 100644 --- a/doc/getting-started.dox +++ b/doc/getting-started.dox @@ -169,10 +169,11 @@ subdirectory of the build dir: cmake --build . ./src/MyApplication -On Windows you can use either MSVC or MinGW-w64 compiler. It's then up to you -whether you will use command-line, QtCreator or Visual Studio. With Visual -Studio the most straightforward way to create the project file is via the -command-line: +On Windows you can use either MSVC or MinGW-w64 compiler and prebuilt SDL2 +binaries can be downloaded at https://libsdl.org/download-2.0.php. It's then up +to you whether you will use command-line, QtCreator or Visual Studio. With +Visual Studio the most straightforward way to create the project file is via +the command-line: mkdir build && cd build cmake .. -DWITH_SDL2APPLICATION=ON

~P=pK@OIP|AOi?CXPzos^Pp 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 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/surround51Channel16.wav b/src/MagnumPlugins/WavAudioImporter/Test/surround51Channel16.wav index 0e38025966749196cb52eb630866342386de0c98..e051095fa7756f0de9dcf587e14b9e74eec354e5 100644 GIT binary patch delta 63 zcmew}QRI;VdyuD_Ta*C9M0Qh6AJ55hzw>!N&*NOz>7U=NU=hbZyn`u}&?!JzBYO$9CP@x9(c`=JsvcJyH3#4&7RJY2Uh4o0i>Lmu}Rtdxut) z8{KkG>3VG*?9#H!6P0VVYu&QLzvW#k|DW)VE*;ypeyCfeuHD*qx}{#dI~y1N*B$@) z`)36H8G(OB;GYrrX9WHkfqzEepAqEy6dt8-=U5D#9-3FZaIpyZeO;xB|l6TsPrA+#kY}Kk6Qpe4$$?e4V>axS4Av zyw^9-@uDo;_x`x8NTrc4+u8VLN$#AvAh|%eVp37~ z?Bs0WqDfKVN=YT*b#9&7{MG#`e8e3Q?v?bC{;kQa!Y*;b`7-%3x&7&sbdsF?S)MGH zynE7J_^#wG;oZq@;eE+I;d_#Mgf}IdgfGlosQX@(TqXH)$#cRxk{!Z)mOPm}y0&7b zqVQkIU(!D_bEf2ROIx$)u$8J0u;1 zC%eh|U8*KkC9jZF5dOjaAf42u!ZY1W;WLsmqoC)#hpTG~wlDxpde*`!?JRmrhsHRd}^oE!@tu6Mn_KBAhi@;ijgkF#Be6 z{&N41Z_GEj&^(v(FZZvNX_X7j-8uhq|5}^YxiIHx|MR@nOf|`0HZT8A%r^PF*PH95 zU)q!we!;vTT*wp>u4<|Z+yC=e{7aC@`Iq~*F>Z{xxPR;~JTwj!?i>3GzZu^YJ};gp zJUWaHx$P8-#U#(fjPS59Ogh)a>m(l=#!6m3lowtVRtc{OYlN$XYQil-3t=C;aM#dP z_|$N!aGTIZnD?C#W=LK))D#A0oWV?-D*IoTF<$_n%9?(ytVL%0DGM%nuW0pYQSaNIuC= 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 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/surround71Channel24.wav b/src/MagnumPlugins/WavAudioImporter/Test/surround71Channel24.wav index a9419a4f3168d8dc93e60145f30473dac0b619bf..23646e204d4d8bd7c74155c2817a5ef951c6ff6e 100644 GIT binary patch delta 86 zcmaFye=Ey11@<6MH#a{4hKcM-)@%$6j0_+kz|g?Ju!_NAcA<}FaEKI8#M95s-!s@P lgb&E}Ni0h`~Zs^74HB5 literal 9273320 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

~P=pK@OIP|AOi?CXPzos^Pp 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