From 0d671c823cfa1a3beff09b5f0d0a8f16fdf4c7ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 3 Sep 2019 18:21:21 +0200 Subject: [PATCH] python: wire in the WindowlessWglApplication. --- src/python/magnum/CMakeLists.txt | 8 ++- src/python/magnum/__init__.py | 4 +- src/python/magnum/platform/CMakeLists.txt | 10 +++ src/python/magnum/platform/__init__.py | 7 +- src/python/magnum/platform/wgl.cpp | 81 +++++++++++++++++++++++ 5 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 src/python/magnum/platform/wgl.cpp diff --git a/src/python/magnum/CMakeLists.txt b/src/python/magnum/CMakeLists.txt index 548c466..6bf30bf 100644 --- a/src/python/magnum/CMakeLists.txt +++ b/src/python/magnum/CMakeLists.txt @@ -35,7 +35,8 @@ find_package(Magnum COMPONENTS GlfwApplication Sdl2Application WindowlessEglApplication - WindowlessGlxApplication) + WindowlessGlxApplication + WindowlessWglApplication) set(magnum_SRCS magnum.cpp @@ -194,6 +195,11 @@ else() list(APPEND magnum_SRCS platform/glx.cpp) list(APPEND magnum_LIBS Magnum::WindowlessGlxApplication) endif() + + if(Magnum_WindowlessWglApplication_FOUND) + list(APPEND magnum_SRCS platform/wgl.cpp) + list(APPEND magnum_LIBS Magnum::WindowlessWglApplication) + endif() endif() pybind11_add_module(magnum SYSTEM ${magnum_SRCS}) diff --git a/src/python/magnum/__init__.py b/src/python/magnum/__init__.py index e3f99cf..fa4244a 100644 --- a/src/python/magnum/__init__.py +++ b/src/python/magnum/__init__.py @@ -40,7 +40,7 @@ for i in ['gl', 'meshtools', 'platform', 'primitives', 'scenegraph', 'shaders', # Platform has subpackages if 'platform' in globals(): - for i in ['glfw', 'sdl2', 'egl', 'glx']: + for i in ['glfw', 'sdl2', 'glx', 'wgl', 'egl']: if hasattr(platform, i): sys.modules['magnum.platform.' + i] = getattr(platform, i) # Bring one application implementation directly into the platform module. @@ -53,6 +53,8 @@ if 'platform' in globals(): # Same for windowless apps if hasattr(platform, 'glx'): platform.WindowlessApplication = platform.glx.WindowlessApplication + elif hasattr(platform, 'wgl'): + platform.WindowlessApplication = platform.wgl.WindowlessApplication elif hasattr(platform, 'egl'): platform.WindowlessApplication = platform.egl.WindowlessApplication diff --git a/src/python/magnum/platform/CMakeLists.txt b/src/python/magnum/platform/CMakeLists.txt index c883fb1..af3ce0a 100644 --- a/src/python/magnum/platform/CMakeLists.txt +++ b/src/python/magnum/platform/CMakeLists.txt @@ -63,6 +63,16 @@ if(NOT MAGNUM_BUILD_STATIC) OUTPUT_NAME "glx" LIBRARY_OUTPUT_DIRECTORY ${output_dir}/magnum/platform) endif() + + if(Magnum_WindowlessWglApplication_FOUND) + pybind11_add_module(magnum_platform_wgl SYSTEM wgl.cpp) + target_link_libraries(magnum_platform_wgl PRIVATE Magnum::WindowlessWglApplication) + target_include_directories(magnum_platform_wgl PRIVATE ${PROJECT_SOURCE_DIR}/src/python) + set_target_properties(magnum_platform_wgl PROPERTIES + FOLDER "python/platform" + OUTPUT_NAME "wgl" + LIBRARY_OUTPUT_DIRECTORY ${output_dir}/magnum/platform) + endif() endif() file(GENERATE OUTPUT ${output_dir}/magnum/platform/__init__.py diff --git a/src/python/magnum/platform/__init__.py b/src/python/magnum/platform/__init__.py index afb7f66..64991c3 100644 --- a/src/python/magnum/platform/__init__.py +++ b/src/python/magnum/platform/__init__.py @@ -32,9 +32,12 @@ try: from .glx import WindowlessApplication except ImportError: # pragma: no cover try: - from .egl import WindowlessApplication + from .wgl import WindowlessApplication except ImportError: - pass + try: + from .egl import WindowlessApplication + except ImportError: + pass try: from .sdl2 import Application diff --git a/src/python/magnum/platform/wgl.cpp b/src/python/magnum/platform/wgl.cpp new file mode 100644 index 0000000..89dbbae --- /dev/null +++ b/src/python/magnum/platform/wgl.cpp @@ -0,0 +1,81 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + 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/bootstrap.h" +#include "magnum/platform/windowlessapplication.h" + +namespace magnum { namespace platform { + +namespace { + int argc = 0; +} + +void wgl(py::module& m) { + m.doc() = "WGL-based platform integration"; + + struct PyWindowlessApplication: Platform::WindowlessApplication { + explicit PyWindowlessApplication(const Configuration& configuration = Configuration{}): Platform::WindowlessApplication{Arguments{argc, nullptr}, configuration} {} + + int exec() override { + #ifdef __clang__ + /* ugh pybind don't tell me I AM THE FIRST ON EARTH to get a + warning here. Why there's no PYBIND11_OVERLOAD_PURE_NAME_ARG() + variant *with* arguments and one without? */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" + #endif + PYBIND11_OVERLOAD_PURE_NAME( + int, + PyWindowlessApplication, + "exec", + ); + #ifdef __clang__ + #pragma GCC diagnostic pop + #endif + } + + /* The base doesn't have a virtual destructor because in C++ it's never + deleted through a pointer to the base. Here we need it, though. */ + virtual ~PyWindowlessApplication() {} + }; + + py::class_ windowlessWglApplication{m, "WindowlessApplication", "Windowless WGL application"}; + + windowlessapplication(windowlessWglApplication); +} + +}} + +#ifndef MAGNUM_BUILD_STATIC +/* TODO: remove declaration when https://github.com/pybind/pybind11/pull/1863 + is released */ +extern "C" PYBIND11_EXPORT PyObject* PyInit_wgl(); +PYBIND11_MODULE(wgl, m) { + magnum::platform::wgl(m); +} +#endif