Browse Source
Only the double ones, exposed as floats, because the extra ALU required by doubles is negligible to function call overhead. It'll be different for non-scalar types, but here I use this.pull/1/head
17 changed files with 2198 additions and 0 deletions
@ -0,0 +1,46 @@
|
||||
# |
||||
# This file is part of Magnum. |
||||
# |
||||
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
# Vladimír Vondruš <mosra@centrum.cz> |
||||
# |
||||
# 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. |
||||
# |
||||
|
||||
cmake_minimum_required(VERSION 3.1) |
||||
|
||||
# Configuration fails on < 3.4 if only C++ is enabled (CheckFunctionExists |
||||
# macro called from FindX11) |
||||
if(NOT CMAKE_VERSION VERSION_LESS 3.4.0) |
||||
set(LANG CXX) |
||||
endif() |
||||
project(MagnumBindings ${LANG}) |
||||
|
||||
# Use folders for nice tree in Visual Studio and XCode |
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON) |
||||
|
||||
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/modules/" ${CMAKE_MODULE_PATH}) |
||||
find_package(Magnum REQUIRED) |
||||
|
||||
include(CMakeDependentOption) |
||||
|
||||
# Libraries to build |
||||
option(WITH_PYTHON "Build Python bindings" OFF) |
||||
|
||||
add_subdirectory(src) |
||||
@ -0,0 +1,513 @@
|
||||
#.rst: |
||||
# Find Corrade |
||||
# ------------ |
||||
# |
||||
# Finds the Corrade library. Basic usage:: |
||||
# |
||||
# find_package(Corrade REQUIRED) |
||||
# |
||||
# This module tries to find the base Corrade library and then defines the |
||||
# following: |
||||
# |
||||
# Corrade_FOUND - Whether the base library was found |
||||
# CORRADE_LIB_SUFFIX_MODULE - Path to CorradeLibSuffix.cmake module |
||||
# |
||||
# This command will try to find only the base library, not the optional |
||||
# components, which are: |
||||
# |
||||
# Containers - Containers library |
||||
# PluginManager - PluginManager library |
||||
# TestSuite - TestSuite library |
||||
# Utility - Utility library |
||||
# rc - corrade-rc executable |
||||
# |
||||
# Example usage with specifying additional components is:: |
||||
# |
||||
# find_package(Corrade REQUIRED Utility TestSuite) |
||||
# |
||||
# For each component is then defined: |
||||
# |
||||
# Corrade_*_FOUND - Whether the component was found |
||||
# Corrade::* - Component imported target |
||||
# |
||||
# The package is found if either debug or release version of each library is |
||||
# found. If both debug and release libraries are found, proper version is |
||||
# chosen based on actual build configuration of the project (i.e. Debug build |
||||
# is linked to debug libraries, Release build to release libraries). |
||||
# |
||||
# Corrade conditionally defines ``CORRADE_IS_DEBUG_BUILD`` preprocessor |
||||
# variable in case build configuration is ``Debug`` (not Corrade itself, but |
||||
# build configuration of the project using it). Useful e.g. for selecting |
||||
# proper plugin directory. |
||||
# |
||||
# Corrade defines the following custom target properties: |
||||
# |
||||
# CORRADE_CXX_STANDARD - C++ standard to require when compiling given |
||||
# target. Does nothing if :variable:`CMAKE_CXX_FLAGS` already contains |
||||
# particular standard setting flag or if given target contains |
||||
# :prop_tgt:`CMAKE_CXX_STANDARD` property. Allowed value is 11, 14 or 17. |
||||
# INTERFACE_CORRADE_CXX_STANDARD - C++ standard to require when using given |
||||
# target. Does nothing if :variable:`CMAKE_CXX_FLAGS` already contains |
||||
# particular standard setting flag or if given target contains |
||||
# :prop_tgt:`CMAKE_CXX_STANDARD` property. Allowed value is 11, 14 or 17. |
||||
# CORRADE_USE_PEDANTIC_FLAGS - Enable additional compiler/linker flags. |
||||
# Boolean. |
||||
# |
||||
# These properties are inherited from directory properties, meaning that if you |
||||
# set them on directories, they get implicitly set on all targets in given |
||||
# directory (with a possibility to do target-specific overrides). All Corrade |
||||
# libraries have the :prop_tgt:`INTERFACE_CORRADE_CXX_STANDARD` property set to |
||||
# 11, meaning that you will always have at least C++11 enabled once you link to |
||||
# any Corrade library. |
||||
# |
||||
# Features of found Corrade library are exposed in these variables: |
||||
# |
||||
# CORRADE_MSVC2017_COMPATIBILITY - Defined if compiled with compatibility |
||||
# mode for MSVC 2017 |
||||
# CORRADE_MSVC2015_COMPATIBILITY - Defined if compiled with compatibility |
||||
# mode for MSVC 2015 |
||||
# CORRADE_BUILD_DEPRECATED - Defined if compiled with deprecated APIs |
||||
# included |
||||
# CORRADE_BUILD_STATIC - Defined if compiled as static libraries. |
||||
# Default are shared libraries. |
||||
# CORRADE_TARGET_UNIX - Defined if compiled for some Unix flavor |
||||
# (Linux, BSD, macOS) |
||||
# CORRADE_TARGET_APPLE - Defined if compiled for Apple platforms |
||||
# 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_EMSCRIPTEN - Defined if compiled for Emscripten |
||||
# CORRADE_TARGET_ANDROID - Defined if compiled for Android |
||||
# CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT - Defined if PluginManager |
||||
# doesn't support dynamic plugin loading due to platform limitations |
||||
# CORRADE_TESTSUITE_TARGET_XCTEST - Defined if TestSuite is targetting Xcode |
||||
# XCTest |
||||
# CORRADE_UTILITY_USE_ANSI_COLORS - Defined if ANSI escape sequences are used |
||||
# for colored output with Utility::Debug on Windows |
||||
# |
||||
# Additionally these variables are defined for internal usage: |
||||
# |
||||
# CORRADE_INCLUDE_DIR - Root include dir |
||||
# CORRADE_*_LIBRARY_DEBUG - Debug version of given library, if found |
||||
# CORRADE_*_LIBRARY_RELEASE - Release version of given library, if found |
||||
# CORRADE_*_EXECUTABLE - Location of given executable, if found |
||||
# 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 |
||||
# definitions used for targets with :prop_tgt:`CORRADE_USE_PEDANTIC_FLAGS` |
||||
# enabled |
||||
# |
||||
# Workflows without :prop_tgt:`IMPORTED` targets are deprecated and the |
||||
# following variables are included just for backwards compatibility and only if |
||||
# :variable:`CORRADE_BUILD_DEPRECATED` is enabled: |
||||
# |
||||
# CORRADE_CXX_FLAGS - Pedantic compile flags. Use |
||||
# :prop_tgt:`CORRADE_USE_PEDANTIC_FLAGS` property or |
||||
# :variable:`CORRADE_PEDANTIC_COMPILER_DEFINITIONS` / |
||||
# :variable:`CORRADE_PEDANTIC_COMPILER_OPTIONS` list variables instead. |
||||
# |
||||
# Corrade provides these macros and functions: |
||||
# |
||||
# .. command:: corrade_add_test |
||||
# |
||||
# Add unit test using Corrade's TestSuite:: |
||||
# |
||||
# corrade_add_test(<test name> |
||||
# <sources>... |
||||
# [LIBRARIES <libraries>...] |
||||
# [FILES <files>...] |
||||
# [ARGUMENTS <arguments>...]) |
||||
# |
||||
# Test name is also executable name. You can use ``LIBRARIES`` to specify |
||||
# libraries to link with instead of using :command:`target_link_libraries()`. |
||||
# The ``Corrade::TestSuite`` target is linked automatically to each test. Note |
||||
# that the :command:`enable_testing()` function must be called explicitly. |
||||
# Arguments passed after ``ARGUMENTS`` will be appended to the test |
||||
# command line. ``ARGUMENTS`` are supported everywhere except when |
||||
# ``CORRADE_TESTSUITE_TARGET_XCTEST`` is enabled. |
||||
# |
||||
# You can list files needed by the test in the ``FILES`` section. If given |
||||
# filename is relative, it is treated relatively to `CMAKE_CURRENT_SOURCE_DIR`. |
||||
# 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. In case of Emscripten and Android, if the file is absolute or |
||||
# contains ``..``, only the leaf name is used. Alternatively you can have a |
||||
# filename formatted as ``<input>@<output>``, in which case the ``<input>`` is |
||||
# treated as local filesystem location and ``<output>`` as remote/virtual |
||||
# filesystem location. The remote location can't be absolute or contain ``..`` |
||||
# / ``@`` characters. |
||||
# |
||||
# 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` |
||||
# to change it to something else. |
||||
# |
||||
# .. command:: corrade_add_resource |
||||
# |
||||
# Compile data resources into application binary:: |
||||
# |
||||
# corrade_add_resource(<name> <resources.conf>) |
||||
# |
||||
# Depends on ``Corrade::rc``, which is part of Corrade utilities. This command |
||||
# generates resource data using given configuration file in current build |
||||
# directory. Argument name is name under which the resources can be explicitly |
||||
# loaded. Variable ``<name>`` contains compiled resource filename, which is |
||||
# then used for compiling library / executable. On CMake >= 3.1 the |
||||
# `resources.conf` file can contain UTF-8-encoded filenames. Example usage:: |
||||
# |
||||
# corrade_add_resource(app_resources resources.conf) |
||||
# add_executable(app source1 source2 ... ${app_resources}) |
||||
# |
||||
# .. command:: corrade_add_plugin |
||||
# |
||||
# Add dynamic plugin:: |
||||
# |
||||
# corrade_add_plugin(<plugin name> |
||||
# "<debug binary install dir>;<debug library install dir>" |
||||
# "<release binary install dir>;<release library install dir>" |
||||
# <metadata file> |
||||
# <sources>...) |
||||
# |
||||
# The macro adds preprocessor directive ``CORRADE_DYNAMIC_PLUGIN``. Additional |
||||
# libraries can be linked in via :command:`target_link_libraries(plugin_name ...) <target_link_libraries>`. |
||||
# On DLL platforms, the plugin DLLs and metadata files are put into |
||||
# ``<debug binary install dir>``/``<release binary install dir>`` and the |
||||
# ``*.lib`` files into ``<debug library install dir>``/``<release library install dir>``. |
||||
# On non-DLL platforms everything is put into ``<debug library install dir>``/ |
||||
# ``<release library install dir>``. |
||||
# |
||||
# corrade_add_plugin(<plugin name> |
||||
# <debug install dir> |
||||
# <release install dir> |
||||
# <metadata file> |
||||
# <sources>...) |
||||
# |
||||
# Unline the above version this puts everything into ``<debug install dir>`` on |
||||
# both DLL and non-DLL platforms. If ``<debug install dir>`` 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(<plugin name> |
||||
# "<binary install dir>;<library install dir>" |
||||
# <metadata file> |
||||
# <sources>...) |
||||
# |
||||
# The macro adds preprocessor directive ``CORRADE_STATIC_PLUGIN``. Additional |
||||
# libraries can be linked in via :command:`target_link_libraries(plugin_name ...) <target_link_libraries>`. |
||||
# The ``<binary install dir>`` is ignored and included just for compatibility |
||||
# with the :command:`corrade_add_plugin` command, everything is installed into |
||||
# ``<library install dir>``. 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(<plugin name> |
||||
# <install dir> |
||||
# <metadata file> |
||||
# <sources>...) |
||||
# |
||||
# Equivalent to the above with ``<library install dir>`` set to ``<install dir>``. |
||||
# If ``<install dir>`` is set to :variable:`CMAKE_CURRENT_BINARY_DIR` (e.g. for |
||||
# testing purposes), no installation rules are added. |
||||
# |
||||
# .. command:: corrade_find_dlls_for_libs |
||||
# |
||||
# Find corresponding DLLs for library files:: |
||||
# |
||||
# corrade_find_dlls_for_libs(<output variable> <libs>...) |
||||
# |
||||
# Available only on Windows, for all ``*.lib`` files tries to find |
||||
# corresponding DLL file. Useful for bundling dependencies for e.g. WinRT |
||||
# packages. |
||||
# |
||||
|
||||
# |
||||
# This file is part of Corrade. |
||||
# |
||||
# Copyright © 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, |
||||
# 2017, 2018, 2019 Vladimír Vondruš <mosra@centrum.cz> |
||||
# |
||||
# 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. |
||||
# |
||||
|
||||
# Root include dir |
||||
find_path(CORRADE_INCLUDE_DIR |
||||
NAMES Corrade/Corrade.h) |
||||
mark_as_advanced(CORRADE_INCLUDE_DIR) |
||||
|
||||
# Configuration file |
||||
find_file(_CORRADE_CONFIGURE_FILE configure.h |
||||
HINTS ${CORRADE_INCLUDE_DIR}/Corrade/) |
||||
mark_as_advanced(_CORRADE_CONFIGURE_FILE) |
||||
|
||||
# We need to open configure.h file from CORRADE_INCLUDE_DIR before we check for |
||||
# the components. Bail out with proper error message if it wasn't found. The |
||||
# complete check with all components is further below. |
||||
if(NOT CORRADE_INCLUDE_DIR) |
||||
include(FindPackageHandleStandardArgs) |
||||
find_package_handle_standard_args(Corrade |
||||
REQUIRED_VARS CORRADE_INCLUDE_DIR _CORRADE_CONFIGURE_FILE) |
||||
endif() |
||||
|
||||
# Read flags from configuration |
||||
file(READ ${_CORRADE_CONFIGURE_FILE} _corradeConfigure) |
||||
set(_corradeFlags |
||||
# WARNING: CAREFUL HERE, the string(FIND) succeeds even if a subset is |
||||
# found -- so e.g. looking for TARGET_GL will match TARGET_GLES2 as well. |
||||
# So far that's not a problem, but might become an issue for new flags. |
||||
MSVC2015_COMPATIBILITY |
||||
MSVC2017_COMPATIBILITY |
||||
BUILD_DEPRECATED |
||||
BUILD_STATIC |
||||
TARGET_UNIX |
||||
TARGET_APPLE |
||||
TARGET_IOS |
||||
TARGET_IOS_SIMULATOR |
||||
TARGET_WINDOWS |
||||
TARGET_WINDOWS_RT |
||||
TARGET_EMSCRIPTEN |
||||
TARGET_ANDROID |
||||
PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT |
||||
TESTSUITE_TARGET_XCTEST |
||||
UTILITY_USE_ANSI_COLORS) |
||||
foreach(_corradeFlag ${_corradeFlags}) |
||||
string(FIND "${_corradeConfigure}" "#define CORRADE_${_corradeFlag}" _corrade_${_corradeFlag}) |
||||
if(NOT _corrade_${_corradeFlag} EQUAL -1) |
||||
set(CORRADE_${_corradeFlag} 1) |
||||
endif() |
||||
endforeach() |
||||
|
||||
# CMake module dir |
||||
find_path(_CORRADE_MODULE_DIR |
||||
NAMES UseCorrade.cmake CorradeLibSuffix.cmake |
||||
PATH_SUFFIXES share/cmake/Corrade) |
||||
mark_as_advanced(_CORRADE_MODULE_DIR) |
||||
|
||||
set(CORRADE_USE_MODULE ${_CORRADE_MODULE_DIR}/UseCorrade.cmake) |
||||
set(CORRADE_LIB_SUFFIX_MODULE ${_CORRADE_MODULE_DIR}/CorradeLibSuffix.cmake) |
||||
|
||||
# Ensure that all inter-component dependencies are specified as well |
||||
foreach(_component ${Corrade_FIND_COMPONENTS}) |
||||
string(TOUPPER ${_component} _COMPONENT) |
||||
|
||||
if(_component STREQUAL Containers) |
||||
set(_CORRADE_${_COMPONENT}_DEPENDENCIES Utility) |
||||
elseif(_component STREQUAL Interconnect) |
||||
set(_CORRADE_${_COMPONENT}_DEPENDENCIES Utility) |
||||
elseif(_component STREQUAL PluginManager) |
||||
set(_CORRADE_${_COMPONENT}_DEPENDENCIES Containers Utility rc) |
||||
elseif(_component STREQUAL TestSuite) |
||||
set(_CORRADE_${_COMPONENT}_DEPENDENCIES Utility) |
||||
elseif(_component STREQUAL Utility) |
||||
set(_CORRADE_${_COMPONENT}_DEPENDENCIES Containers rc) |
||||
endif() |
||||
|
||||
# Mark the dependencies as required if the component is also required |
||||
if(Corrade_FIND_REQUIRED_${_component}) |
||||
foreach(_dependency ${_CORRADE_${_COMPONENT}_DEPENDENCIES}) |
||||
set(Corrade_FIND_REQUIRED_${_dependency} TRUE) |
||||
endforeach() |
||||
endif() |
||||
|
||||
list(APPEND _CORRADE_ADDITIONAL_COMPONENTS ${_CORRADE_${_COMPONENT}_DEPENDENCIES}) |
||||
endforeach() |
||||
|
||||
# Join the lists, remove duplicate components |
||||
if(_CORRADE_ADDITIONAL_COMPONENTS) |
||||
list(INSERT Corrade_FIND_COMPONENTS 0 ${_CORRADE_ADDITIONAL_COMPONENTS}) |
||||
endif() |
||||
if(Corrade_FIND_COMPONENTS) |
||||
list(REMOVE_DUPLICATES Corrade_FIND_COMPONENTS) |
||||
endif() |
||||
|
||||
# Component distinction |
||||
set(_CORRADE_LIBRARY_COMPONENTS "^(Containers|Interconnect|PluginManager|TestSuite|Utility)$") |
||||
set(_CORRADE_HEADER_ONLY_COMPONENTS "^(Containers)$") |
||||
set(_CORRADE_EXECUTABLE_COMPONENTS "^(rc)$") |
||||
|
||||
# Find all components |
||||
foreach(_component ${Corrade_FIND_COMPONENTS}) |
||||
string(TOUPPER ${_component} _COMPONENT) |
||||
|
||||
# Create imported target in case the library is found. If the project is |
||||
# added as subproject to CMake, the target already exists and all the |
||||
# required setup is already done from the build tree. |
||||
if(TARGET Corrade::${_component}) |
||||
set(Corrade_${_component}_FOUND TRUE) |
||||
else() |
||||
# Library components |
||||
if(_component MATCHES ${_CORRADE_LIBRARY_COMPONENTS} AND NOT _component MATCHES ${_CORRADE_HEADER_ONLY_COMPONENTS}) |
||||
add_library(Corrade::${_component} UNKNOWN IMPORTED) |
||||
|
||||
# Try to find both debug and release version |
||||
find_library(CORRADE_${_COMPONENT}_LIBRARY_DEBUG Corrade${_component}-d) |
||||
find_library(CORRADE_${_COMPONENT}_LIBRARY_RELEASE Corrade${_component}) |
||||
mark_as_advanced(CORRADE_${_COMPONENT}_LIBRARY_DEBUG |
||||
CORRADE_${_COMPONENT}_LIBRARY_RELEASE) |
||||
|
||||
if(CORRADE_${_COMPONENT}_LIBRARY_RELEASE) |
||||
set_property(TARGET Corrade::${_component} APPEND PROPERTY |
||||
IMPORTED_CONFIGURATIONS RELEASE) |
||||
set_property(TARGET Corrade::${_component} PROPERTY |
||||
IMPORTED_LOCATION_RELEASE ${CORRADE_${_COMPONENT}_LIBRARY_RELEASE}) |
||||
endif() |
||||
|
||||
if(CORRADE_${_COMPONENT}_LIBRARY_DEBUG) |
||||
set_property(TARGET Corrade::${_component} APPEND PROPERTY |
||||
IMPORTED_CONFIGURATIONS DEBUG) |
||||
set_property(TARGET Corrade::${_component} PROPERTY |
||||
IMPORTED_LOCATION_DEBUG ${CORRADE_${_COMPONENT}_LIBRARY_DEBUG}) |
||||
endif() |
||||
endif() |
||||
|
||||
# Header-only library components |
||||
if(_component MATCHES ${_CORRADE_HEADER_ONLY_COMPONENTS}) |
||||
add_library(Corrade::${_component} INTERFACE IMPORTED) |
||||
endif() |
||||
|
||||
# Executable components |
||||
if(_component MATCHES ${_CORRADE_EXECUTABLE_COMPONENTS}) |
||||
add_executable(Corrade::${_component} IMPORTED) |
||||
|
||||
find_program(CORRADE_${_COMPONENT}_EXECUTABLE corrade-${_component}) |
||||
mark_as_advanced(CORRADE_${_COMPONENT}_EXECUTABLE) |
||||
|
||||
if(CORRADE_${_COMPONENT}_EXECUTABLE) |
||||
set_property(TARGET Corrade::${_component} PROPERTY |
||||
IMPORTED_LOCATION ${CORRADE_${_COMPONENT}_EXECUTABLE}) |
||||
endif() |
||||
endif() |
||||
|
||||
# No special setup for Containers library |
||||
|
||||
# Interconnect library |
||||
if(_component STREQUAL Interconnect) |
||||
# Disable /OPT:ICF on MSVC, which merges functions with identical |
||||
# contents and thus breaks signal comparison |
||||
if(CORRADE_TARGET_WINDOWS AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") |
||||
if(CMAKE_VERSION VERSION_LESS 3.13) |
||||
set_property(TARGET Corrade::${_component} PROPERTY |
||||
INTERFACE_LINK_LIBRARIES "-OPT:NOICF,REF") |
||||
else() |
||||
set_property(TARGET Corrade::${_component} PROPERTY |
||||
INTERFACE_LINK_OPTIONS "/OPT:NOICF,REF") |
||||
endif() |
||||
endif() |
||||
|
||||
# PluginManager library |
||||
elseif(_component STREQUAL PluginManager) |
||||
# At least static build needs this |
||||
if(CORRADE_TARGET_UNIX) |
||||
set_property(TARGET Corrade::${_component} APPEND PROPERTY |
||||
INTERFACE_LINK_LIBRARIES ${CMAKE_DL_LIBS}) |
||||
endif() |
||||
|
||||
# TestSuite library has some additional files |
||||
elseif(_component STREQUAL TestSuite) |
||||
# XCTest runner file |
||||
if(CORRADE_TESTSUITE_TARGET_XCTEST) |
||||
find_file(CORRADE_TESTSUITE_XCTEST_RUNNER XCTestRunner.mm.in |
||||
PATH_SUFFIXES share/corrade/TestSuite) |
||||
set(CORRADE_TESTSUITE_XCTEST_RUNNER_NEEDED CORRADE_TESTSUITE_XCTEST_RUNNER) |
||||
|
||||
# ADB runner file |
||||
elseif(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) |
||||
|
||||
# Emscripten runner file |
||||
elseif(CORRADE_TARGET_EMSCRIPTEN) |
||||
find_file(CORRADE_TESTSUITE_EMSCRIPTEN_RUNNER EmscriptenRunner.html.in |
||||
PATH_SUFFIXES share/corrade/TestSuite) |
||||
set(CORRADE_TESTSUITE_EMSCRIPTEN_RUNNER_NEEDED CORRADE_TESTSUITE_EMSCRIPTEN_RUNNER) |
||||
endif() |
||||
|
||||
# Utility library (contains all setup that is used by others) |
||||
elseif(_component STREQUAL Utility) |
||||
# Top-level include directory |
||||
set_property(TARGET Corrade::${_component} APPEND PROPERTY |
||||
INTERFACE_INCLUDE_DIRECTORIES ${CORRADE_INCLUDE_DIR}) |
||||
|
||||
# Require (at least) C++11 for users |
||||
set_property(TARGET Corrade::${_component} PROPERTY |
||||
INTERFACE_CORRADE_CXX_STANDARD 11) |
||||
set_property(TARGET Corrade::${_component} APPEND PROPERTY |
||||
COMPATIBLE_INTERFACE_NUMBER_MAX CORRADE_CXX_STANDARD) |
||||
|
||||
# AndroidLogStreamBuffer class needs to be linked to log library |
||||
if(CORRADE_TARGET_ANDROID) |
||||
set_property(TARGET Corrade::${_component} APPEND PROPERTY |
||||
INTERFACE_LINK_LIBRARIES "log") |
||||
endif() |
||||
endif() |
||||
|
||||
# Find library includes |
||||
if(_component MATCHES ${_CORRADE_LIBRARY_COMPONENTS}) |
||||
find_path(_CORRADE_${_COMPONENT}_INCLUDE_DIR |
||||
NAMES ${_component}.h |
||||
HINTS ${CORRADE_INCLUDE_DIR}/Corrade/${_component}) |
||||
mark_as_advanced(_CORRADE_${_COMPONENT}_INCLUDE_DIR) |
||||
endif() |
||||
|
||||
# Add inter-library dependencies |
||||
if(_component MATCHES ${_CORRADE_LIBRARY_COMPONENTS} OR _component MATCHES ${_CORRADE_HEADER_ONLY_COMPONENTS}) |
||||
foreach(_dependency ${_CORRADE_${_COMPONENT}_DEPENDENCIES}) |
||||
if(_dependency MATCHES ${_CORRADE_LIBRARY_COMPONENTS} OR _dependency MATCHES ${_CORRADE_HEADER_ONLY_COMPONENTS}) |
||||
set_property(TARGET Corrade::${_component} APPEND PROPERTY |
||||
INTERFACE_LINK_LIBRARIES Corrade::${_dependency}) |
||||
endif() |
||||
endforeach() |
||||
endif() |
||||
|
||||
# Decide if the component was found |
||||
if((_component MATCHES ${_CORRADE_LIBRARY_COMPONENTS} AND _CORRADE_${_COMPONENT}_INCLUDE_DIR AND (_component MATCHES ${_CORRADE_HEADER_ONLY_COMPONENTS} OR CORRADE_${_COMPONENT}_LIBRARY_RELEASE OR CORRADE_${_COMPONENT}_LIBRARY_DEBUG)) OR (_component MATCHES ${_CORRADE_EXECUTABLE_COMPONENTS} AND CORRADE_${_COMPONENT}_EXECUTABLE)) |
||||
set(Corrade_${_component}_FOUND TRUE) |
||||
else() |
||||
set(Corrade_${_component}_FOUND FALSE) |
||||
endif() |
||||
endif() |
||||
endforeach() |
||||
|
||||
include(FindPackageHandleStandardArgs) |
||||
find_package_handle_standard_args(Corrade REQUIRED_VARS |
||||
CORRADE_INCLUDE_DIR |
||||
_CORRADE_MODULE_DIR |
||||
_CORRADE_CONFIGURE_FILE |
||||
${CORRADE_TESTSUITE_XCTEST_RUNNER_NEEDED} |
||||
${CORRADE_TESTSUITE_ADB_RUNNER_NEEDED} |
||||
${CORRADE_TESTSUITE_EMSCRIPTEN_RUNNER_NEEDED} |
||||
HANDLE_COMPONENTS) |
||||
|
||||
# Finalize the finding process |
||||
include(${CORRADE_USE_MODULE}) |
||||
@ -0,0 +1,30 @@
|
||||
# |
||||
# This file is part of Magnum. |
||||
# |
||||
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
# Vladimír Vondruš <mosra@centrum.cz> |
||||
# |
||||
# 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. |
||||
# |
||||
|
||||
set_directory_properties(PROPERTIES CORRADE_USE_PEDANTIC_FLAGS ON) |
||||
|
||||
if(WITH_PYTHON) |
||||
add_subdirectory(python) |
||||
endif() |
||||
@ -0,0 +1,39 @@
|
||||
# |
||||
# This file is part of Magnum. |
||||
# |
||||
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
# Vladimír Vondruš <mosra@centrum.cz> |
||||
# |
||||
# 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. |
||||
# |
||||
|
||||
find_package(pybind11 CONFIG REQUIRED) |
||||
|
||||
# UGH FFS |
||||
get_property(CMAKE_GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) |
||||
if(CMAKE_GENERATOR_IS_MULTI_CONFIG) |
||||
set(output_dir ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>) |
||||
else() |
||||
set(output_dir ${CMAKE_CURRENT_BINARY_DIR}) |
||||
endif() |
||||
|
||||
add_subdirectory(magnum) |
||||
|
||||
file(GENERATE OUTPUT ${output_dir}/setup.py |
||||
INPUT ${CMAKE_CURRENT_SOURCE_DIR}/setup.py.cmake) |
||||
@ -0,0 +1,39 @@
|
||||
# |
||||
# This file is part of Magnum. |
||||
# |
||||
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
# Vladimír Vondruš <mosra@centrum.cz> |
||||
# |
||||
# 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. |
||||
# |
||||
|
||||
set(magnum_SRCS |
||||
magnum.cpp |
||||
math.cpp) |
||||
|
||||
pybind11_add_module(magnum ${magnum_SRCS}) |
||||
target_include_directories(magnum PRIVATE ${PROJECT_SOURCE_DIR}/src/python) |
||||
target_link_libraries(magnum PRIVATE Magnum::Magnum) |
||||
set_target_properties(magnum PROPERTIES |
||||
FOLDER "python" |
||||
OUTPUT_NAME "_magnum" |
||||
LIBRARY_OUTPUT_DIRECTORY ${output_dir}/magnum) |
||||
|
||||
file(GENERATE OUTPUT ${output_dir}/magnum/__init__.py |
||||
INPUT ${CMAKE_CURRENT_SOURCE_DIR}/__init__.py) |
||||
@ -0,0 +1,32 @@
|
||||
# |
||||
# This file is part of Magnum. |
||||
# |
||||
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
# Vladimír Vondruš <mosra@centrum.cz> |
||||
# |
||||
# 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. |
||||
# |
||||
|
||||
"""Root Magnum module""" |
||||
|
||||
from ._magnum import * |
||||
|
||||
__all__ = [ |
||||
'Deg', 'Rad' |
||||
] |
||||
@ -0,0 +1,40 @@
|
||||
#ifndef magnum_bootstrap_h |
||||
#define magnum_bootstrap_h |
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
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. |
||||
*/ |
||||
|
||||
namespace pybind11 { class module; } |
||||
namespace Magnum {} |
||||
|
||||
namespace magnum { |
||||
|
||||
using namespace Magnum; |
||||
namespace py = pybind11; |
||||
|
||||
void math(py::module& root, py::module& m); |
||||
|
||||
} |
||||
|
||||
#endif |
||||
@ -0,0 +1,37 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
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 <pybind11/pybind11.h> |
||||
|
||||
#include "magnum/bootstrap.h" |
||||
|
||||
namespace py = pybind11; |
||||
|
||||
PYBIND11_MODULE(_magnum, m) { |
||||
m.doc() = "Root Magnum module"; |
||||
|
||||
py::module math = m.def_submodule("math"); |
||||
magnum::math(m, math); |
||||
} |
||||
@ -0,0 +1,124 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
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 <sstream> |
||||
#include <pybind11/pybind11.h> |
||||
#include <pybind11/operators.h> |
||||
#include <Magnum/Magnum.h> |
||||
#include <Magnum/Math/Angle.h> |
||||
|
||||
#include "magnum/bootstrap.h" |
||||
|
||||
namespace magnum { |
||||
|
||||
namespace { |
||||
|
||||
template<class T> std::string repr(const T& value) { |
||||
std::ostringstream out; |
||||
Debug{&out, Debug::Flag::NoNewlineAtTheEnd} << value; |
||||
return out.str(); |
||||
} |
||||
|
||||
template<class T> void angle(py::class_<T>& c) { |
||||
/*
|
||||
Missing APIs: |
||||
|
||||
Type |
||||
*/ |
||||
|
||||
c |
||||
/* Constructors */ |
||||
.def_static("zero_init", []() { |
||||
return T{Math::ZeroInit}; |
||||
}, "Construct a zero value") |
||||
.def(py::init(), "Default constructor") |
||||
.def(py::init<typename T::Type>(), "Explicit conversion from a unitless type") |
||||
|
||||
/* Explicit conversion to an underlying type */ |
||||
.def("__float__", &T::operator typename T::Type, "Conversion to underlying type") |
||||
|
||||
/* Comparison */ |
||||
.def(py::self == py::self, "Equality comparison") |
||||
.def(py::self != py::self, "Non-equality comparison") |
||||
.def(py::self < py::self, "Less than comparison") |
||||
.def(py::self > py::self, "Greater than comparison") |
||||
.def(py::self <= py::self, "Less than or equal comparison") |
||||
.def(py::self >= py::self, "Greater than or equal comparison") |
||||
|
||||
/* Arithmetic ops. Need to use lambdas because the C++ functions return
|
||||
the Unit base class :( */ |
||||
.def("__neg__", [](const T& self) -> T { |
||||
return -self; |
||||
}, "Negated value") |
||||
.def("__iadd__", [](T& self, const T& other) -> T& { |
||||
self += other; |
||||
return self; |
||||
}, "Add and assign a value") |
||||
.def("__add__", [](const T& self, const T& other) -> T { |
||||
return self + other; |
||||
}, "Add a value") |
||||
.def("__isub__", [](T& self, const T& other) -> T& { |
||||
self -= other; |
||||
return self; |
||||
}, "Subtract and assign a value") |
||||
.def("__sub__", [](const T& self, const T& other) -> T { |
||||
return self - other; |
||||
}, "Subtract a value") |
||||
.def("__imul__", [](T& self, typename T::Type other) -> T& { |
||||
self *= other; |
||||
return self; |
||||
}, "Multiply with a number and assign") |
||||
.def("__mul__", [](const T& self, typename T::Type other) -> T { |
||||
return self * other; |
||||
}, "Multiply with a number") |
||||
.def("__itruediv__", [](T& self, typename T::Type other) -> T& { |
||||
self /= other; |
||||
return self; |
||||
}, "Divide with a number and assign") |
||||
.def("__truediv__", [](const T& self, typename T::Type other) -> T { |
||||
return self / other; |
||||
}, "Divide with a number") |
||||
.def("__truediv__", [](const T& self, const T& other) -> typename T::Type { |
||||
return self / other; |
||||
}, "Ratio of two values") |
||||
|
||||
.def("__repr__", repr<T>, "Object representation"); |
||||
} |
||||
|
||||
} |
||||
|
||||
void math(py::module& root, py::module& m) { |
||||
m.doc() = "Math library"; |
||||
|
||||
/* Deg, Rad, Degd, Radd */ |
||||
py::class_<Degd> deg{root, "Deg", "Degrees"}; |
||||
py::class_<Radd> rad{root, "Rad", "Radians"}; |
||||
deg.def(py::init<Radd>(), "Conversion from radians"); |
||||
rad.def(py::init<Degd>(), "Conversion from degrees"); |
||||
angle(deg); |
||||
angle(rad); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,32 @@
|
||||
# |
||||
# This file is part of Magnum. |
||||
# |
||||
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
# Vladimír Vondruš <mosra@centrum.cz> |
||||
# |
||||
# 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. |
||||
# |
||||
|
||||
import os |
||||
import sys |
||||
import unittest |
||||
|
||||
# TODO: do this differently / more robustly |
||||
sys.path = [os.path.join(os.path.dirname(__file__), '../../../../build/src/python')] + sys.path |
||||
from magnum import * |
||||
@ -0,0 +1,69 @@
|
||||
# |
||||
# This file is part of Magnum. |
||||
# |
||||
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
# Vladimír Vondruš <mosra@centrum.cz> |
||||
# |
||||
# 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. |
||||
# |
||||
|
||||
import unittest |
||||
|
||||
from magnum import * |
||||
from magnum import math |
||||
|
||||
class Angle(unittest.TestCase): |
||||
def test_init(self): |
||||
a = Deg() |
||||
b = Rad.zero_init() |
||||
c = Deg(90.0) |
||||
self.assertEqual(a, Deg(0.0)) |
||||
self.assertEqual(b, Rad(0.0)) |
||||
self.assertEqual(c, Deg(90.0)) |
||||
|
||||
def test_conversion(self): |
||||
self.assertEqual(Rad(Deg(90.0)), Rad(1.570796326794896)) |
||||
|
||||
def test_ops(self): |
||||
self.assertEqual(-Deg(30.0), Deg(-30.0)) |
||||
self.assertEqual(Deg(30.0) + Deg(45.0), Deg(75.0)) |
||||
self.assertEqual(Deg(75.0) - Deg(45.0), Deg(30.0)) |
||||
self.assertEqual(Deg(45.0)*2.0, Deg(90.0)) |
||||
self.assertEqual(Deg(90.0)/2.0, Deg(45.0)) |
||||
self.assertEqual(Deg(180.0)/Deg(9.0), 20.0) |
||||
|
||||
def test_inplace_ops(self): |
||||
a = Deg(30.0) |
||||
a += Deg(45.0) |
||||
self.assertEqual(a, Deg(75.0)) |
||||
|
||||
a = Deg(75.0) |
||||
a -= Deg(45.0) |
||||
self.assertEqual(a, Deg(30.0)) |
||||
|
||||
a = Deg(45.0) |
||||
a *= 2.0 |
||||
self.assertEqual(a, Deg(90.0)) |
||||
|
||||
a = Deg(90.0) |
||||
a /= 2.0 |
||||
self.assertEqual(a, Deg(45.0)) |
||||
|
||||
def test_repr(self): |
||||
self.assertEqual(repr(Deg(45.3)), 'Deg(45.3)') |
||||
@ -0,0 +1,52 @@
|
||||
# |
||||
# This file is part of Magnum. |
||||
# |
||||
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
# Vladimír Vondruš <mosra@centrum.cz> |
||||
# |
||||
# 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. |
||||
# |
||||
|
||||
import os |
||||
import shutil |
||||
|
||||
from setuptools import setup, Extension, find_packages |
||||
from setuptools.command.build_ext import build_ext |
||||
|
||||
extension_paths = { |
||||
# Filled in by cmake |
||||
'magnum._magnum': '$<TARGET_FILE:magnum>', |
||||
} |
||||
|
||||
class TheExtensionIsAlreadyBuiltWhyThisHasToBeSoDamnComplicated(build_ext): |
||||
def run(self): |
||||
for ext in self.extensions: |
||||
shutil.copyfile(extension_paths[ext.name], self.get_ext_fullpath(ext.name)) |
||||
|
||||
setup( |
||||
name='magnum', |
||||
packages=['magnum'], |
||||
ext_modules=[Extension(name, sources=[]) for name, path in extension_paths.items() if path], |
||||
cmdclass = { |
||||
'build_ext': TheExtensionIsAlreadyBuiltWhyThisHasToBeSoDamnComplicated |
||||
}, |
||||
zip_safe=True |
||||
) |
||||
|
||||
# kate: hl python |
||||
Loading…
Reference in new issue