From 8977e6d010e964a782d624aa45c8852d6196c69e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C4=8Cajka?= Date: Wed, 28 Jan 2015 09:57:55 +0100 Subject: [PATCH 01/74] Fixed (u)int64 MSB/LSB handling on BE archs --- glm/detail/func_integer.inl | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/glm/detail/func_integer.inl b/glm/detail/func_integer.inl index 31eddf9b..6d204b40 100644 --- a/glm/detail/func_integer.inl +++ b/glm/detail/func_integer.inl @@ -248,10 +248,8 @@ namespace detail GLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32), "uint and uint32 size mismatch"); uint64 Value64 = static_cast(x) * static_cast(y); - uint32* PointerMSB = (reinterpret_cast(&Value64) + 1); - msb = *PointerMSB; - uint32* PointerLSB = (reinterpret_cast(&Value64) + 0); - lsb = *PointerLSB; + msb = Value64 >> 32; + lsb = Value64; } template class vecType> @@ -270,10 +268,8 @@ namespace detail GLM_STATIC_ASSERT(sizeof(int) == sizeof(int32), "int and int32 size mismatch"); int64 Value64 = static_cast(x) * static_cast(y); - int32* PointerMSB = (reinterpret_cast(&Value64) + 1); - msb = *PointerMSB; - int32* PointerLSB = (reinterpret_cast(&Value64)); - lsb = *PointerLSB; + msb = Value64 >> 32; + lsb = Value64; } template class vecType> From d3313421c664db5bd1b672d39ba3faec0d430117 Mon Sep 17 00:00:00 2001 From: Jonathan Zrake Date: Sun, 15 Feb 2015 14:29:49 -0500 Subject: [PATCH 02/74] Add functions eulerAngleXYZ and extractEulerAngleXYZ --- glm/gtx/euler_angles.hpp | 18 ++++++++++++- glm/gtx/euler_angles.inl | 56 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/glm/gtx/euler_angles.hpp b/glm/gtx/euler_angles.hpp index 7a1cb364..e772bbf0 100644 --- a/glm/gtx/euler_angles.hpp +++ b/glm/gtx/euler_angles.hpp @@ -114,6 +114,14 @@ namespace glm T const & angleZ, T const & angleY); + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL tmat4x4 eulerAngleXYZ( + T const & t1, + T const & t2, + T const & t3); + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). /// @see gtx_euler_angles template @@ -121,7 +129,7 @@ namespace glm T const & yaw, T const & pitch, T const & roll); - + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). /// @see gtx_euler_angles template @@ -150,6 +158,14 @@ namespace glm template GLM_FUNC_DECL tmat4x4 orientate4(tvec3 const & angles); + /// Extracts the (X * Y * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleXYZ(tmat4x4 & M, + T & t1, + T & t2, + T & t3); + /// @} }//namespace glm diff --git a/glm/gtx/euler_angles.inl b/glm/gtx/euler_angles.inl index 77fea425..80b30dbe 100644 --- a/glm/gtx/euler_angles.inl +++ b/glm/gtx/euler_angles.inl @@ -30,6 +30,8 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////////////////////// +#include "compatibility.hpp" // glm::atan2 + namespace glm { template @@ -157,7 +159,42 @@ namespace glm { return eulerAngleZ(angleZ) * eulerAngleY(angleY); } - + + template + GLM_FUNC_QUALIFIER tmat4x4 eulerAngleXYZ + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(-t1); + T c2 = glm::cos(-t2); + T c3 = glm::cos(-t3); + T s1 = glm::sin(-t1); + T s2 = glm::sin(-t2); + T s3 = glm::sin(-t3); + + tmat4x4 Result; + Result[0][0] = c2 * c3; + Result[0][1] =-c1 * s3 + s1 * s2 * c3; + Result[0][2] = s1 * s3 + c1 * s2 * c3; + Result[0][3] = static_cast(0); + Result[1][0] = c2 * s3; + Result[1][1] = c1 * c3 + s1 * s2 * s3; + Result[1][2] =-s1 * c3 + c1 * s2 * s3; + Result[1][3] = static_cast(0); + Result[2][0] =-s2; + Result[2][1] = s1 * c2; + Result[2][2] = c1 * c2; + Result[2][3] = static_cast(0); + Result[3][0] = static_cast(0); + Result[3][1] = static_cast(0); + Result[3][2] = static_cast(0); + Result[3][3] = static_cast(1); + return Result; + } + template GLM_FUNC_QUALIFIER tmat4x4 eulerAngleYXZ ( @@ -284,4 +321,21 @@ namespace glm { return yawPitchRoll(angles.z, angles.x, angles.y); } + + template + GLM_FUNC_DECL void extractEulerAngleXYZ(tmat4x4 & M, + T & t1, + T & t2, + T & t3) + { + float T1 = glm::atan2(M[2][1], M[2][2]); + float C2 = glm::sqrt(M[0][0]*M[0][0] + M[1][0]*M[1][0]); + float T2 = glm::atan2(-M[2][0], C2); + float S1 = glm::sin(T1); + float C1 = glm::cos(T1); + float T3 = glm::atan2(S1*M[0][2] - C1*M[0][1], C1*M[1][1] - S1*M[1][2 ]); + t1 = -T1; + t2 = -T2; + t3 = -T3; + } }//namespace glm From 47116d8c284a2bca8d871ae9231b6b40c07b19d5 Mon Sep 17 00:00:00 2001 From: BryceMehring Date: Sun, 22 Feb 2015 14:32:55 -0600 Subject: [PATCH 03/74] Fixed multi-line comment warning in g++. --- glm/detail/setup.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp index 1defed89..bfe18bca 100644 --- a/glm/detail/setup.hpp +++ b/glm/detail/setup.hpp @@ -633,7 +633,7 @@ #endif // -#define GLM_HAS_TRIVIAL_QUERIES 0//( \ +#define GLM_HAS_TRIVIAL_QUERIES 0//( //((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) // From 5ac752262a6cc9fcdbf315553e44c881abd18c8d Mon Sep 17 00:00:00 2001 From: "David J. Sankel" Date: Thu, 26 Feb 2015 11:12:02 -0700 Subject: [PATCH 04/74] Don't show status message in 'FindGLM' if 'QUIET' option is set. The 'QUIET' option of 'find_package' sets the 'GLM_FIND_QUIETLY' option. This patch makes FindGLM suppress output when this is the case. --- util/FindGLM.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/util/FindGLM.cmake b/util/FindGLM.cmake index 2d900929..73fdc0bd 100644 --- a/util/FindGLM.cmake +++ b/util/FindGLM.cmake @@ -59,5 +59,7 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLM DEFAULT_MSG IF(GLM_FOUND) SET(GLM_INCLUDE_DIRS "${GLM_INCLUDE_DIR}") - MESSAGE(STATUS "GLM_INCLUDE_DIR = ${GLM_INCLUDE_DIR}") + IF(NOT GLM_FIND_QUIETLY) + MESSAGE(STATUS "GLM_INCLUDE_DIR = ${GLM_INCLUDE_DIR}") + ENDIF(NOT GLM_FIND_QUIETLY) ENDIF(GLM_FOUND) From 417676566e009670bbf6649cdff67e1cf328826c Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 15 Mar 2015 21:31:51 +0100 Subject: [PATCH 05/74] Fixed (u)int64 MSB/LSB handling on BE archs #306 --- readme.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/readme.txt b/readme.txt index 56645b7c..bae96df7 100644 --- a/readme.txt +++ b/readme.txt @@ -75,6 +75,9 @@ Improvements: - Changed usage of __has_include to support Intel compiler #307 - Specialized integer implementation of YCoCg-R #310 +Fixes: +- Fixed (u)int64 MSB/LSB handling on BE archs #306 + Deprecation: - Removed integer specification for 'mod' in GTC_integer #308 From 3252b538411a92bdaa2ab2f88461d9160a9fc423 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 15 Mar 2015 21:36:56 +0100 Subject: [PATCH 06/74] Added functions eulerAngleXYZ and extractEulerAngleXYZ #311 --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index bae96df7..6245af14 100644 --- a/readme.txt +++ b/readme.txt @@ -70,6 +70,7 @@ Features: - Added GTC_color: convertRgbToSrgb and convertSrgbToRgb functions - Added 'fmod' overload to GTX_common with tests #308 - Left handed perspective and lookAt functions #314 +- Added functions eulerAngleXYZ and extractEulerAngleXYZ #311 Improvements: - Changed usage of __has_include to support Intel compiler #307 From a8203ac0347547376b307ff72ea29d669baa605f Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 15 Mar 2015 21:45:57 +0100 Subject: [PATCH 07/74] Fixed multi-line comment warning in g++. #315 --- glm/detail/setup.hpp | 3 +-- readme.txt | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp index bfe18bca..fea8fc15 100644 --- a/glm/detail/setup.hpp +++ b/glm/detail/setup.hpp @@ -633,8 +633,7 @@ #endif // -#define GLM_HAS_TRIVIAL_QUERIES 0//( - //((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) +#define GLM_HAS_TRIVIAL_QUERIES 0 // #if GLM_LANG & GLM_LANG_CXX11_FLAG diff --git a/readme.txt b/readme.txt index 6245af14..b3b67a20 100644 --- a/readme.txt +++ b/readme.txt @@ -78,6 +78,7 @@ Improvements: Fixes: - Fixed (u)int64 MSB/LSB handling on BE archs #306 +- Fixed multi-line comment warning in g++. #315 Deprecation: - Removed integer specification for 'mod' in GTC_integer #308 From 102c223aa2820aed1293361f30055c102915b1ef Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 15 Mar 2015 21:50:46 +0100 Subject: [PATCH 08/74] Don't show status message in 'FindGLM' if 'QUIET' option is set. #317 --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index b3b67a20..900c3550 100644 --- a/readme.txt +++ b/readme.txt @@ -75,6 +75,7 @@ Features: Improvements: - Changed usage of __has_include to support Intel compiler #307 - Specialized integer implementation of YCoCg-R #310 +- Don't show status message in 'FindGLM' if 'QUIET' option is set. #317 Fixes: - Fixed (u)int64 MSB/LSB handling on BE archs #306 From f51bcc70cc2e4218b6e5880f096f39fd812c1d4c Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 15 Mar 2015 23:52:22 +0100 Subject: [PATCH 09/74] Added to perform to perform std::hash on GLM types #320 --- glm/gtx/hash.hpp | 4 ++++ glm/gtx/scalar_multiplication.hpp | 2 +- readme.txt | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/glm/gtx/hash.hpp b/glm/gtx/hash.hpp index f029b751..31e86dc6 100644 --- a/glm/gtx/hash.hpp +++ b/glm/gtx/hash.hpp @@ -41,6 +41,10 @@ #pragma once +#if !GLM_HAS_CXX11_STL +# error "GLM_GTX_hash requires C++11 standard library support" +#endif + #include #include "../vec2.hpp" diff --git a/glm/gtx/scalar_multiplication.hpp b/glm/gtx/scalar_multiplication.hpp index 5f6c4d9e..3b34d2b3 100644 --- a/glm/gtx/scalar_multiplication.hpp +++ b/glm/gtx/scalar_multiplication.hpp @@ -44,7 +44,7 @@ #include "../detail/setup.hpp" #if !GLM_HAS_TEMPLATE_ALIASES && !(GLM_COMPILER & GLM_COMPILER_GCC) -# error "GLM_GTX_scalar_multiplication requires C++11 suppport or alias templates and if not support for GCC" +# error "GLM_GTX_scalar_multiplication requires C++11 support or alias templates and if not support for GCC" #endif #include "../vec2.hpp" diff --git a/readme.txt b/readme.txt index 900c3550..b29e01c6 100644 --- a/readme.txt +++ b/readme.txt @@ -71,6 +71,7 @@ Features: - Added 'fmod' overload to GTX_common with tests #308 - Left handed perspective and lookAt functions #314 - Added functions eulerAngleXYZ and extractEulerAngleXYZ #311 +- Added to perform to perform std::hash on GLM types #320 Improvements: - Changed usage of __has_include to support Intel compiler #307 From e1c3c531dde218ca36ca53de4d279ad3ff525d64 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Mon, 16 Mar 2015 23:29:13 +0100 Subject: [PATCH 10/74] Fixed warnings --- glm/detail/func_integer.inl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/glm/detail/func_integer.inl b/glm/detail/func_integer.inl index 6d204b40..20e29d6f 100644 --- a/glm/detail/func_integer.inl +++ b/glm/detail/func_integer.inl @@ -248,8 +248,8 @@ namespace detail GLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32), "uint and uint32 size mismatch"); uint64 Value64 = static_cast(x) * static_cast(y); - msb = Value64 >> 32; - lsb = Value64; + msb = static_cast(Value64 >> static_cast(32)); + lsb = static_cast(Value64); } template class vecType> @@ -268,8 +268,8 @@ namespace detail GLM_STATIC_ASSERT(sizeof(int) == sizeof(int32), "int and int32 size mismatch"); int64 Value64 = static_cast(x) * static_cast(y); - msb = Value64 >> 32; - lsb = Value64; + msb = static_cast(Value64 >> static_cast(32)); + lsb = static_cast(Value64); } template class vecType> From 288d1af3096b09374338a9f5202ee148cbc31b03 Mon Sep 17 00:00:00 2001 From: Zbigniew Mandziejewicz Date: Sun, 29 Mar 2015 10:41:09 +0800 Subject: [PATCH 11/74] Export glm as interface library for CMake 2.8.12 and newer --- CMakeLists.txt | 35 +++++++++++++++++++++++++++++++++++ cmake/glmConfig.cmake | 1 + 2 files changed, 36 insertions(+) create mode 100644 cmake/glmConfig.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 5925d5fe..329b846a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 2.6 FATAL_ERROR) project(glm) +set(GLM_VERSION "0.9.6") + enable_testing() list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") @@ -144,3 +146,36 @@ add_subdirectory(test) add_subdirectory(util) install(DIRECTORY glm DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}) + +if (NOT CMAKE_VERSION VERSION_LESS "2.8.12") + add_library(glm INTERFACE) + target_include_directories(glm INTERFACE + $ + ) + install(TARGETS glm EXPORT glmTargets) + + set(GLM_INSTALL_CONFIG_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/glm") + + include(CMakePackageConfigHelpers) + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" + VERSION ${GLM_VERSION} + COMPATIBILITY AnyNewerVersion + ) + + export( + EXPORT glmTargets + FILE "${CMAKE_CURRENT_BINARY_DIR}/glmTargets.cmake" + ) + install( + EXPORT glmTargets FILE glmTargets.cmake + DESTINATION ${GLM_INSTALL_CONFIG_DIR} + ) + + install( + FILES + cmake/glmConfig.cmake + "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" + DESTINATION ${GLM_INSTALL_CONFIG_DIR} + ) +endif() diff --git a/cmake/glmConfig.cmake b/cmake/glmConfig.cmake new file mode 100644 index 00000000..ea324ab6 --- /dev/null +++ b/cmake/glmConfig.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/glmTargets.cmake") From 62a7daddcf082f754000fc5e42d7bcdf93c895f7 Mon Sep 17 00:00:00 2001 From: Zbigniew Mandziejewicz Date: Mon, 30 Mar 2015 01:21:56 +0800 Subject: [PATCH 12/74] Removed obsolete FindGLM --- CMakeLists.txt | 41 ++++++++++++++----------- cmake/glmConfig.cmake | 1 - cmake/glmConfig.cmake.in | 5 ++++ util/CMakeLists.txt | 3 -- util/FindGLM.cmake | 65 ---------------------------------------- 5 files changed, 28 insertions(+), 87 deletions(-) delete mode 100644 cmake/glmConfig.cmake create mode 100644 cmake/glmConfig.cmake.in delete mode 100644 util/CMakeLists.txt delete mode 100644 util/FindGLM.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 329b846a..54d6d0f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,26 +143,38 @@ include_directories("${PROJECT_SOURCE_DIR}/test/external") add_subdirectory(glm) add_subdirectory(test) -add_subdirectory(util) -install(DIRECTORY glm DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}) +set(GLM_INSTALL_CONFIG_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/glm") +set(GLM_INCLUDE_DIRS ${CMAKE_INSTALL_FULL_INCLUDEDIR}) +install(DIRECTORY glm DESTINATION ${GLM_INCLUDE_DIRS}) + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" + VERSION ${GLM_VERSION} + COMPATIBILITY AnyNewerVersion +) + +configure_file(cmake/glmConfig.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/glmConfig.cmake" + @ONLY +) + +install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/glmConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" + DESTINATION ${GLM_INSTALL_CONFIG_DIR} +) if (NOT CMAKE_VERSION VERSION_LESS "2.8.12") add_library(glm INTERFACE) target_include_directories(glm INTERFACE $ + $ ) install(TARGETS glm EXPORT glmTargets) - set(GLM_INSTALL_CONFIG_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/glm") - - include(CMakePackageConfigHelpers) - write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" - VERSION ${GLM_VERSION} - COMPATIBILITY AnyNewerVersion - ) - export( EXPORT glmTargets FILE "${CMAKE_CURRENT_BINARY_DIR}/glmTargets.cmake" @@ -171,11 +183,4 @@ if (NOT CMAKE_VERSION VERSION_LESS "2.8.12") EXPORT glmTargets FILE glmTargets.cmake DESTINATION ${GLM_INSTALL_CONFIG_DIR} ) - - install( - FILES - cmake/glmConfig.cmake - "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" - DESTINATION ${GLM_INSTALL_CONFIG_DIR} - ) endif() diff --git a/cmake/glmConfig.cmake b/cmake/glmConfig.cmake deleted file mode 100644 index ea324ab6..00000000 --- a/cmake/glmConfig.cmake +++ /dev/null @@ -1 +0,0 @@ -include("${CMAKE_CURRENT_LIST_DIR}/glmTargets.cmake") diff --git a/cmake/glmConfig.cmake.in b/cmake/glmConfig.cmake.in new file mode 100644 index 00000000..677995e3 --- /dev/null +++ b/cmake/glmConfig.cmake.in @@ -0,0 +1,5 @@ +set_and_check(GLM_INCLUDE_DIRS "@GLM_INCLUDE_DIRS@") + +if (NOT CMAKE_VERSION VERSION_LESS "2.8.12") + include("${CMAKE_CURRENT_LIST_DIR}/glmTargets.cmake") +endif() diff --git a/util/CMakeLists.txt b/util/CMakeLists.txt deleted file mode 100644 index 3deeb15b..00000000 --- a/util/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/FindGLM.cmake - DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/cmake) - diff --git a/util/FindGLM.cmake b/util/FindGLM.cmake deleted file mode 100644 index 73fdc0bd..00000000 --- a/util/FindGLM.cmake +++ /dev/null @@ -1,65 +0,0 @@ -# FindGLM - attempts to locate the glm matrix/vector library. -# -# This module defines the following variables (on success): -# GLM_INCLUDE_DIRS - where to find glm/glm.hpp -# GLM_FOUND - if the library was successfully located -# -# It is trying a few standard installation locations, but can be customized -# with the following variables: -# GLM_ROOT_DIR - root directory of a glm installation -# Headers are expected to be found in either: -# /glm/glm.hpp OR -# /include/glm/glm.hpp -# This variable can either be a cmake or environment -# variable. Note however that changing the value -# of the environment varible will NOT result in -# re-running the header search and therefore NOT -# adjust the variables set by this module. - -#============================================================================= -# Copyright 2012 Carsten Neumann -# -# 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.) - -# default search dirs -SET(_glm_HEADER_SEARCH_DIRS - "/usr/include" - "/usr/local/include") - -# check environment variable -SET(_glm_ENV_ROOT_DIR "$ENV{GLM_ROOT_DIR}") - -IF(NOT GLM_ROOT_DIR AND _glm_ENV_ROOT_DIR) - SET(GLM_ROOT_DIR "${_glm_ENV_ROOT_DIR}") -ENDIF(NOT GLM_ROOT_DIR AND _glm_ENV_ROOT_DIR) - -# put user specified location at beginning of search -IF(GLM_ROOT_DIR) - SET(_glm_HEADER_SEARCH_DIRS "${GLM_ROOT_DIR}" - "${GLM_ROOT_DIR}/include" - ${_glm_HEADER_SEARCH_DIRS}) -ENDIF(GLM_ROOT_DIR) - -# locate header -FIND_PATH(GLM_INCLUDE_DIR "glm/glm.hpp" - PATHS ${_glm_HEADER_SEARCH_DIRS}) - -INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLM DEFAULT_MSG - GLM_INCLUDE_DIR) - -IF(GLM_FOUND) - SET(GLM_INCLUDE_DIRS "${GLM_INCLUDE_DIR}") - - IF(NOT GLM_FIND_QUIETLY) - MESSAGE(STATUS "GLM_INCLUDE_DIR = ${GLM_INCLUDE_DIR}") - ENDIF(NOT GLM_FIND_QUIETLY) -ENDIF(GLM_FOUND) From 29940ee4433922496d0056fc02ec90109b7272a2 Mon Sep 17 00:00:00 2001 From: Zbigniew Mandziejewicz Date: Thu, 9 Apr 2015 11:20:58 +0800 Subject: [PATCH 13/74] Export build tree package --- CMakeLists.txt | 33 ++++++++++++++++++++++++--------- cmake/glmConfig.cmake.in | 6 +++++- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 54d6d0f2..f69f6795 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -144,9 +144,8 @@ include_directories("${PROJECT_SOURCE_DIR}/test/external") add_subdirectory(glm) add_subdirectory(test) -set(GLM_INSTALL_CONFIG_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/glm") -set(GLM_INCLUDE_DIRS ${CMAKE_INSTALL_FULL_INCLUDEDIR}) -install(DIRECTORY glm DESTINATION ${GLM_INCLUDE_DIRS}) +set(GLM_INSTALL_CONFIGDIR "${CMAKE_INSTALL_LIBDIR}/cmake/glm") +install(DIRECTORY glm DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) include(CMakePackageConfigHelpers) write_basic_package_version_file( @@ -155,23 +154,36 @@ write_basic_package_version_file( COMPATIBILITY AnyNewerVersion ) -configure_file(cmake/glmConfig.cmake.in - "${CMAKE_CURRENT_BINARY_DIR}/glmConfig.cmake" - @ONLY +# build tree package config +configure_package_config_file( + cmake/glmConfig.cmake.in + glmConfig.cmake + INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} + PATH_VARS CMAKE_INSTALL_INCLUDEDIR + NO_CHECK_REQUIRED_COMPONENTS_MACRO +) + +# install tree package config +configure_package_config_file( + cmake/glmConfig.cmake.in + ${GLM_INSTALL_CONFIGDIR}/glmConfig.cmake + INSTALL_DESTINATION ${GLM_INSTALL_CONFIGDIR} + PATH_VARS CMAKE_INSTALL_INCLUDEDIR + NO_CHECK_REQUIRED_COMPONENTS_MACRO ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/glmConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" - DESTINATION ${GLM_INSTALL_CONFIG_DIR} + DESTINATION ${GLM_INSTALL_CONFIGDIR} ) if (NOT CMAKE_VERSION VERSION_LESS "2.8.12") add_library(glm INTERFACE) target_include_directories(glm INTERFACE $ - $ + $ ) install(TARGETS glm EXPORT glmTargets) @@ -179,8 +191,11 @@ if (NOT CMAKE_VERSION VERSION_LESS "2.8.12") EXPORT glmTargets FILE "${CMAKE_CURRENT_BINARY_DIR}/glmTargets.cmake" ) + install( EXPORT glmTargets FILE glmTargets.cmake - DESTINATION ${GLM_INSTALL_CONFIG_DIR} + DESTINATION ${GLM_INSTALL_CONFIGDIR} ) endif() + +export(PACKAGE glm) diff --git a/cmake/glmConfig.cmake.in b/cmake/glmConfig.cmake.in index 677995e3..3f8a1fe5 100644 --- a/cmake/glmConfig.cmake.in +++ b/cmake/glmConfig.cmake.in @@ -1,4 +1,8 @@ -set_and_check(GLM_INCLUDE_DIRS "@GLM_INCLUDE_DIRS@") +set(GLM_VERSION "@GLM_VERSION@") + +@PACKAGE_INIT@ + +set_and_check(GLM_INCLUDE_DIRS "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@") if (NOT CMAKE_VERSION VERSION_LESS "2.8.12") include("${CMAKE_CURRENT_LIST_DIR}/glmTargets.cmake") From 37f7df3dc039af47d86664aa99d59f4926464784 Mon Sep 17 00:00:00 2001 From: Zbigniew Mandziejewicz Date: Fri, 10 Apr 2015 00:04:52 +0800 Subject: [PATCH 14/74] Simplified build tree CMake config --- CMakeLists.txt | 8 +++----- cmake/glmBuildConfig.cmake.in | 1 + 2 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 cmake/glmBuildConfig.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index f69f6795..cc6818bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -155,12 +155,10 @@ write_basic_package_version_file( ) # build tree package config -configure_package_config_file( - cmake/glmConfig.cmake.in +configure_file( + cmake/glmBuildConfig.cmake.in glmConfig.cmake - INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} - PATH_VARS CMAKE_INSTALL_INCLUDEDIR - NO_CHECK_REQUIRED_COMPONENTS_MACRO + COPYONLY ) # install tree package config diff --git a/cmake/glmBuildConfig.cmake.in b/cmake/glmBuildConfig.cmake.in new file mode 100644 index 00000000..ea324ab6 --- /dev/null +++ b/cmake/glmBuildConfig.cmake.in @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/glmTargets.cmake") From a472f50767c1601d99e0b8e2d9177720dc1af632 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 14:13:48 +0200 Subject: [PATCH 15/74] Fixed C++98 build --- test/gtc/gtc_bitfield.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/gtc/gtc_bitfield.cpp b/test/gtc/gtc_bitfield.cpp index 3f1c1ed1..e309ee41 100644 --- a/test/gtc/gtc_bitfield.cpp +++ b/test/gtc/gtc_bitfield.cpp @@ -634,8 +634,10 @@ namespace bitfieldInterleave # if(GLM_ARCH != GLM_ARCH_PURE) { // SIMD - std::vector<__m128i> SimdData(x_max * y_max); - std::vector<__m128i> SimdParam(x_max * y_max); + std::vector<__m128i> SimdData; + SimdData.resize(x_max * y_max); + std::vector<__m128i> SimdParam; + SimdParam.resize(x_max * y_max); for(int i = 0; i < SimdParam.size(); ++i) SimdParam[i] = _mm_set_epi32(i % x_max, 0, i / y_max, 0); From 099bef4d1630327360116083ded4fd389fbb2497 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 14:48:55 +0200 Subject: [PATCH 16/74] Fixed GCC build --- test/gtc/gtc_bitfield.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/gtc/gtc_bitfield.cpp b/test/gtc/gtc_bitfield.cpp index e309ee41..5e4accf5 100644 --- a/test/gtc/gtc_bitfield.cpp +++ b/test/gtc/gtc_bitfield.cpp @@ -631,7 +631,7 @@ namespace bitfieldInterleave std::printf("glm::detail::bitfieldInterleave Time %d clocks\n", static_cast(Time)); } -# if(GLM_ARCH != GLM_ARCH_PURE) +# if(GLM_ARCH != GLM_ARCH_PURE && !(GLM_COMPILER & GLM_COMPILER_GCC)) { // SIMD std::vector<__m128i> SimdData; From 7f291cdbeb95b6567d90541e0d147e16fea2bd1f Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 15:05:16 +0200 Subject: [PATCH 17/74] Renamed readme.md --- glm/CMakeLists.txt | 3 ++- readme.txt => readme.md | 0 2 files changed, 2 insertions(+), 1 deletion(-) rename readme.txt => readme.md (100%) diff --git a/glm/CMakeLists.txt b/glm/CMakeLists.txt index aaeae626..12b2df1f 100644 --- a/glm/CMakeLists.txt +++ b/glm/CMakeLists.txt @@ -4,6 +4,7 @@ file(GLOB ROOT_SOURCE *.cpp) file(GLOB ROOT_INLINE *.inl) file(GLOB ROOT_HEADER *.hpp) file(GLOB ROOT_TEXT ../*.txt) +file(GLOB ROOT_MD ../*.md) file(GLOB ROOT_NAT ../util/glm.natvis) file(GLOB_RECURSE CORE_SOURCE ./detail/*.cpp) @@ -18,7 +19,7 @@ file(GLOB_RECURSE GTX_SOURCE ./gtx/*.cpp) file(GLOB_RECURSE GTX_INLINE ./gtx/*.inl) file(GLOB_RECURSE GTX_HEADER ./gtx/*.hpp) -source_group("Text Files" FILES ${ROOT_TEXT}) +source_group("Text Files" FILES ${ROOT_TEXT} ${ROOT_MD}) source_group("Core Files" FILES ${CORE_SOURCE}) source_group("Core Files" FILES ${CORE_INLINE}) source_group("Core Files" FILES ${CORE_HEADER}) diff --git a/readme.txt b/readme.md similarity index 100% rename from readme.txt rename to readme.md From d1f36ac4192c441111cd3c08bda71c7d4f0acd1f Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 15:30:52 +0200 Subject: [PATCH 18/74] Added logo --- readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme.md b/readme.md index b29e01c6..5b392f83 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,5 @@ +![glm](doc/logo.png) + ================================================================================ OpenGL Mathematics (GLM) -------------------------------------------------------------------------------- From 1fe65522c92446636affcdeaedbd84dffe772413 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 15:46:53 +0200 Subject: [PATCH 19/74] Added GLM description to GLM readme.md --- readme.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/readme.md b/readme.md index 5b392f83..ce6a6713 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,21 @@ ![glm](doc/logo.png) +*OpenGL Mathematics (GLM) is a header only C++ mathematics library for graphics software based on the [OpenGL Shading Language (GLSL) specifications](https://www.opengl.org/registry/doc/GLSLangSpec.4.50.diff.pdf). +*GLM provides classes and functions designed and implemented with the same naming conventions and functionalities than GLSL so that anyone who knows GLSL, can use GLM as well in C++. +*This project isn't limited to GLSL features. An extension system, based on the GLSL extension conventions, provides extended capabilities: matrix transformations, quaternions, data packing, random numbers, noise, etc... +*This library works perfectly with OpenGL but it also ensures interoperability with other third party libraries and SDK. It is a good candidate for software rendering (raytracing / rasterisation), image processing, physic simulations and any development context that requires a simple and convenient mathematics library. +*GLM is written in C++98 but can take advantage of C++11 when supported by the compiler. It is a platform independent library with no dependence and it officially supports the following compilers: +- Apple Clang 4.0 and higher +- GCC 4.2 and higher +- Intel C++ Composer XE 2013 and higher +- LLVM 3.0 and higher +- Visual C++ 2010 and higher +- CUDA 4.0 and higher (experimental) +- Any conform C++98 or C++11 compiler +*For more information about GLM, please have a look at the manual and the API reference documentation. +*The source code and the documentation, including this manual, are licensed under the [Happy Bunny License (Modified MIT) and the MIT License](./copying.txt). +*Thanks for contributing to the project by [submitting issues](https://github.com/g-truc/glm/issues) for bug reports and feature requests. Any feedback is welcome at [glm@g-truc.net](mailto://glm@g-truc.net). + ================================================================================ OpenGL Mathematics (GLM) -------------------------------------------------------------------------------- From 20d1e6b06a54655617087bf195ccedd24e69fe07 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 16:07:48 +0200 Subject: [PATCH 20/74] Updated readme.rd --- readme.md | 93 +++++++++++++++++++------------------------------------ 1 file changed, 31 insertions(+), 62 deletions(-) diff --git a/readme.md b/readme.md index ce6a6713..f922195c 100644 --- a/readme.md +++ b/readme.md @@ -1,10 +1,10 @@ ![glm](doc/logo.png) -*OpenGL Mathematics (GLM) is a header only C++ mathematics library for graphics software based on the [OpenGL Shading Language (GLSL) specifications](https://www.opengl.org/registry/doc/GLSLangSpec.4.50.diff.pdf). -*GLM provides classes and functions designed and implemented with the same naming conventions and functionalities than GLSL so that anyone who knows GLSL, can use GLM as well in C++. -*This project isn't limited to GLSL features. An extension system, based on the GLSL extension conventions, provides extended capabilities: matrix transformations, quaternions, data packing, random numbers, noise, etc... -*This library works perfectly with OpenGL but it also ensures interoperability with other third party libraries and SDK. It is a good candidate for software rendering (raytracing / rasterisation), image processing, physic simulations and any development context that requires a simple and convenient mathematics library. -*GLM is written in C++98 but can take advantage of C++11 when supported by the compiler. It is a platform independent library with no dependence and it officially supports the following compilers: +OpenGL Mathematics (*GLM*) is a header only C++ mathematics library for graphics software based on the [OpenGL Shading Language (GLSL) specifications](https://www.opengl.org/registry/doc/GLSLangSpec.4.50.diff.pdf). +*GLM* provides classes and functions designed and implemented with the same naming conventions and functionalities than GLSL so that anyone who knows GLSL, can use GLM as well in C++. +This project isn't limited to GLSL features. An extension system, based on the GLSL extension conventions, provides extended capabilities: matrix transformations, quaternions, data packing, random numbers, noise, etc... +This library works perfectly with OpenGL but it also ensures interoperability with other third party libraries and SDK. It is a good candidate for software rendering (raytracing / rasterisation), image processing, physic simulations and any development context that requires a simple and convenient mathematics library. +*GLM* is written in C++98 but can take advantage of C++11 when supported by the compiler. It is a platform independent library with no dependence and it officially supports the following compilers: - Apple Clang 4.0 and higher - GCC 4.2 and higher - Intel C++ Composer XE 2013 and higher @@ -12,65 +12,26 @@ - Visual C++ 2010 and higher - CUDA 4.0 and higher (experimental) - Any conform C++98 or C++11 compiler -*For more information about GLM, please have a look at the manual and the API reference documentation. -*The source code and the documentation, including this manual, are licensed under the [Happy Bunny License (Modified MIT) and the MIT License](./copying.txt). -*Thanks for contributing to the project by [submitting issues](https://github.com/g-truc/glm/issues) for bug reports and feature requests. Any feedback is welcome at [glm@g-truc.net](mailto://glm@g-truc.net). +For more information about *GLM*, please have a look at the manual and the API reference documentation. +The source code and the documentation, including this manual, are licensed under the [Happy Bunny License (Modified MIT) and the MIT License](./copying.txt). +Thanks for contributing to the project by [submitting issues](https://github.com/g-truc/glm/issues) for bug reports and feature requests. Any feedback is welcome at [glm@g-truc.net](mailto://glm@g-truc.net). -================================================================================ -OpenGL Mathematics (GLM) --------------------------------------------------------------------------------- -GLM can be distributed and/or modified under the terms of either -a) The Happy Bunny License, or b) the MIT License. +```c++ +#include // glm::vec3 +#include // glm::vec4 +#include // glm::mat4 +#include // glm::translate, glm::rotate, glm::scale, glm::perspective -================================================================================ -The Happy Bunny License (Modified MIT License) --------------------------------------------------------------------------------- -Copyright (c) 2005 - 2015 G-Truc Creation - -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. - -Restrictions: - By making use of the Software for military purposes, you choose to make a - Bunny unhappy. - -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. - -================================================================================ -The MIT License --------------------------------------------------------------------------------- -Copyright (c) 2005 - 2015 G-Truc Creation - -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. +glm::mat4 camera(float Translate, glm::vec2 const & Rotate) +{ + glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f); + glm::mat4 View = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate)); + View = glm::rotate(View, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f)); + View = glm::rotate(View, Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f)); + glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f)); + return Projection * View * Model; +} +``` ================================================================================ GLM Usage @@ -81,6 +42,14 @@ GLM is a header only library, there is nothing to build, just include it. More informations in GLM manual: http://glm.g-truc.net/glm.pdf +## Project Health + +| Service | System | Compiler | Options | Status | +| ------- | ------ | -------- | ------- | ------ | +| [Drone](https://drone.io/github.com/g-truc/glm) | Ubuntu 12.04 | GCC 4.8 | no tests | [![Build Status](https://drone.io/github.com/g-truc/glm/status.png)](https://drone.io/github.com/g-truc/glm/latest) | + +## Release notes + ================================================================================ GLM 0.9.7.0: 2015-XX-XX -------------------------------------------------------------------------------- From 63091596835992ab4a0aa145b5791b3dd3983ea2 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 16:16:36 +0200 Subject: [PATCH 21/74] Updated readme.md --- readme.md | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/readme.md b/readme.md index f922195c..8d2214e6 100644 --- a/readme.md +++ b/readme.md @@ -1,19 +1,25 @@ ![glm](doc/logo.png) OpenGL Mathematics (*GLM*) is a header only C++ mathematics library for graphics software based on the [OpenGL Shading Language (GLSL) specifications](https://www.opengl.org/registry/doc/GLSLangSpec.4.50.diff.pdf). + *GLM* provides classes and functions designed and implemented with the same naming conventions and functionalities than GLSL so that anyone who knows GLSL, can use GLM as well in C++. + This project isn't limited to GLSL features. An extension system, based on the GLSL extension conventions, provides extended capabilities: matrix transformations, quaternions, data packing, random numbers, noise, etc... + This library works perfectly with OpenGL but it also ensures interoperability with other third party libraries and SDK. It is a good candidate for software rendering (raytracing / rasterisation), image processing, physic simulations and any development context that requires a simple and convenient mathematics library. + *GLM* is written in C++98 but can take advantage of C++11 when supported by the compiler. It is a platform independent library with no dependence and it officially supports the following compilers: -- Apple Clang 4.0 and higher -- GCC 4.2 and higher -- Intel C++ Composer XE 2013 and higher -- LLVM 3.0 and higher -- Visual C++ 2010 and higher -- CUDA 4.0 and higher (experimental) +- [Apple Clang 4.0](https://developer.apple.com/library/mac/documentation/CompilerTools/Conceptual/LLVMCompilerOverview/index.html) and higher +- [GCC](http://gcc.gnu.org/) 4.2 and higher +- [Intel C++ Composer](https://software.intel.com/en-us/intel-compilers) XE 2013 and higher +- [LLVM](http://llvm.org/) 3.0 and higher +- [Visual C++](http://www.visualstudio.com/) 2010 and higher +- [CUDA](https://developer.nvidia.com/about-cuda) 4.0 and higher (experimental) - Any conform C++98 or C++11 compiler -For more information about *GLM*, please have a look at the manual and the API reference documentation. -The source code and the documentation, including this manual, are licensed under the [Happy Bunny License (Modified MIT) and the MIT License](./copying.txt). + +For more information about *GLM*, please have a look at the [manual](http://glm.g-truc.net/0.9.6/glm-0.9.6.pdf) and the [API reference documentation](http://glm.g-truc.net/0.9.6/api/index.html). +The source code and the documentation are licensed under the [Happy Bunny License (Modified MIT) and the MIT License](./copying.txt). + Thanks for contributing to the project by [submitting issues](https://github.com/g-truc/glm/issues) for bug reports and feature requests. Any feedback is welcome at [glm@g-truc.net](mailto://glm@g-truc.net). ```c++ @@ -33,15 +39,6 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) } ``` -================================================================================ -GLM Usage --------------------------------------------------------------------------------- -GLM is a header only library, there is nothing to build, just include it. -#include - -More informations in GLM manual: -http://glm.g-truc.net/glm.pdf - ## Project Health | Service | System | Compiler | Options | Status | @@ -50,9 +47,7 @@ http://glm.g-truc.net/glm.pdf ## Release notes -================================================================================ -GLM 0.9.7.0: 2015-XX-XX --------------------------------------------------------------------------------- +##### GLM 0.9.7.0: 2015-XX-XX Features: - Added GTC_color: convertRgbToSrgb and convertSrgbToRgb functions - Added 'fmod' overload to GTX_common with tests #308 From 3164671f77b1d1afcd8fd37b761ce4801f13349b Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 16:19:21 +0200 Subject: [PATCH 22/74] Updated readme.md --- readme.md | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/readme.md b/readme.md index 8d2214e6..f3a234eb 100644 --- a/readme.md +++ b/readme.md @@ -67,20 +67,14 @@ Fixes: Deprecation: - Removed integer specification for 'mod' in GTC_integer #308 -================================================================================ -GLM 0.9.6.4: 2015-0X-XX --------------------------------------------------------------------------------- +##### GLM 0.9.6.4: 2015-0X-XX Fixes: - Fixed default precision for quat and dual_quat type #312 -================================================================================ -GLM 0.9.6.3: 2015-02-15 --------------------------------------------------------------------------------- +##### GLM 0.9.6.3: 2015-02-15 - Fixed Android doesn't have C++ 11 STL #284 -================================================================================ -GLM 0.9.6.2: 2015-02-15 --------------------------------------------------------------------------------- +##### GLM 0.9.6.2: 2015-02-15 Features: - Added display of GLM version with other GLM_MESSAGES - Added ARM instruction set detection @@ -104,9 +98,7 @@ Fixes: - Fixed functions not inlined with Clang #302 - Fixed memory corruption (undefined behaviour) #303 -================================================================================ -GLM 0.9.6.1: 2014-12-10 --------------------------------------------------------------------------------- +##### GLM 0.9.6.1: 2014-12-10 Features: - Added GLM_LANG_CXX14_FLAG and GLM_LANG_CXX1Z_FLAG language feature flags - Added C++14 detection @@ -127,9 +119,7 @@ Fixes: - Fixed conflict between GTX_compatibility and GTC_quaternion #286 - Fixed C++ language restriction using GLM_FORCE_CXX** -================================================================================ -GLM 0.9.6.0: 2014-11-30 --------------------------------------------------------------------------------- +##### GLM 0.9.6.0: 2014-11-30 Features: - Exposed template vector and matrix types in 'glm' namespace #239, #244 - Added GTX_scalar_multiplication for C++ 11 compiler only #242 @@ -190,9 +180,7 @@ Deprecation: - Removed LLVM 2.6 to 3.1 support - Removed CUDA 3.0 to 3.2 support -================================================================================ -GLM 0.9.5.4: 2014-06-21 --------------------------------------------------------------------------------- +##### GLM 0.9.5.4: 2014-06-21 - Fixed non-utf8 character #196 - Added FindGLM install for CMake #189 - Fixed GTX_color_space - saturation #195 From ff05442b0bce0f4ffd8ef8c71099485c408b0479 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 16:22:00 +0200 Subject: [PATCH 23/74] Updated readme.md --- readme.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/readme.md b/readme.md index f3a234eb..26f032e9 100644 --- a/readme.md +++ b/readme.md @@ -47,27 +47,27 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) ## Release notes -##### GLM 0.9.7.0: 2015-XX-XX -Features: +### GLM 0.9.7.0: 2015-XX-XX +##### Features: - Added GTC_color: convertRgbToSrgb and convertSrgbToRgb functions - Added 'fmod' overload to GTX_common with tests #308 - Left handed perspective and lookAt functions #314 - Added functions eulerAngleXYZ and extractEulerAngleXYZ #311 - Added to perform to perform std::hash on GLM types #320 -Improvements: +##### Improvements: - Changed usage of __has_include to support Intel compiler #307 - Specialized integer implementation of YCoCg-R #310 - Don't show status message in 'FindGLM' if 'QUIET' option is set. #317 -Fixes: +##### Fixes: - Fixed (u)int64 MSB/LSB handling on BE archs #306 - Fixed multi-line comment warning in g++. #315 -Deprecation: +##### Deprecation: - Removed integer specification for 'mod' in GTC_integer #308 -##### GLM 0.9.6.4: 2015-0X-XX +### GLM 0.9.6.4: 2015-0X-XX Fixes: - Fixed default precision for quat and dual_quat type #312 From 376ca3351f55a3c69d1384a891ba164f02dffbcc Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 16:46:45 +0200 Subject: [PATCH 24/74] Updated readme.md --- readme.md | 302 ++++++++++++++++++++---------------------------------- 1 file changed, 111 insertions(+), 191 deletions(-) diff --git a/readme.md b/readme.md index 26f032e9..c2bd5d53 100644 --- a/readme.md +++ b/readme.md @@ -2,11 +2,11 @@ OpenGL Mathematics (*GLM*) is a header only C++ mathematics library for graphics software based on the [OpenGL Shading Language (GLSL) specifications](https://www.opengl.org/registry/doc/GLSLangSpec.4.50.diff.pdf). -*GLM* provides classes and functions designed and implemented with the same naming conventions and functionalities than GLSL so that anyone who knows GLSL, can use GLM as well in C++. +*GLM* provides classes and functions designed and implemented with the same naming conventions and functionalities than *GLSL* so that anyone who knows *GLSL*, can use *GLM* as well in C++. -This project isn't limited to GLSL features. An extension system, based on the GLSL extension conventions, provides extended capabilities: matrix transformations, quaternions, data packing, random numbers, noise, etc... +This project isn't limited to *GLSL* features. An extension system, based on the *GLSL* extension conventions, provides extended capabilities: matrix transformations, quaternions, data packing, random numbers, noise, etc... -This library works perfectly with OpenGL but it also ensures interoperability with other third party libraries and SDK. It is a good candidate for software rendering (raytracing / rasterisation), image processing, physic simulations and any development context that requires a simple and convenient mathematics library. +This library works perfectly with *OpenGL* but it also ensures interoperability with other third party libraries and SDK. It is a good candidate for software rendering (raytracing / rasterisation), image processing, physic simulations and any development context that requires a simple and convenient mathematics library. *GLM* is written in C++98 but can take advantage of C++11 when supported by the compiler. It is a platform independent library with no dependence and it officially supports the following compilers: - [Apple Clang 4.0](https://developer.apple.com/library/mac/documentation/CompilerTools/Conceptual/LLVMCompilerOverview/index.html) and higher @@ -67,25 +67,29 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) ##### Deprecation: - Removed integer specification for 'mod' in GTC_integer #308 +-------------------------------------------------------------------------------- ### GLM 0.9.6.4: 2015-0X-XX Fixes: - Fixed default precision for quat and dual_quat type #312 -##### GLM 0.9.6.3: 2015-02-15 +-------------------------------------------------------------------------------- +### GLM 0.9.6.3: 2015-02-15 - Fixed Android doesn't have C++ 11 STL #284 -##### GLM 0.9.6.2: 2015-02-15 -Features: +-------------------------------------------------------------------------------- +### GLM 0.9.6.2: 2015-02-15 +##### Features: - Added display of GLM version with other GLM_MESSAGES - Added ARM instruction set detection -Improvements: +-------------------------------------------------------------------------------- +##### Improvements: - Removed assert for perspective with zFar < zNear #298 - Added Visual Studio natvis support for vec1, quat and dualqual types - Cleaned up C++11 feature detections - Clarify GLM licensing -Fixes: +##### Fixes: - Fixed faceforward build #289 - Fixed conflict with Xlib #define True 1 #293 - Fixed decompose function VS2010 templating issues #294 @@ -98,15 +102,16 @@ Fixes: - Fixed functions not inlined with Clang #302 - Fixed memory corruption (undefined behaviour) #303 -##### GLM 0.9.6.1: 2014-12-10 -Features: +-------------------------------------------------------------------------------- +### GLM 0.9.6.1: 2014-12-10 +##### Features: - Added GLM_LANG_CXX14_FLAG and GLM_LANG_CXX1Z_FLAG language feature flags - Added C++14 detection -Improvements: +##### Improvements: - Clean up GLM_MESSAGES compilation log to report only detected capabilities -Fixes: +##### Fixes: - Fixed scalar uaddCarry build error with Cuda #276 - Fixed C++11 explicit conversion operators detection #282 - Fixed missing explicit convertion when using integer log2 with *vec1 types @@ -119,8 +124,9 @@ Fixes: - Fixed conflict between GTX_compatibility and GTC_quaternion #286 - Fixed C++ language restriction using GLM_FORCE_CXX** -##### GLM 0.9.6.0: 2014-11-30 -Features: +-------------------------------------------------------------------------------- +### GLM 0.9.6.0: 2014-11-30 +##### Features: - Exposed template vector and matrix types in 'glm' namespace #239, #244 - Added GTX_scalar_multiplication for C++ 11 compiler only #242 - Added GTX_range for C++ 11 compiler only #240 @@ -140,7 +146,7 @@ Features: - Added GLM_FORCE_EXPLICIT_CTOR to require explicit type conversions #269 - Added GTX_type_aligned for aligned vector, matrix and quaternion types -Improvements: +##### Improvements: - Rely on C++11 to implement isinf and isnan - Removed GLM_FORCE_CUDA, Cuda is implicitly detected - Separated Apple Clang and LLVM compiler detection @@ -160,7 +166,7 @@ Improvements: - Optimized sign function #272 - Added explicit cast from quat to mat3 and mat4 #275 -Fixes: +##### Fixes: - Fixed std::nextafter not supported with C++11 on Android #217 - Fixed missing value_type for dual quaternion - Fixed return type of dual quaternion length @@ -171,7 +177,7 @@ Fixes: - Fixed uaddCarray #253 - Fixed float comparison warnings #270 -Deprecation: +##### Deprecation: - Removed degrees for function parameters - Removed GLM_FORCE_RADIANS, active by default - Removed VC 2005 / 8 and 2008 / 9 support @@ -180,7 +186,8 @@ Deprecation: - Removed LLVM 2.6 to 3.1 support - Removed CUDA 3.0 to 3.2 support -##### GLM 0.9.5.4: 2014-06-21 +-------------------------------------------------------------------------------- +### GLM 0.9.5.4: 2014-06-21 - Fixed non-utf8 character #196 - Added FindGLM install for CMake #189 - Fixed GTX_color_space - saturation #195 @@ -200,9 +207,8 @@ Deprecation: - Fixed std::nextafter not supported with C++11 on Android #213 - Fixed corner cases in exp and log functions for quaternions #199 -================================================================================ -GLM 0.9.5.3: 2014-04-02 -------------------------------------------------------------------------------- +### GLM 0.9.5.3: 2014-04-02 - Added instruction set auto detection with Visual C++ using _M_IX86_FP - /arch compiler argument - Fixed GTX_raw_data code dependency @@ -217,9 +223,8 @@ GLM 0.9.5.3: 2014-04-02 - Added full tests for eulerAngle*** functions (#173) - Added workaround for a CUDA compiler bug (#186, #185) -================================================================================ -GLM 0.9.5.2: 2014-02-08 -------------------------------------------------------------------------------- +### GLM 0.9.5.2: 2014-02-08 - Fixed initializer list ambiguity (#159, #160) - Fixed warnings with the Android NDK 9c - Fixed non power of two matrix products @@ -231,9 +236,8 @@ GLM 0.9.5.2: 2014-02-08 - Tentative fix for strict aliasing warning in GCC 4.8.1 / Android NDK 9c (#152) - Fixed GLM_GTC_constants description brief (#162) -================================================================================ -GLM 0.9.5.1: 2014-01-11 -------------------------------------------------------------------------------- +### GLM 0.9.5.1: 2014-01-11 - Fixed angle and orientedAngle that sometimes return NaN values (#145) - Deprecated degrees for function parameters and display a message - Added possible static_cast conversion of GLM types (#72) @@ -244,9 +248,8 @@ GLM 0.9.5.1: 2014-01-11 - Added intersectRayPlane function (#153) - Fixed outerProduct return type (#155) -================================================================================ -GLM 0.9.5.0: 2013-12-25 -------------------------------------------------------------------------------- +### GLM 0.9.5.0: 2013-12-25 - Added forward declarations (glm/fwd.hpp) for faster compilations - Added per feature headers - Minimized GLM internal dependencies @@ -284,9 +287,8 @@ GLM 0.9.5.0: 2013-12-25 - Improved GLM messages enabled when defining GLM_MESSAGES - Hidden matrix _inverse function implementation detail into private section -================================================================================ -GLM 0.9.4.6: 2013-09-20 -------------------------------------------------------------------------------- +### GLM 0.9.4.6: 2013-09-20 - Fixed detection to select the last known compiler if newer version #106 - Fixed is_int and is_uint code duplication with GCC and C++11 #107 - Fixed test suite build while using Clang in C++11 mode @@ -300,9 +302,8 @@ GLM 0.9.4.6: 2013-09-20 - Fixed const ref issue on assignment operator taking a scalar parameter #116 - Fixed glm::eulerAngleY implementation #117 -================================================================================ -GLM 0.9.4.5: 2013-08-12 -------------------------------------------------------------------------------- +### GLM 0.9.4.5: 2013-08-12 - Fixed CUDA support - Fixed inclusion of intrinsics in "pure" mode #92 - Fixed language detection on GCC when the C++0x mode isn't enabled #95 @@ -311,9 +312,8 @@ GLM 0.9.4.5: 2013-08-12 - Added Windows CE detection #92 - Added missing value_ptr for quaternions #99 -================================================================================ -GLM 0.9.4.4: 2013-05-29 -------------------------------------------------------------------------------- +### GLM 0.9.4.4: 2013-05-29 - Fixed slerp when costheta is close to 1 #65 - Fixed mat4x2 value_type constructor #70 - Fixed glm.natvis for Visual C++ 12 #82 @@ -324,9 +324,8 @@ GLM 0.9.4.4: 2013-05-29 - Fixed GLM_GTX_multiple with negative values #79 - Fixed glm::perspective when zNear is zero #71 -================================================================================ -GLM 0.9.4.3: 2013-03-20 -------------------------------------------------------------------------------- +### GLM 0.9.4.3: 2013-03-20 - Detected qualifier for Clang - Fixed C++11 mode for GCC, couldn't be enabled without MS extensions - Fixed squad, intermediate and exp quaternion functions @@ -338,9 +337,8 @@ GLM 0.9.4.3: 2013-03-20 - Autodetected C++ version using __cplusplus value - Fixed mix for bool and bvec* third parameter -================================================================================ -GLM 0.9.4.2: 2013-02-14 -------------------------------------------------------------------------------- +### GLM 0.9.4.2: 2013-02-14 - Fixed compAdd from GTX_component_wise - Fixed SIMD support for Intel compiler on Windows - Fixed isnan and isinf for CUDA compiler @@ -353,9 +351,8 @@ GLM 0.9.4.2: 2013-02-14 - Fixed documentation warnings - Fixed CUDA warnings -================================================================================ -GLM 0.9.4.1: 2012-12-22 -------------------------------------------------------------------------------- +### GLM 0.9.4.1: 2012-12-22 - Improved half support: -0.0 case and implicit conversions - Fixed Intel Composer Compiler support on Linux - Fixed interaction between quaternion and euler angles @@ -366,9 +363,8 @@ GLM 0.9.4.1: 2012-12-22 - Fixed assert messages - Added slerp and lerp quaternion functions and tests -================================================================================ -GLM 0.9.4.0: 2012-11-18 -------------------------------------------------------------------------------- +### GLM 0.9.4.0: 2012-11-18 - Added Intel Composer Compiler support - Promoted GTC_espilon extension - Promoted GTC_ulp extension @@ -377,9 +373,8 @@ GLM 0.9.4.0: 2012-11-18 - Fixed detection of Clang and LLVM GCC on MacOS X - Added debugger visualizers for Visual C++ 2012 -================================================================================ -GLM 0.9.3.4: 2012-06-30 -------------------------------------------------------------------------------- +### GLM 0.9.3.4: 2012-06-30 - Added SSE4 and AVX2 detection. - Removed VIRTREV_xstream and the incompatibility generated with GCC - Fixed C++11 compiler option for GCC @@ -388,9 +383,8 @@ GLM 0.9.3.4: 2012-06-30 - Fixed warnings - Fixed SSE includes -================================================================================ -GLM 0.9.3.3: 2012-05-10 -------------------------------------------------------------------------------- +### GLM 0.9.3.3: 2012-05-10 - Fixed isinf and isnan - Improved compatibility with Intel compiler - Added CMake test build options: SIMD, C++11, fast math and MS land ext @@ -401,32 +395,28 @@ GLM 0.9.3.3: 2012-05-10 - Fixed various warnings - Added VC11 support -================================================================================ -GLM 0.9.3.2: 2012-03-15 -------------------------------------------------------------------------------- +### GLM 0.9.3.2: 2012-03-15 - Fixed doxygen documentation - Fixed Clang version detection - Fixed simd mat4 /= operator -================================================================================ -GLM 0.9.3.1: 2012-01-25 -------------------------------------------------------------------------------- +### GLM 0.9.3.1: 2012-01-25 - Fixed platform detection - Fixed warnings - Removed detail code from Doxygen doc -================================================================================ -GLM 0.9.3.0: 2012-01-09 -------------------------------------------------------------------------------- +### GLM 0.9.3.0: 2012-01-09 - Added CPP Check project - Fixed conflict with Windows headers - Fixed isinf implementation - Fixed Boost conflict - Fixed warnings -================================================================================ -GLM 0.9.3.B: 2011-12-12 -------------------------------------------------------------------------------- +### GLM 0.9.3.B: 2011-12-12 - Added support for Chrone Native Client - Added epsilon constant - Removed value_size function from vector types @@ -436,9 +426,8 @@ GLM 0.9.3.B: 2011-12-12 - Fixed step function accuracy - Fixed outerProduct -================================================================================ -GLM 0.9.3.A: 2011-11-11 -------------------------------------------------------------------------------- +### GLM 0.9.3.A: 2011-11-11 - Improved doxygen documentation - Added new swizzle operators for C++11 compilers - Added new swizzle operators declared as functions @@ -452,55 +441,47 @@ generation distribution - Fixed half based type contructors - Added GLSL core noise functions -================================================================================ -GLM 0.9.2.7: 2011-10-24 -------------------------------------------------------------------------------- +### GLM 0.9.2.7: 2011-10-24 - Added more swizzling constructors - Added missing none-squared matrix products -================================================================================ -GLM 0.9.2.6: 2011-10-01 -------------------------------------------------------------------------------- +### GLM 0.9.2.6: 2011-10-01 - Fixed half based type build on old GCC - Fixed /W4 warnings on Visual C++ - Fixed some missing l-value swizzle operators -================================================================================ -GLM 0.9.2.5: 2011-09-20 -------------------------------------------------------------------------------- +### GLM 0.9.2.5: 2011-09-20 - Fixed floatBitToXint functions - Fixed pack and unpack functions - Fixed round functions -================================================================================ -GLM 0.9.2.4: 2011-09-03 -------------------------------------------------------------------------------- +### GLM 0.9.2.4: 2011-09-03 - Fixed extensions bugs -================================================================================ -GLM 0.9.2.3: 2011-06-08 -------------------------------------------------------------------------------- +### GLM 0.9.2.3: 2011-06-08 - Fixed build issues -================================================================================ -GLM 0.9.2.2: 2011-06-02 -------------------------------------------------------------------------------- +### GLM 0.9.2.2: 2011-06-02 - Expend matrix constructors flexibility - Improved quaternion implementation - Fixed many warnings across platforms and compilers -================================================================================ -GLM 0.9.2.1: 2011-05-24 -------------------------------------------------------------------------------- +### GLM 0.9.2.1: 2011-05-24 - Automatically detect CUDA support - Improved compiler detection - Fixed errors and warnings in VC with C++ extensions disabled - Fixed and tested GLM_GTX_vector_angle - Fixed and tested GLM_GTX_rotate_vector -================================================================================ -GLM 0.9.2.0: 2011-05-09 -------------------------------------------------------------------------------- +### GLM 0.9.2.0: 2011-05-09 - Added CUDA support - Added CTest test suite - Added GLM_GTX_ulp extension @@ -508,42 +489,35 @@ GLM 0.9.2.0: 2011-05-09 - Added GLM_GTX_matrix_interpolation extension - Updated quaternion slerp interpolation -================================================================================ -GLM 0.9.1.3: 2011-05-07 -------------------------------------------------------------------------------- +### GLM 0.9.1.3: 2011-05-07 - Fixed bugs -================================================================================ -GLM 0.9.1.2: 2011-04-15 -------------------------------------------------------------------------------- +### GLM 0.9.1.2: 2011-04-15 - Fixed bugs -================================================================================ -GLM 0.9.1.1: 2011-03-17 -------------------------------------------------------------------------------- +### GLM 0.9.1.1: 2011-03-17 - Fixed bugs -================================================================================ -GLM 0.9.1.0: 2011-03-03 -------------------------------------------------------------------------------- +### GLM 0.9.1.0: 2011-03-03 - Fixed bugs -================================================================================ -GLM 0.9.1.B: 2011-02-13 -------------------------------------------------------------------------------- +### GLM 0.9.1.B: 2011-02-13 - Updated API documentation - Improved SIMD implementation - Fixed Linux build -================================================================================ -GLM 0.9.0.8: 2011-02-13 -------------------------------------------------------------------------------- +### GLM 0.9.0.8: 2011-02-13 - Added quaternion product operator. - Clarify that GLM is a header only library. -================================================================================ -GLM 0.9.1.A: 2011-01-31 -------------------------------------------------------------------------------- +### GLM 0.9.1.A: 2011-01-31 - Added SIMD support - Added new swizzle functions - Improved static assert error message with C++0x static_assert @@ -551,315 +525,261 @@ GLM 0.9.1.A: 2011-01-31 - Reduced branching - Fixed trunc implementation -================================================================================ -GLM 0.9.0.7: 2011-01-30 -------------------------------------------------------------------------------- +### GLM 0.9.0.7: 2011-01-30 - Added GLSL 4.10 packing functions - Added == and != operators for every types. -================================================================================ -GLM 0.9.0.6: 2010-12-21 -------------------------------------------------------------------------------- +### GLM 0.9.0.6: 2010-12-21 - Many matrices bugs fixed -================================================================================ -GLM 0.9.0.5: 2010-11-01 -------------------------------------------------------------------------------- +### GLM 0.9.0.5: 2010-11-01 - Improved Clang support - Fixed bugs -================================================================================ -GLM 0.9.0.4: 2010-10-04 -------------------------------------------------------------------------------- +### GLM 0.9.0.4: 2010-10-04 - Added autoexp for GLM - Fixed bugs -================================================================================ -GLM 0.9.0.3: 2010-08-26 -------------------------------------------------------------------------------- +### GLM 0.9.0.3: 2010-08-26 - Fixed non-squared matrix operators -================================================================================ -GLM 0.9.0.2: 2010-07-08 -------------------------------------------------------------------------------- +### GLM 0.9.0.2: 2010-07-08 - Added GLM_GTX_int_10_10_10_2 - Fixed bugs -================================================================================ -GLM 0.9.0.1: 2010-06-21 -------------------------------------------------------------------------------- +### GLM 0.9.0.1: 2010-06-21 - Fixed extensions errors -================================================================================ -GLM 0.9.0.0: 2010-05-25 -------------------------------------------------------------------------------- +### GLM 0.9.0.0: 2010-05-25 - Objective-C support - Fixed warnings - Updated documentation -================================================================================ -GLM 0.9.B.2: 2010-04-30 -------------------------------------------------------------------------------- +### GLM 0.9.B.2: 2010-04-30 - Git transition - Removed experimental code from releases - Fixed bugs -================================================================================ -GLM 0.9.B.1: 2010-04-03 -------------------------------------------------------------------------------- +### GLM 0.9.B.1: 2010-04-03 - Based on GLSL 4.00 specification - Added the new core functions - Added some implicit conversion support -================================================================================ -GLM 0.9.A.2: 2010-02-20 -------------------------------------------------------------------------------- +### GLM 0.9.A.2: 2010-02-20 - Improved some possible errors messages - Improved declarations and definitions match -================================================================================ -GLM 0.9.A.1: 2010-02-09 -------------------------------------------------------------------------------- +### GLM 0.9.A.1: 2010-02-09 - Removed deprecated features - Internal redesign -================================================================================ -GLM 0.8.4.4 final: 2010-01-25 -------------------------------------------------------------------------------- +### GLM 0.8.4.4 final: 2010-01-25 - Fixed warnings -================================================================================ -GLM 0.8.4.3 final: 2009-11-16 -------------------------------------------------------------------------------- +### GLM 0.8.4.3 final: 2009-11-16 - Fixed Half float arithmetic - Fixed setup defines -================================================================================ -GLM 0.8.4.2 final: 2009-10-19 -------------------------------------------------------------------------------- +### GLM 0.8.4.2 final: 2009-10-19 - Fixed Half float adds -================================================================================ -GLM 0.8.4.1 final: 2009-10-05 -------------------------------------------------------------------------------- +### GLM 0.8.4.1 final: 2009-10-05 - Updated documentation - Fixed MacOS X build -================================================================================ -GLM 0.8.4.0 final: 2009-09-16 -------------------------------------------------------------------------------- +### GLM 0.8.4.0 final: 2009-09-16 - Added GCC 4.4 and VC2010 support - Added matrix optimizations -================================================================================ -GLM 0.8.3.5 final: 2009-08-11 -------------------------------------------------------------------------------- +### GLM 0.8.3.5 final: 2009-08-11 - Fixed bugs -================================================================================ -GLM 0.8.3.4 final: 2009-08-10 -------------------------------------------------------------------------------- +### GLM 0.8.3.4 final: 2009-08-10 - Updated GLM according GLSL 1.5 spec - Fixed bugs -================================================================================ -GLM 0.8.3.3 final: 2009-06-25 -------------------------------------------------------------------------------- +### GLM 0.8.3.3 final: 2009-06-25 - Fixed bugs -================================================================================ -GLM 0.8.3.2 final: 2009-06-04 -------------------------------------------------------------------------------- +### GLM 0.8.3.2 final: 2009-06-04 - Added GLM_GTC_quaternion - Added GLM_GTC_type_precision -================================================================================ -GLM 0.8.3.1 final: 2009-05-21 -------------------------------------------------------------------------------- +### GLM 0.8.3.1 final: 2009-05-21 - Fixed old extension system. -================================================================================ -GLM 0.8.3.0 final: 2009-05-06 -------------------------------------------------------------------------------- +### GLM 0.8.3.0 final: 2009-05-06 - Added stable extensions. - Added new extension system. -================================================================================ -GLM 0.8.2.3 final: 2009-04-01 -------------------------------------------------------------------------------- +### GLM 0.8.2.3 final: 2009-04-01 - Fixed bugs. -================================================================================ -GLM 0.8.2.2 final: 2009-02-24 -------------------------------------------------------------------------------- +### GLM 0.8.2.2 final: 2009-02-24 - Fixed bugs. -================================================================================ -GLM 0.8.2.1 final: 2009-02-13 -------------------------------------------------------------------------------- +### GLM 0.8.2.1 final: 2009-02-13 - Fixed bugs. -================================================================================ -GLM 0.8.2 final: 2009-01-21 -------------------------------------------------------------------------------- +### GLM 0.8.2 final: 2009-01-21 - Fixed bugs. -================================================================================ -GLM 0.8.1 final: 2008-10-30 -------------------------------------------------------------------------------- +### GLM 0.8.1 final: 2008-10-30 - Fixed bugs. -================================================================================ -GLM 0.8.0 final: 2008-10-23 -------------------------------------------------------------------------------- +### GLM 0.8.0 final: 2008-10-23 - New method to use extension. -================================================================================ -GLM 0.8.0 beta3: 2008-10-10 -------------------------------------------------------------------------------- +### GLM 0.8.0 beta3: 2008-10-10 - Added CMake support for GLM tests. -================================================================================ -GLM 0.8.0 beta2: 2008-10-04 -------------------------------------------------------------------------------- +### GLM 0.8.0 beta2: 2008-10-04 - Improved half scalars and vectors support. -================================================================================ -GLM 0.8.0 beta1: 2008-09-26 -------------------------------------------------------------------------------- +### GLM 0.8.0 beta1: 2008-09-26 - Improved GLSL conformance - Added GLSL 1.30 support - Improved API documentation -================================================================================ -GLM 0.7.6 final: 2008-08-08 -------------------------------------------------------------------------------- +### GLM 0.7.6 final: 2008-08-08 - Improved C++ standard comformance - Added Static assert for types checking -================================================================================ -GLM 0.7.5 final: 2008-07-05 -------------------------------------------------------------------------------- +### GLM 0.7.5 final: 2008-07-05 - Added build message system with Visual Studio - Pedantic build with GCC -================================================================================ -GLM 0.7.4 final: 2008-06-01 -------------------------------------------------------------------------------- +### GLM 0.7.4 final: 2008-06-01 - Added external dependencies system. -================================================================================ -GLM 0.7.3 final: 2008-05-24 -------------------------------------------------------------------------------- +### GLM 0.7.3 final: 2008-05-24 - Fixed bugs - Added new extension group -================================================================================ -GLM 0.7.2 final: 2008-04-27 -------------------------------------------------------------------------------- +### GLM 0.7.2 final: 2008-04-27 - Updated documentation - Added preprocessor options -================================================================================ -GLM 0.7.1 final: 2008-03-24 -------------------------------------------------------------------------------- +### GLM 0.7.1 final: 2008-03-24 - Disabled half on GCC - Fixed extensions -================================================================================ -GLM 0.7.0 final: 2008-03-22 -------------------------------------------------------------------------------- +### GLM 0.7.0 final: 2008-03-22 - Changed to MIT license - Added new documentation -================================================================================ -GLM 0.6.4 : 2007-12-10 -------------------------------------------------------------------------------- +### GLM 0.6.4 : 2007-12-10 - Fixed swizzle operators -================================================================================ -GLM 0.6.3 : 2007-11-05 -------------------------------------------------------------------------------- +### GLM 0.6.3 : 2007-11-05 - Fixed type data accesses - Fixed 3DSMax sdk conflict -================================================================================ -GLM 0.6.2 : 2007-10-08 -------------------------------------------------------------------------------- +### GLM 0.6.2 : 2007-10-08 - Fixed extension -================================================================================ -GLM 0.6.1 : 2007-10-07 -------------------------------------------------------------------------------- +### GLM 0.6.1 : 2007-10-07 - Fixed a namespace error - Added extensions -================================================================================ -GLM 0.6.0 : 2007-09-16 -------------------------------------------------------------------------------- +### GLM 0.6.0 : 2007-09-16 - Added new extension namespace mecanium - Added Automatic compiler detection -================================================================================ -GLM 0.5.1 : 2007-02-19 -------------------------------------------------------------------------------- +### GLM 0.5.1 : 2007-02-19 - Fixed swizzle operators -================================================================================ -GLM 0.5.0 : 2007-01-06 -------------------------------------------------------------------------------- +### GLM 0.5.0 : 2007-01-06 - Upgrated to GLSL 1.2 - Added swizzle operators - Added setup settings -================================================================================ -GLM 0.4.1 : 2006-05-22 -------------------------------------------------------------------------------- +### GLM 0.4.1 : 2006-05-22 - Added OpenGL examples -================================================================================ -GLM 0.4.0 : 2006-05-17 -------------------------------------------------------------------------------- +### GLM 0.4.0 : 2006-05-17 - Added missing operators to vec* and mat* - Added first GLSL 1.2 features - Fixed windows.h before glm.h when windows.h required -================================================================================ -GLM 0.3.2 : 2006-04-21 -------------------------------------------------------------------------------- +### GLM 0.3.2 : 2006-04-21 - Fixed texcoord components access. - Fixed mat4 and imat4 division operators. -================================================================================ -GLM 0.3.1 : 2006-03-28 -------------------------------------------------------------------------------- +### GLM 0.3.1 : 2006-03-28 - Added GCC 4.0 support under MacOS X. - Added GCC 4.0 and 4.1 support under Linux. - Added code optimisations. -================================================================================ -GLM 0.3 : 2006-02-19 -------------------------------------------------------------------------------- +### GLM 0.3 : 2006-02-19 - Improved GLSL type conversion and construction compliance. - Added experimental extensions. - Added Doxygen Documentation. - Added code optimisations. - Fixed bugs. -================================================================================ -GLM 0.2: 2005-05-05 -------------------------------------------------------------------------------- +### GLM 0.2: 2005-05-05 - Improve adaptative from GLSL. - Add experimental extensions based on OpenGL extension process. - Fixe bugs. -================================================================================ -GLM 0.1: 2005-02-21 -------------------------------------------------------------------------------- +### GLM 0.1: 2005-02-21 - Add vec2, vec3, vec4 GLSL types - Add ivec2, ivec3, ivec4 GLSL types - Add bvec2, bvec3, bvec4 GLSL types - Add mat2, mat3, mat4 GLSL types - Add almost all functions -================================================================================ From 7cdc3aa4e05319fae1d57afaf51a10f313694aef Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 16:58:02 +0200 Subject: [PATCH 25/74] Updated readme.md formatting --- readme.md | 188 +++++++++++++++++++++++++++--------------------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/readme.md b/readme.md index c2bd5d53..855af287 100644 --- a/readme.md +++ b/readme.md @@ -47,7 +47,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) ## Release notes -### GLM 0.9.7.0: 2015-XX-XX +#### GLM 0.9.7.0 - 2015-XX-XX ##### Features: - Added GTC_color: convertRgbToSrgb and convertSrgbToRgb functions - Added 'fmod' overload to GTX_common with tests #308 @@ -68,16 +68,16 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Removed integer specification for 'mod' in GTC_integer #308 -------------------------------------------------------------------------------- -### GLM 0.9.6.4: 2015-0X-XX -Fixes: +#### GLM 0.9.6.4 - 2015-0X-XX +##### Fixes: - Fixed default precision for quat and dual_quat type #312 -------------------------------------------------------------------------------- -### GLM 0.9.6.3: 2015-02-15 +#### GLM 0.9.6.3 - 2015-02-15 - Fixed Android doesn't have C++ 11 STL #284 -------------------------------------------------------------------------------- -### GLM 0.9.6.2: 2015-02-15 +#### GLM 0.9.6.2 - 2015-02-15 ##### Features: - Added display of GLM version with other GLM_MESSAGES - Added ARM instruction set detection @@ -103,7 +103,7 @@ Fixes: - Fixed memory corruption (undefined behaviour) #303 -------------------------------------------------------------------------------- -### GLM 0.9.6.1: 2014-12-10 +#### GLM 0.9.6.1 - 2014-12-10 ##### Features: - Added GLM_LANG_CXX14_FLAG and GLM_LANG_CXX1Z_FLAG language feature flags - Added C++14 detection @@ -125,7 +125,7 @@ Fixes: - Fixed C++ language restriction using GLM_FORCE_CXX** -------------------------------------------------------------------------------- -### GLM 0.9.6.0: 2014-11-30 +#### GLM 0.9.6.0 - 2014-11-30 ##### Features: - Exposed template vector and matrix types in 'glm' namespace #239, #244 - Added GTX_scalar_multiplication for C++ 11 compiler only #242 @@ -187,7 +187,7 @@ Fixes: - Removed CUDA 3.0 to 3.2 support -------------------------------------------------------------------------------- -### GLM 0.9.5.4: 2014-06-21 +#### GLM 0.9.5.4 - 2014-06-21 - Fixed non-utf8 character #196 - Added FindGLM install for CMake #189 - Fixed GTX_color_space - saturation #195 @@ -208,7 +208,7 @@ Fixes: - Fixed corner cases in exp and log functions for quaternions #199 -------------------------------------------------------------------------------- -### GLM 0.9.5.3: 2014-04-02 +#### GLM 0.9.5.3 - 2014-04-02 - Added instruction set auto detection with Visual C++ using _M_IX86_FP - /arch compiler argument - Fixed GTX_raw_data code dependency @@ -224,7 +224,7 @@ Fixes: - Added workaround for a CUDA compiler bug (#186, #185) -------------------------------------------------------------------------------- -### GLM 0.9.5.2: 2014-02-08 +#### GLM 0.9.5.2 - 2014-02-08 - Fixed initializer list ambiguity (#159, #160) - Fixed warnings with the Android NDK 9c - Fixed non power of two matrix products @@ -237,7 +237,7 @@ Fixes: - Fixed GLM_GTC_constants description brief (#162) -------------------------------------------------------------------------------- -### GLM 0.9.5.1: 2014-01-11 +#### GLM 0.9.5.1 - 2014-01-11 - Fixed angle and orientedAngle that sometimes return NaN values (#145) - Deprecated degrees for function parameters and display a message - Added possible static_cast conversion of GLM types (#72) @@ -249,7 +249,7 @@ Fixes: - Fixed outerProduct return type (#155) -------------------------------------------------------------------------------- -### GLM 0.9.5.0: 2013-12-25 +#### GLM 0.9.5.0 - 2013-12-25 - Added forward declarations (glm/fwd.hpp) for faster compilations - Added per feature headers - Minimized GLM internal dependencies @@ -288,7 +288,7 @@ Fixes: - Hidden matrix _inverse function implementation detail into private section -------------------------------------------------------------------------------- -### GLM 0.9.4.6: 2013-09-20 +#### GLM 0.9.4.6 - 2013-09-20 - Fixed detection to select the last known compiler if newer version #106 - Fixed is_int and is_uint code duplication with GCC and C++11 #107 - Fixed test suite build while using Clang in C++11 mode @@ -303,7 +303,7 @@ Fixes: - Fixed glm::eulerAngleY implementation #117 -------------------------------------------------------------------------------- -### GLM 0.9.4.5: 2013-08-12 +#### GLM 0.9.4.5 - 2013-08-12 - Fixed CUDA support - Fixed inclusion of intrinsics in "pure" mode #92 - Fixed language detection on GCC when the C++0x mode isn't enabled #95 @@ -313,7 +313,7 @@ Fixes: - Added missing value_ptr for quaternions #99 -------------------------------------------------------------------------------- -### GLM 0.9.4.4: 2013-05-29 +#### GLM 0.9.4.4 - 2013-05-29 - Fixed slerp when costheta is close to 1 #65 - Fixed mat4x2 value_type constructor #70 - Fixed glm.natvis for Visual C++ 12 #82 @@ -325,7 +325,7 @@ Fixes: - Fixed glm::perspective when zNear is zero #71 -------------------------------------------------------------------------------- -### GLM 0.9.4.3: 2013-03-20 +#### GLM 0.9.4.3 - 2013-03-20 - Detected qualifier for Clang - Fixed C++11 mode for GCC, couldn't be enabled without MS extensions - Fixed squad, intermediate and exp quaternion functions @@ -338,7 +338,7 @@ Fixes: - Fixed mix for bool and bvec* third parameter -------------------------------------------------------------------------------- -### GLM 0.9.4.2: 2013-02-14 +#### GLM 0.9.4.2 - 2013-02-14 - Fixed compAdd from GTX_component_wise - Fixed SIMD support for Intel compiler on Windows - Fixed isnan and isinf for CUDA compiler @@ -352,7 +352,7 @@ Fixes: - Fixed CUDA warnings -------------------------------------------------------------------------------- -### GLM 0.9.4.1: 2012-12-22 +#### GLM 0.9.4.1 - 2012-12-22 - Improved half support: -0.0 case and implicit conversions - Fixed Intel Composer Compiler support on Linux - Fixed interaction between quaternion and euler angles @@ -364,7 +364,7 @@ Fixes: - Added slerp and lerp quaternion functions and tests -------------------------------------------------------------------------------- -### GLM 0.9.4.0: 2012-11-18 +#### GLM 0.9.4.0 - 2012-11-18 - Added Intel Composer Compiler support - Promoted GTC_espilon extension - Promoted GTC_ulp extension @@ -374,7 +374,7 @@ Fixes: - Added debugger visualizers for Visual C++ 2012 -------------------------------------------------------------------------------- -### GLM 0.9.3.4: 2012-06-30 +#### GLM 0.9.3.4 - 2012-06-30 - Added SSE4 and AVX2 detection. - Removed VIRTREV_xstream and the incompatibility generated with GCC - Fixed C++11 compiler option for GCC @@ -384,7 +384,7 @@ Fixes: - Fixed SSE includes -------------------------------------------------------------------------------- -### GLM 0.9.3.3: 2012-05-10 +#### GLM 0.9.3.3 - 2012-05-10 - Fixed isinf and isnan - Improved compatibility with Intel compiler - Added CMake test build options: SIMD, C++11, fast math and MS land ext @@ -396,19 +396,19 @@ Fixes: - Added VC11 support -------------------------------------------------------------------------------- -### GLM 0.9.3.2: 2012-03-15 +#### GLM 0.9.3.2 - 2012-03-15 - Fixed doxygen documentation - Fixed Clang version detection - Fixed simd mat4 /= operator -------------------------------------------------------------------------------- -### GLM 0.9.3.1: 2012-01-25 +#### GLM 0.9.3.1 - 2012-01-25 - Fixed platform detection - Fixed warnings - Removed detail code from Doxygen doc -------------------------------------------------------------------------------- -### GLM 0.9.3.0: 2012-01-09 +#### GLM 0.9.3.0 - 2012-01-09 - Added CPP Check project - Fixed conflict with Windows headers - Fixed isinf implementation @@ -416,7 +416,7 @@ Fixes: - Fixed warnings -------------------------------------------------------------------------------- -### GLM 0.9.3.B: 2011-12-12 +#### GLM 0.9.3.B - 2011-12-12 - Added support for Chrone Native Client - Added epsilon constant - Removed value_size function from vector types @@ -427,7 +427,7 @@ Fixes: - Fixed outerProduct -------------------------------------------------------------------------------- -### GLM 0.9.3.A: 2011-11-11 +#### GLM 0.9.3.A - 2011-11-11 - Improved doxygen documentation - Added new swizzle operators for C++11 compilers - Added new swizzle operators declared as functions @@ -442,38 +442,38 @@ generation distribution - Added GLSL core noise functions -------------------------------------------------------------------------------- -### GLM 0.9.2.7: 2011-10-24 +#### GLM 0.9.2.7 - 2011-10-24 - Added more swizzling constructors - Added missing none-squared matrix products -------------------------------------------------------------------------------- -### GLM 0.9.2.6: 2011-10-01 +#### GLM 0.9.2.6 - 2011-10-01 - Fixed half based type build on old GCC - Fixed /W4 warnings on Visual C++ - Fixed some missing l-value swizzle operators -------------------------------------------------------------------------------- -### GLM 0.9.2.5: 2011-09-20 +#### GLM 0.9.2.5 - 2011-09-20 - Fixed floatBitToXint functions - Fixed pack and unpack functions - Fixed round functions -------------------------------------------------------------------------------- -### GLM 0.9.2.4: 2011-09-03 +#### GLM 0.9.2.4 - 2011-09-03 - Fixed extensions bugs -------------------------------------------------------------------------------- -### GLM 0.9.2.3: 2011-06-08 +#### GLM 0.9.2.3 - 2011-06-08 - Fixed build issues -------------------------------------------------------------------------------- -### GLM 0.9.2.2: 2011-06-02 +#### GLM 0.9.2.2 - 2011-06-02 - Expend matrix constructors flexibility - Improved quaternion implementation - Fixed many warnings across platforms and compilers -------------------------------------------------------------------------------- -### GLM 0.9.2.1: 2011-05-24 +#### GLM 0.9.2.1 - 2011-05-24 - Automatically detect CUDA support - Improved compiler detection - Fixed errors and warnings in VC with C++ extensions disabled @@ -481,7 +481,7 @@ generation distribution - Fixed and tested GLM_GTX_rotate_vector -------------------------------------------------------------------------------- -### GLM 0.9.2.0: 2011-05-09 +#### GLM 0.9.2.0 - 2011-05-09 - Added CUDA support - Added CTest test suite - Added GLM_GTX_ulp extension @@ -490,34 +490,34 @@ generation distribution - Updated quaternion slerp interpolation -------------------------------------------------------------------------------- -### GLM 0.9.1.3: 2011-05-07 +#### GLM 0.9.1.3 - 2011-05-07 - Fixed bugs -------------------------------------------------------------------------------- -### GLM 0.9.1.2: 2011-04-15 +#### GLM 0.9.1.2 - 2011-04-15 - Fixed bugs -------------------------------------------------------------------------------- -### GLM 0.9.1.1: 2011-03-17 +#### GLM 0.9.1.1 - 2011-03-17 - Fixed bugs -------------------------------------------------------------------------------- -### GLM 0.9.1.0: 2011-03-03 +#### GLM 0.9.1.0 - 2011-03-03 - Fixed bugs -------------------------------------------------------------------------------- -### GLM 0.9.1.B: 2011-02-13 +#### GLM 0.9.1.B - 2011-02-13 - Updated API documentation - Improved SIMD implementation - Fixed Linux build -------------------------------------------------------------------------------- -### GLM 0.9.0.8: 2011-02-13 +#### GLM 0.9.0.8 - 2011-02-13 - Added quaternion product operator. - Clarify that GLM is a header only library. -------------------------------------------------------------------------------- -### GLM 0.9.1.A: 2011-01-31 +#### GLM 0.9.1.A - 2011-01-31 - Added SIMD support - Added new swizzle functions - Improved static assert error message with C++0x static_assert @@ -526,243 +526,243 @@ generation distribution - Fixed trunc implementation -------------------------------------------------------------------------------- -### GLM 0.9.0.7: 2011-01-30 +#### GLM 0.9.0.7 - 2011-01-30 - Added GLSL 4.10 packing functions - Added == and != operators for every types. -------------------------------------------------------------------------------- -### GLM 0.9.0.6: 2010-12-21 +#### GLM 0.9.0.6 - 2010-12-21 - Many matrices bugs fixed -------------------------------------------------------------------------------- -### GLM 0.9.0.5: 2010-11-01 +#### GLM 0.9.0.5 - 2010-11-01 - Improved Clang support - Fixed bugs -------------------------------------------------------------------------------- -### GLM 0.9.0.4: 2010-10-04 +#### GLM 0.9.0.4 - 2010-10-04 - Added autoexp for GLM - Fixed bugs -------------------------------------------------------------------------------- -### GLM 0.9.0.3: 2010-08-26 +#### GLM 0.9.0.3 - 2010-08-26 - Fixed non-squared matrix operators -------------------------------------------------------------------------------- -### GLM 0.9.0.2: 2010-07-08 +#### GLM 0.9.0.2 - 2010-07-08 - Added GLM_GTX_int_10_10_10_2 - Fixed bugs -------------------------------------------------------------------------------- -### GLM 0.9.0.1: 2010-06-21 +#### GLM 0.9.0.1 - 2010-06-21 - Fixed extensions errors -------------------------------------------------------------------------------- -### GLM 0.9.0.0: 2010-05-25 +#### GLM 0.9.0.0 - 2010-05-25 - Objective-C support - Fixed warnings - Updated documentation -------------------------------------------------------------------------------- -### GLM 0.9.B.2: 2010-04-30 +#### GLM 0.9.B.2 - 2010-04-30 - Git transition - Removed experimental code from releases - Fixed bugs -------------------------------------------------------------------------------- -### GLM 0.9.B.1: 2010-04-03 +#### GLM 0.9.B.1 - 2010-04-03 - Based on GLSL 4.00 specification - Added the new core functions - Added some implicit conversion support -------------------------------------------------------------------------------- -### GLM 0.9.A.2: 2010-02-20 +#### GLM 0.9.A.2 - 2010-02-20 - Improved some possible errors messages - Improved declarations and definitions match -------------------------------------------------------------------------------- -### GLM 0.9.A.1: 2010-02-09 +#### GLM 0.9.A.1 - 2010-02-09 - Removed deprecated features - Internal redesign -------------------------------------------------------------------------------- -### GLM 0.8.4.4 final: 2010-01-25 +#### GLM 0.8.4.4 final - 2010-01-25 - Fixed warnings -------------------------------------------------------------------------------- -### GLM 0.8.4.3 final: 2009-11-16 +#### GLM 0.8.4.3 final - 2009-11-16 - Fixed Half float arithmetic - Fixed setup defines -------------------------------------------------------------------------------- -### GLM 0.8.4.2 final: 2009-10-19 +#### GLM 0.8.4.2 final - 2009-10-19 - Fixed Half float adds -------------------------------------------------------------------------------- -### GLM 0.8.4.1 final: 2009-10-05 +#### GLM 0.8.4.1 final - 2009-10-05 - Updated documentation - Fixed MacOS X build -------------------------------------------------------------------------------- -### GLM 0.8.4.0 final: 2009-09-16 +#### GLM 0.8.4.0 final - 2009-09-16 - Added GCC 4.4 and VC2010 support - Added matrix optimizations -------------------------------------------------------------------------------- -### GLM 0.8.3.5 final: 2009-08-11 +#### GLM 0.8.3.5 final - 2009-08-11 - Fixed bugs -------------------------------------------------------------------------------- -### GLM 0.8.3.4 final: 2009-08-10 +#### GLM 0.8.3.4 final - 2009-08-10 - Updated GLM according GLSL 1.5 spec - Fixed bugs -------------------------------------------------------------------------------- -### GLM 0.8.3.3 final: 2009-06-25 +#### GLM 0.8.3.3 final - 2009-06-25 - Fixed bugs -------------------------------------------------------------------------------- -### GLM 0.8.3.2 final: 2009-06-04 +#### GLM 0.8.3.2 final - 2009-06-04 - Added GLM_GTC_quaternion - Added GLM_GTC_type_precision -------------------------------------------------------------------------------- -### GLM 0.8.3.1 final: 2009-05-21 +#### GLM 0.8.3.1 final - 2009-05-21 - Fixed old extension system. -------------------------------------------------------------------------------- -### GLM 0.8.3.0 final: 2009-05-06 +#### GLM 0.8.3.0 final - 2009-05-06 - Added stable extensions. - Added new extension system. -------------------------------------------------------------------------------- -### GLM 0.8.2.3 final: 2009-04-01 +#### GLM 0.8.2.3 final - 2009-04-01 - Fixed bugs. -------------------------------------------------------------------------------- -### GLM 0.8.2.2 final: 2009-02-24 +#### GLM 0.8.2.2 final - 2009-02-24 - Fixed bugs. -------------------------------------------------------------------------------- -### GLM 0.8.2.1 final: 2009-02-13 +#### GLM 0.8.2.1 final - 2009-02-13 - Fixed bugs. -------------------------------------------------------------------------------- -### GLM 0.8.2 final: 2009-01-21 +#### GLM 0.8.2 final - 2009-01-21 - Fixed bugs. -------------------------------------------------------------------------------- -### GLM 0.8.1 final: 2008-10-30 +#### GLM 0.8.1 final - 2008-10-30 - Fixed bugs. -------------------------------------------------------------------------------- -### GLM 0.8.0 final: 2008-10-23 +#### GLM 0.8.0 final - 2008-10-23 - New method to use extension. -------------------------------------------------------------------------------- -### GLM 0.8.0 beta3: 2008-10-10 +#### GLM 0.8.0 beta3 - 2008-10-10 - Added CMake support for GLM tests. -------------------------------------------------------------------------------- -### GLM 0.8.0 beta2: 2008-10-04 +#### GLM 0.8.0 beta2 - 2008-10-04 - Improved half scalars and vectors support. -------------------------------------------------------------------------------- -### GLM 0.8.0 beta1: 2008-09-26 +#### GLM 0.8.0 beta1 - 2008-09-26 - Improved GLSL conformance - Added GLSL 1.30 support - Improved API documentation -------------------------------------------------------------------------------- -### GLM 0.7.6 final: 2008-08-08 +#### GLM 0.7.6 final - 2008-08-08 - Improved C++ standard comformance - Added Static assert for types checking -------------------------------------------------------------------------------- -### GLM 0.7.5 final: 2008-07-05 +#### GLM 0.7.5 final - 2008-07-05 - Added build message system with Visual Studio - Pedantic build with GCC -------------------------------------------------------------------------------- -### GLM 0.7.4 final: 2008-06-01 +#### GLM 0.7.4 final - 2008-06-01 - Added external dependencies system. -------------------------------------------------------------------------------- -### GLM 0.7.3 final: 2008-05-24 +#### GLM 0.7.3 final - 2008-05-24 - Fixed bugs - Added new extension group -------------------------------------------------------------------------------- -### GLM 0.7.2 final: 2008-04-27 +#### GLM 0.7.2 final - 2008-04-27 - Updated documentation - Added preprocessor options -------------------------------------------------------------------------------- -### GLM 0.7.1 final: 2008-03-24 +#### GLM 0.7.1 final - 2008-03-24 - Disabled half on GCC - Fixed extensions -------------------------------------------------------------------------------- -### GLM 0.7.0 final: 2008-03-22 +#### GLM 0.7.0 final - 2008-03-22 - Changed to MIT license - Added new documentation -------------------------------------------------------------------------------- -### GLM 0.6.4 : 2007-12-10 +#### GLM 0.6.4 - 2007-12-10 - Fixed swizzle operators -------------------------------------------------------------------------------- -### GLM 0.6.3 : 2007-11-05 +#### GLM 0.6.3 - 2007-11-05 - Fixed type data accesses - Fixed 3DSMax sdk conflict -------------------------------------------------------------------------------- -### GLM 0.6.2 : 2007-10-08 +#### GLM 0.6.2 - 2007-10-08 - Fixed extension -------------------------------------------------------------------------------- -### GLM 0.6.1 : 2007-10-07 +#### GLM 0.6.1 - 2007-10-07 - Fixed a namespace error - Added extensions -------------------------------------------------------------------------------- -### GLM 0.6.0 : 2007-09-16 +#### GLM 0.6.0 : 2007-09-16 - Added new extension namespace mecanium - Added Automatic compiler detection -------------------------------------------------------------------------------- -### GLM 0.5.1 : 2007-02-19 +#### GLM 0.5.1 - 2007-02-19 - Fixed swizzle operators -------------------------------------------------------------------------------- -### GLM 0.5.0 : 2007-01-06 +#### GLM 0.5.0 - 2007-01-06 - Upgrated to GLSL 1.2 - Added swizzle operators - Added setup settings -------------------------------------------------------------------------------- -### GLM 0.4.1 : 2006-05-22 +#### GLM 0.4.1 - 2006-05-22 - Added OpenGL examples -------------------------------------------------------------------------------- -### GLM 0.4.0 : 2006-05-17 +#### GLM 0.4.0 - 2006-05-17 - Added missing operators to vec* and mat* - Added first GLSL 1.2 features - Fixed windows.h before glm.h when windows.h required -------------------------------------------------------------------------------- -### GLM 0.3.2 : 2006-04-21 +#### GLM 0.3.2 - 2006-04-21 - Fixed texcoord components access. - Fixed mat4 and imat4 division operators. -------------------------------------------------------------------------------- -### GLM 0.3.1 : 2006-03-28 +#### GLM 0.3.1 - 2006-03-28 - Added GCC 4.0 support under MacOS X. - Added GCC 4.0 and 4.1 support under Linux. - Added code optimisations. -------------------------------------------------------------------------------- -### GLM 0.3 : 2006-02-19 +#### GLM 0.3 - 2006-02-19 - Improved GLSL type conversion and construction compliance. - Added experimental extensions. - Added Doxygen Documentation. @@ -770,13 +770,13 @@ generation distribution - Fixed bugs. -------------------------------------------------------------------------------- -### GLM 0.2: 2005-05-05 +#### GLM 0.2 - 2005-05-05 - Improve adaptative from GLSL. - Add experimental extensions based on OpenGL extension process. - Fixe bugs. -------------------------------------------------------------------------------- -### GLM 0.1: 2005-02-21 +#### GLM 0.1 - 2005-02-21 - Add vec2, vec3, vec4 GLSL types - Add ivec2, ivec3, ivec4 GLSL types - Add bvec2, bvec3, bvec4 GLSL types From 5f784d812a862e68fdcab535f568706606ac80a8 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 19:40:03 +0200 Subject: [PATCH 26/74] Updated readme.md with more link --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 855af287..6699d309 100644 --- a/readme.md +++ b/readme.md @@ -1,12 +1,12 @@ ![glm](doc/logo.png) -OpenGL Mathematics (*GLM*) is a header only C++ mathematics library for graphics software based on the [OpenGL Shading Language (GLSL) specifications](https://www.opengl.org/registry/doc/GLSLangSpec.4.50.diff.pdf). +[OpenGL Mathematics](http://glm.g-truc.net/) (*GLM*) is a header only C++ mathematics library for graphics software based on the [OpenGL Shading Language (GLSL) specifications](https://www.opengl.org/registry/doc/GLSLangSpec.4.50.diff.pdf). *GLM* provides classes and functions designed and implemented with the same naming conventions and functionalities than *GLSL* so that anyone who knows *GLSL*, can use *GLM* as well in C++. This project isn't limited to *GLSL* features. An extension system, based on the *GLSL* extension conventions, provides extended capabilities: matrix transformations, quaternions, data packing, random numbers, noise, etc... -This library works perfectly with *OpenGL* but it also ensures interoperability with other third party libraries and SDK. It is a good candidate for software rendering (raytracing / rasterisation), image processing, physic simulations and any development context that requires a simple and convenient mathematics library. +This library works perfectly with *[OpenGL](https://www.opengl.org)* but it also ensures interoperability with other third party libraries and SDK. It is a good candidate for software rendering (raytracing / rasterisation), image processing, physic simulations and any development context that requires a simple and convenient mathematics library. *GLM* is written in C++98 but can take advantage of C++11 when supported by the compiler. It is a platform independent library with no dependence and it officially supports the following compilers: - [Apple Clang 4.0](https://developer.apple.com/library/mac/documentation/CompilerTools/Conceptual/LLVMCompilerOverview/index.html) and higher From df8cd2270691e0def85355b61004216b839301bf Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 20:01:07 +0200 Subject: [PATCH 27/74] Fixed specifier removal by 'std::make_pair<>' #333 --- glm/gtx/io.hpp | 6 ++++++ glm/gtx/io.inl | 8 ++++++++ readme.md | 1 + 3 files changed, 15 insertions(+) diff --git a/glm/gtx/io.hpp b/glm/gtx/io.hpp index b3842bbd..dcb706af 100644 --- a/glm/gtx/io.hpp +++ b/glm/gtx/io.hpp @@ -220,6 +220,12 @@ namespace glm std::pair const, tmat4x4 const> const &); + template + GLM_FUNC_DECL std::basic_ostream & operator<<( + std::basic_ostream &, + std::pair, + tmat4x4> const &); + /// @} }//namespace glm diff --git a/glm/gtx/io.inl b/glm/gtx/io.inl index 5af266dd..38202485 100644 --- a/glm/gtx/io.inl +++ b/glm/gtx/io.inl @@ -645,4 +645,12 @@ namespace io return os; } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<( + std::basic_ostream & os, + std::pair, tmat4x4> const& a) + { + return operator<<(os, static_cast const, tmat4x4 const> const&>(a)); + } }//namespace glm diff --git a/readme.md b/readme.md index 6699d309..8e163cd0 100644 --- a/readme.md +++ b/readme.md @@ -63,6 +63,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) ##### Fixes: - Fixed (u)int64 MSB/LSB handling on BE archs #306 - Fixed multi-line comment warning in g++. #315 +- Fixed specifier removal by 'std::make_pair<>' #333 ##### Deprecation: - Removed integer specification for 'mod' in GTC_integer #308 From 084804111e877dab464792c911c17ac43a105713 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 20:40:45 +0200 Subject: [PATCH 28/74] Fixed CMake build on 2.8 versions --- CMakeLists.txt | 60 +++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cc6818bc..c408aa6f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,37 +147,37 @@ add_subdirectory(test) set(GLM_INSTALL_CONFIGDIR "${CMAKE_INSTALL_LIBDIR}/cmake/glm") install(DIRECTORY glm DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -include(CMakePackageConfigHelpers) -write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" - VERSION ${GLM_VERSION} - COMPATIBILITY AnyNewerVersion -) - -# build tree package config -configure_file( - cmake/glmBuildConfig.cmake.in - glmConfig.cmake - COPYONLY -) - -# install tree package config -configure_package_config_file( - cmake/glmConfig.cmake.in - ${GLM_INSTALL_CONFIGDIR}/glmConfig.cmake - INSTALL_DESTINATION ${GLM_INSTALL_CONFIGDIR} - PATH_VARS CMAKE_INSTALL_INCLUDEDIR - NO_CHECK_REQUIRED_COMPONENTS_MACRO -) - -install( - FILES - "${CMAKE_CURRENT_BINARY_DIR}/glmConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" - DESTINATION ${GLM_INSTALL_CONFIGDIR} -) - if (NOT CMAKE_VERSION VERSION_LESS "2.8.12") + include(CMakePackageConfigHelpers) + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" + VERSION ${GLM_VERSION} + COMPATIBILITY AnyNewerVersion + ) + + # build tree package config + configure_file( + cmake/glmBuildConfig.cmake.in + glmConfig.cmake + COPYONLY + ) + + # install tree package config + configure_package_config_file( + cmake/glmConfig.cmake.in + ${GLM_INSTALL_CONFIGDIR}/glmConfig.cmake + INSTALL_DESTINATION ${GLM_INSTALL_CONFIGDIR} + PATH_VARS CMAKE_INSTALL_INCLUDEDIR + NO_CHECK_REQUIRED_COMPONENTS_MACRO + ) + + install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/glmConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" + DESTINATION ${GLM_INSTALL_CONFIGDIR} + ) + add_library(glm INTERFACE) target_include_directories(glm INTERFACE $ From 303a5233252922690898489fbe756e905d5f2ba0 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 20:49:58 +0200 Subject: [PATCH 29/74] Fixed C++98 build --- glm/gtx/io.hpp | 2 +- glm/gtx/io.inl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/glm/gtx/io.hpp b/glm/gtx/io.hpp index dcb706af..a52ab9c0 100644 --- a/glm/gtx/io.hpp +++ b/glm/gtx/io.hpp @@ -224,7 +224,7 @@ namespace glm GLM_FUNC_DECL std::basic_ostream & operator<<( std::basic_ostream &, std::pair, - tmat4x4> const &); + tmat4x4 > const &); /// @} }//namespace glm diff --git a/glm/gtx/io.inl b/glm/gtx/io.inl index 38202485..92c68732 100644 --- a/glm/gtx/io.inl +++ b/glm/gtx/io.inl @@ -649,7 +649,7 @@ namespace io template GLM_FUNC_QUALIFIER std::basic_ostream& operator<<( std::basic_ostream & os, - std::pair, tmat4x4> const& a) + std::pair, tmat4x4 > const& a) { return operator<<(os, static_cast const, tmat4x4 const> const&>(a)); } From 6b47f41387bdc24992c98ee64aaf7c54e2954957 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 21:39:36 +0200 Subject: [PATCH 30/74] Fixed automated tests compiler versions --- readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index 8e163cd0..b8c6cb62 100644 --- a/readme.md +++ b/readme.md @@ -41,9 +41,9 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) ## Project Health -| Service | System | Compiler | Options | Status | -| ------- | ------ | -------- | ------- | ------ | -| [Drone](https://drone.io/github.com/g-truc/glm) | Ubuntu 12.04 | GCC 4.8 | no tests | [![Build Status](https://drone.io/github.com/g-truc/glm/status.png)](https://drone.io/github.com/g-truc/glm/latest) | +| Service | System | Compiler | Status | +| ------- | ------ | -------- | ------ | +| [Drone](https://drone.io/github.com/g-truc/glm) | Ubuntu 12.04 | GCC 4.6.3 | [![Build Status](https://drone.io/github.com/g-truc/glm/status.png)](https://drone.io/github.com/g-truc/glm/latest) | ## Release notes From 08937e2702249f215f460134088ac4054ccac264 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 22:25:24 +0200 Subject: [PATCH 31/74] Added lastest release on release.md --- readme.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index b8c6cb62..622414fe 100644 --- a/readme.md +++ b/readme.md @@ -18,10 +18,13 @@ This library works perfectly with *[OpenGL](https://www.opengl.org)* but it also - Any conform C++98 or C++11 compiler For more information about *GLM*, please have a look at the [manual](http://glm.g-truc.net/0.9.6/glm-0.9.6.pdf) and the [API reference documentation](http://glm.g-truc.net/0.9.6/api/index.html). -The source code and the documentation are licensed under the [Happy Bunny License (Modified MIT) and the MIT License](./copying.txt). +The source code and the documentation are licensed under the [Happy Bunny License (Modified MIT) or the MIT License](./copying.txt). Thanks for contributing to the project by [submitting issues](https://github.com/g-truc/glm/issues) for bug reports and feature requests. Any feedback is welcome at [glm@g-truc.net](mailto://glm@g-truc.net). +[Download lastest release](https://github.com/g-truc/glm/releases/latest) + + ```c++ #include // glm::vec3 #include // glm::vec4 From b05536dee8dcf1de4cdca847cb2d0177563b8869 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 22:32:13 +0200 Subject: [PATCH 32/74] Added link to releases --- readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/readme.md b/readme.md index 622414fe..5aa5b1eb 100644 --- a/readme.md +++ b/readme.md @@ -77,7 +77,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Fixed default precision for quat and dual_quat type #312 -------------------------------------------------------------------------------- -#### GLM 0.9.6.3 - 2015-02-15 +#### [GLM 0.9.6.3 - 2015-02-15](https://github.com/g-truc/glm/releases/tag/0.9.6.3) - Fixed Android doesn't have C++ 11 STL #284 -------------------------------------------------------------------------------- @@ -191,7 +191,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Removed CUDA 3.0 to 3.2 support -------------------------------------------------------------------------------- -#### GLM 0.9.5.4 - 2014-06-21 +#### [GLM 0.9.5.4 - 2014-06-21](https://github.com/g-truc/glm/releases/tag/0.9.5.4) - Fixed non-utf8 character #196 - Added FindGLM install for CMake #189 - Fixed GTX_color_space - saturation #195 @@ -292,7 +292,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Hidden matrix _inverse function implementation detail into private section -------------------------------------------------------------------------------- -#### GLM 0.9.4.6 - 2013-09-20 +#### [GLM 0.9.4.6 - 2013-09-20](https://github.com/g-truc/glm/releases/tag/0.9.4.6) - Fixed detection to select the last known compiler if newer version #106 - Fixed is_int and is_uint code duplication with GCC and C++11 #107 - Fixed test suite build while using Clang in C++11 mode @@ -378,7 +378,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Added debugger visualizers for Visual C++ 2012 -------------------------------------------------------------------------------- -#### GLM 0.9.3.4 - 2012-06-30 +#### [GLM 0.9.3.4 - 2012-06-30](https://github.com/g-truc/glm/releases/tag/0.9.3.4) - Added SSE4 and AVX2 detection. - Removed VIRTREV_xstream and the incompatibility generated with GCC - Fixed C++11 compiler option for GCC From 909e3c2e29feb7868fc5370b1b5ed45cc241fab9 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 22:35:05 +0200 Subject: [PATCH 33/74] Updated lasest release. --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 5aa5b1eb..0a6e9625 100644 --- a/readme.md +++ b/readme.md @@ -22,8 +22,6 @@ The source code and the documentation are licensed under the [Happy Bunny Licens Thanks for contributing to the project by [submitting issues](https://github.com/g-truc/glm/issues) for bug reports and feature requests. Any feedback is welcome at [glm@g-truc.net](mailto://glm@g-truc.net). -[Download lastest release](https://github.com/g-truc/glm/releases/latest) - ```c++ #include // glm::vec3 @@ -48,6 +46,8 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) | ------- | ------ | -------- | ------ | | [Drone](https://drone.io/github.com/g-truc/glm) | Ubuntu 12.04 | GCC 4.6.3 | [![Build Status](https://drone.io/github.com/g-truc/glm/status.png)](https://drone.io/github.com/g-truc/glm/latest) | +## [Download lastest release](https://github.com/g-truc/glm/releases/latest) + ## Release notes #### GLM 0.9.7.0 - 2015-XX-XX From 3a1c5109998f09d4cef462498863130d18ceb202 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 22:42:30 +0200 Subject: [PATCH 34/74] Updated lastest release in readme.md --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 0a6e9625..3b5bb2f7 100644 --- a/readme.md +++ b/readme.md @@ -44,9 +44,9 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) | Service | System | Compiler | Status | | ------- | ------ | -------- | ------ | -| [Drone](https://drone.io/github.com/g-truc/glm) | Ubuntu 12.04 | GCC 4.6.3 | [![Build Status](https://drone.io/github.com/g-truc/glm/status.png)](https://drone.io/github.com/g-truc/glm/latest) | +| [Drone](https://drone.io/github.com/g-truc/glm) | Linux 64 bits | GCC 4.6.3 | [![Build Status](https://drone.io/github.com/g-truc/glm/status.png)](https://drone.io/github.com/g-truc/glm/latest) | -## [Download lastest release](https://github.com/g-truc/glm/releases/latest) +## [Lastest release](https://github.com/g-truc/glm/releases/latest) ## Release notes From 0d1e2d5e8a46317a1e990230a185fe4ca87ad27d Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 23:37:48 +0200 Subject: [PATCH 35/74] Updated release note for Added master branch continuous integration service on Linux 64 #332 --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index 3b5bb2f7..67bf7e7f 100644 --- a/readme.md +++ b/readme.md @@ -62,6 +62,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Changed usage of __has_include to support Intel compiler #307 - Specialized integer implementation of YCoCg-R #310 - Don't show status message in 'FindGLM' if 'QUIET' option is set. #317 +- Added master branch continuous integration service on Linux 64 #332 ##### Fixes: - Fixed (u)int64 MSB/LSB handling on BE archs #306 From ea36f44294bee02926444ad8d36a4d6324177466 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 1 May 2015 23:46:09 +0200 Subject: [PATCH 36/74] Fixed perspective fovy argument documentation #327 --- glm/gtc/matrix_transform.hpp | 2 +- readme.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/glm/gtc/matrix_transform.hpp b/glm/gtc/matrix_transform.hpp index e70e6a81..777c87f8 100644 --- a/glm/gtc/matrix_transform.hpp +++ b/glm/gtc/matrix_transform.hpp @@ -173,7 +173,7 @@ namespace glm /// Creates a matrix for a symetric perspective-view frustum based on the default handedness. /// - /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param fovy Specifies the field of view angle in the y direction. Expressed in radians. /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). diff --git a/readme.md b/readme.md index 67bf7e7f..5528d4a5 100644 --- a/readme.md +++ b/readme.md @@ -68,6 +68,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Fixed (u)int64 MSB/LSB handling on BE archs #306 - Fixed multi-line comment warning in g++. #315 - Fixed specifier removal by 'std::make_pair<>' #333 +- Fixed perspective fovy argument documentation #327 ##### Deprecation: - Removed integer specification for 'mod' in GTC_integer #308 From c1377bc360b516c2437d4e47451b10249ece3354 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sat, 2 May 2015 00:07:35 +0200 Subject: [PATCH 37/74] - Clarified manual regarding angle unit in GLM, added FAQ 11 #336 --- doc/glm.docx | Bin 1071007 -> 1085373 bytes readme.md | 1 + 2 files changed, 1 insertion(+) diff --git a/doc/glm.docx b/doc/glm.docx index 80add995e58769cf09bd5d343988b94d608ca29a..ce05f6f80b282b73571b5736d92f515ca6d86436 100644 GIT binary patch delta 87820 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º*Cp13_-LM8t#8Kj=xaxg6j-|3Cp2yW2QiIYxI|Q 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 delta 73344 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 Date: Sat, 2 May 2015 00:08:47 +0200 Subject: [PATCH 38/74] Fixed release note --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 893c0e48..cc5ea87e 100644 --- a/readme.md +++ b/readme.md @@ -63,7 +63,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Specialized integer implementation of YCoCg-R #310 - Don't show status message in 'FindGLM' if 'QUIET' option is set. #317 - Added master branch continuous integration service on Linux 64 #332 -- Clarified manual regarding angle unit in GLM, added FAQ 11 #336 +- Clarified manual regarding angle unit in GLM, added FAQ 11 #326 ##### Fixes: - Fixed (u)int64 MSB/LSB handling on BE archs #306 From d7fa6d318c2c904caae4aab5892a0e97842c50de Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sat, 2 May 2015 00:26:12 +0200 Subject: [PATCH 39/74] - Removed -m64 causing build issues on Linux 32 #331 --- CMakeLists.txt | 1 - readme.md | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c408aa6f..80427dc8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -131,7 +131,6 @@ endif() if(CMAKE_COMPILER_IS_GNUCXX) #add_definitions(-S) #add_definitions(-s) - add_definitions(-m64) add_definitions(-O2) #add_definitions(-fprofile-arcs -ftest-coverage) gcov diff --git a/readme.md b/readme.md index cc5ea87e..a35496f4 100644 --- a/readme.md +++ b/readme.md @@ -70,6 +70,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Fixed multi-line comment warning in g++. #315 - Fixed specifier removal by 'std::make_pair<>' #333 - Fixed perspective fovy argument documentation #327 +- Removed -m64 causing build issues on Linux 32 #331 ##### Deprecation: - Removed integer specification for 'mod' in GTC_integer #308 From 60ccb43b146c5a47adf9e3404eff63a093121ee1 Mon Sep 17 00:00:00 2001 From: Zbigniew Mandziejewicz Date: Sat, 2 May 2015 16:03:24 +0800 Subject: [PATCH 40/74] Improve compatibility with old CMake versions --- CMakeLists.txt | 69 ++++---- cmake/CMakePackageConfigHelpers.cmake | 227 ++++++++++++++++++++++++++ cmake/glmBuildConfig.cmake.in | 7 +- 3 files changed, 268 insertions(+), 35 deletions(-) create mode 100644 cmake/CMakePackageConfigHelpers.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 80427dc8..962fa640 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,15 @@ cmake_minimum_required(VERSION 2.6 FATAL_ERROR) project(glm) -set(GLM_VERSION "0.9.6") +set(GLM_VERSION "0.9.7") + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) enable_testing() -list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") -include(GNUInstallDirs) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) option(GLM_TEST_ENABLE "GLM test" OFF) @@ -146,37 +148,36 @@ add_subdirectory(test) set(GLM_INSTALL_CONFIGDIR "${CMAKE_INSTALL_LIBDIR}/cmake/glm") install(DIRECTORY glm DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" + VERSION ${GLM_VERSION} + COMPATIBILITY AnyNewerVersion +) + +# build tree package config +configure_file( + cmake/glmBuildConfig.cmake.in + glmConfig.cmake + @ONLY +) + +# install tree package config +configure_package_config_file( + cmake/glmConfig.cmake.in + ${GLM_INSTALL_CONFIGDIR}/glmConfig.cmake + INSTALL_DESTINATION ${GLM_INSTALL_CONFIGDIR} + PATH_VARS CMAKE_INSTALL_INCLUDEDIR + NO_CHECK_REQUIRED_COMPONENTS_MACRO +) + +install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/${GLM_INSTALL_CONFIGDIR}/glmConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" + DESTINATION ${GLM_INSTALL_CONFIGDIR} +) + if (NOT CMAKE_VERSION VERSION_LESS "2.8.12") - include(CMakePackageConfigHelpers) - write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" - VERSION ${GLM_VERSION} - COMPATIBILITY AnyNewerVersion - ) - - # build tree package config - configure_file( - cmake/glmBuildConfig.cmake.in - glmConfig.cmake - COPYONLY - ) - - # install tree package config - configure_package_config_file( - cmake/glmConfig.cmake.in - ${GLM_INSTALL_CONFIGDIR}/glmConfig.cmake - INSTALL_DESTINATION ${GLM_INSTALL_CONFIGDIR} - PATH_VARS CMAKE_INSTALL_INCLUDEDIR - NO_CHECK_REQUIRED_COMPONENTS_MACRO - ) - - install( - FILES - "${CMAKE_CURRENT_BINARY_DIR}/glmConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/glmVersion.cmake" - DESTINATION ${GLM_INSTALL_CONFIGDIR} - ) - add_library(glm INTERFACE) target_include_directories(glm INTERFACE $ diff --git a/cmake/CMakePackageConfigHelpers.cmake b/cmake/CMakePackageConfigHelpers.cmake new file mode 100644 index 00000000..48039e52 --- /dev/null +++ b/cmake/CMakePackageConfigHelpers.cmake @@ -0,0 +1,227 @@ +# - CONFIGURE_PACKAGE_CONFIG_FILE(), WRITE_BASIC_PACKAGE_VERSION_FILE() +# +# CONFIGURE_PACKAGE_CONFIG_FILE( INSTALL_DESTINATION +# [PATH_VARS ... ] +# [NO_SET_AND_CHECK_MACRO] +# [NO_CHECK_REQUIRED_COMPONENTS_MACRO]) +# +# CONFIGURE_PACKAGE_CONFIG_FILE() should be used instead of the plain +# CONFIGURE_FILE() command when creating the Config.cmake or -config.cmake +# file for installing a project or library. It helps making the resulting package +# relocatable by avoiding hardcoded paths in the installed Config.cmake file. +# +# In a FooConfig.cmake file there may be code like this to make the +# install destinations know to the using project: +# set(FOO_INCLUDE_DIR "@CMAKE_INSTALL_FULL_INCLUDEDIR@" ) +# set(FOO_DATA_DIR "@CMAKE_INSTALL_PREFIX@/@RELATIVE_DATA_INSTALL_DIR@" ) +# set(FOO_ICONS_DIR "@CMAKE_INSTALL_PREFIX@/share/icons" ) +# ...logic to determine installedPrefix from the own location... +# set(FOO_CONFIG_DIR "${installedPrefix}/@CONFIG_INSTALL_DIR@" ) +# All 4 options shown above are not sufficient, since the first 3 hardcode +# the absolute directory locations, and the 4th case works only if the logic +# to determine the installedPrefix is correct, and if CONFIG_INSTALL_DIR contains +# a relative path, which in general cannot be guaranteed. +# This has the effect that the resulting FooConfig.cmake file would work poorly +# under Windows and OSX, where users are used to choose the install location +# of a binary package at install time, independent from how CMAKE_INSTALL_PREFIX +# was set at build/cmake time. +# +# Using CONFIGURE_PACKAGE_CONFIG_FILE() helps. If used correctly, it makes the +# resulting FooConfig.cmake file relocatable. +# Usage: +# 1. write a FooConfig.cmake.in file as you are used to +# 2. insert a line containing only the string "@PACKAGE_INIT@" +# 3. instead of SET(FOO_DIR "@SOME_INSTALL_DIR@"), use SET(FOO_DIR "@PACKAGE_SOME_INSTALL_DIR@") +# (this must be after the @PACKAGE_INIT@ line) +# 4. instead of using the normal CONFIGURE_FILE(), use CONFIGURE_PACKAGE_CONFIG_FILE() +# +# The and arguments are the input and output file, the same way +# as in CONFIGURE_FILE(). +# +# The given to INSTALL_DESTINATION must be the destination where the FooConfig.cmake +# file will be installed to. This can either be a relative or absolute path, both work. +# +# The variables to given as PATH_VARS are the variables which contain +# install destinations. For each of them the macro will create a helper variable +# PACKAGE_. These helper variables must be used +# in the FooConfig.cmake.in file for setting the installed location. They are calculated +# by CONFIGURE_PACKAGE_CONFIG_FILE() so that they are always relative to the +# installed location of the package. This works both for relative and also for absolute locations. +# For absolute locations it works only if the absolute location is a subdirectory +# of CMAKE_INSTALL_PREFIX. +# +# By default configure_package_config_file() also generates two helper macros, +# set_and_check() and check_required_components() into the FooConfig.cmake file. +# +# set_and_check() should be used instead of the normal set() +# command for setting directories and file locations. Additionally to setting the +# variable it also checks that the referenced file or directory actually exists +# and fails with a FATAL_ERROR otherwise. This makes sure that the created +# FooConfig.cmake file does not contain wrong references. +# When using the NO_SET_AND_CHECK_MACRO, this macro is not generated into the +# FooConfig.cmake file. +# +# check_required_components() should be called at the end of the +# FooConfig.cmake file if the package supports components. +# This macro checks whether all requested, non-optional components have been found, +# and if this is not the case, sets the Foo_FOUND variable to FALSE, so that the package +# is considered to be not found. +# It does that by testing the Foo__FOUND variables for all requested +# required components. +# When using the NO_CHECK_REQUIRED_COMPONENTS option, this macro is not generated +# into the FooConfig.cmake file. +# +# For an example see below the documentation for WRITE_BASIC_PACKAGE_VERSION_FILE(). +# +# +# WRITE_BASIC_PACKAGE_VERSION_FILE( filename VERSION major.minor.patch COMPATIBILITY (AnyNewerVersion|SameMajorVersion|ExactVersion) ) +# +# Writes a file for use as ConfigVersion.cmake file to . +# See the documentation of FIND_PACKAGE() for details on this. +# filename is the output filename, it should be in the build tree. +# major.minor.patch is the version number of the project to be installed +# The COMPATIBILITY mode AnyNewerVersion means that the installed package version +# will be considered compatible if it is newer or exactly the same as the requested version. +# This mode should be used for packages which are fully backward compatible, +# also across major versions. +# If SameMajorVersion is used instead, then the behaviour differs from AnyNewerVersion +# in that the major version number must be the same as requested, e.g. version 2.0 will +# not be considered compatible if 1.0 is requested. +# This mode should be used for packages which guarantee backward compatibility within the +# same major version. +# If ExactVersion is used, then the package is only considered compatible if the requested +# version matches exactly its own version number (not considering the tweak version). +# For example, version 1.2.3 of a package is only considered compatible to requested version 1.2.3. +# This mode is for packages without compatibility guarantees. +# If your project has more elaborated version matching rules, you will need to write your +# own custom ConfigVersion.cmake file instead of using this macro. +# +# Internally, this macro executes configure_file() to create the resulting +# version file. Depending on the COMPATIBLITY, either the file +# BasicConfigVersion-SameMajorVersion.cmake.in or BasicConfigVersion-AnyNewerVersion.cmake.in +# is used. Please note that these two files are internal to CMake and you should +# not call configure_file() on them yourself, but they can be used as starting +# point to create more sophisticted custom ConfigVersion.cmake files. +# +# +# Example using both configure_package_config_file() and write_basic_package_version_file(): +# CMakeLists.txt: +# set(INCLUDE_INSTALL_DIR include/ ... CACHE ) +# set(LIB_INSTALL_DIR lib/ ... CACHE ) +# set(SYSCONFIG_INSTALL_DIR etc/foo/ ... CACHE ) +# ... +# include(CMakePackageConfigHelpers) +# configure_package_config_file(FooConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake +# INSTALL_DESTINATION ${LIB_INSTALL_DIR}/Foo/cmake +# PATH_VARS INCLUDE_INSTALL_DIR SYSCONFIG_INSTALL_DIR) +# write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake +# VERSION 1.2.3 +# COMPATIBILITY SameMajorVersion ) +# install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake +# DESTINATION ${LIB_INSTALL_DIR}/Foo/cmake ) +# +# With a FooConfig.cmake.in: +# set(FOO_VERSION x.y.z) +# ... +# @PACKAGE_INIT@ +# ... +# set_and_check(FOO_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") +# set_and_check(FOO_SYSCONFIG_DIR "@PACKAGE_SYSCONFIG_INSTALL_DIR@") +# +# check_required_components(Foo) + + +#============================================================================= +# Copyright 2012 Alexander Neundorf +# +# 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.) + +include(CMakeParseArguments) + +include(WriteBasicConfigVersionFile) + +macro(WRITE_BASIC_PACKAGE_VERSION_FILE) + write_basic_config_version_file(${ARGN}) +endmacro() + + +function(CONFIGURE_PACKAGE_CONFIG_FILE _inputFile _outputFile) + set(options NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO) + set(oneValueArgs INSTALL_DESTINATION ) + set(multiValueArgs PATH_VARS ) + + cmake_parse_arguments(CCF "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(CCF_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to CONFIGURE_PACKAGE_CONFIG_FILE(): \"${CCF_UNPARSED_ARGUMENTS}\"") + endif() + + if(NOT CCF_INSTALL_DESTINATION) + message(FATAL_ERROR "No INSTALL_DESTINATION given to CONFIGURE_PACKAGE_CONFIG_FILE()") + endif() + + if(IS_ABSOLUTE "${CCF_INSTALL_DESTINATION}") + set(absInstallDir "${CCF_INSTALL_DESTINATION}") + else() + set(absInstallDir "${CMAKE_INSTALL_PREFIX}/${CCF_INSTALL_DESTINATION}") + endif() + file(RELATIVE_PATH PACKAGE_RELATIVE_PATH "${absInstallDir}" "${CMAKE_INSTALL_PREFIX}" ) + + foreach(var ${CCF_PATH_VARS}) + if(NOT DEFINED ${var}) + message(FATAL_ERROR "Variable ${var} does not exist") + else() + if(IS_ABSOLUTE "${${var}}") + string(REPLACE "${CMAKE_INSTALL_PREFIX}" "\${PACKAGE_PREFIX_DIR}" + PACKAGE_${var} "${${var}}") + else() + set(PACKAGE_${var} "\${PACKAGE_PREFIX_DIR}/${${var}}") + endif() + endif() + endforeach() + + set(PACKAGE_INIT " +####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() ####### +get_filename_component(PACKAGE_PREFIX_DIR \"\${CMAKE_CURRENT_LIST_DIR}/${PACKAGE_RELATIVE_PATH}\" ABSOLUTE) +") + + if(NOT CCF_NO_SET_AND_CHECK_MACRO) + set(PACKAGE_INIT "${PACKAGE_INIT} +macro(set_and_check _var _file) + set(\${_var} \"\${_file}\") + if(NOT EXISTS \"\${_file}\") + message(FATAL_ERROR \"File or directory \${_file} referenced by variable \${_var} does not exist !\") + endif() +endmacro() +") + endif() + + + if(NOT CCF_NO_CHECK_REQUIRED_COMPONENTS_MACRO) + set(PACKAGE_INIT "${PACKAGE_INIT} +macro(check_required_components _NAME) + foreach(comp \${\${_NAME}_FIND_COMPONENTS}) + if(NOT \${_NAME}_\${comp}_FOUND) + if(\${_NAME}_FIND_REQUIRED_\${comp}) + set(\${_NAME}_FOUND FALSE) + endif() + endif() + endforeach(comp) +endmacro() +") + endif() + + set(PACKAGE_INIT "${PACKAGE_INIT} +####################################################################################") + + configure_file("${_inputFile}" "${_outputFile}" @ONLY) + +endfunction() diff --git a/cmake/glmBuildConfig.cmake.in b/cmake/glmBuildConfig.cmake.in index ea324ab6..bec9af30 100644 --- a/cmake/glmBuildConfig.cmake.in +++ b/cmake/glmBuildConfig.cmake.in @@ -1 +1,6 @@ -include("${CMAKE_CURRENT_LIST_DIR}/glmTargets.cmake") +set(GLM_VERSION "@GLM_VERSION@") +set(GLM_INCLUDE_DIRS "@CMAKE_CURRENT_SOURCE_DIR@") + +if (NOT CMAKE_VERSION VERSION_LESS "2.8.12") + include("${CMAKE_CURRENT_LIST_DIR}/glmTargets.cmake") +endif() From d69aa08187a97ca806b183a5b00dff1f3eee3b04 Mon Sep 17 00:00:00 2001 From: morgan Date: Sat, 16 May 2015 12:29:37 +0200 Subject: [PATCH 41/74] Small documentation mistake in intersect.hpp, plane instead of triangle. --- glm/gtx/intersect.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glm/gtx/intersect.hpp b/glm/gtx/intersect.hpp index ef3d42d1..d35b4c54 100644 --- a/glm/gtx/intersect.hpp +++ b/glm/gtx/intersect.hpp @@ -55,7 +55,7 @@ namespace glm /// @addtogroup gtx_intersect /// @{ - //! Compute the intersection of a ray and a triangle. + //! Compute the intersection of a ray and a plane. //! Ray direction and plane normal must be unit length. //! From GLM_GTX_intersect extension. template From 2ee6151a40f99a8a31349f0743eef50a9007da9f Mon Sep 17 00:00:00 2001 From: Carsten Neumann Date: Mon, 18 May 2015 12:20:55 -0500 Subject: [PATCH 42/74] Use unions for type punning Fixes #334 --- glm/detail/func_packing.inl | 162 +++++++++++++++++++++++++++++------- 1 file changed, 132 insertions(+), 30 deletions(-) diff --git a/glm/detail/func_packing.inl b/glm/detail/func_packing.inl index 3132a279..fff9e703 100644 --- a/glm/detail/func_packing.inl +++ b/glm/detail/func_packing.inl @@ -38,82 +38,184 @@ namespace glm { GLM_FUNC_QUALIFIER uint packUnorm2x16(vec2 const & v) { - u16vec2 const Topack(round(clamp(v, 0.0f, 1.0f) * 65535.0f)); - return reinterpret_cast(Topack); + union + { + u16 in[2]; + uint out; + } u; + + u.in[0] = round(clamp(v[0], 0.0f, 1.0f) * 65535.0f); + u.in[1] = round(clamp(v[1], 0.0f, 1.0f) * 65535.0f); + + return u.out; } GLM_FUNC_QUALIFIER vec2 unpackUnorm2x16(uint p) { - vec2 Unpack(reinterpret_cast(p)); - return Unpack * float(1.5259021896696421759365224689097e-5); // 1.0 / 65535.0 + union + { + uint in; + u16 out[2]; + } u; + + u.in = p; + + return vec2( + u.out[0] * 1.5259021896696421759365224689097e-5f, + u.out[1] * 1.5259021896696421759365224689097e-5f); } GLM_FUNC_QUALIFIER uint packSnorm2x16(vec2 const & v) { - i16vec2 const Topack(round(clamp(v ,-1.0f, 1.0f) * 32767.0f)); - return reinterpret_cast(Topack); + union + { + i16 in[2]; + uint out; + } u; + + u.in[0] = round(clamp(v[0], -1.0f, 1.0f) * 32767.0f); + u.in[1] = round(clamp(v[1], -1.0f, 1.0f) * 32767.0f); + + return u.out; } GLM_FUNC_QUALIFIER vec2 unpackSnorm2x16(uint p) { - vec2 const Unpack(reinterpret_cast(p)); - return clamp( - Unpack * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f, - -1.0f, 1.0f); + union + { + uint in; + i16 out[2]; + } u; + + u.in = p; + + return vec2( + clamp(u.out[0] * 3.0518509475997192297128208258309e-5f, + -1.0f, 1.0f), + clamp(u.out[1] * 3.0518509475997192297128208258309e-5f, + -1.0f, 1.0f)); } GLM_FUNC_QUALIFIER uint packUnorm4x8(vec4 const & v) { - u8vec4 const Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f)); - return reinterpret_cast(Topack); + union + { + u8 in[4]; + uint out; + } u; + + u.in[0] = round(clamp(v[0], 0.0f, 1.0f) * 255.0f); + u.in[1] = round(clamp(v[1], 0.0f, 1.0f) * 255.0f); + u.in[2] = round(clamp(v[2], 0.0f, 1.0f) * 255.0f); + u.in[3] = round(clamp(v[3], 0.0f, 1.0f) * 255.0f); + + return u.out; } GLM_FUNC_QUALIFIER vec4 unpackUnorm4x8(uint p) { - vec4 const Unpack(reinterpret_cast(p)); - return Unpack * float(0.0039215686274509803921568627451); // 1 / 255 + union + { + uint in; + u8 out[4]; + } u; + + u.in = p; + + return vec4( + u.out[0] * 0.0039215686274509803921568627451f, + u.out[1] * 0.0039215686274509803921568627451f, + u.out[2] * 0.0039215686274509803921568627451f, + u.out[3] * 0.0039215686274509803921568627451f); } GLM_FUNC_QUALIFIER uint packSnorm4x8(vec4 const & v) { - i8vec4 const Topack(round(clamp(v ,-1.0f, 1.0f) * 127.0f)); - return reinterpret_cast(Topack); + union + { + i8 in[4]; + uint out; + } u; + + u.in[0] = round(clamp(v[0], -1.0f, 1.0f) * 127.0f); + u.in[1] = round(clamp(v[1], -1.0f, 1.0f) * 127.0f); + u.in[2] = round(clamp(v[2], -1.0f, 1.0f) * 127.0f); + u.in[3] = round(clamp(v[3], -1.0f, 1.0f) * 127.0f); + + return u.out; } GLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint p) { - vec4 const Unpack(reinterpret_cast(p)); - return clamp( - Unpack * 0.0078740157480315f, // 1.0f / 127.0f - -1.0f, 1.0f); + union + { + uint in; + i8 out[4]; + } u; + + u.in = p; + + return vec4( + clamp(u.out[0] * 0.0078740157480315f, -1.0f, 1.0f), + clamp(u.out[1] * 0.0078740157480315f, -1.0f, 1.0f), + clamp(u.out[2] * 0.0078740157480315f, -1.0f, 1.0f), + clamp(u.out[3] * 0.0078740157480315f, -1.0f, 1.0f)); } GLM_FUNC_QUALIFIER double packDouble2x32(uvec2 const & v) { - return reinterpret_cast(v); + union + { + uint in[2]; + double out; + } u; + + u.in[0] = v[0]; + u.in[1] = v[1]; + + return u.out; } GLM_FUNC_QUALIFIER uvec2 unpackDouble2x32(double v) { - return reinterpret_cast(v); + union + { + double in; + uint out[2]; + } u; + + u.in = v; + + return uvec2(u.out[0], u.out[1]); } GLM_FUNC_QUALIFIER uint packHalf2x16(vec2 const & v) { - i16vec2 const Unpack( - detail::toFloat16(v.x), - detail::toFloat16(v.y)); + union + { + i16 in[2]; + uint out; + } u; - return reinterpret_cast(Unpack); + u.in[0] = detail::toFloat16(v.x); + u.in[1] = detail::toFloat16(v.y); + + return u.out; } GLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint v) { - i16vec2 const Unpack(reinterpret_cast(v)); - + union + { + uint in; + i16 out[2]; + } u; + + u.in = v; + return vec2( - detail::toFloat32(Unpack.x), - detail::toFloat32(Unpack.y)); + detail::toFloat32(u.out[0]), + detail::toFloat32(u.out[1])); } }//namespace glm From 08eedc6209ca99e0b712159d822e285ec2c631b8 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sat, 27 Jun 2015 18:36:17 +0200 Subject: [PATCH 43/74] Added experiment for new fastCos. More sRGB tests. --- glm/gtx/fast_trigonometry.inl | 16 +- test/core/core_func_common.cpp | 16 ++ test/core/core_func_trigonometric.cpp | 13 +- test/gtc/gtc_color.cpp | 24 +- test/gtx/gtx_fast_trigonometry.cpp | 302 +++++++++++++++++++++++++- 5 files changed, 342 insertions(+), 29 deletions(-) diff --git a/glm/gtx/fast_trigonometry.inl b/glm/gtx/fast_trigonometry.inl index 16a821ad..b8c65810 100644 --- a/glm/gtx/fast_trigonometry.inl +++ b/glm/gtx/fast_trigonometry.inl @@ -33,6 +33,16 @@ namespace glm{ namespace detail { + template class vecType> + GLM_FUNC_QUALIFIER vecType taylorCos(vecType const & x) + { + return static_cast(1) + - (x * x) / 2.f + + (x * x * x * x) / 24.f + - (x * x * x * x * x * x) / 720.f + + (x * x * x * x * x * x * x * x) / 40320.f; + } + template GLM_FUNC_QUALIFIER T cos_52s(T x) { @@ -66,11 +76,11 @@ namespace detail { T const angle(wrapAngle(x)); - if(angle()) + if(angle < half_pi()) return detail::cos_52s(angle); - if(angle()) + if(angle < pi()) return -detail::cos_52s(pi() - angle); - if(angle<(T(3) * half_pi())) + if(angle < (T(3) * half_pi())) return -detail::cos_52s(angle - pi()); return detail::cos_52s(two_pi() - angle); diff --git a/test/core/core_func_common.cpp b/test/core/core_func_common.cpp index 9a7c5d94..7911a72f 100644 --- a/test/core/core_func_common.cpp +++ b/test/core/core_func_common.cpp @@ -168,6 +168,22 @@ namespace mod_ { int Error(0); + { + float A(1.5f); + float B(1.0f); + float C = glm::mod(A, B); + + Error += glm::abs(C - 0.5f) < 0.00001f ? 0 : 1; + } + + { + float A(-0.2f); + float B(1.0f); + float C = glm::mod(A, B); + + Error += glm::abs(C - 0.8f) < 0.00001f ? 0 : 1; + } + { float A(3.0); float B(2.0f); diff --git a/test/core/core_func_trigonometric.cpp b/test/core/core_func_trigonometric.cpp index fa391151..abadc6f5 100644 --- a/test/core/core_func_trigonometric.cpp +++ b/test/core/core_func_trigonometric.cpp @@ -30,17 +30,12 @@ /////////////////////////////////////////////////////////////////////////////////// #include -/* -float sin(float x) { - float temp; - temp = (x + M_PI) / ((2 * M_PI) - M_PI); - return limited_sin((x + M_PI) - ((2 * M_PI) - M_PI) * temp)); -} -*/ + int main() { - int Failed = 0; + int Error = 0; - return Failed; + + return Error; } diff --git a/test/gtc/gtc_color.cpp b/test/gtc/gtc_color.cpp index 77759dac..03bd0261 100644 --- a/test/gtc/gtc_color.cpp +++ b/test/gtc/gtc_color.cpp @@ -39,20 +39,34 @@ namespace srgb { int Error(0); - glm::vec4 const ColorSourceRGB(1.0, 0.5, 0.0, 1.0); + glm::vec3 const ColorSourceRGB(1.0, 0.5, 0.0); { - glm::vec4 const ColorSRGB = glm::convertRgbToSrgb(ColorSourceRGB); - glm::vec4 const ColorRGB = glm::convertSrgbToRgb(ColorSRGB); + glm::vec3 const ColorSRGB = glm::convertRgbToSrgb(ColorSourceRGB); + glm::vec3 const ColorRGB = glm::convertSrgbToRgb(ColorSRGB); Error += glm::all(glm::epsilonEqual(ColorSourceRGB, ColorRGB, 0.00001f)) ? 0 : 1; } { - glm::vec4 const ColorSRGB = glm::convertRgbToSrgb(ColorSourceRGB, 2.8f); - glm::vec4 const ColorRGB = glm::convertSrgbToRgb(ColorSRGB, 2.8f); + glm::vec3 const ColorSRGB = glm::convertRgbToSrgb(ColorSourceRGB, 2.8f); + glm::vec3 const ColorRGB = glm::convertSrgbToRgb(ColorSRGB, 2.8f); Error += glm::all(glm::epsilonEqual(ColorSourceRGB, ColorRGB, 0.00001f)) ? 0 : 1; } + glm::vec4 const ColorSourceRGBA(1.0, 0.5, 0.0, 1.0); + + { + glm::vec4 const ColorSRGB = glm::convertRgbToSrgb(ColorSourceRGBA); + glm::vec4 const ColorRGB = glm::convertSrgbToRgb(ColorSRGB); + Error += glm::all(glm::epsilonEqual(ColorSourceRGBA, ColorRGB, 0.00001f)) ? 0 : 1; + } + + { + glm::vec4 const ColorSRGB = glm::convertRgbToSrgb(ColorSourceRGBA, 2.8f); + glm::vec4 const ColorRGB = glm::convertSrgbToRgb(ColorSRGB, 2.8f); + Error += glm::all(glm::epsilonEqual(ColorSourceRGBA, ColorRGB, 0.00001f)) ? 0 : 1; + } + return Error; } }//namespace srgb diff --git a/test/gtx/gtx_fast_trigonometry.cpp b/test/gtx/gtx_fast_trigonometry.cpp index eb73157b..46faffd5 100644 --- a/test/gtx/gtx_fast_trigonometry.cpp +++ b/test/gtx/gtx_fast_trigonometry.cpp @@ -31,10 +31,16 @@ #include #include +#include +#include #include #include +#include +#include +#include #include #include +#include namespace fastCos { @@ -43,12 +49,15 @@ namespace fastCos const float begin = -glm::pi(); const float end = glm::pi(); float result = 0.f; + const std::clock_t timestamp1 = std::clock(); - for(float i=begin; i(); const float end = glm::pi(); float result = 0.f; + const std::clock_t timestamp1 = std::clock(); - for (float i = begin; i(); const float end = glm::pi(); float result = 0.f; + const std::clock_t timestamp1 = std::clock(); - for (float i = begin; i(); const float end = glm::pi(); float result = 0.f; + const std::clock_t timestamp1 = std::clock(); - for (float i = begin; i(time_fast)); std::printf("acos Time %d clocks\n", static_cast(time_default)); @@ -144,10 +163,10 @@ namespace fastAsin const float end = glm::pi(); float result = 0.f; const std::clock_t timestamp1 = std::clock(); - for (float i = begin; i(); float result = 0.f; const std::clock_t timestamp1 = std::clock(); - for (float i = begin; i() * 0.5f, glm::pi() * 1.0f, glm::pi() * 1.5f); + + template class vecType> + GLM_FUNC_QUALIFIER vecType taylorSeriesNewCos(vecType const & x) + { + vecType const Powed2(x * x); + vecType const Powed4(Powed2 * Powed2); + vecType const Powed6(Powed4 * Powed2); + vecType const Powed8(Powed4 * Powed4); + + return static_cast(1) + - Powed2 * static_cast(0.5) + + Powed4 * static_cast(0.04166666666666666666666666666667) + - Powed6 * static_cast(0.00138888888888888888888888888889) + + Powed8 * static_cast(2.4801587301587301587301587301587e-5); + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType taylorSeriesNewCos6(vecType const & x) + { + vecType const Powed2(x * x); + vecType const Powed4(Powed2 * Powed2); + vecType const Powed6(Powed4 * Powed2); + + return static_cast(1) + - Powed2 * static_cast(0.5) + + Powed4 * static_cast(0.04166666666666666666666666666667) + - Powed6 * static_cast(0.00138888888888888888888888888889); + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType fastAbs(vecType x) + { + int* Pointer = reinterpret_cast(&x[0]); + *(((int *) &Pointer[0]) + 1) &= 0x7fffffff; + *(((int *) &Pointer[1]) + 1) &= 0x7fffffff; + *(((int *) &Pointer[2]) + 1) &= 0x7fffffff; + *(((int *) &Pointer[3]) + 1) &= 0x7fffffff; + return x; + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType fastCosNew(vecType const & x) + { + vecType const Angle0_PI(fastAbs(fmod(x + glm::pi(), glm::two_pi()) - glm::pi())); + return taylorSeriesNewCos6(x); +/* + vecType const FirstQuarterPi(lessThanEqual(Angle0_PI, vecType(glm::half_pi()))); + + vecType const RevertAngle(mix(vecType(glm::pi()), vecType(0), FirstQuarterPi)); + vecType const ReturnSign(mix(vecType(-1), vecType(1), FirstQuarterPi)); + vecType const SectionAngle(RevertAngle - Angle0_PI); + + return ReturnSign * taylorSeriesNewCos(SectionAngle); +*/ + } + + int perf_fastCosNew(float Begin, float End, std::size_t Samples) + { + std::vector Results; + Results.resize(Samples); + + float Steps = (End - Begin) / Samples; + + std::clock_t const TimeStampBegin = std::clock(); + + for(std::size_t i = 0; i < Samples; ++i) + Results[i] = taylorCos::fastCosNew(AngleShift + glm::vec4(Begin + Steps * i)); + + std::clock_t const TimeStampEnd = std::clock(); + + std::printf("fastCosNew %ld clocks\n", TimeStampEnd - TimeStampBegin); + + int Error = 0; + for(std::size_t i = 0; i < Samples; ++i) + Error += Results[i].x >= -1.0f && Results[i].x <= 1.0f ? 0 : 1; + return Error; + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType deterministic_fmod(vecType const & x, T y) + { + return x - y * trunc(x / y); + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType fastCosDeterminisctic(vecType const & x) + { + vecType const Angle0_PI(abs(deterministic_fmod(x + glm::pi(), glm::two_pi()) - glm::pi())); + vecType const FirstQuarterPi(lessThanEqual(Angle0_PI, vecType(glm::half_pi()))); + + vecType const RevertAngle(mix(vecType(glm::pi()), vecType(0), FirstQuarterPi)); + vecType const ReturnSign(mix(vecType(-1), vecType(1), FirstQuarterPi)); + vecType const SectionAngle(RevertAngle - Angle0_PI); + + return ReturnSign * taylorSeriesNewCos(SectionAngle); + } + + int perf_fastCosDeterminisctic(float Begin, float End, std::size_t Samples) + { + std::vector Results; + Results.resize(Samples); + + float Steps = (End - Begin) / Samples; + + std::clock_t const TimeStampBegin = std::clock(); + + for(std::size_t i = 0; i < Samples; ++i) + Results[i] = taylorCos::fastCosDeterminisctic(AngleShift + glm::vec4(Begin + Steps * i)); + + std::clock_t const TimeStampEnd = std::clock(); + + std::printf("fastCosDeterminisctic %ld clocks\n", TimeStampEnd - TimeStampBegin); + + int Error = 0; + for(std::size_t i = 0; i < Samples; ++i) + Error += Results[i].x >= -1.0f && Results[i].x <= 1.0f ? 0 : 1; + return Error; + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType taylorSeriesRefCos(vecType const & x) + { + return static_cast(1) + - (x * x) / glm::factorial(static_cast(2)) + + (x * x * x * x) / glm::factorial(static_cast(4)) + - (x * x * x * x * x * x) / glm::factorial(static_cast(6)) + + (x * x * x * x * x * x * x * x) / glm::factorial(static_cast(8)); + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType fastRefCos(vecType const & x) + { + vecType const Angle0_PI(glm::abs(fmod(x + glm::pi(), glm::two_pi()) - glm::pi())); +// return taylorSeriesRefCos(Angle0_PI); + + vecType const FirstQuarterPi(lessThanEqual(Angle0_PI, vecType(glm::half_pi()))); + + vecType const RevertAngle(mix(vecType(glm::pi()), vecType(0), FirstQuarterPi)); + vecType const ReturnSign(mix(vecType(-1), vecType(1), FirstQuarterPi)); + vecType const SectionAngle(RevertAngle - Angle0_PI); + + return ReturnSign * taylorSeriesRefCos(SectionAngle); + } + + int perf_fastCosRef(float Begin, float End, std::size_t Samples) + { + std::vector Results; + Results.resize(Samples); + + float Steps = (End - Begin) / Samples; + + std::clock_t const TimeStampBegin = std::clock(); + + for(std::size_t i = 0; i < Samples; ++i) + Results[i] = taylorCos::fastRefCos(AngleShift + glm::vec4(Begin + Steps * i)); + + std::clock_t const TimeStampEnd = std::clock(); + + std::printf("fastCosRef %ld clocks\n", TimeStampEnd - TimeStampBegin); + + int Error = 0; + for(std::size_t i = 0; i < Samples; ++i) + Error += Results[i].x >= -1.0f && Results[i].x <= 1.0f ? 0 : 1; + return Error; + } + + int perf_fastCosOld(float Begin, float End, std::size_t Samples) + { + std::vector Results; + Results.resize(Samples); + + float Steps = (End - Begin) / Samples; + + std::clock_t const TimeStampBegin = std::clock(); + + for(std::size_t i = 0; i < Samples; ++i) + Results[i] = glm::fastCos(AngleShift + glm::vec4(Begin + Steps * i)); + + std::clock_t const TimeStampEnd = std::clock(); + + std::printf("fastCosOld %ld clocks\n", TimeStampEnd - TimeStampBegin); + + int Error = 0; + for(std::size_t i = 0; i < Samples; ++i) + Error += Results[i].x >= -1.0f && Results[i].x <= 1.0f ? 0 : 1; + return Error; + } + + int perf_cos(float Begin, float End, std::size_t Samples) + { + std::vector Results; + Results.resize(Samples); + + float Steps = (End - Begin) / Samples; + + std::clock_t const TimeStampBegin = std::clock(); + + for(std::size_t i = 0; i < Samples; ++i) + Results[i] = glm::cos(AngleShift + glm::vec4(Begin + Steps * i)); + + std::clock_t const TimeStampEnd = std::clock(); + + std::printf("cos %ld clocks\n", TimeStampEnd - TimeStampBegin); + + int Error = 0; + for(std::size_t i = 0; i < Samples; ++i) + Error += Results[i].x >= -1.0f && Results[i].x <= 1.0f ? 0 : 1; + return Error; + } + + int perf() + { + int Error = 0; + + float const Begin = -glm::pi(); + float const End = glm::pi(); + std::size_t const Samples = 10000000; + + Error += perf_cos(Begin, End, Samples); + Error += perf_fastCosOld(Begin, End, Samples); + Error += perf_fastCosRef(Begin, End, Samples); + //Error += perf_fastCosNew(Begin, End, Samples); + Error += perf_fastCosDeterminisctic(Begin, End, Samples); + + return Error; + } + + int test() + { + int Error = 0; + + //for(float Angle = -4.0f * glm::pi(); Angle < 4.0f * glm::pi(); Angle += 0.1f) + //for(float Angle = -720.0f; Angle < 720.0f; Angle += 0.1f) + for(float Angle = 0.0f; Angle < 180.0f; Angle += 0.1f) + { + float const modAngle = std::fmod(glm::abs(Angle), 360.f); + assert(modAngle >= 0.0f && modAngle <= 360.f); + float const radAngle = glm::radians(modAngle); + float const Cos0 = std::cos(radAngle); + + float const Cos1 = taylorCos::fastRefCos(glm::fvec1(radAngle)).x; + Error += glm::abs(Cos1 - Cos0) < 0.1f ? 0 : 1; + + float const Cos2 = taylorCos::fastCosNew(glm::fvec1(radAngle)).x; + //Error += glm::abs(Cos2 - Cos0) < 0.1f ? 0 : 1; + + assert(!Error); + } + + return Error; + } +}//namespace taylorCos + int main() { int Error(0); + Error += ::taylorCos::test(); + Error += ::taylorCos::perf(); + # ifdef NDEBUG Error += ::fastCos::perf(); Error += ::fastSin::perf(); From ff1f50bb152a2b06728f6dc3543ba1879b12eae5 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sat, 27 Jun 2015 19:36:03 +0200 Subject: [PATCH 44/74] Added GTX_wrap --- glm/CMakeLists.txt | 2 +- glm/gtx/wrap.inl | 95 ++++++++-------------------- readme.md | 3 +- test/gtx/CMakeLists.txt | 1 + test/gtx/gtx_wrap.cpp | 134 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 165 insertions(+), 70 deletions(-) create mode 100644 test/gtx/gtx_wrap.cpp diff --git a/glm/CMakeLists.txt b/glm/CMakeLists.txt index 12b2df1f..8f2f552e 100644 --- a/glm/CMakeLists.txt +++ b/glm/CMakeLists.txt @@ -33,7 +33,7 @@ source_group("GTX Files" FILES ${GTX_HEADER}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) if(GLM_TEST_ENABLE) - add_executable(${NAME} ${ROOT_TEXT} ${ROOT_NAT} + add_executable(${NAME} ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT} ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} diff --git a/glm/gtx/wrap.inl b/glm/gtx/wrap.inl index 5cd084ea..d0d8e256 100644 --- a/glm/gtx/wrap.inl +++ b/glm/gtx/wrap.inl @@ -33,67 +33,46 @@ namespace glm { template - GLM_FUNC_QUALIFIER genType clamp - ( - genType const & Texcoord - ) + GLM_FUNC_QUALIFIER genType clamp(genType const & Texcoord) { return glm::clamp(Texcoord, genType(0), genType(1)); } template - GLM_FUNC_QUALIFIER tvec2 clamp - ( - tvec2 const & Texcoord - ) + GLM_FUNC_QUALIFIER tvec2 clamp(tvec2 const & Texcoord) { tvec2 Result; for(typename tvec2::size_type i = 0; i < tvec2::value_size(); ++i) - Result[i] = clamp(Texcoord[i]); + Result[i] = clamp_to_edge(Texcoord[i]); return Result; } template - GLM_FUNC_QUALIFIER tvec3 clamp - ( - tvec3 const & Texcoord - ) + GLM_FUNC_QUALIFIER tvec3 clamp(tvec3 const & Texcoord) { tvec3 Result; for(typename tvec3::size_type i = 0; i < tvec3::value_size(); ++i) - Result[i] = clamp(Texcoord[i]); + Result[i] = clamp_to_edge(Texcoord[i]); return Result; } template - GLM_FUNC_QUALIFIER tvec4 clamp - ( - tvec4 const & Texcoord - ) + GLM_FUNC_QUALIFIER tvec4 clamp(tvec4 const & Texcoord) { tvec4 Result; for(typename tvec4::size_type i = 0; i < tvec4::value_size(); ++i) - Result[i] = clamp(Texcoord[i]); + Result[i] = clamp_to_edge(Texcoord[i]); return Result; } - //////////////////////// - // repeat - - template - GLM_FUNC_QUALIFIER genType repeat - ( - genType const & Texcoord - ) + template + GLM_FUNC_QUALIFIER genType repeat(genType const & Texcoord) { return glm::fract(Texcoord); } - template - GLM_FUNC_QUALIFIER tvec2 repeat - ( - tvec2 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec2 repeat(tvec2 const & Texcoord) { tvec2 Result; for(typename tvec2::size_type i = 0; i < tvec2::value_size(); ++i) @@ -101,11 +80,8 @@ namespace glm return Result; } - template - GLM_FUNC_QUALIFIER tvec3 repeat - ( - tvec3 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec3 repeat(tvec3 const & Texcoord) { tvec3 Result; for(typename tvec3::size_type i = 0; i < tvec3::value_size(); ++i) @@ -113,11 +89,8 @@ namespace glm return Result; } - template - GLM_FUNC_QUALIFIER tvec4 repeat - ( - tvec4 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec4 repeat(tvec4 const & Texcoord) { tvec4 Result; for(typename tvec4::size_type i = 0; i < tvec4::value_size(); ++i) @@ -125,18 +98,13 @@ namespace glm return Result; } - //////////////////////// - // mirrorRepeat - - template - GLM_FUNC_QUALIFIER genType mirrorRepeat - ( - genType const & Texcoord - ) + template + GLM_FUNC_QUALIFIER genType mirrorRepeat(genType const & Texcoord) { - genType const Clamp = genType(int(glm::floor(Texcoord)) % 2); - genType const Floor = glm::floor(Texcoord); - genType const Rest = Texcoord - Floor; + genType const Abs = glm::abs(Texcoord); + genType const Clamp = genType(int(glm::floor(Abs)) % 2); + genType const Floor = glm::floor(Abs); + genType const Rest = Abs - Floor; genType const Mirror = Clamp + Rest; genType Out; @@ -147,11 +115,8 @@ namespace glm return Out; } - template - GLM_FUNC_QUALIFIER tvec2 mirrorRepeat - ( - tvec2 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec2 mirrorRepeat(tvec2 const & Texcoord) { tvec2 Result; for(typename tvec2::size_type i = 0; i < tvec2::value_size(); ++i) @@ -159,11 +124,8 @@ namespace glm return Result; } - template - GLM_FUNC_QUALIFIER tvec3 mirrorRepeat - ( - tvec3 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec3 mirrorRepeat(tvec3 const & Texcoord) { tvec3 Result; for(typename tvec3::size_type i = 0; i < tvec3::value_size(); ++i) @@ -171,11 +133,8 @@ namespace glm return Result; } - template - GLM_FUNC_QUALIFIER tvec4 mirrorRepeat - ( - tvec4 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec4 mirrorRepeat(tvec4 const & Texcoord) { tvec4 Result; for(typename tvec4::size_type i = 0; i < tvec4::value_size(); ++i) diff --git a/readme.md b/readme.md index a35496f4..dd1f44a3 100644 --- a/readme.md +++ b/readme.md @@ -56,7 +56,8 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Added 'fmod' overload to GTX_common with tests #308 - Left handed perspective and lookAt functions #314 - Added functions eulerAngleXYZ and extractEulerAngleXYZ #311 -- Added to perform to perform std::hash on GLM types #320 +- Added to perform std::hash on GLM types #320 +- Added for texcoord wrapping ##### Improvements: - Changed usage of __has_include to support Intel compiler #307 diff --git a/test/gtx/CMakeLists.txt b/test/gtx/CMakeLists.txt index 4be4343f..be39a6c5 100644 --- a/test/gtx/CMakeLists.txt +++ b/test/gtx/CMakeLists.txt @@ -48,3 +48,4 @@ glmCreateTestGTC(gtx_string_cast) glmCreateTestGTC(gtx_type_aligned) glmCreateTestGTC(gtx_vector_angle) glmCreateTestGTC(gtx_vector_query) +glmCreateTestGTC(gtx_wrap) diff --git a/test/gtx/gtx_wrap.cpp b/test/gtx/gtx_wrap.cpp new file mode 100644 index 00000000..2366170e --- /dev/null +++ b/test/gtx/gtx_wrap.cpp @@ -0,0 +1,134 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// Restrictions: +/// By making use of the Software for military purposes, you choose to make +/// a Bunny unhappy. +/// +/// 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 test/gtx/gtx_normal.cpp +/// @date 2013-10-25 / 2014-11-25 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +namespace clamp +{ + int test() + { + int Error(0); + + float A = glm::clamp(0.5f); + Error += glm::epsilonEqual(A, 0.5f, 0.00001f) ? 0 : 1; + + float B = glm::clamp(0.0f); + Error += glm::epsilonEqual(B, 0.0f, 0.00001f) ? 0 : 1; + + float C = glm::clamp(1.0f); + Error += glm::epsilonEqual(C, 1.0f, 0.00001f) ? 0 : 1; + + float D = glm::clamp(-0.5f); + Error += glm::epsilonEqual(D, 0.0f, 0.00001f) ? 0 : 1; + + float E = glm::clamp(1.5f); + Error += glm::epsilonEqual(E, 1.0f, 0.00001f) ? 0 : 1; + + return Error; + } +}//namespace clamp + +namespace repeat +{ + int test() + { + int Error(0); + + float A = glm::repeat(0.5f); + Error += glm::epsilonEqual(A, 0.5f, 0.00001f) ? 0 : 1; + + float B = glm::repeat(0.0f); + Error += glm::epsilonEqual(B, 0.0f, 0.00001f) ? 0 : 1; + + float C = glm::repeat(1.0f); + Error += glm::epsilonEqual(C, 0.0f, 0.00001f) ? 0 : 1; + + float D = glm::repeat(-0.5f); + Error += glm::epsilonEqual(D, 0.5f, 0.00001f) ? 0 : 1; + + float E = glm::repeat(1.5f); + Error += glm::epsilonEqual(E, 0.5f, 0.00001f) ? 0 : 1; + + float F = glm::repeat(0.9f); + Error += glm::epsilonEqual(F, 0.9f, 0.00001f) ? 0 : 1; + + return Error; + } +}//namespace repeat + +namespace mirrorRepeat +{ + int test() + { + int Error(0); + + float A = glm::mirrorRepeat(0.5f); + Error += glm::epsilonEqual(A, 0.5f, 0.00001f) ? 0 : 1; + + float B = glm::mirrorRepeat(0.0f); + Error += glm::epsilonEqual(B, 0.0f, 0.00001f) ? 0 : 1; + + float C = glm::mirrorRepeat(1.0f); + Error += glm::epsilonEqual(C, 1.0f, 0.00001f) ? 0 : 1; + + float D = glm::mirrorRepeat(-0.5f); + Error += glm::epsilonEqual(D, 0.5f, 0.00001f) ? 0 : 1; + + float E = glm::mirrorRepeat(1.5f); + Error += glm::epsilonEqual(E, 0.5f, 0.00001f) ? 0 : 1; + + float F = glm::mirrorRepeat(0.9f); + Error += glm::epsilonEqual(F, 0.9f, 0.00001f) ? 0 : 1; + + float G = glm::mirrorRepeat(3.0f); + Error += glm::epsilonEqual(G, 1.0f, 0.00001f) ? 0 : 1; + + float H = glm::mirrorRepeat(-3.0f); + Error += glm::epsilonEqual(H, 1.0f, 0.00001f) ? 0 : 1; + + float I = glm::mirrorRepeat(-1.0f); + Error += glm::epsilonEqual(I, 1.0f, 0.00001f) ? 0 : 1; + + return Error; + } +}//namespace mirrorRepeat + +int main() +{ + int Error(0); + + Error += clamp::test(); + Error += repeat::test(); + Error += mirrorRepeat::test(); + + return Error; +} From 01419547561c59cb82b5275e38c954dd52014132 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sat, 27 Jun 2015 20:12:27 +0200 Subject: [PATCH 45/74] Added mirror repeat --- glm/gtx/wrap.hpp | 5 +++++ glm/gtx/wrap.inl | 34 ++++++++++++++++++++++++++++++++++ test/gtx/gtx_wrap.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) diff --git a/glm/gtx/wrap.hpp b/glm/gtx/wrap.hpp index cf21d6fe..20566516 100644 --- a/glm/gtx/wrap.hpp +++ b/glm/gtx/wrap.hpp @@ -63,6 +63,11 @@ namespace glm template GLM_FUNC_DECL genType repeat(genType const & Texcoord); + /// Simulate GL_MIRRORED_REPEAT OpenGL wrap mode + /// @see gtx_wrap extension. + template + GLM_FUNC_DECL genType mirrorClamp(genType const & Texcoord); + /// Simulate GL_MIRROR_REPEAT OpenGL wrap mode /// @see gtx_wrap extension. template diff --git a/glm/gtx/wrap.inl b/glm/gtx/wrap.inl index d0d8e256..402e815d 100644 --- a/glm/gtx/wrap.inl +++ b/glm/gtx/wrap.inl @@ -98,6 +98,40 @@ namespace glm return Result; } + template + GLM_FUNC_QUALIFIER genType mirrorClamp(genType const & Texcoord) + { + return glm::fract(glm::abs(Texcoord)); + //return glm::mod(glm::abs(Texcoord), 1.0f); + } + + template + GLM_FUNC_QUALIFIER tvec2 mirrorClamp(tvec2 const & Texcoord) + { + tvec2 Result; + for(typename tvec2::size_type i = 0; i < tvec2::value_size(); ++i) + Result[i] = mirrorClamp(Texcoord[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER tvec3 mirrorClamp(tvec3 const & Texcoord) + { + tvec3 Result; + for(typename tvec3::size_type i = 0; i < tvec3::value_size(); ++i) + Result[i] = mirrorClamp(Texcoord[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER tvec4 mirrorClamp(tvec4 const & Texcoord) + { + tvec4 Result; + for(typename tvec4::size_type i = 0; i < tvec4::value_size(); ++i) + Result[i] = mirrorClamp(Texcoord[i]); + return Result; + } + template GLM_FUNC_QUALIFIER genType mirrorRepeat(genType const & Texcoord) { diff --git a/test/gtx/gtx_wrap.cpp b/test/gtx/gtx_wrap.cpp index 2366170e..b65d94ba 100644 --- a/test/gtx/gtx_wrap.cpp +++ b/test/gtx/gtx_wrap.cpp @@ -85,6 +85,43 @@ namespace repeat } }//namespace repeat +namespace mirrorClamp +{ + int test() + { + int Error(0); + + float A = glm::mirrorClamp(0.5f); + Error += glm::epsilonEqual(A, 0.5f, 0.00001f) ? 0 : 1; + + float B = glm::mirrorClamp(0.0f); + Error += glm::epsilonEqual(B, 0.0f, 0.00001f) ? 0 : 1; + + float C = glm::mirrorClamp(1.1f); + Error += glm::epsilonEqual(C, 0.1f, 0.00001f) ? 0 : 1; + + float D = glm::mirrorClamp(-0.5f); + Error += glm::epsilonEqual(D, 0.5f, 0.00001f) ? 0 : 1; + + float E = glm::mirrorClamp(1.5f); + Error += glm::epsilonEqual(E, 0.5f, 0.00001f) ? 0 : 1; + + float F = glm::mirrorClamp(0.9f); + Error += glm::epsilonEqual(F, 0.9f, 0.00001f) ? 0 : 1; + + float G = glm::mirrorClamp(3.1f); + Error += glm::epsilonEqual(G, 0.1f, 0.00001f) ? 0 : 1; + + float H = glm::mirrorClamp(-3.1f); + Error += glm::epsilonEqual(H, 0.1f, 0.00001f) ? 0 : 1; + + float I = glm::mirrorClamp(-0.9f); + Error += glm::epsilonEqual(I, 0.9f, 0.00001f) ? 0 : 1; + + return Error; + } +}//namespace mirrorClamp + namespace mirrorRepeat { int test() @@ -128,6 +165,7 @@ int main() Error += clamp::test(); Error += repeat::test(); + Error += mirrorClamp::test(); Error += mirrorRepeat::test(); return Error; From e601191ed2fc5b50a5dfa1fa1da93b5ba1f5ae67 Mon Sep 17 00:00:00 2001 From: Jesse Talavera-Greenberg Date: Fri, 3 Jul 2015 12:48:22 -0400 Subject: [PATCH 46/74] Add .gitignore --- .gitignore | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..dc30457a --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# CMake +CMakeCache.txt +CMakeFiles +Makefile +cmake_install.cmake +install_manifest.txt \ No newline at end of file From a9c26d065bae11c9a33e86eff94ce111c95c7ede Mon Sep 17 00:00:00 2001 From: Jesse Talavera-Greenberg Date: Fri, 3 Jul 2015 14:57:46 -0400 Subject: [PATCH 47/74] Add static components and prec members to all vector and quaternion types --- glm/detail/type_vec1.hpp | 60 +++++++++++++++++--------------- glm/detail/type_vec2.hpp | 7 ++++ glm/detail/type_vec3.hpp | 7 ++++ glm/detail/type_vec4.hpp | 7 ++++ glm/gtc/quaternion.hpp | 7 ++++ glm/gtx/dual_quaternion.hpp | 59 ++++++++++++++++++-------------- glm/gtx/simd_quat.hpp | 7 ++++ glm/gtx/simd_vec4.hpp | 7 ++++ test/core/core_type_vec1.cpp | 2 ++ test/core/core_type_vec2.cpp | 66 +++++++++++++++++++----------------- test/core/core_type_vec3.cpp | 6 +++- test/core/core_type_vec4.cpp | 5 ++- test/gtc/gtc_quaternion.cpp | 8 +++-- 13 files changed, 158 insertions(+), 90 deletions(-) diff --git a/glm/detail/type_vec1.hpp b/glm/detail/type_vec1.hpp index 3550d032..f5d9d6c3 100644 --- a/glm/detail/type_vec1.hpp +++ b/glm/detail/type_vec1.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -54,7 +54,13 @@ namespace glm typedef tvec1 type; typedef tvec1 bool_type; typedef T value_type; - +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 1; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 1; + static const precision prec = P; +# endif ////////////////////////////////////// // Data @@ -120,7 +126,7 @@ namespace glm ////////////////////////////////////// // Conversion vector constructors - + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) template GLM_FUNC_DECL explicit tvec1(tvec2 const & v); @@ -157,23 +163,23 @@ namespace glm GLM_FUNC_DECL tvec1 & operator=(tvec1 const & v); - template + template GLM_FUNC_DECL tvec1 & operator=(tvec1 const & v); - template + template GLM_FUNC_DECL tvec1 & operator+=(U const & s); - template + template GLM_FUNC_DECL tvec1 & operator+=(tvec1 const & v); - template + template GLM_FUNC_DECL tvec1 & operator-=(U const & s); - template + template GLM_FUNC_DECL tvec1 & operator-=(tvec1 const & v); - template + template GLM_FUNC_DECL tvec1 & operator*=(U const & s); - template + template GLM_FUNC_DECL tvec1 & operator*=(tvec1 const & v); - template + template GLM_FUNC_DECL tvec1 & operator/=(U const & s); - template + template GLM_FUNC_DECL tvec1 & operator/=(tvec1 const & v); ////////////////////////////////////// @@ -187,29 +193,29 @@ namespace glm ////////////////////////////////////// // Unary bit operators - template + template GLM_FUNC_DECL tvec1 & operator%=(U const & s); - template + template GLM_FUNC_DECL tvec1 & operator%=(tvec1 const & v); - template + template GLM_FUNC_DECL tvec1 & operator&=(U const & s); - template + template GLM_FUNC_DECL tvec1 & operator&=(tvec1 const & v); - template + template GLM_FUNC_DECL tvec1 & operator|=(U const & s); - template + template GLM_FUNC_DECL tvec1 & operator|=(tvec1 const & v); - template + template GLM_FUNC_DECL tvec1 & operator^=(U const & s); - template + template GLM_FUNC_DECL tvec1 & operator^=(tvec1 const & v); - template + template GLM_FUNC_DECL tvec1 & operator<<=(U const & s); - template + template GLM_FUNC_DECL tvec1 & operator<<=(tvec1 const & v); - template + template GLM_FUNC_DECL tvec1 & operator>>=(U const & s); - template + template GLM_FUNC_DECL tvec1 & operator>>=(tvec1 const & v); }; @@ -313,7 +319,7 @@ namespace glm template GLM_FUNC_DECL tvec1 operator>>(tvec1 const & v1, tvec1 const & v2); - template + template GLM_FUNC_DECL tvec1 operator~(tvec1 const & v); }//namespace glm diff --git a/glm/detail/type_vec2.hpp b/glm/detail/type_vec2.hpp index 29cfa092..8b2a8ba6 100644 --- a/glm/detail/type_vec2.hpp +++ b/glm/detail/type_vec2.hpp @@ -54,6 +54,13 @@ namespace glm typedef tvec2 type; typedef tvec2 bool_type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 2; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 2; + static const precision prec = P; +# endif ////////////////////////////////////// // Data diff --git a/glm/detail/type_vec3.hpp b/glm/detail/type_vec3.hpp index 5f0673bf..2aef6ef7 100644 --- a/glm/detail/type_vec3.hpp +++ b/glm/detail/type_vec3.hpp @@ -54,6 +54,13 @@ namespace glm typedef tvec3 type; typedef tvec3 bool_type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 3; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 3; + static const precision prec = P; +# endif ////////////////////////////////////// // Data diff --git a/glm/detail/type_vec4.hpp b/glm/detail/type_vec4.hpp index 8189d6f0..31ae1a8d 100644 --- a/glm/detail/type_vec4.hpp +++ b/glm/detail/type_vec4.hpp @@ -108,6 +108,13 @@ namespace detail typedef tvec4 type; typedef tvec4 bool_type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 4; + static const precision prec = P; +# endif ////////////////////////////////////// // Data diff --git a/glm/gtc/quaternion.hpp b/glm/gtc/quaternion.hpp index 812b5b00..a50e31b3 100644 --- a/glm/gtc/quaternion.hpp +++ b/glm/gtc/quaternion.hpp @@ -64,6 +64,13 @@ namespace glm { typedef tquat type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 4; + static const precision prec = P; +# endif public: T x, y, z, w; diff --git a/glm/gtx/dual_quaternion.hpp b/glm/gtx/dual_quaternion.hpp index a8005cb8..392a0005 100644 --- a/glm/gtx/dual_quaternion.hpp +++ b/glm/gtx/dual_quaternion.hpp @@ -15,7 +15,7 @@ /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -63,10 +63,17 @@ namespace glm { typedef T value_type; typedef glm::tquat part_type; - +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 8; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 8; + static const precision prec = P; +# endif + public: glm::tquat real, dual; - + ////////////////////////////////////// // Component accesses @@ -115,7 +122,7 @@ namespace glm GLM_FUNC_DECL explicit tdualquat(tmat2x4 const & holder_mat); GLM_FUNC_DECL explicit tdualquat(tmat3x4 const & aug_mat); - + // Operators GLM_FUNC_DECL tdualquat & operator=(tdualquat const & m); @@ -126,51 +133,51 @@ namespace glm template GLM_FUNC_DECL tdualquat & operator/=(U s); }; - + template GLM_FUNC_DECL tquat operator- ( tquat const & q); - + template GLM_FUNC_DECL tdualquat operator+ ( tdualquat const & q, tdualquat const & p); - + template GLM_FUNC_DECL tdualquat operator* ( tdualquat const & q, tdualquat const & p); - + template GLM_FUNC_DECL tvec3 operator* ( tquat const & q, tvec3 const & v); - + template GLM_FUNC_DECL tvec3 operator* ( tvec3 const & v, tquat const & q); - + template GLM_FUNC_DECL tvec4 operator* ( tquat const & q, tvec4 const & v); - + template GLM_FUNC_DECL tvec4 operator* ( tvec4 const & v, tquat const & q); - + template GLM_FUNC_DECL tdualquat operator* ( tdualquat const & q, T const & s); - + template GLM_FUNC_DECL tdualquat operator* ( T const & s, tdualquat const & q); - + template GLM_FUNC_DECL tdualquat operator/ ( tdualquat const & q, @@ -227,17 +234,17 @@ namespace glm GLM_FUNC_DECL tdualquat dualquat_cast( tmat3x4 const & x); - + /// Dual-quaternion of low single-precision floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat lowp_dualquat; - + /// Dual-quaternion of medium single-precision floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat mediump_dualquat; - + /// Dual-quaternion of high single-precision floating-point numbers. /// /// @see gtx_dual_quaternion @@ -248,40 +255,40 @@ namespace glm /// /// @see gtx_dual_quaternion typedef tdualquat lowp_fdualquat; - + /// Dual-quaternion of medium single-precision floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat mediump_fdualquat; - + /// Dual-quaternion of high single-precision floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat highp_fdualquat; - - + + /// Dual-quaternion of low double-precision floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat lowp_ddualquat; - + /// Dual-quaternion of medium double-precision floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat mediump_ddualquat; - + /// Dual-quaternion of high double-precision floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat highp_ddualquat; - + #if(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) /// Dual-quaternion of floating-point numbers. /// /// @see gtx_dual_quaternion typedef highp_fdualquat dualquat; - + /// Dual-quaternion of single-precision floating-point numbers. /// /// @see gtx_dual_quaternion @@ -298,7 +305,7 @@ namespace glm #else # error "GLM error: multiple default precision requested for single-precision floating-point types" #endif - + #if(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) /// Dual-quaternion of default double-precision floating-point numbers. diff --git a/glm/gtx/simd_quat.hpp b/glm/gtx/simd_quat.hpp index 810ce30c..177d0401 100644 --- a/glm/gtx/simd_quat.hpp +++ b/glm/gtx/simd_quat.hpp @@ -75,6 +75,13 @@ namespace detail typedef fquatSIMD type; typedef tquat bool_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 1; + static GLM_CONSTEXPR precision prec = defaultp; +# else + static const length_t components = 1; + static const precision prec = defaultp; +# endif #ifdef GLM_SIMD_ENABLE_XYZW_UNION union diff --git a/glm/gtx/simd_vec4.hpp b/glm/gtx/simd_vec4.hpp index 2d836a41..3a263323 100644 --- a/glm/gtx/simd_vec4.hpp +++ b/glm/gtx/simd_vec4.hpp @@ -98,6 +98,13 @@ namespace detail typedef fvec4SIMD type; typedef tvec4 bool_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 1; + static GLM_CONSTEXPR precision prec = defaultp; +# else + static const length_t components = 1; + static const precision prec = defaultp; +# endif #ifdef GLM_SIMD_ENABLE_XYZW_UNION union diff --git a/test/core/core_type_vec1.cpp b/test/core/core_type_vec1.cpp index 24d1796a..76d808ce 100644 --- a/test/core/core_type_vec1.cpp +++ b/test/core/core_type_vec1.cpp @@ -131,6 +131,7 @@ int test_vec1_size() Error += 8 == sizeof(glm::highp_dvec1) ? 0 : 1; Error += glm::vec1().length() == 1 ? 0 : 1; Error += glm::dvec1().length() == 1 ? 0 : 1; + Error += glm::vec1::components == 1 ? 0 : 1; return Error; } @@ -168,6 +169,7 @@ int main() glm::vec1 v; assert(v.length() == 1); + assert(glm::vec1::components == 1); Error += test_vec1_size(); Error += test_vec1_ctor(); diff --git a/test/core/core_type_vec2.cpp b/test/core/core_type_vec2.cpp index 1b545c43..590ad3f0 100644 --- a/test/core/core_type_vec2.cpp +++ b/test/core/core_type_vec2.cpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -102,81 +102,81 @@ int test_vec2_operators() { glm::vec2 A(1.0f, 2.0f); glm::vec2 B(4.0f, 5.0f); - + glm::vec2 C = A + B; Error += C == glm::vec2(5, 7) ? 0 : 1; - + glm::vec2 D = B - A; Error += D == glm::vec2(3, 3) ? 0 : 1; - + glm::vec2 E = A * B; Error += E == glm::vec2(4, 10) ? 0 : 1; - + glm::vec2 F = B / A; Error += F == glm::vec2(4, 2.5) ? 0 : 1; - + glm::vec2 G = A + 1.0f; Error += G == glm::vec2(2, 3) ? 0 : 1; - + glm::vec2 H = B - 1.0f; Error += H == glm::vec2(3, 4) ? 0 : 1; - + glm::vec2 I = A * 2.0f; Error += I == glm::vec2(2, 4) ? 0 : 1; - + glm::vec2 J = B / 2.0f; Error += J == glm::vec2(2, 2.5) ? 0 : 1; - + glm::vec2 K = 1.0f + A; Error += K == glm::vec2(2, 3) ? 0 : 1; - + glm::vec2 L = 1.0f - B; Error += L == glm::vec2(-3, -4) ? 0 : 1; - + glm::vec2 M = 2.0f * A; Error += M == glm::vec2(2, 4) ? 0 : 1; - + glm::vec2 N = 2.0f / B; Error += N == glm::vec2(0.5, 2.0 / 5.0) ? 0 : 1; } - + { glm::vec2 A(1.0f, 2.0f); glm::vec2 B(4.0f, 5.0f); - + A += B; Error += A == glm::vec2(5, 7) ? 0 : 1; - + A += 1.0f; Error += A == glm::vec2(6, 8) ? 0 : 1; } { glm::vec2 A(1.0f, 2.0f); glm::vec2 B(4.0f, 5.0f); - + B -= A; Error += B == glm::vec2(3, 3) ? 0 : 1; - + B -= 1.0f; Error += B == glm::vec2(2, 2) ? 0 : 1; } { glm::vec2 A(1.0f, 2.0f); glm::vec2 B(4.0f, 5.0f); - + A *= B; Error += A == glm::vec2(4, 10) ? 0 : 1; - + A *= 2.0f; Error += A == glm::vec2(8, 20) ? 0 : 1; } { glm::vec2 A(1.0f, 2.0f); glm::vec2 B(4.0f, 5.0f); - + B /= A; Error += B == glm::vec2(4, 2.5) ? 0 : 1; - + B /= 2.0f; Error += B == glm::vec2(2, 1.25) ? 0 : 1; } @@ -186,39 +186,39 @@ int test_vec2_operators() B /= B.y; Error += B == glm::vec2(1.0f) ? 0 : 1; } - + { glm::vec2 A(1.0f, 2.0f); glm::vec2 B = -A; Error += B == glm::vec2(-1.0f, -2.0f) ? 0 : 1; } - + { glm::vec2 A(1.0f, 2.0f); glm::vec2 B = --A; Error += B == glm::vec2(0.0f, 1.0f) ? 0 : 1; } - + { glm::vec2 A(1.0f, 2.0f); glm::vec2 B = A--; Error += B == glm::vec2(1.0f, 2.0f) ? 0 : 1; Error += A == glm::vec2(0.0f, 1.0f) ? 0 : 1; } - + { glm::vec2 A(1.0f, 2.0f); glm::vec2 B = ++A; Error += B == glm::vec2(2.0f, 3.0f) ? 0 : 1; } - + { glm::vec2 A(1.0f, 2.0f); glm::vec2 B = A++; Error += B == glm::vec2(1.0f, 2.0f) ? 0 : 1; Error += A == glm::vec2(2.0f, 3.0f) ? 0 : 1; } - + return Error; } @@ -283,14 +283,15 @@ int test_vec2_ctor() int test_vec2_size() { int Error = 0; - + Error += sizeof(glm::vec2) == sizeof(glm::mediump_vec2) ? 0 : 1; Error += 8 == sizeof(glm::mediump_vec2) ? 0 : 1; Error += sizeof(glm::dvec2) == sizeof(glm::highp_dvec2) ? 0 : 1; Error += 16 == sizeof(glm::highp_dvec2) ? 0 : 1; Error += glm::vec2().length() == 2 ? 0 : 1; Error += glm::dvec2().length() == 2 ? 0 : 1; - + Error += glm::vec2::components == 2 ? 0 : 1; + return Error; } @@ -327,6 +328,7 @@ int main() glm::vec2 v; assert(v.length() == 2); + assert(glm::vec2::components == 2); Error += test_vec2_size(); Error += test_vec2_ctor(); diff --git a/test/core/core_type_vec3.cpp b/test/core/core_type_vec3.cpp index 81d8ed35..cdd5f6d3 100644 --- a/test/core/core_type_vec3.cpp +++ b/test/core/core_type_vec3.cpp @@ -263,7 +263,7 @@ int test_vec3_size() Error += 24 == sizeof(glm::highp_dvec3) ? 0 : 1; Error += glm::vec3().length() == 3 ? 0 : 1; Error += glm::dvec3().length() == 3 ? 0 : 1; - + Error += glm::vec3::components == 3 ? 0 : 1; return Error; } @@ -494,6 +494,10 @@ int main() { int Error = 0; + glm::vec3 v; + assert(v.length() == 3); + assert(glm::vec3::components == 3); + Error += test_vec3_ctor(); Error += test_vec3_operators(); Error += test_vec3_size(); diff --git a/test/core/core_type_vec4.cpp b/test/core/core_type_vec4.cpp index fa724399..89ee0a6a 100644 --- a/test/core/core_type_vec4.cpp +++ b/test/core/core_type_vec4.cpp @@ -446,9 +446,12 @@ int main() { int Error(0); - std::size_t const Size(1000000); + glm::vec4 v; + assert(v.length() == 4); + assert(glm::vec4::components == 4); # ifdef NDEBUG + std::size_t const Size(1000000); Error += test_vec4_perf_AoS(Size); Error += test_vec4_perf_SoA(Size); # endif//NDEBUG diff --git a/test/gtc/gtc_quaternion.cpp b/test/gtc/gtc_quaternion.cpp index 8818827e..6a8d344b 100644 --- a/test/gtc/gtc_quaternion.cpp +++ b/test/gtc/gtc_quaternion.cpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -324,6 +324,8 @@ int main() { int Error(0); + assert(glm::quat::components == 4); + Error += test_quat_ctr(); Error += test_quat_mul_vec(); Error += test_quat_two_axis_ctr(); From 5d05c8c1f7c1131c4f801a9a505c02e04d96aa57 Mon Sep 17 00:00:00 2001 From: Jesse Talavera-Greenberg Date: Fri, 3 Jul 2015 15:00:37 -0400 Subject: [PATCH 48/74] Correct component amounts for simqQuat and simdVec4 --- glm/gtx/simd_quat.hpp | 110 +++++++++++++++++++++--------------------- glm/gtx/simd_vec4.hpp | 88 ++++++++++++++++----------------- 2 files changed, 99 insertions(+), 99 deletions(-) diff --git a/glm/gtx/simd_quat.hpp b/glm/gtx/simd_quat.hpp index 177d0401..3f0e05f3 100644 --- a/glm/gtx/simd_quat.hpp +++ b/glm/gtx/simd_quat.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -33,9 +33,9 @@ /// /// @defgroup gtx_simd_quat GLM_GTX_simd_quat /// @ingroup gtx -/// +/// /// @brief SIMD implementation of quat type. -/// +/// /// need to be included to use these functionalities. /////////////////////////////////////////////////////////////////////////////////// @@ -76,10 +76,10 @@ namespace detail typedef fquatSIMD type; typedef tquat bool_type; # if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 1; + static GLM_CONSTEXPR length_t components = 4; static GLM_CONSTEXPR precision prec = defaultp; # else - static const length_t components = 1; + static const length_t components = 4; static const precision prec = defaultp; # endif @@ -106,15 +106,15 @@ namespace detail explicit fquatSIMD( ctor); explicit fquatSIMD( - float const & w, - float const & x, - float const & y, + float const & w, + float const & x, + float const & y, float const & z); explicit fquatSIMD( quat const & v); explicit fquatSIMD( vec3 const & eulerAngles); - + ////////////////////////////////////// // Unary arithmetic operators @@ -131,16 +131,16 @@ namespace detail detail::fquatSIMD operator- ( detail::fquatSIMD const & q); - detail::fquatSIMD operator+ ( - detail::fquatSIMD const & q, - detail::fquatSIMD const & p); + detail::fquatSIMD operator+ ( + detail::fquatSIMD const & q, + detail::fquatSIMD const & p); - detail::fquatSIMD operator* ( - detail::fquatSIMD const & q, - detail::fquatSIMD const & p); + detail::fquatSIMD operator* ( + detail::fquatSIMD const & q, + detail::fquatSIMD const & p); detail::fvec4SIMD operator* ( - detail::fquatSIMD const & q, + detail::fquatSIMD const & q, detail::fvec4SIMD const & v); detail::fvec4SIMD operator* ( @@ -148,7 +148,7 @@ namespace detail detail::fquatSIMD const & q); detail::fquatSIMD operator* ( - detail::fquatSIMD const & q, + detail::fquatSIMD const & q, float s); detail::fquatSIMD operator* ( @@ -156,7 +156,7 @@ namespace detail detail::fquatSIMD const & q); detail::fquatSIMD operator/ ( - detail::fquatSIMD const & q, + detail::fquatSIMD const & q, float s); }//namespace detail @@ -199,64 +199,64 @@ namespace detail detail::fquatSIMD const & q); - /// Returns the length of the quaternion. - /// + /// Returns the length of the quaternion. + /// /// @see gtx_simd_quat float length( detail::fquatSIMD const & x); - /// Returns the normalized quaternion. - /// + /// Returns the normalized quaternion. + /// /// @see gtx_simd_quat detail::fquatSIMD normalize( detail::fquatSIMD const & x); - /// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ... - /// + /// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ... + /// /// @see gtx_simd_quat float dot( - detail::fquatSIMD const & q1, + detail::fquatSIMD const & q1, detail::fquatSIMD const & q2); /// Spherical linear interpolation of two quaternions. /// The interpolation is oriented and the rotation is performed at constant speed. /// For short path spherical linear interpolation, use the slerp function. - /// + /// /// @param x A quaternion /// @param y A quaternion /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1]. /// @tparam T Value type used to build the quaternion. Supported: half, float or double. /// @see gtx_simd_quat - /// @see - slerp(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a) + /// @see - slerp(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a) detail::fquatSIMD mix( - detail::fquatSIMD const & x, - detail::fquatSIMD const & y, + detail::fquatSIMD const & x, + detail::fquatSIMD const & y, float const & a); - /// Linear interpolation of two quaternions. + /// Linear interpolation of two quaternions. /// The interpolation is oriented. - /// + /// /// @param x A quaternion /// @param y A quaternion /// @param a Interpolation factor. The interpolation is defined in the range [0, 1]. /// @tparam T Value type used to build the quaternion. Supported: half, float or double. /// @see gtx_simd_quat detail::fquatSIMD lerp( - detail::fquatSIMD const & x, - detail::fquatSIMD const & y, + detail::fquatSIMD const & x, + detail::fquatSIMD const & y, float const & a); /// Spherical linear interpolation of two quaternions. /// The interpolation always take the short path and the rotation is performed at constant speed. - /// + /// /// @param x A quaternion /// @param y A quaternion /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1]. /// @tparam T Value type used to build the quaternion. Supported: half, float or double. /// @see gtx_simd_quat detail::fquatSIMD slerp( - detail::fquatSIMD const & x, - detail::fquatSIMD const & y, + detail::fquatSIMD const & x, + detail::fquatSIMD const & y, float const & a); @@ -269,10 +269,10 @@ namespace detail /// This will use the equivalent to fastAcos() and fastSin(). /// /// @see gtx_simd_quat - /// @see - mix(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a) + /// @see - mix(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a) detail::fquatSIMD fastMix( - detail::fquatSIMD const & x, - detail::fquatSIMD const & y, + detail::fquatSIMD const & x, + detail::fquatSIMD const & y, float const & a); /// Identical to fastMix() except takes the shortest path. @@ -280,22 +280,22 @@ namespace detail /// The same rules apply here as those in fastMix(). Both quaternions must be unit length and 'a' must be /// in the range [0, 1]. /// - /// @see - fastMix(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a) - /// @see - slerp(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a) + /// @see - fastMix(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a) + /// @see - slerp(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a) detail::fquatSIMD fastSlerp( - detail::fquatSIMD const & x, - detail::fquatSIMD const & y, + detail::fquatSIMD const & x, + detail::fquatSIMD const & y, float const & a); - /// Returns the q conjugate. - /// + /// Returns the q conjugate. + /// /// @see gtx_simd_quat detail::fquatSIMD conjugate( detail::fquatSIMD const & q); - /// Returns the q inverse. - /// + /// Returns the q inverse. + /// /// @see gtx_simd_quat detail::fquatSIMD inverse( detail::fquatSIMD const & q); @@ -303,14 +303,14 @@ namespace detail /// Build a quaternion from an angle and a normalized axis. /// /// @param angle Angle expressed in radians. - /// @param axis Axis of the quaternion, must be normalized. + /// @param axis Axis of the quaternion, must be normalized. /// /// @see gtx_simd_quat detail::fquatSIMD angleAxisSIMD( - float const & angle, + float const & angle, vec3 const & axis); - /// Build a quaternion from an angle and a normalized axis. + /// Build a quaternion from an angle and a normalized axis. /// /// @param angle Angle expressed in radians. /// @param x x component of the x-axis, x, y, z must be a normalized axis @@ -319,9 +319,9 @@ namespace detail /// /// @see gtx_simd_quat detail::fquatSIMD angleAxisSIMD( - float const & angle, - float const & x, - float const & y, + float const & angle, + float const & x, + float const & y, float const & z); // TODO: Move this to somewhere more appropriate. Used with fastMix() and fastSlerp(). diff --git a/glm/gtx/simd_vec4.hpp b/glm/gtx/simd_vec4.hpp index 3a263323..3958f2ce 100644 --- a/glm/gtx/simd_vec4.hpp +++ b/glm/gtx/simd_vec4.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -33,9 +33,9 @@ /// /// @defgroup gtx_simd_vec4 GLM_GTX_simd_vec4 /// @ingroup gtx -/// +/// /// @brief SIMD implementation of vec4 type. -/// +/// /// need to be included to use these functionalities. /////////////////////////////////////////////////////////////////////////////////// @@ -99,10 +99,10 @@ namespace detail typedef fvec4SIMD type; typedef tvec4 bool_type; # if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 1; + static GLM_CONSTEXPR length_t components = 4; static GLM_CONSTEXPR precision prec = defaultp; # else - static const length_t components = 1; + static const length_t components = 4; static const precision prec = defaultp; # endif @@ -131,9 +131,9 @@ namespace detail explicit fvec4SIMD( float const & s); explicit fvec4SIMD( - float const & x, - float const & y, - float const & z, + float const & x, + float const & y, + float const & z, float const & w); explicit fvec4SIMD( vec4 const & v); @@ -220,13 +220,13 @@ namespace detail //! Returns a value equal to the nearest integer to x. //! A fractional part of 0.5 will round toward the nearest even - //! integer. (Both 3.5 and 4.5 for x will return 4.0.) + //! integer. (Both 3.5 and 4.5 for x will return 4.0.) /// /// @see gtx_simd_vec4 //detail::fvec4SIMD roundEven(detail::fvec4SIMD const & x); - //! Returns a value equal to the nearest integer - //! that is greater than or equal to x. + //! Returns a value equal to the nearest integer + //! that is greater than or equal to x. /// @see gtx_simd_vec4 detail::fvec4SIMD ceil(detail::fvec4SIMD const & x); @@ -240,7 +240,7 @@ namespace detail /// /// @see gtx_simd_vec4 detail::fvec4SIMD mod( - detail::fvec4SIMD const & x, + detail::fvec4SIMD const & x, detail::fvec4SIMD const & y); //! Modulus. Returns x - y * floor(x / y) @@ -248,7 +248,7 @@ namespace detail /// /// @see gtx_simd_vec4 detail::fvec4SIMD mod( - detail::fvec4SIMD const & x, + detail::fvec4SIMD const & x, float const & y); //! Returns the fractional part of x and sets i to the integer @@ -257,51 +257,51 @@ namespace detail //! sign as x. //! (From GLM_GTX_simd_vec4 extension, common function) //detail::fvec4SIMD modf( - // detail::fvec4SIMD const & x, + // detail::fvec4SIMD const & x, // detail::fvec4SIMD & i); //! Returns y if y < x; otherwise, it returns x. - /// + /// /// @see gtx_simd_vec4 detail::fvec4SIMD min( - detail::fvec4SIMD const & x, + detail::fvec4SIMD const & x, detail::fvec4SIMD const & y); detail::fvec4SIMD min( - detail::fvec4SIMD const & x, + detail::fvec4SIMD const & x, float const & y); //! Returns y if x < y; otherwise, it returns x. /// /// @see gtx_simd_vec4 detail::fvec4SIMD max( - detail::fvec4SIMD const & x, + detail::fvec4SIMD const & x, detail::fvec4SIMD const & y); detail::fvec4SIMD max( - detail::fvec4SIMD const & x, + detail::fvec4SIMD const & x, float const & y); - //! Returns min(max(x, minVal), maxVal) for each component in x + //! Returns min(max(x, minVal), maxVal) for each component in x //! using the floating-point values minVal and maxVal. /// /// @see gtx_simd_vec4 detail::fvec4SIMD clamp( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & minVal, - detail::fvec4SIMD const & maxVal); + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & minVal, + detail::fvec4SIMD const & maxVal); detail::fvec4SIMD clamp( - detail::fvec4SIMD const & x, - float const & minVal, - float const & maxVal); + detail::fvec4SIMD const & x, + float const & minVal, + float const & maxVal); - //! \return If genTypeU is a floating scalar or vector: - //! Returns x * (1.0 - a) + y * a, i.e., the linear blend of - //! x and y using the floating-point value a. + //! \return If genTypeU is a floating scalar or vector: + //! Returns x * (1.0 - a) + y * a, i.e., the linear blend of + //! x and y using the floating-point value a. //! The value for a is not restricted to the range [0, 1]. //! - //! \return If genTypeU is a boolean scalar or vector: + //! \return If genTypeU is a boolean scalar or vector: //! Selects which vector each returned component comes //! from. For a component of a that is false, the //! corresponding component of x is returned. For a @@ -312,9 +312,9 @@ namespace detail //! provides different functionality than //! genType mix(genType x, genType y, genType(a)) //! where a is a Boolean vector. - //! + //! //! From GLSL 1.30.08 specification, section 8.3 - //! + //! //! \param[in] x Floating point scalar or vector. //! \param[in] y Floating point scalar or vector. //! \param[in] a Floating point or boolean scalar or vector. @@ -323,19 +323,19 @@ namespace detail /// /// @see gtx_simd_vec4 detail::fvec4SIMD mix( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y, + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y, detail::fvec4SIMD const & a); //! Returns 0.0 if x < edge, otherwise it returns 1.0. /// /// @see gtx_simd_vec4 detail::fvec4SIMD step( - detail::fvec4SIMD const & edge, + detail::fvec4SIMD const & edge, detail::fvec4SIMD const & x); detail::fvec4SIMD step( - float const & edge, + float const & edge, detail::fvec4SIMD const & x); //! Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and @@ -350,13 +350,13 @@ namespace detail /// /// @see gtx_simd_vec4 detail::fvec4SIMD smoothstep( - detail::fvec4SIMD const & edge0, - detail::fvec4SIMD const & edge1, + detail::fvec4SIMD const & edge0, + detail::fvec4SIMD const & edge1, detail::fvec4SIMD const & x); detail::fvec4SIMD smoothstep( - float const & edge0, - float const & edge1, + float const & edge0, + float const & edge1, detail::fvec4SIMD const & x); //! Returns true if x holds a NaN (not a number) @@ -397,8 +397,8 @@ namespace detail /// /// @see gtx_simd_vec4 detail::fvec4SIMD fma( - detail::fvec4SIMD const & a, - detail::fvec4SIMD const & b, + detail::fvec4SIMD const & a, + detail::fvec4SIMD const & b, detail::fvec4SIMD const & c); //! Splits x into a floating-point significand in the range From 38f63d394311f8cc49711f20e17e01cf8f32022a Mon Sep 17 00:00:00 2001 From: Jesse Talavera-Greenberg Date: Fri, 3 Jul 2015 15:21:11 -0400 Subject: [PATCH 49/74] Add static rows, cols, prec, and components fields to all matrix types --- glm/detail/type_mat2x2.hpp | 44 ++++++++++++++++++++++++-------------- glm/detail/type_mat2x3.hpp | 40 ++++++++++++++++++++++------------ glm/detail/type_mat2x4.hpp | 40 ++++++++++++++++++++++------------ glm/detail/type_mat3x2.hpp | 40 ++++++++++++++++++++++------------ glm/detail/type_mat3x3.hpp | 24 +++++++++++++++------ glm/detail/type_mat3x4.hpp | 40 ++++++++++++++++++++++------------ glm/detail/type_mat4x2.hpp | 38 +++++++++++++++++++++----------- glm/detail/type_mat4x3.hpp | 24 +++++++++++++++------ glm/detail/type_mat4x4.hpp | 24 +++++++++++++++------ glm/gtx/simd_mat4.hpp | 24 +++++++++++++++------ 10 files changed, 229 insertions(+), 109 deletions(-) diff --git a/glm/detail/type_mat2x2.hpp b/glm/detail/type_mat2x2.hpp index 046ceac3..c2bc2b40 100644 --- a/glm/detail/type_mat2x2.hpp +++ b/glm/detail/type_mat2x2.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -54,11 +54,23 @@ namespace glm template friend tvec2 operator/(tvec2 const & v, tmat2x2 const & m); +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 2; + static GLM_CONSTEXPR length_t cols = 2; + static GLM_CONSTEXPR length_t rows = 2; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 2; + static const length_t cols = 2; + static const length_t rows = 2; + static const precision prec = P; +# endif + private: /// @cond DETAIL col_type value[2]; /// @endcond - + public: ////////////////////////////////////// // Constructors @@ -130,23 +142,23 @@ namespace glm GLM_FUNC_DECL tmat2x2 & operator=(tmat2x2 const & v); - template + template GLM_FUNC_DECL tmat2x2 & operator=(tmat2x2 const & m); - template + template GLM_FUNC_DECL tmat2x2 & operator+=(U s); - template + template GLM_FUNC_DECL tmat2x2 & operator+=(tmat2x2 const & m); - template + template GLM_FUNC_DECL tmat2x2 & operator-=(U s); - template + template GLM_FUNC_DECL tmat2x2 & operator-=(tmat2x2 const & m); - template + template GLM_FUNC_DECL tmat2x2 & operator*=(U s); - template + template GLM_FUNC_DECL tmat2x2 & operator*=(tmat2x2 const & m); - template + template GLM_FUNC_DECL tmat2x2 & operator/=(U s); - template + template GLM_FUNC_DECL tmat2x2 & operator/=(tmat2x2 const & m); ////////////////////////////////////// @@ -191,10 +203,10 @@ namespace glm template GLM_FUNC_DECL tmat2x2 operator*(tmat2x2 const & m1, tmat2x2 const & m2); - + template GLM_FUNC_DECL tmat3x2 operator*(tmat2x2 const & m1, tmat3x2 const & m2); - + template GLM_FUNC_DECL tmat4x2 operator*(tmat2x2 const & m1, tmat4x2 const & m2); @@ -214,7 +226,7 @@ namespace glm GLM_FUNC_DECL tmat2x2 operator/(tmat2x2 const & m1, tmat2x2 const & m2); // Unary constant operators - template + template GLM_FUNC_DECL tmat2x2 const operator-(tmat2x2 const & m); } //namespace glm diff --git a/glm/detail/type_mat2x3.hpp b/glm/detail/type_mat2x3.hpp index 9986e881..5057ae46 100644 --- a/glm/detail/type_mat2x3.hpp +++ b/glm/detail/type_mat2x3.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -50,11 +50,23 @@ namespace glm typedef tmat3x2 transpose_type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 2; + static GLM_CONSTEXPR length_t cols = 3; + static GLM_CONSTEXPR length_t rows = 2; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 2; + static const length_t cols = 3; + static const length_t rows = 2; + static const precision prec = P; +# endif + private: - /// @cond DETAIL + /// @cond DETAIL col_type value[2]; /// @endcond - + public: // Constructors GLM_FUNC_DECL tmat2x3(); @@ -78,7 +90,7 @@ namespace glm GLM_FUNC_DECL tmat2x3( X1 const & x1, Y1 const & y1, Z1 const & z1, X2 const & x2, Y2 const & y2, Z2 const & z2); - + template GLM_FUNC_DECL tmat2x3( tvec3 const & v1, @@ -126,19 +138,19 @@ namespace glm GLM_FUNC_DECL tmat2x3 & operator=(tmat2x3 const & m); - template + template GLM_FUNC_DECL tmat2x3 & operator=(tmat2x3 const & m); - template + template GLM_FUNC_DECL tmat2x3 & operator+=(U s); - template + template GLM_FUNC_DECL tmat2x3 & operator+=(tmat2x3 const & m); - template + template GLM_FUNC_DECL tmat2x3 & operator-=(U s); - template + template GLM_FUNC_DECL tmat2x3 & operator-=(tmat2x3 const & m); - template + template GLM_FUNC_DECL tmat2x3 & operator*=(U s); - template + template GLM_FUNC_DECL tmat2x3 & operator/=(U s); ////////////////////////////////////// @@ -181,7 +193,7 @@ namespace glm template GLM_FUNC_DECL tmat3x3 operator*(tmat2x3 const & m1, tmat3x2 const & m2); - + template GLM_FUNC_DECL tmat4x3 operator*(tmat2x3 const & m1, tmat4x2 const & m2); diff --git a/glm/detail/type_mat2x4.hpp b/glm/detail/type_mat2x4.hpp index 9239e9c9..7f682112 100644 --- a/glm/detail/type_mat2x4.hpp +++ b/glm/detail/type_mat2x4.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -50,11 +50,23 @@ namespace glm typedef tmat4x2 transpose_type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 2; + static GLM_CONSTEXPR length_t cols = 4; + static GLM_CONSTEXPR length_t rows = 2; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 2; + static const length_t cols = 4; + static const length_t rows = 2; + static const precision prec = P; +# endif + private: /// @cond DETAIL col_type value[2]; /// @endcond - + public: // Constructors GLM_FUNC_DECL tmat2x4(); @@ -68,7 +80,7 @@ namespace glm T const & x0, T const & y0, T const & z0, T const & w0, T const & x1, T const & y1, T const & z1, T const & w1); GLM_FUNC_DECL tmat2x4( - col_type const & v0, + col_type const & v0, col_type const & v1); ////////////////////////////////////// @@ -127,19 +139,19 @@ namespace glm GLM_FUNC_DECL tmat2x4 & operator=(tmat2x4 const & m); - template + template GLM_FUNC_DECL tmat2x4 & operator=(tmat2x4 const & m); - template + template GLM_FUNC_DECL tmat2x4 & operator+=(U s); - template + template GLM_FUNC_DECL tmat2x4 & operator+=(tmat2x4 const & m); - template + template GLM_FUNC_DECL tmat2x4 & operator-=(U s); - template + template GLM_FUNC_DECL tmat2x4 & operator-=(tmat2x4 const & m); - template + template GLM_FUNC_DECL tmat2x4 & operator*=(U s); - template + template GLM_FUNC_DECL tmat2x4 & operator/=(U s); ////////////////////////////////////// @@ -179,7 +191,7 @@ namespace glm template GLM_FUNC_DECL tmat4x4 operator*(tmat2x4 const & m1, tmat4x2 const & m2); - + template GLM_FUNC_DECL tmat2x4 operator*(tmat2x4 const & m1, tmat2x2 const & m2); @@ -189,7 +201,7 @@ namespace glm template GLM_FUNC_DECL tmat2x4 operator/(tmat2x4 const & m, T s); - template + template GLM_FUNC_DECL tmat2x4 operator/(T s, tmat2x4 const & m); // Unary constant operators diff --git a/glm/detail/type_mat3x2.hpp b/glm/detail/type_mat3x2.hpp index 9fd573f2..ab27b01f 100644 --- a/glm/detail/type_mat3x2.hpp +++ b/glm/detail/type_mat3x2.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -50,11 +50,23 @@ namespace glm typedef tmat2x3 transpose_type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 3; + static GLM_CONSTEXPR length_t cols = 2; + static GLM_CONSTEXPR length_t rows = 3; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 3; + static const length_t cols = 2; + static const length_t rows = 3; + static const precision prec = P; +# endif + private: /// @cond DETAIL col_type value[3]; /// @endcond - + public: // Constructors GLM_FUNC_DECL tmat3x2(); @@ -84,7 +96,7 @@ namespace glm X1 const & x1, Y1 const & y1, X2 const & x2, Y2 const & y2, X3 const & x3, Y3 const & y3); - + template GLM_FUNC_DECL tmat3x2( tvec2 const & v1, @@ -133,19 +145,19 @@ namespace glm GLM_FUNC_DECL tmat3x2 & operator=(tmat3x2 const & m); - template + template GLM_FUNC_DECL tmat3x2 & operator=(tmat3x2 const & m); - template + template GLM_FUNC_DECL tmat3x2 & operator+=(U s); - template + template GLM_FUNC_DECL tmat3x2 & operator+=(tmat3x2 const & m); - template + template GLM_FUNC_DECL tmat3x2 & operator-=(U s); - template + template GLM_FUNC_DECL tmat3x2 & operator-=(tmat3x2 const & m); - template + template GLM_FUNC_DECL tmat3x2 & operator*=(U s); - template + template GLM_FUNC_DECL tmat3x2 & operator/=(U s); ////////////////////////////////////// @@ -184,10 +196,10 @@ namespace glm template GLM_FUNC_DECL tmat2x2 operator*(tmat3x2 const & m1, tmat2x3 const & m2); - + template GLM_FUNC_DECL tmat3x2 operator*(tmat3x2 const & m1, tmat3x3 const & m2); - + template GLM_FUNC_DECL tmat4x2 operator*(tmat3x2 const & m1, tmat4x3 const & m2); diff --git a/glm/detail/type_mat3x3.hpp b/glm/detail/type_mat3x3.hpp index dddfc535..73142e6b 100644 --- a/glm/detail/type_mat3x3.hpp +++ b/glm/detail/type_mat3x3.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -49,6 +49,18 @@ namespace glm typedef tmat3x3 transpose_type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 3; + static GLM_CONSTEXPR length_t cols = 3; + static GLM_CONSTEXPR length_t rows = 3; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 3; + static const length_t cols = 3; + static const length_t rows = 3; + static const precision prec = P; +# endif + template friend tvec3 operator/(tmat3x3 const & m, tvec3 const & v); template @@ -88,7 +100,7 @@ namespace glm X1 const & x1, Y1 const & y1, Z1 const & z1, X2 const & x2, Y2 const & y2, Z2 const & z2, X3 const & x3, Y3 const & y3, Z3 const & z3); - + template GLM_FUNC_DECL tmat3x3( tvec3 const & v1, @@ -198,10 +210,10 @@ namespace glm template GLM_FUNC_DECL tmat3x3 operator*(tmat3x3 const & m1, tmat3x3 const & m2); - + template GLM_FUNC_DECL tmat2x3 operator*(tmat3x3 const & m1, tmat2x3 const & m2); - + template GLM_FUNC_DECL tmat4x3 operator*(tmat3x3 const & m1, tmat4x3 const & m2); diff --git a/glm/detail/type_mat3x4.hpp b/glm/detail/type_mat3x4.hpp index 7814e3fd..c372fb27 100644 --- a/glm/detail/type_mat3x4.hpp +++ b/glm/detail/type_mat3x4.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -50,6 +50,18 @@ namespace glm typedef tmat4x3 transpose_type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 3; + static GLM_CONSTEXPR length_t cols = 4; + static GLM_CONSTEXPR length_t rows = 3; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 3; + static const length_t cols = 4; + static const length_t rows = 3; + static const precision prec = P; +# endif + private: /// @cond DETAIL col_type value[3]; @@ -83,7 +95,7 @@ namespace glm X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1, X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2, X3 const & x3, Y3 const & y3, Z3 const & z3, W3 const & w3); - + template GLM_FUNC_DECL tmat3x4( tvec4 const & v1, @@ -132,19 +144,19 @@ namespace glm GLM_FUNC_DECL tmat3x4 & operator=(tmat3x4 const & m); - template + template GLM_FUNC_DECL tmat3x4 & operator=(tmat3x4 const & m); - template + template GLM_FUNC_DECL tmat3x4 & operator+=(U s); - template + template GLM_FUNC_DECL tmat3x4 & operator+=(tmat3x4 const & m); - template + template GLM_FUNC_DECL tmat3x4 & operator-=(U s); - template + template GLM_FUNC_DECL tmat3x4 & operator-=(tmat3x4 const & m); - template + template GLM_FUNC_DECL tmat3x4 & operator*=(U s); - template + template GLM_FUNC_DECL tmat3x4 & operator/=(U s); ////////////////////////////////////// @@ -178,15 +190,15 @@ namespace glm template GLM_FUNC_DECL typename tmat3x4::col_type operator*(tmat3x4 const & m, typename tmat3x4::row_type const & v); - template + template GLM_FUNC_DECL typename tmat3x4::row_type operator*(typename tmat3x4::col_type const & v, tmat3x4 const & m); template GLM_FUNC_DECL tmat4x4 operator*(tmat3x4 const & m1, tmat4x3 const & m2); - + template GLM_FUNC_DECL tmat2x4 operator*(tmat3x4 const & m1, tmat2x3 const & m2); - + template GLM_FUNC_DECL tmat3x4 operator*(tmat3x4 const & m1, tmat3x3 const & m2); diff --git a/glm/detail/type_mat4x2.hpp b/glm/detail/type_mat4x2.hpp index d529ecbd..d78b9f4d 100644 --- a/glm/detail/type_mat4x2.hpp +++ b/glm/detail/type_mat4x2.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -50,6 +50,18 @@ namespace glm typedef tmat2x4 transpose_type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR length_t cols = 2; + static GLM_CONSTEXPR length_t rows = 4; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 4; + static const length_t cols = 2; + static const length_t rows = 4; + static const precision prec = P; +# endif + private: /// @cond DETAIL col_type value[4]; @@ -70,7 +82,7 @@ namespace glm T const & x2, T const & y2, T const & x3, T const & y3); GLM_FUNC_DECL tmat4x2( - col_type const & v0, + col_type const & v0, col_type const & v1, col_type const & v2, col_type const & v3); @@ -138,19 +150,19 @@ namespace glm GLM_FUNC_DECL tmat4x2 & operator=(tmat4x2 const & m); - template + template GLM_FUNC_DECL tmat4x2 & operator=(tmat4x2 const & m); - template + template GLM_FUNC_DECL tmat4x2 & operator+=(U s); - template + template GLM_FUNC_DECL tmat4x2 & operator+=(tmat4x2 const & m); - template + template GLM_FUNC_DECL tmat4x2 & operator-=(U s); - template + template GLM_FUNC_DECL tmat4x2 & operator-=(tmat4x2 const & m); - template + template GLM_FUNC_DECL tmat4x2 & operator*=(U s); - template + template GLM_FUNC_DECL tmat4x2 & operator/=(U s); ////////////////////////////////////// @@ -189,10 +201,10 @@ namespace glm template GLM_FUNC_DECL tmat3x2 operator*(tmat4x2 const & m1, tmat3x4 const & m2); - + template GLM_FUNC_DECL tmat4x2 operator*(tmat4x2 const & m1, tmat4x4 const & m2); - + template GLM_FUNC_DECL tmat2x3 operator*(tmat4x3 const & m1, tmat2x4 const & m2); diff --git a/glm/detail/type_mat4x3.hpp b/glm/detail/type_mat4x3.hpp index 8bde1ac0..f93f5c87 100644 --- a/glm/detail/type_mat4x3.hpp +++ b/glm/detail/type_mat4x3.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -50,8 +50,20 @@ namespace glm typedef tmat3x4 transpose_type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR length_t cols = 3; + static GLM_CONSTEXPR length_t rows = 4; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 4; + static const length_t cols = 3; + static const length_t rows = 4; + static const precision prec = P; +# endif + private: - // Data + // Data col_type value[4]; public: @@ -87,7 +99,7 @@ namespace glm X2 const & x2, Y2 const & y2, Z2 const & z2, X3 const & x3, Y3 const & y3, Z3 const & z3, X4 const & x4, Y4 const & y4, Z4 const & z4); - + template GLM_FUNC_DECL tmat4x3( tvec3 const & v1, @@ -191,7 +203,7 @@ namespace glm template GLM_FUNC_DECL tmat3x3 operator*(tmat4x3 const & m1, tmat3x4 const & m2); - + template GLM_FUNC_DECL tmat4x3 operator*(tmat4x3 const & m1, tmat4x4 const & m2); diff --git a/glm/detail/type_mat4x4.hpp b/glm/detail/type_mat4x4.hpp index dcb7269b..6e68f6f7 100644 --- a/glm/detail/type_mat4x4.hpp +++ b/glm/detail/type_mat4x4.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -49,6 +49,18 @@ namespace glm typedef tmat4x4 transpose_type; typedef T value_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR length_t cols = 4; + static GLM_CONSTEXPR length_t rows = 4; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 4; + static const length_t cols = 4; + static const length_t rows = 4; + static const precision prec = P; +# endif + template friend tvec4 operator/(tmat4x4 const & m, tvec4 const & v); template @@ -177,13 +189,13 @@ namespace glm template GLM_FUNC_DECL tmat4x4 operator+(T const & s, tmat4x4 const & m); - template + template GLM_FUNC_DECL tmat4x4 operator+(tmat4x4 const & m1, tmat4x4 const & m2); - template + template GLM_FUNC_DECL tmat4x4 operator-(tmat4x4 const & m, T const & s); - template + template GLM_FUNC_DECL tmat4x4 operator-(T const & s, tmat4x4 const & m); template diff --git a/glm/gtx/simd_mat4.hpp b/glm/gtx/simd_mat4.hpp index 89ee5e75..3334dc53 100644 --- a/glm/gtx/simd_mat4.hpp +++ b/glm/gtx/simd_mat4.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -33,9 +33,9 @@ /// /// @defgroup gtx_simd_mat4 GLM_GTX_simd_mat4 /// @ingroup gtx -/// +/// /// @brief SIMD implementation of mat4 type. -/// +/// /// need to be included to use these functionalities. /////////////////////////////////////////////////////////////////////////////////// @@ -71,6 +71,18 @@ namespace detail typedef fmat4x4SIMD type; typedef fmat4x4SIMD transpose_type; +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR length_t cols = 4; + static GLM_CONSTEXPR length_t rows = 4; + static GLM_CONSTEXPR precision prec = defaultp; +# else + static const length_t components = 4; + static const length_t cols = 4; + static const length_t rows = 4; + static const precision prec = defaultp; +# endif + GLM_FUNC_DECL length_t length() const; fvec4SIMD Data[4]; @@ -96,7 +108,7 @@ namespace detail __m128 const in[4]); // Conversions - //template + //template //explicit tmat4x4(tmat4x4 const & m); //explicit tmat4x4(tmat2x2 const & x); From 357eaf7071c606d8252471b0747050fcd05513a4 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sat, 18 Jul 2015 10:00:00 +0200 Subject: [PATCH 50/74] Fixed warnings --- test/core/core_setup_message.cpp | 2 +- test/core/core_type_vec4.cpp | 4 ++-- test/gtc/gtc_integer.cpp | 14 +++++++------- test/gtx/gtx_type_aligned.cpp | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/test/core/core_setup_message.cpp b/test/core/core_setup_message.cpp index 0955f2e1..09ef6a36 100644 --- a/test/core/core_setup_message.cpp +++ b/test/core/core_setup_message.cpp @@ -196,7 +196,7 @@ int test_instruction_set() int test_cpp_version() { - std::printf("__cplusplus: %d\n", __cplusplus); + std::printf("__cplusplus: %ld\n", __cplusplus); return 0; } diff --git a/test/core/core_type_vec4.cpp b/test/core/core_type_vec4.cpp index fa724399..be023307 100644 --- a/test/core/core_type_vec4.cpp +++ b/test/core/core_type_vec4.cpp @@ -398,7 +398,7 @@ int test_vec4_perf_AoS(std::size_t Size) std::clock_t EndTime = std::clock(); - std::printf("AoS: %d\n", EndTime - StartTime); + std::printf("AoS: %ld\n", EndTime - StartTime); return Error; } @@ -437,7 +437,7 @@ int test_vec4_perf_SoA(std::size_t Size) std::clock_t EndTime = std::clock(); - std::printf("SoA: %d\n", EndTime - StartTime); + std::printf("SoA: %ld\n", EndTime - StartTime); return Error; } diff --git a/test/gtc/gtc_integer.cpp b/test/gtc/gtc_integer.cpp index 64d9377c..df1d3fdb 100644 --- a/test/gtc/gtc_integer.cpp +++ b/test/gtc/gtc_integer.cpp @@ -99,7 +99,7 @@ namespace log2_ std::clock_t End = clock(); - printf("glm::log2: %d clocks\n", End - Begin); + printf("glm::log2: %ld clocks\n", End - Begin); } { @@ -113,7 +113,7 @@ namespace log2_ std::clock_t End = clock(); - printf("glm::log2: %d clocks\n", End - Begin); + printf("glm::log2: %ld clocks\n", End - Begin); } # if GLM_HAS_BITSCAN_WINDOWS @@ -135,7 +135,7 @@ namespace log2_ std::clock_t End = clock(); - printf("glm::log2 inlined: %d clocks\n", End - Begin); + printf("glm::log2 inlined: %ld clocks\n", End - Begin); } @@ -155,7 +155,7 @@ namespace log2_ std::clock_t End = clock(); - printf("glm::log2 inlined no cast: %d clocks\n", End - Begin); + printf("glm::log2 inlined no cast: %ld clocks\n", End - Begin); } @@ -175,7 +175,7 @@ namespace log2_ std::clock_t End = clock(); - printf("glm::log2 reinterpret: %d clocks\n", End - Begin); + printf("glm::log2 reinterpret: %ld clocks\n", End - Begin); } # endif//GLM_HAS_BITSCAN_WINDOWS @@ -190,7 +190,7 @@ namespace log2_ std::clock_t End = clock(); - printf("glm::log2: %d clocks\n", End - Begin); + printf("glm::log2: %ld clocks\n", End - Begin); } { @@ -204,7 +204,7 @@ namespace log2_ std::clock_t End = clock(); - printf("glm::log2: %d clocks\n", End - Begin); + printf("glm::log2: %ld clocks\n", End - Begin); } return Error; diff --git a/test/gtx/gtx_type_aligned.cpp b/test/gtx/gtx_type_aligned.cpp index aeff2b7e..b69a6307 100644 --- a/test/gtx/gtx_type_aligned.cpp +++ b/test/gtx/gtx_type_aligned.cpp @@ -47,7 +47,7 @@ int test_decl() glm::vec4 B; }; - printf("vec4 - Aligned: %d, unaligned: %d\n", sizeof(S1), sizeof(S2)); + printf("vec4 - Aligned: %ld, unaligned: %ld\n", sizeof(S1), sizeof(S2)); Error += sizeof(S1) >= sizeof(S2) ? 0 : 1; } @@ -65,7 +65,7 @@ int test_decl() glm::aligned_vec3 B; }; - printf("vec3: %d, aligned: %d\n", sizeof(S1), sizeof(S2)); + printf("vec3: %ld, aligned: %ld\n", sizeof(S1), sizeof(S2)); Error += sizeof(S1) <= sizeof(S2) ? 0 : 1; } @@ -83,7 +83,7 @@ int test_decl() glm::vec4 B; }; - printf("vec4 - Aligned: %d, unaligned: %d\n", sizeof(S1), sizeof(S2)); + printf("vec4 - Aligned: %ld, unaligned: %ld\n", sizeof(S1), sizeof(S2)); Error += sizeof(S1) >= sizeof(S2) ? 0 : 1; } @@ -101,7 +101,7 @@ int test_decl() glm::dvec4 B; }; - printf("dvec4 - Aligned: %d, unaligned: %d\n", sizeof(S1), sizeof(S2)); + printf("dvec4 - Aligned: %ld, unaligned: %ld\n", sizeof(S1), sizeof(S2)); Error += sizeof(S1) >= sizeof(S2) ? 0 : 1; } From 38c9cd6cbac73fcf48e261df702c7bfc9ca78294 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 00:25:33 +0200 Subject: [PATCH 51/74] Added GLM_META_PROG_HELPERS #350 --- glm/detail/type_mat2x2.hpp | 24 +++++++++++++----------- glm/detail/type_mat2x3.hpp | 24 +++++++++++++----------- glm/detail/type_mat2x4.hpp | 24 +++++++++++++----------- glm/detail/type_mat3x2.hpp | 24 +++++++++++++----------- glm/detail/type_mat3x4.hpp | 24 +++++++++++++----------- glm/detail/type_mat4x2.hpp | 24 +++++++++++++----------- glm/detail/type_mat4x3.hpp | 24 +++++++++++++----------- glm/detail/type_mat4x4.hpp | 24 +++++++++++++----------- glm/detail/type_vec1.hpp | 18 +++++++++++------- glm/detail/type_vec2.hpp | 17 ++++++++++------- glm/detail/type_vec3.hpp | 17 ++++++++++------- glm/detail/type_vec4.hpp | 17 ++++++++++------- glm/gtc/quaternion.hpp | 17 ++++++++++------- glm/gtx/dual_quaternion.hpp | 17 ++++++++++------- glm/gtx/simd_mat4.hpp | 24 +++++++++++++----------- glm/gtx/simd_quat.hpp | 17 ++++++++++------- glm/gtx/simd_vec4.hpp | 17 ++++++++++------- readme.md | 1 + 18 files changed, 199 insertions(+), 155 deletions(-) diff --git a/glm/detail/type_mat2x2.hpp b/glm/detail/type_mat2x2.hpp index c2bc2b40..f3ea0f9e 100644 --- a/glm/detail/type_mat2x2.hpp +++ b/glm/detail/type_mat2x2.hpp @@ -54,17 +54,19 @@ namespace glm template friend tvec2 operator/(tvec2 const & v, tmat2x2 const & m); -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 2; - static GLM_CONSTEXPR length_t cols = 2; - static GLM_CONSTEXPR length_t rows = 2; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 2; - static const length_t cols = 2; - static const length_t rows = 2; - static const precision prec = P; -# endif +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 2; + static GLM_CONSTEXPR length_t columns = 2; + static GLM_CONSTEXPR length_t rows = 2; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 2; + static const length_t columns = 2; + static const length_t rows = 2; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS private: /// @cond DETAIL diff --git a/glm/detail/type_mat2x3.hpp b/glm/detail/type_mat2x3.hpp index 5057ae46..cbd88424 100644 --- a/glm/detail/type_mat2x3.hpp +++ b/glm/detail/type_mat2x3.hpp @@ -50,17 +50,19 @@ namespace glm typedef tmat3x2 transpose_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 2; - static GLM_CONSTEXPR length_t cols = 3; - static GLM_CONSTEXPR length_t rows = 2; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 2; - static const length_t cols = 3; - static const length_t rows = 2; - static const precision prec = P; -# endif +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 2; + static GLM_CONSTEXPR length_t cols = 3; + static GLM_CONSTEXPR length_t rows = 2; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 2; + static const length_t cols = 3; + static const length_t rows = 2; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS private: /// @cond DETAIL diff --git a/glm/detail/type_mat2x4.hpp b/glm/detail/type_mat2x4.hpp index 7f682112..3deb880d 100644 --- a/glm/detail/type_mat2x4.hpp +++ b/glm/detail/type_mat2x4.hpp @@ -50,17 +50,19 @@ namespace glm typedef tmat4x2 transpose_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 2; - static GLM_CONSTEXPR length_t cols = 4; - static GLM_CONSTEXPR length_t rows = 2; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 2; - static const length_t cols = 4; - static const length_t rows = 2; - static const precision prec = P; -# endif +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 2; + static GLM_CONSTEXPR length_t cols = 4; + static GLM_CONSTEXPR length_t rows = 2; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 2; + static const length_t cols = 4; + static const length_t rows = 2; + static const precision prec = P; +# endif +# endif//GLM_META_PROG_HELPERS private: /// @cond DETAIL diff --git a/glm/detail/type_mat3x2.hpp b/glm/detail/type_mat3x2.hpp index ab27b01f..69feddcf 100644 --- a/glm/detail/type_mat3x2.hpp +++ b/glm/detail/type_mat3x2.hpp @@ -50,17 +50,19 @@ namespace glm typedef tmat2x3 transpose_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 3; - static GLM_CONSTEXPR length_t cols = 2; - static GLM_CONSTEXPR length_t rows = 3; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 3; - static const length_t cols = 2; - static const length_t rows = 3; - static const precision prec = P; -# endif +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 3; + static GLM_CONSTEXPR length_t cols = 2; + static GLM_CONSTEXPR length_t rows = 3; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 3; + static const length_t cols = 2; + static const length_t rows = 3; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS private: /// @cond DETAIL diff --git a/glm/detail/type_mat3x4.hpp b/glm/detail/type_mat3x4.hpp index c372fb27..193d48f9 100644 --- a/glm/detail/type_mat3x4.hpp +++ b/glm/detail/type_mat3x4.hpp @@ -50,17 +50,19 @@ namespace glm typedef tmat4x3 transpose_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 3; - static GLM_CONSTEXPR length_t cols = 4; - static GLM_CONSTEXPR length_t rows = 3; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 3; - static const length_t cols = 4; - static const length_t rows = 3; - static const precision prec = P; -# endif +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 3; + static GLM_CONSTEXPR length_t cols = 4; + static GLM_CONSTEXPR length_t rows = 3; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 3; + static const length_t cols = 4; + static const length_t rows = 3; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS private: /// @cond DETAIL diff --git a/glm/detail/type_mat4x2.hpp b/glm/detail/type_mat4x2.hpp index d78b9f4d..8fb47a1b 100644 --- a/glm/detail/type_mat4x2.hpp +++ b/glm/detail/type_mat4x2.hpp @@ -50,17 +50,19 @@ namespace glm typedef tmat2x4 transpose_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR length_t cols = 2; - static GLM_CONSTEXPR length_t rows = 4; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 4; - static const length_t cols = 2; - static const length_t rows = 4; - static const precision prec = P; -# endif +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR length_t cols = 2; + static GLM_CONSTEXPR length_t rows = 4; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 4; + static const length_t cols = 2; + static const length_t rows = 4; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS private: /// @cond DETAIL diff --git a/glm/detail/type_mat4x3.hpp b/glm/detail/type_mat4x3.hpp index f93f5c87..d5502baa 100644 --- a/glm/detail/type_mat4x3.hpp +++ b/glm/detail/type_mat4x3.hpp @@ -50,17 +50,19 @@ namespace glm typedef tmat3x4 transpose_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR length_t cols = 3; - static GLM_CONSTEXPR length_t rows = 4; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 4; - static const length_t cols = 3; - static const length_t rows = 4; - static const precision prec = P; -# endif +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR length_t cols = 3; + static GLM_CONSTEXPR length_t rows = 4; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 4; + static const length_t cols = 3; + static const length_t rows = 4; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS private: // Data diff --git a/glm/detail/type_mat4x4.hpp b/glm/detail/type_mat4x4.hpp index 6e68f6f7..682a1f87 100644 --- a/glm/detail/type_mat4x4.hpp +++ b/glm/detail/type_mat4x4.hpp @@ -49,17 +49,19 @@ namespace glm typedef tmat4x4 transpose_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR length_t cols = 4; - static GLM_CONSTEXPR length_t rows = 4; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 4; - static const length_t cols = 4; - static const length_t rows = 4; - static const precision prec = P; -# endif +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR length_t cols = 4; + static GLM_CONSTEXPR length_t rows = 4; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 4; + static const length_t cols = 4; + static const length_t rows = 4; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS template friend tvec4 operator/(tmat4x4 const & m, tvec4 const & v); diff --git a/glm/detail/type_vec1.hpp b/glm/detail/type_vec1.hpp index f5d9d6c3..500a3ccb 100644 --- a/glm/detail/type_vec1.hpp +++ b/glm/detail/type_vec1.hpp @@ -54,13 +54,17 @@ namespace glm typedef tvec1 type; typedef tvec1 bool_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 1; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 1; - static const precision prec = P; -# endif + +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 1; + static GLM_CONSTEXPR precision precision = P; +# else + static const length_t components = 1; + static const precision precision = P; +# endif +# endif//GLM_META_PROG_HELPERS + ////////////////////////////////////// // Data diff --git a/glm/detail/type_vec2.hpp b/glm/detail/type_vec2.hpp index 8b2a8ba6..0c4f0663 100644 --- a/glm/detail/type_vec2.hpp +++ b/glm/detail/type_vec2.hpp @@ -54,13 +54,16 @@ namespace glm typedef tvec2 type; typedef tvec2 bool_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 2; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 2; - static const precision prec = P; -# endif + +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 2; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 2; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS ////////////////////////////////////// // Data diff --git a/glm/detail/type_vec3.hpp b/glm/detail/type_vec3.hpp index 2aef6ef7..a010e5d0 100644 --- a/glm/detail/type_vec3.hpp +++ b/glm/detail/type_vec3.hpp @@ -54,13 +54,16 @@ namespace glm typedef tvec3 type; typedef tvec3 bool_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 3; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 3; - static const precision prec = P; -# endif + +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 3; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 3; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS ////////////////////////////////////// // Data diff --git a/glm/detail/type_vec4.hpp b/glm/detail/type_vec4.hpp index 31ae1a8d..574596a5 100644 --- a/glm/detail/type_vec4.hpp +++ b/glm/detail/type_vec4.hpp @@ -108,13 +108,16 @@ namespace detail typedef tvec4 type; typedef tvec4 bool_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 4; - static const precision prec = P; -# endif + +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 4; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS ////////////////////////////////////// // Data diff --git a/glm/gtc/quaternion.hpp b/glm/gtc/quaternion.hpp index a50e31b3..bb2c4494 100644 --- a/glm/gtc/quaternion.hpp +++ b/glm/gtc/quaternion.hpp @@ -64,13 +64,16 @@ namespace glm { typedef tquat type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 4; - static const precision prec = P; -# endif + +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 4; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS public: T x, y, z, w; diff --git a/glm/gtx/dual_quaternion.hpp b/glm/gtx/dual_quaternion.hpp index 392a0005..87349caa 100644 --- a/glm/gtx/dual_quaternion.hpp +++ b/glm/gtx/dual_quaternion.hpp @@ -63,13 +63,16 @@ namespace glm { typedef T value_type; typedef glm::tquat part_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 8; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 8; - static const precision prec = P; -# endif + +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 8; + static GLM_CONSTEXPR precision prec = P; +# else + static const length_t components = 8; + static const precision prec = P; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS public: glm::tquat real, dual; diff --git a/glm/gtx/simd_mat4.hpp b/glm/gtx/simd_mat4.hpp index 3334dc53..0a81fd40 100644 --- a/glm/gtx/simd_mat4.hpp +++ b/glm/gtx/simd_mat4.hpp @@ -71,17 +71,19 @@ namespace detail typedef fmat4x4SIMD type; typedef fmat4x4SIMD transpose_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR length_t cols = 4; - static GLM_CONSTEXPR length_t rows = 4; - static GLM_CONSTEXPR precision prec = defaultp; -# else - static const length_t components = 4; - static const length_t cols = 4; - static const length_t rows = 4; - static const precision prec = defaultp; -# endif +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR length_t cols = 4; + static GLM_CONSTEXPR length_t rows = 4; + static GLM_CONSTEXPR precision prec = defaultp; +# else + static const length_t components = 4; + static const length_t cols = 4; + static const length_t rows = 4; + static const precision prec = defaultp; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS GLM_FUNC_DECL length_t length() const; diff --git a/glm/gtx/simd_quat.hpp b/glm/gtx/simd_quat.hpp index 3f0e05f3..600d49f7 100644 --- a/glm/gtx/simd_quat.hpp +++ b/glm/gtx/simd_quat.hpp @@ -75,13 +75,16 @@ namespace detail typedef fquatSIMD type; typedef tquat bool_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR precision prec = defaultp; -# else - static const length_t components = 4; - static const precision prec = defaultp; -# endif + +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR precision prec = defaultp; +# else + static const length_t components = 4; + static const precision prec = defaultp; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS #ifdef GLM_SIMD_ENABLE_XYZW_UNION union diff --git a/glm/gtx/simd_vec4.hpp b/glm/gtx/simd_vec4.hpp index 3958f2ce..27352c53 100644 --- a/glm/gtx/simd_vec4.hpp +++ b/glm/gtx/simd_vec4.hpp @@ -98,13 +98,16 @@ namespace detail typedef fvec4SIMD type; typedef tvec4 bool_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR precision prec = defaultp; -# else - static const length_t components = 4; - static const precision prec = defaultp; -# endif + +# if GLM_META_PROG_HELPERS +# if GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR length_t components = 4; + static GLM_CONSTEXPR precision prec = defaultp; +# else + static const length_t components = 4; + static const precision prec = defaultp; +# endif//GLM_HAS_CONSTEXPR +# endif//GLM_META_PROG_HELPERS #ifdef GLM_SIMD_ENABLE_XYZW_UNION union diff --git a/readme.md b/readme.md index dd1f44a3..3fd18b07 100644 --- a/readme.md +++ b/readme.md @@ -58,6 +58,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Added functions eulerAngleXYZ and extractEulerAngleXYZ #311 - Added to perform std::hash on GLM types #320 - Added for texcoord wrapping +- Added static components and precision members to all vector and quat types #350 ##### Improvements: - Changed usage of __has_include to support Intel compiler #307 From 12328983ae3dd1bcf59b5d5e200d8d18e7a8ca23 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 00:29:56 +0200 Subject: [PATCH 52/74] Updated changelog #349 --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index 3fd18b07..245838a8 100644 --- a/readme.md +++ b/readme.md @@ -59,6 +59,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Added to perform std::hash on GLM types #320 - Added for texcoord wrapping - Added static components and precision members to all vector and quat types #350 +- Added .gitignore #349 ##### Improvements: - Changed usage of __has_include to support Intel compiler #307 From 6f1b7c24ce61209399bde34d7281996a74a05ee8 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 00:34:59 +0200 Subject: [PATCH 53/74] Fixed build --- test/core/core_type_vec1.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/test/core/core_type_vec1.cpp b/test/core/core_type_vec1.cpp index 76d808ce..ae08f0aa 100644 --- a/test/core/core_type_vec1.cpp +++ b/test/core/core_type_vec1.cpp @@ -30,6 +30,7 @@ /////////////////////////////////////////////////////////////////////////////////// #define GLM_SWIZZLE +#define GLM_META_PROG_HELPERS #include #include #include From c90f7b0973e7ca5a5f7ab12f0cf595a52366b00b Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 01:04:07 +0200 Subject: [PATCH 54/74] Fixed build --- glm/detail/type_mat2x2.hpp | 2 +- glm/detail/type_mat2x3.hpp | 2 +- glm/detail/type_mat2x4.hpp | 2 +- glm/detail/type_mat3x2.hpp | 2 +- glm/detail/type_mat3x4.hpp | 2 +- glm/detail/type_mat4x2.hpp | 2 +- glm/detail/type_mat4x3.hpp | 2 +- glm/detail/type_mat4x4.hpp | 2 +- glm/detail/type_vec1.hpp | 4 ++-- glm/detail/type_vec2.hpp | 2 +- glm/detail/type_vec3.hpp | 2 +- glm/detail/type_vec4.hpp | 2 +- glm/gtc/quaternion.hpp | 2 +- glm/gtx/dual_quaternion.hpp | 2 +- glm/gtx/simd_mat4.hpp | 2 +- glm/gtx/simd_quat.hpp | 2 +- glm/gtx/simd_vec4.hpp | 2 +- test/core/core_type_vec2.cpp | 1 + test/core/core_type_vec3.cpp | 1 + test/core/core_type_vec4.cpp | 1 + test/gtc/gtc_quaternion.cpp | 1 + 21 files changed, 22 insertions(+), 18 deletions(-) diff --git a/glm/detail/type_mat2x2.hpp b/glm/detail/type_mat2x2.hpp index f3ea0f9e..ad160b20 100644 --- a/glm/detail/type_mat2x2.hpp +++ b/glm/detail/type_mat2x2.hpp @@ -54,7 +54,7 @@ namespace glm template friend tvec2 operator/(tvec2 const & v, tmat2x2 const & m); -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 2; static GLM_CONSTEXPR length_t columns = 2; diff --git a/glm/detail/type_mat2x3.hpp b/glm/detail/type_mat2x3.hpp index cbd88424..af37884e 100644 --- a/glm/detail/type_mat2x3.hpp +++ b/glm/detail/type_mat2x3.hpp @@ -50,7 +50,7 @@ namespace glm typedef tmat3x2 transpose_type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 2; static GLM_CONSTEXPR length_t cols = 3; diff --git a/glm/detail/type_mat2x4.hpp b/glm/detail/type_mat2x4.hpp index 3deb880d..48521460 100644 --- a/glm/detail/type_mat2x4.hpp +++ b/glm/detail/type_mat2x4.hpp @@ -50,7 +50,7 @@ namespace glm typedef tmat4x2 transpose_type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 2; static GLM_CONSTEXPR length_t cols = 4; diff --git a/glm/detail/type_mat3x2.hpp b/glm/detail/type_mat3x2.hpp index 69feddcf..d5480432 100644 --- a/glm/detail/type_mat3x2.hpp +++ b/glm/detail/type_mat3x2.hpp @@ -50,7 +50,7 @@ namespace glm typedef tmat2x3 transpose_type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 3; static GLM_CONSTEXPR length_t cols = 2; diff --git a/glm/detail/type_mat3x4.hpp b/glm/detail/type_mat3x4.hpp index 193d48f9..8074ea43 100644 --- a/glm/detail/type_mat3x4.hpp +++ b/glm/detail/type_mat3x4.hpp @@ -50,7 +50,7 @@ namespace glm typedef tmat4x3 transpose_type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 3; static GLM_CONSTEXPR length_t cols = 4; diff --git a/glm/detail/type_mat4x2.hpp b/glm/detail/type_mat4x2.hpp index 8fb47a1b..3bc73706 100644 --- a/glm/detail/type_mat4x2.hpp +++ b/glm/detail/type_mat4x2.hpp @@ -50,7 +50,7 @@ namespace glm typedef tmat2x4 transpose_type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 4; static GLM_CONSTEXPR length_t cols = 2; diff --git a/glm/detail/type_mat4x3.hpp b/glm/detail/type_mat4x3.hpp index d5502baa..a0ff185c 100644 --- a/glm/detail/type_mat4x3.hpp +++ b/glm/detail/type_mat4x3.hpp @@ -50,7 +50,7 @@ namespace glm typedef tmat3x4 transpose_type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 4; static GLM_CONSTEXPR length_t cols = 3; diff --git a/glm/detail/type_mat4x4.hpp b/glm/detail/type_mat4x4.hpp index 682a1f87..0973fd83 100644 --- a/glm/detail/type_mat4x4.hpp +++ b/glm/detail/type_mat4x4.hpp @@ -49,7 +49,7 @@ namespace glm typedef tmat4x4 transpose_type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 4; static GLM_CONSTEXPR length_t cols = 4; diff --git a/glm/detail/type_vec1.hpp b/glm/detail/type_vec1.hpp index 500a3ccb..d346cb89 100644 --- a/glm/detail/type_vec1.hpp +++ b/glm/detail/type_vec1.hpp @@ -55,13 +55,13 @@ namespace glm typedef tvec1 bool_type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 1; static GLM_CONSTEXPR precision precision = P; # else static const length_t components = 1; - static const precision precision = P; + static const precision prec = P; # endif # endif//GLM_META_PROG_HELPERS diff --git a/glm/detail/type_vec2.hpp b/glm/detail/type_vec2.hpp index 0c4f0663..d25de4ea 100644 --- a/glm/detail/type_vec2.hpp +++ b/glm/detail/type_vec2.hpp @@ -55,7 +55,7 @@ namespace glm typedef tvec2 bool_type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 2; static GLM_CONSTEXPR precision prec = P; diff --git a/glm/detail/type_vec3.hpp b/glm/detail/type_vec3.hpp index a010e5d0..b0abde48 100644 --- a/glm/detail/type_vec3.hpp +++ b/glm/detail/type_vec3.hpp @@ -55,7 +55,7 @@ namespace glm typedef tvec3 bool_type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 3; static GLM_CONSTEXPR precision prec = P; diff --git a/glm/detail/type_vec4.hpp b/glm/detail/type_vec4.hpp index 574596a5..c0f07661 100644 --- a/glm/detail/type_vec4.hpp +++ b/glm/detail/type_vec4.hpp @@ -109,7 +109,7 @@ namespace detail typedef tvec4 bool_type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 4; static GLM_CONSTEXPR precision prec = P; diff --git a/glm/gtc/quaternion.hpp b/glm/gtc/quaternion.hpp index bb2c4494..97c7dc50 100644 --- a/glm/gtc/quaternion.hpp +++ b/glm/gtc/quaternion.hpp @@ -65,7 +65,7 @@ namespace glm typedef tquat type; typedef T value_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 4; static GLM_CONSTEXPR precision prec = P; diff --git a/glm/gtx/dual_quaternion.hpp b/glm/gtx/dual_quaternion.hpp index 87349caa..10ffa836 100644 --- a/glm/gtx/dual_quaternion.hpp +++ b/glm/gtx/dual_quaternion.hpp @@ -64,7 +64,7 @@ namespace glm typedef T value_type; typedef glm::tquat part_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 8; static GLM_CONSTEXPR precision prec = P; diff --git a/glm/gtx/simd_mat4.hpp b/glm/gtx/simd_mat4.hpp index 0a81fd40..649bdef2 100644 --- a/glm/gtx/simd_mat4.hpp +++ b/glm/gtx/simd_mat4.hpp @@ -71,7 +71,7 @@ namespace detail typedef fmat4x4SIMD type; typedef fmat4x4SIMD transpose_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 4; static GLM_CONSTEXPR length_t cols = 4; diff --git a/glm/gtx/simd_quat.hpp b/glm/gtx/simd_quat.hpp index 600d49f7..8595bc99 100644 --- a/glm/gtx/simd_quat.hpp +++ b/glm/gtx/simd_quat.hpp @@ -76,7 +76,7 @@ namespace detail typedef fquatSIMD type; typedef tquat bool_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 4; static GLM_CONSTEXPR precision prec = defaultp; diff --git a/glm/gtx/simd_vec4.hpp b/glm/gtx/simd_vec4.hpp index 27352c53..d576bbc2 100644 --- a/glm/gtx/simd_vec4.hpp +++ b/glm/gtx/simd_vec4.hpp @@ -99,7 +99,7 @@ namespace detail typedef fvec4SIMD type; typedef tvec4 bool_type; -# if GLM_META_PROG_HELPERS +# ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 4; static GLM_CONSTEXPR precision prec = defaultp; diff --git a/test/core/core_type_vec2.cpp b/test/core/core_type_vec2.cpp index 590ad3f0..cf608f9f 100644 --- a/test/core/core_type_vec2.cpp +++ b/test/core/core_type_vec2.cpp @@ -29,6 +29,7 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// +#define GLM_META_PROG_HELPERS #define GLM_SWIZZLE #include #include diff --git a/test/core/core_type_vec3.cpp b/test/core/core_type_vec3.cpp index cdd5f6d3..a1a8f9f9 100644 --- a/test/core/core_type_vec3.cpp +++ b/test/core/core_type_vec3.cpp @@ -29,6 +29,7 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// +#define GLM_META_PROG_HELPERS #define GLM_SWIZZLE #include #include diff --git a/test/core/core_type_vec4.cpp b/test/core/core_type_vec4.cpp index f899c9c9..37d6afbe 100644 --- a/test/core/core_type_vec4.cpp +++ b/test/core/core_type_vec4.cpp @@ -30,6 +30,7 @@ /////////////////////////////////////////////////////////////////////////////////// //#define GLM_FORCE_AVX2 +#define GLM_META_PROG_HELPERS #define GLM_SWIZZLE #include #include diff --git a/test/gtc/gtc_quaternion.cpp b/test/gtc/gtc_quaternion.cpp index 6a8d344b..d9b3ddf1 100644 --- a/test/gtc/gtc_quaternion.cpp +++ b/test/gtc/gtc_quaternion.cpp @@ -29,6 +29,7 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// +#define GLM_META_PROG_HELPERS #include #include #include From 02d7be8531aa36c253c24eef61daf4da1269d520 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 01:20:20 +0200 Subject: [PATCH 55/74] Improved packing code to give vectorization a chance --- glm/detail/func_packing.inl | 54 +++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/glm/detail/func_packing.inl b/glm/detail/func_packing.inl index fff9e703..34953fdf 100644 --- a/glm/detail/func_packing.inl +++ b/glm/detail/func_packing.inl @@ -44,8 +44,10 @@ namespace glm uint out; } u; - u.in[0] = round(clamp(v[0], 0.0f, 1.0f) * 65535.0f); - u.in[1] = round(clamp(v[1], 0.0f, 1.0f) * 65535.0f); + u16vec2 result(round(clamp(v, 0.0f, 1.0f) * 65535.0f)); + + u.in[0] = result[0]; + u.in[1] = result[1]; return u.out; } @@ -60,9 +62,7 @@ namespace glm u.in = p; - return vec2( - u.out[0] * 1.5259021896696421759365224689097e-5f, - u.out[1] * 1.5259021896696421759365224689097e-5f); + return vec2(u.out[0], u.out[1]) * 1.5259021896696421759365224689097e-5f; } GLM_FUNC_QUALIFIER uint packSnorm2x16(vec2 const & v) @@ -73,8 +73,10 @@ namespace glm uint out; } u; - u.in[0] = round(clamp(v[0], -1.0f, 1.0f) * 32767.0f); - u.in[1] = round(clamp(v[1], -1.0f, 1.0f) * 32767.0f); + i16vec2 result(round(clamp(v, -1.0f, 1.0f) * 32767.0f)); + + u.in[0] = result[0]; + u.in[1] = result[1]; return u.out; } @@ -89,11 +91,7 @@ namespace glm u.in = p; - return vec2( - clamp(u.out[0] * 3.0518509475997192297128208258309e-5f, - -1.0f, 1.0f), - clamp(u.out[1] * 3.0518509475997192297128208258309e-5f, - -1.0f, 1.0f)); + return clamp(vec2(u.out[0], u.out[1]) * 3.0518509475997192297128208258309e-5f, -1.0f, 1.0f); } GLM_FUNC_QUALIFIER uint packUnorm4x8(vec4 const & v) @@ -104,10 +102,12 @@ namespace glm uint out; } u; - u.in[0] = round(clamp(v[0], 0.0f, 1.0f) * 255.0f); - u.in[1] = round(clamp(v[1], 0.0f, 1.0f) * 255.0f); - u.in[2] = round(clamp(v[2], 0.0f, 1.0f) * 255.0f); - u.in[3] = round(clamp(v[3], 0.0f, 1.0f) * 255.0f); + u8vec4 result(round(clamp(v, 0.0f, 1.0f) * 255.0f)); + + u.in[0] = result[0]; + u.in[1] = result[1]; + u.in[2] = result[2]; + u.in[3] = result[3]; return u.out; } @@ -122,11 +122,7 @@ namespace glm u.in = p; - return vec4( - u.out[0] * 0.0039215686274509803921568627451f, - u.out[1] * 0.0039215686274509803921568627451f, - u.out[2] * 0.0039215686274509803921568627451f, - u.out[3] * 0.0039215686274509803921568627451f); + return vec4(u.out[0], u.out[1], u.out[2], u.out[3]) * 0.0039215686274509803921568627451f; } GLM_FUNC_QUALIFIER uint packSnorm4x8(vec4 const & v) @@ -137,10 +133,12 @@ namespace glm uint out; } u; - u.in[0] = round(clamp(v[0], -1.0f, 1.0f) * 127.0f); - u.in[1] = round(clamp(v[1], -1.0f, 1.0f) * 127.0f); - u.in[2] = round(clamp(v[2], -1.0f, 1.0f) * 127.0f); - u.in[3] = round(clamp(v[3], -1.0f, 1.0f) * 127.0f); + i8vec4 result(round(clamp(v, -1.0f, 1.0f) * 127.0f)); + + u.in[0] = result[0]; + u.in[1] = result[1]; + u.in[2] = result[2]; + u.in[3] = result[3]; return u.out; } @@ -155,11 +153,7 @@ namespace glm u.in = p; - return vec4( - clamp(u.out[0] * 0.0078740157480315f, -1.0f, 1.0f), - clamp(u.out[1] * 0.0078740157480315f, -1.0f, 1.0f), - clamp(u.out[2] * 0.0078740157480315f, -1.0f, 1.0f), - clamp(u.out[3] * 0.0078740157480315f, -1.0f, 1.0f)); + return clamp(vec4(u.out[0], u.out[1], u.out[2], u.out[3]) * 0.0078740157480315f, -1.0f, 1.0f); } GLM_FUNC_QUALIFIER double packDouble2x32(uvec2 const & v) From 4f7afb272fb3816e1f4a9b79cfb3f0ae7d5ec699 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 01:46:49 +0200 Subject: [PATCH 56/74] Fixed GCC build, GLM_META_PROG_HELPERS unsupported with GCC 4.6 --- test/core/core_type_vec1.cpp | 9 +++++++-- test/core/core_type_vec2.cpp | 9 +++++++-- test/core/core_type_vec3.cpp | 9 +++++++-- test/core/core_type_vec4.cpp | 9 +++++++-- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/test/core/core_type_vec1.cpp b/test/core/core_type_vec1.cpp index ae08f0aa..67917844 100644 --- a/test/core/core_type_vec1.cpp +++ b/test/core/core_type_vec1.cpp @@ -29,8 +29,10 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// +#if !(GLM_COMPILER & GLM_COMPILER_GCC) +# define GLM_META_PROG_HELPERS +#endif #define GLM_SWIZZLE -#define GLM_META_PROG_HELPERS #include #include #include @@ -170,7 +172,10 @@ int main() glm::vec1 v; assert(v.length() == 1); - assert(glm::vec1::components == 1); + +# ifdef GLM_META_PROG_HELPERS + assert(glm::vec1::components == 1); +# endif Error += test_vec1_size(); Error += test_vec1_ctor(); diff --git a/test/core/core_type_vec2.cpp b/test/core/core_type_vec2.cpp index cf608f9f..2b8f8575 100644 --- a/test/core/core_type_vec2.cpp +++ b/test/core/core_type_vec2.cpp @@ -29,7 +29,9 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// -#define GLM_META_PROG_HELPERS +#if !(GLM_COMPILER & GLM_COMPILER_GCC) +# define GLM_META_PROG_HELPERS +#endif #define GLM_SWIZZLE #include #include @@ -329,7 +331,10 @@ int main() glm::vec2 v; assert(v.length() == 2); - assert(glm::vec2::components == 2); + +# ifdef GLM_META_PROG_HELPERS + assert(glm::vec2::components == 2); +# endif Error += test_vec2_size(); Error += test_vec2_ctor(); diff --git a/test/core/core_type_vec3.cpp b/test/core/core_type_vec3.cpp index a1a8f9f9..e2ce6ee1 100644 --- a/test/core/core_type_vec3.cpp +++ b/test/core/core_type_vec3.cpp @@ -29,7 +29,9 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// -#define GLM_META_PROG_HELPERS +#if !(GLM_COMPILER & GLM_COMPILER_GCC) +# define GLM_META_PROG_HELPERS +#endif #define GLM_SWIZZLE #include #include @@ -497,7 +499,10 @@ int main() glm::vec3 v; assert(v.length() == 3); - assert(glm::vec3::components == 3); + +# ifdef GLM_META_PROG_HELPERS + assert(glm::vec3::components == 3); +# endif Error += test_vec3_ctor(); Error += test_vec3_operators(); diff --git a/test/core/core_type_vec4.cpp b/test/core/core_type_vec4.cpp index 37d6afbe..9d283a94 100644 --- a/test/core/core_type_vec4.cpp +++ b/test/core/core_type_vec4.cpp @@ -30,7 +30,9 @@ /////////////////////////////////////////////////////////////////////////////////// //#define GLM_FORCE_AVX2 -#define GLM_META_PROG_HELPERS +#if !(GLM_COMPILER & GLM_COMPILER_GCC) +# define GLM_META_PROG_HELPERS +#endif #define GLM_SWIZZLE #include #include @@ -449,7 +451,10 @@ int main() glm::vec4 v; assert(v.length() == 4); - assert(glm::vec4::components == 4); + +# ifdef GLM_META_PROG_HELPERS + assert(glm::vec4::components == 4); +# endif # ifdef NDEBUG std::size_t const Size(1000000); From 9539174494ce431c4ba8b93aad141fab3aa9a213 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 02:07:55 +0200 Subject: [PATCH 57/74] Fixed build --- glm/detail/type_vec1.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glm/detail/type_vec1.hpp b/glm/detail/type_vec1.hpp index d346cb89..ce0a00db 100644 --- a/glm/detail/type_vec1.hpp +++ b/glm/detail/type_vec1.hpp @@ -58,7 +58,7 @@ namespace glm # ifdef GLM_META_PROG_HELPERS # if GLM_HAS_CONSTEXPR static GLM_CONSTEXPR length_t components = 1; - static GLM_CONSTEXPR precision precision = P; + static GLM_CONSTEXPR precision prec = P; # else static const length_t components = 1; static const precision prec = P; From dcfddb75b80b4b3b5998cddda46082c455da9fdf Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 02:36:53 +0200 Subject: [PATCH 58/74] Updated list of compiler versions --- glm/detail/setup.hpp | 41 +++++++++++++++++++++++++++++--- readme.md | 1 + test/core/core_setup_message.cpp | 27 +++++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp index fea8fc15..57c1d782 100644 --- a/glm/detail/setup.hpp +++ b/glm/detail/setup.hpp @@ -128,6 +128,7 @@ #define GLM_COMPILER_INTEL13 0x00100030 #define GLM_COMPILER_INTEL14 0x00100040 #define GLM_COMPILER_INTEL15 0x00100050 +#define GLM_COMPILER_INTEL16 0x00100060 // Visual C++ defines #define GLM_COMPILER_VC 0x01000000 @@ -145,6 +146,9 @@ #define GLM_COMPILER_GCC48 0x020000F0 #define GLM_COMPILER_GCC49 0x02000100 #define GLM_COMPILER_GCC50 0x02000200 +#define GLM_COMPILER_GCC51 0x02000300 +#define GLM_COMPILER_GCC52 0x02000400 +#define GLM_COMPILER_GCC53 0x02000500 // CUDA #define GLM_COMPILER_CUDA 0x10000000 @@ -154,6 +158,8 @@ #define GLM_COMPILER_CUDA50 0x10000070 #define GLM_COMPILER_CUDA60 0x10000080 #define GLM_COMPILER_CUDA65 0x10000090 +#define GLM_COMPILER_CUDA70 0x100000A0 +#define GLM_COMPILER_CUDA75 0x100000B0 // LLVM #define GLM_COMPILER_LLVM 0x20000000 @@ -161,6 +167,10 @@ #define GLM_COMPILER_LLVM33 0x20000040 #define GLM_COMPILER_LLVM34 0x20000050 #define GLM_COMPILER_LLVM35 0x20000060 +#define GLM_COMPILER_LLVM36 0x20000070 +#define GLM_COMPILER_LLVM37 0x20000080 +#define GLM_COMPILER_LLVM38 0x20000090 +#define GLM_COMPILER_LLVM39 0x200000A0 // Apple Clang #define GLM_COMPILER_APPLE_CLANG 0x40000000 @@ -170,6 +180,7 @@ #define GLM_COMPILER_APPLE_CLANG50 0x40000040 #define GLM_COMPILER_APPLE_CLANG51 0x40000050 #define GLM_COMPILER_APPLE_CLANG60 0x40000060 +#define GLM_COMPILER_APPLE_CLANG61 0x40000070 // Build model #define GLM_MODEL_32 0x00000010 @@ -190,6 +201,8 @@ # define GLM_COMPILER GLM_COMPILER_INTEL14 # elif __INTEL_COMPILER >= 1500 # define GLM_COMPILER GLM_COMPILER_INTEL15 +# elif __INTEL_COMPILER >= 1600 +# define GLM_COMPILER GLM_COMPILER_INTEL16 # else # define GLM_COMPILER GLM_COMPILER_INTEL # endif @@ -234,8 +247,14 @@ # define GLM_COMPILER GLM_COMPILER_APPLE_CLANG50 # elif __clang_major__ == 5 && __clang_minor__ == 1 # define GLM_COMPILER GLM_COMPILER_APPLE_CLANG51 -# elif __clang_major__ >= 6 +# elif __clang_major__ == 6 && __clang_minor__ == 0 # define GLM_COMPILER GLM_COMPILER_APPLE_CLANG60 +# elif __clang_major__ == 6 && __clang_minor__ >= 1 +# define GLM_COMPILER GLM_COMPILER_APPLE_CLANG61 +# elif __clang_major__ >= 7 +# define GLM_COMPILER GLM_COMPILER_APPLE_CLANG61 +# else +# define GLM_COMPILER GLM_COMPILER_APPLE_CLANG # endif # else # if __clang_major__ == 3 && __clang_minor__ == 0 @@ -250,8 +269,18 @@ # define GLM_COMPILER GLM_COMPILER_LLVM34 # elif __clang_major__ == 3 && __clang_minor__ == 5 # define GLM_COMPILER GLM_COMPILER_LLVM35 +# elif __clang_major__ == 3 && __clang_minor__ == 6 +# define GLM_COMPILER GLM_COMPILER_LLVM36 +# elif __clang_major__ == 3 && __clang_minor__ == 7 +# define GLM_COMPILER GLM_COMPILER_LLVM37 +# elif __clang_major__ == 3 && __clang_minor__ == 8 +# define GLM_COMPILER GLM_COMPILER_LLVM38 +# elif __clang_major__ == 3 && __clang_minor__ >= 9 +# define GLM_COMPILER GLM_COMPILER_LLVM39 +# elif __clang_major__ >= 4 +# define GLM_COMPILER GLM_COMPILER_LLVM39 # else -# define GLM_COMPILER GLM_COMPILER_LLVM35 +# define GLM_COMPILER GLM_COMPILER_LLVM # endif # endif @@ -273,8 +302,14 @@ # define GLM_COMPILER (GLM_COMPILER_GCC48) # elif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9) # define GLM_COMPILER (GLM_COMPILER_GCC49) -# elif (__GNUC__ > 4 ) +# elif (__GNUC__ == 5) && (__GNUC_MINOR__ == 0) # define GLM_COMPILER (GLM_COMPILER_GCC50) +# elif (__GNUC__ == 5) && (__GNUC_MINOR__ == 1) +# define GLM_COMPILER (GLM_COMPILER_GCC51) +# elif (__GNUC__ == 5) && (__GNUC_MINOR__ == 2) +# define GLM_COMPILER (GLM_COMPILER_GCC52) +# elif (__GNUC__ == 5) && (__GNUC_MINOR__ >= 3) +# define GLM_COMPILER (GLM_COMPILER_GCC53) # else # define GLM_COMPILER (GLM_COMPILER_GCC) # endif diff --git a/readme.md b/readme.md index 245838a8..a30d3017 100644 --- a/readme.md +++ b/readme.md @@ -67,6 +67,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Don't show status message in 'FindGLM' if 'QUIET' option is set. #317 - Added master branch continuous integration service on Linux 64 #332 - Clarified manual regarding angle unit in GLM, added FAQ 11 #326 +- Updated list of compiler versions ##### Fixes: - Fixed (u)int64 MSB/LSB handling on BE archs #306 diff --git a/test/core/core_setup_message.cpp b/test/core/core_setup_message.cpp index 09ef6a36..6c9a3765 100644 --- a/test/core/core_setup_message.cpp +++ b/test/core/core_setup_message.cpp @@ -62,6 +62,15 @@ int test_compiler() case GLM_COMPILER_GCC50: std::printf("GLM_COMPILER_GCC50\n"); break; + case GLM_COMPILER_GCC51: + std::printf("GLM_COMPILER_GCC51\n"); + break; + case GLM_COMPILER_GCC52: + std::printf("GLM_COMPILER_GCC52\n"); + break; + case GLM_COMPILER_GCC53: + std::printf("GLM_COMPILER_GCC53\n"); + break; default: std::printf("GCC version not detected\n"); Error += 1; @@ -94,6 +103,9 @@ int test_compiler() case GLM_COMPILER_APPLE_CLANG60: std::printf("GLM_COMPILER_APPLE_CLANG60\n"); break; + case GLM_COMPILER_APPLE_CLANG61: + std::printf("GLM_COMPILER_APPLE_CLANG61\n"); + break; default: std::printf("Apple Clang version not detected\n"); break; @@ -115,6 +127,18 @@ int test_compiler() case GLM_COMPILER_LLVM35: std::printf("GLM_COMPILER_LLVM35\n"); break; + case GLM_COMPILER_LLVM36: + std::printf("GLM_COMPILER_LLVM36\n"); + break; + case GLM_COMPILER_LLVM37: + std::printf("GLM_COMPILER_LLVM37\n"); + break; + case GLM_COMPILER_LLVM38: + std::printf("GLM_COMPILER_LLVM38\n"); + break; + case GLM_COMPILER_LLVM39: + std::printf("GLM_COMPILER_LLVM39\n"); + break; default: std::printf("LLVM version not detected\n"); break; @@ -139,6 +163,9 @@ int test_compiler() case GLM_COMPILER_INTEL15: std::printf("GLM_COMPILER_INTEL15\n"); break; + case GLM_COMPILER_INTEL16: + std::printf("GLM_COMPILER_INTEL16\n"); + break; default: std::printf("Intel compiler version not detected\n"); Error += 1; From 056d6bd95ee1279f3af5ca108a050f624de57b01 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 15:55:44 +0200 Subject: [PATCH 59/74] fixed typo #344 --- glm/gtc/matrix_transform.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glm/gtc/matrix_transform.hpp b/glm/gtc/matrix_transform.hpp index 777c87f8..d4ff3cfe 100644 --- a/glm/gtc/matrix_transform.hpp +++ b/glm/gtc/matrix_transform.hpp @@ -92,7 +92,7 @@ namespace glm /// /// @param m Input matrix multiplied by this rotation matrix. /// @param angle Rotation angle expressed in radians. - /// @param axis Rotation axis, recommanded to be normalized. + /// @param axis Rotation axis, recommended to be normalized. /// @tparam T Value type used to build the matrix. Supported: half, float or double. /// @see gtc_matrix_transform /// @see - rotate(tmat4x4 const & m, T angle, T x, T y, T z) From 76bd630bbd10105952e079df47b3c992e5e74473 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 16:32:36 +0200 Subject: [PATCH 60/74] Fixed isfinite with C++98 compilers #343 --- glm/gtx/compatibility.hpp | 1 + glm/gtx/compatibility.inl | 13 ++++++++++++- readme.md | 3 ++- test/gtx/gtx_compatibility.cpp | 10 ++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/glm/gtx/compatibility.hpp b/glm/gtx/compatibility.hpp index 6a3623be..5b3f0513 100644 --- a/glm/gtx/compatibility.hpp +++ b/glm/gtx/compatibility.hpp @@ -84,6 +84,7 @@ namespace glm template GLM_FUNC_QUALIFIER tvec4 atan2(const tvec4& x, const tvec4& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) template GLM_FUNC_DECL bool isfinite(genType const & x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template GLM_FUNC_DECL tvec1 isfinite(const tvec1& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) template GLM_FUNC_DECL tvec2 isfinite(const tvec2& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) template GLM_FUNC_DECL tvec3 isfinite(const tvec3& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) template GLM_FUNC_DECL tvec4 isfinite(const tvec4& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) diff --git a/glm/gtx/compatibility.inl b/glm/gtx/compatibility.inl index decc26c2..77f99d13 100644 --- a/glm/gtx/compatibility.inl +++ b/glm/gtx/compatibility.inl @@ -46,10 +46,21 @@ namespace glm # elif GLM_COMPILER & GLM_COMPILER_GCC && GLM_PLATFORM & GLM_PLATFORM_ANDROID return _isfinite(x) != 0; # else - return x >= std::numeric_limits::min() && x <= std::numeric_limits::max(); + if (std::numeric_limits::is_integer || std::denorm_absent == std::numeric_limits::has_denorm) + return std::numeric_limits::min() <= x && std::numeric_limits::max() >= x; + else + return -std::numeric_limits::max() <= x && std::numeric_limits::max() >= x; # endif } + template + GLM_FUNC_QUALIFIER tvec1 isfinite( + tvec1 const & x) + { + return tvec1( + isfinite(x.x)); + } + template GLM_FUNC_QUALIFIER tvec2 isfinite( tvec2 const & x) diff --git a/readme.md b/readme.md index a30d3017..7f0a3bab 100644 --- a/readme.md +++ b/readme.md @@ -59,7 +59,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Added to perform std::hash on GLM types #320 - Added for texcoord wrapping - Added static components and precision members to all vector and quat types #350 -- Added .gitignore #349 +- Added .gitignore #349 ##### Improvements: - Changed usage of __has_include to support Intel compiler #307 @@ -75,6 +75,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Fixed specifier removal by 'std::make_pair<>' #333 - Fixed perspective fovy argument documentation #327 - Removed -m64 causing build issues on Linux 32 #331 +- Fixed isfinite with C++98 compilers #343 ##### Deprecation: - Removed integer specification for 'mod' in GTC_integer #308 diff --git a/test/gtx/gtx_compatibility.cpp b/test/gtx/gtx_compatibility.cpp index bd727318..ee577b06 100644 --- a/test/gtx/gtx_compatibility.cpp +++ b/test/gtx/gtx_compatibility.cpp @@ -35,5 +35,15 @@ int main() { int Error(0); + Error += glm::isfinite(1.0f) ? 0 : 1; + Error += glm::isfinite(1.0) ? 0 : 1; + Error += glm::isfinite(-1.0f) ? 0 : 1; + Error += glm::isfinite(-1.0) ? 0 : 1; + + Error += glm::all(glm::isfinite(glm::vec4(1.0f))) ? 0 : 1; + Error += glm::all(glm::isfinite(glm::dvec4(1.0))) ? 0 : 1; + Error += glm::all(glm::isfinite(glm::vec4(-1.0f))) ? 0 : 1; + Error += glm::all(glm::isfinite(glm::dvec4(-1.0))) ? 0 : 1; + return Error; } From f96887863d4dc32161913013cec0c2b4121c1747 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 16:41:07 +0200 Subject: [PATCH 61/74] Added a heap allocation test --- test/core/core_type_vec4.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/test/core/core_type_vec4.cpp b/test/core/core_type_vec4.cpp index 9d283a94..5a3d4fa0 100644 --- a/test/core/core_type_vec4.cpp +++ b/test/core/core_type_vec4.cpp @@ -401,7 +401,7 @@ int test_vec4_perf_AoS(std::size_t Size) std::clock_t EndTime = std::clock(); - std::printf("AoS: %ld\n", EndTime - StartTime); + std::printf("AoS: %ld\n", EndTime - StartTime); return Error; } @@ -445,6 +445,27 @@ int test_vec4_perf_SoA(std::size_t Size) return Error; } +namespace heap +{ + class A + {}; + + class B : public A + { + glm::vec4 v; + }; + + int test() + { + int Error(0); + + A* p = new B; + delete p; + + return Error; + } +}//namespace heap + int main() { int Error(0); @@ -467,6 +488,7 @@ int main() Error += test_vec4_operators(); Error += test_vec4_swizzle_partial(); Error += test_operator_increment(); + Error += heap::test(); return Error; } From 1e0cf75b2f8d22f3e349ef906df27729eb622133 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 16:55:27 +0200 Subject: [PATCH 62/74] More testing --- test/core/core_type_vec4.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/core/core_type_vec4.cpp b/test/core/core_type_vec4.cpp index 5a3d4fa0..4c80f5ba 100644 --- a/test/core/core_type_vec4.cpp +++ b/test/core/core_type_vec4.cpp @@ -448,10 +448,13 @@ int test_vec4_perf_SoA(std::size_t Size) namespace heap { class A - {}; + { + float f; + }; class B : public A { + float g; glm::vec4 v; }; From 9e2f6dfc7f9cae87d450d5fc7fff98473f750f54 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 17:38:41 +0200 Subject: [PATCH 63/74] Fixed Intel compiler build error on Linux #354 --- glm/detail/setup.hpp | 5 +++-- readme.md | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp index 57c1d782..c27b40d2 100644 --- a/glm/detail/setup.hpp +++ b/glm/detail/setup.hpp @@ -537,12 +537,13 @@ #if GLM_PLATFORM == GLM_PLATFORM_ANDROID # define GLM_HAS_CXX11_STL 0 -#elif GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG | GLM_COMPILER_INTEL) +#elif GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) # define GLM_HAS_CXX11_STL __has_include("__config") #else # define GLM_HAS_CXX11_STL ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && \ ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)) || \ - ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013)) || \ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL15))) #endif // N1720 diff --git a/readme.md b/readme.md index 7f0a3bab..603f58fc 100644 --- a/readme.md +++ b/readme.md @@ -76,6 +76,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Fixed perspective fovy argument documentation #327 - Removed -m64 causing build issues on Linux 32 #331 - Fixed isfinite with C++98 compilers #343 +- Fixed Intel compiler build error on Linux #354 ##### Deprecation: - Removed integer specification for 'mod' in GTC_integer #308 From ac21d7bdad6f0fa6a3195360d49045e0a8035463 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 19 Jul 2015 17:59:21 +0200 Subject: [PATCH 64/74] Fixed use of libstdc++ with Clang #351 --- glm/detail/setup.hpp | 11 ++++++++++- readme.md | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp index c27b40d2..199652e2 100644 --- a/glm/detail/setup.hpp +++ b/glm/detail/setup.hpp @@ -538,7 +538,16 @@ #if GLM_PLATFORM == GLM_PLATFORM_ANDROID # define GLM_HAS_CXX11_STL 0 #elif GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) -# define GLM_HAS_CXX11_STL __has_include("__config") +# if __has_include(<__config>) // libc++ +# include <__config> +//# else // libstdc++ +//# include +# endif +# if defined(_LIBCPP_VERSION)// || defined(__GLIBCXX__) +# define GLM_HAS_CXX11_STL 1 +# else +# define GLM_HAS_CXX11_STL 0 +# endif #else # define GLM_HAS_CXX11_STL ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && \ ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)) || \ diff --git a/readme.md b/readme.md index 603f58fc..96a131eb 100644 --- a/readme.md +++ b/readme.md @@ -77,6 +77,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Removed -m64 causing build issues on Linux 32 #331 - Fixed isfinite with C++98 compilers #343 - Fixed Intel compiler build error on Linux #354 +- Fixed use of libstdc++ with Clang #351 ##### Deprecation: - Removed integer specification for 'mod' in GTC_integer #308 From 6d1ddc89806a4b873d4661c040ab24d1cad861db Mon Sep 17 00:00:00 2001 From: Jesse Talavera-Greenberg Date: Mon, 20 Jul 2015 20:11:33 -0400 Subject: [PATCH 65/74] Define MAYBE macros for explicit and constexpr - So we can wrap less code in macros --- glm/detail/setup.hpp | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp index 199652e2..03914395 100644 --- a/glm/detail/setup.hpp +++ b/glm/detail/setup.hpp @@ -8,14 +8,14 @@ /// 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. -/// +/// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. -/// +/// /// 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 @@ -117,7 +117,7 @@ // Compiler // User defines: GLM_FORCE_COMPILER_UNKNOWN -// TODO ? __llvm__ +// TODO ? __llvm__ #define GLM_COMPILER_UNKNOWN 0x00000000 @@ -210,7 +210,7 @@ // CUDA #elif defined(__CUDACC__) # if !defined(CUDA_VERSION) && !defined(GLM_FORCE_CUDA) -# include // make sure version is defined since nvcc does not define it itself! +# include // make sure version is defined since nvcc does not define it itself! # endif # if CUDA_VERSION < 3000 # error "GLM requires CUDA 3.0 or higher" @@ -284,7 +284,7 @@ # endif # endif -// G++ +// G++ #elif defined(__GNUC__) || defined(__MINGW32__) # if (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) # define GLM_COMPILER (GLM_COMPILER_GCC42) @@ -669,7 +669,7 @@ ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2012))) #endif -// +// #if GLM_LANG & GLM_LANG_CXX11_FLAG # define GLM_HAS_ASSIGNABLE 1 #else @@ -677,10 +677,10 @@ ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC49))) #endif -// +// #define GLM_HAS_TRIVIAL_QUERIES 0 -// +// #if GLM_LANG & GLM_LANG_CXX11_FLAG # define GLM_HAS_MAKE_SIGNED 1 #else @@ -688,7 +688,7 @@ ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) #endif -// +// #if GLM_ARCH == GLM_ARCH_PURE # define GLM_HAS_BITSCAN_WINDOWS 0 #else @@ -697,7 +697,7 @@ #endif // OpenMP -#ifdef _OPENMP +#ifdef _OPENMP # if GLM_COMPILER & GLM_COMPILER_GCC # if GLM_COMPILER >= GLM_COMPILER_GCC47 # define GLM_HAS_OPENMP 31 @@ -719,7 +719,7 @@ #define GLM_HAS_ANONYMOUS_UNION (GLM_LANG & GLM_LANG_CXXMS_FLAG) /////////////////////////////////////////////////////////////////////////////////// -// Platform +// Platform // User defines: GLM_FORCE_PURE GLM_FORCE_SSE2 GLM_FORCE_SSE3 GLM_FORCE_AVX GLM_FORCE_AVX2 @@ -769,7 +769,7 @@ # define GLM_ARCH (GLM_ARCH_PURE) # endif #elif (GLM_COMPILER & GLM_COMPILER_GCC) && (defined(__i386__) || defined(__x86_64__)) -# if defined(__AVX2__) +# if defined(__AVX2__) # define GLM_ARCH (GLM_ARCH_AVX2 | GLM_ARCH_AVX | GLM_ARCH_SSE4 | GLM_ARCH_SSE3 | GLM_ARCH_SSE2) # elif defined(__AVX__) # define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE4 | GLM_ARCH_SSE3 | GLM_ARCH_SSE2) @@ -925,8 +925,16 @@ #if GLM_HAS_CONSTEXPR # define GLM_CONSTEXPR constexpr +# define GLM_CONSTEXPR_MAYBE constexpr #else # define GLM_CONSTEXPR +# define GLM_CONSTEXPR_MAYBE const +#endif + +#ifdef GLM_FORCE_EXPLICIT_CTOR +# define GLM_EXPLICIT_CTOR_MAYBE explicit +#else +# define GLM_EXPLICIT_CTOR_MAYBE #endif /////////////////////////////////////////////////////////////////////////////////// From c2078afc12d5d314e132dff7c96d78ef57bfed1a Mon Sep 17 00:00:00 2001 From: Jesse Talavera-Greenberg Date: Mon, 20 Jul 2015 20:15:45 -0400 Subject: [PATCH 66/74] Simplify the constexpr declarations of the GLM_META_PROG_HELPERS - No repetition - Half the size --- glm/detail/type_mat2x2.hpp | 15 ++++----------- glm/detail/type_mat2x3.hpp | 15 ++++----------- glm/detail/type_mat2x4.hpp | 15 ++++----------- glm/detail/type_mat3x2.hpp | 15 ++++----------- glm/detail/type_mat3x3.hpp | 17 ++++++----------- glm/detail/type_mat3x4.hpp | 15 ++++----------- glm/detail/type_mat4x2.hpp | 15 ++++----------- glm/detail/type_mat4x3.hpp | 15 ++++----------- glm/detail/type_mat4x4.hpp | 15 ++++----------- glm/detail/type_vec1.hpp | 9 ++------- glm/detail/type_vec2.hpp | 9 ++------- glm/detail/type_vec3.hpp | 11 +++-------- glm/detail/type_vec4.hpp | 9 ++------- glm/gtc/quaternion.hpp | 9 ++------- glm/gtx/dual_quaternion.hpp | 9 ++------- glm/gtx/simd_mat4.hpp | 15 ++++----------- glm/gtx/simd_quat.hpp | 9 ++------- glm/gtx/simd_vec4.hpp | 9 ++------- 18 files changed, 59 insertions(+), 167 deletions(-) diff --git a/glm/detail/type_mat2x2.hpp b/glm/detail/type_mat2x2.hpp index ad160b20..7ebf1e66 100644 --- a/glm/detail/type_mat2x2.hpp +++ b/glm/detail/type_mat2x2.hpp @@ -55,17 +55,10 @@ namespace glm friend tvec2 operator/(tvec2 const & v, tmat2x2 const & m); # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 2; - static GLM_CONSTEXPR length_t columns = 2; - static GLM_CONSTEXPR length_t rows = 2; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 2; - static const length_t columns = 2; - static const length_t rows = 2; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 2; + static GLM_CONSTEXPR_MAYBE length_t columns = 2; + static GLM_CONSTEXPR_MAYBE length_t rows = 2; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS private: diff --git a/glm/detail/type_mat2x3.hpp b/glm/detail/type_mat2x3.hpp index af37884e..51a1a862 100644 --- a/glm/detail/type_mat2x3.hpp +++ b/glm/detail/type_mat2x3.hpp @@ -51,17 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 2; - static GLM_CONSTEXPR length_t cols = 3; - static GLM_CONSTEXPR length_t rows = 2; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 2; - static const length_t cols = 3; - static const length_t rows = 2; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 2; + static GLM_CONSTEXPR_MAYBE length_t cols = 3; + static GLM_CONSTEXPR_MAYBE length_t rows = 2; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS private: diff --git a/glm/detail/type_mat2x4.hpp b/glm/detail/type_mat2x4.hpp index 48521460..9f776899 100644 --- a/glm/detail/type_mat2x4.hpp +++ b/glm/detail/type_mat2x4.hpp @@ -51,17 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 2; - static GLM_CONSTEXPR length_t cols = 4; - static GLM_CONSTEXPR length_t rows = 2; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 2; - static const length_t cols = 4; - static const length_t rows = 2; - static const precision prec = P; -# endif + static GLM_CONSTEXPR_MAYBE length_t components = 2; + static GLM_CONSTEXPR_MAYBE length_t cols = 4; + static GLM_CONSTEXPR_MAYBE length_t rows = 2; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS private: diff --git a/glm/detail/type_mat3x2.hpp b/glm/detail/type_mat3x2.hpp index d5480432..5bbeed79 100644 --- a/glm/detail/type_mat3x2.hpp +++ b/glm/detail/type_mat3x2.hpp @@ -51,17 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 3; - static GLM_CONSTEXPR length_t cols = 2; - static GLM_CONSTEXPR length_t rows = 3; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 3; - static const length_t cols = 2; - static const length_t rows = 3; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 3; + static GLM_CONSTEXPR_MAYBE length_t cols = 2; + static GLM_CONSTEXPR_MAYBE length_t rows = 3; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS private: diff --git a/glm/detail/type_mat3x3.hpp b/glm/detail/type_mat3x3.hpp index 73142e6b..83b18efb 100644 --- a/glm/detail/type_mat3x3.hpp +++ b/glm/detail/type_mat3x3.hpp @@ -49,17 +49,12 @@ namespace glm typedef tmat3x3 transpose_type; typedef T value_type; -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 3; - static GLM_CONSTEXPR length_t cols = 3; - static GLM_CONSTEXPR length_t rows = 3; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 3; - static const length_t cols = 3; - static const length_t rows = 3; - static const precision prec = P; -# endif +# ifdef GLM_META_PROG_HELPERS + static GLM_CONSTEXPR_MAYBE length_t components = 3; + static GLM_CONSTEXPR_MAYBE length_t cols = 3; + static GLM_CONSTEXPR_MAYBE length_t rows = 3; + static GLM_CONSTEXPR_MAYBE precision prec = P; +# endif//GLM_META_PROG_HELPERS template friend tvec3 operator/(tmat3x3 const & m, tvec3 const & v); diff --git a/glm/detail/type_mat3x4.hpp b/glm/detail/type_mat3x4.hpp index 8074ea43..d894c9ee 100644 --- a/glm/detail/type_mat3x4.hpp +++ b/glm/detail/type_mat3x4.hpp @@ -51,17 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 3; - static GLM_CONSTEXPR length_t cols = 4; - static GLM_CONSTEXPR length_t rows = 3; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 3; - static const length_t cols = 4; - static const length_t rows = 3; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 3; + static GLM_CONSTEXPR_MAYBE length_t cols = 4; + static GLM_CONSTEXPR_MAYBE length_t rows = 3; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS private: diff --git a/glm/detail/type_mat4x2.hpp b/glm/detail/type_mat4x2.hpp index 3bc73706..95b7d3dc 100644 --- a/glm/detail/type_mat4x2.hpp +++ b/glm/detail/type_mat4x2.hpp @@ -51,17 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR length_t cols = 2; - static GLM_CONSTEXPR length_t rows = 4; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 4; - static const length_t cols = 2; - static const length_t rows = 4; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 4; + static GLM_CONSTEXPR_MAYBE length_t cols = 2; + static GLM_CONSTEXPR_MAYBE length_t rows = 4; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS private: diff --git a/glm/detail/type_mat4x3.hpp b/glm/detail/type_mat4x3.hpp index a0ff185c..cab8872c 100644 --- a/glm/detail/type_mat4x3.hpp +++ b/glm/detail/type_mat4x3.hpp @@ -51,17 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR length_t cols = 3; - static GLM_CONSTEXPR length_t rows = 4; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 4; - static const length_t cols = 3; - static const length_t rows = 4; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 4; + static GLM_CONSTEXPR_MAYBE length_t cols = 3; + static GLM_CONSTEXPR_MAYBE length_t rows = 4; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS private: diff --git a/glm/detail/type_mat4x4.hpp b/glm/detail/type_mat4x4.hpp index 0973fd83..f34d8fe8 100644 --- a/glm/detail/type_mat4x4.hpp +++ b/glm/detail/type_mat4x4.hpp @@ -50,17 +50,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR length_t cols = 4; - static GLM_CONSTEXPR length_t rows = 4; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 4; - static const length_t cols = 4; - static const length_t rows = 4; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 4; + static GLM_CONSTEXPR_MAYBE length_t cols = 4; + static GLM_CONSTEXPR_MAYBE length_t rows = 4; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS template diff --git a/glm/detail/type_vec1.hpp b/glm/detail/type_vec1.hpp index ce0a00db..c1cfea25 100644 --- a/glm/detail/type_vec1.hpp +++ b/glm/detail/type_vec1.hpp @@ -56,13 +56,8 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 1; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 1; - static const precision prec = P; -# endif + static GLM_CONSTEXPR_MAYBE length_t components = 1; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS ////////////////////////////////////// diff --git a/glm/detail/type_vec2.hpp b/glm/detail/type_vec2.hpp index d25de4ea..b328e88a 100644 --- a/glm/detail/type_vec2.hpp +++ b/glm/detail/type_vec2.hpp @@ -56,13 +56,8 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 2; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 2; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 2; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS ////////////////////////////////////// diff --git a/glm/detail/type_vec3.hpp b/glm/detail/type_vec3.hpp index b0abde48..0fcee272 100644 --- a/glm/detail/type_vec3.hpp +++ b/glm/detail/type_vec3.hpp @@ -47,7 +47,7 @@ namespace glm { template struct tvec3 - { + { ////////////////////////////////////// // Implementation detail @@ -56,13 +56,8 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 3; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 3; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 3; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS ////////////////////////////////////// diff --git a/glm/detail/type_vec4.hpp b/glm/detail/type_vec4.hpp index c0f07661..265f9dae 100644 --- a/glm/detail/type_vec4.hpp +++ b/glm/detail/type_vec4.hpp @@ -110,13 +110,8 @@ namespace detail typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 4; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 4; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS ////////////////////////////////////// diff --git a/glm/gtc/quaternion.hpp b/glm/gtc/quaternion.hpp index 97c7dc50..4be2782e 100644 --- a/glm/gtc/quaternion.hpp +++ b/glm/gtc/quaternion.hpp @@ -66,13 +66,8 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 4; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 4; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS public: diff --git a/glm/gtx/dual_quaternion.hpp b/glm/gtx/dual_quaternion.hpp index 10ffa836..3b5c87b4 100644 --- a/glm/gtx/dual_quaternion.hpp +++ b/glm/gtx/dual_quaternion.hpp @@ -65,13 +65,8 @@ namespace glm typedef glm::tquat part_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 8; - static GLM_CONSTEXPR precision prec = P; -# else - static const length_t components = 8; - static const precision prec = P; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 8; + static GLM_CONSTEXPR_MAYBE precision prec = P; # endif//GLM_META_PROG_HELPERS public: diff --git a/glm/gtx/simd_mat4.hpp b/glm/gtx/simd_mat4.hpp index 649bdef2..7373431b 100644 --- a/glm/gtx/simd_mat4.hpp +++ b/glm/gtx/simd_mat4.hpp @@ -72,17 +72,10 @@ namespace detail typedef fmat4x4SIMD transpose_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR length_t cols = 4; - static GLM_CONSTEXPR length_t rows = 4; - static GLM_CONSTEXPR precision prec = defaultp; -# else - static const length_t components = 4; - static const length_t cols = 4; - static const length_t rows = 4; - static const precision prec = defaultp; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 4; + static GLM_CONSTEXPR_MAYBE length_t cols = 4; + static GLM_CONSTEXPR_MAYBE length_t rows = 4; + static GLM_CONSTEXPR_MAYBE precision prec = defaultp; # endif//GLM_META_PROG_HELPERS GLM_FUNC_DECL length_t length() const; diff --git a/glm/gtx/simd_quat.hpp b/glm/gtx/simd_quat.hpp index 8595bc99..82df9abf 100644 --- a/glm/gtx/simd_quat.hpp +++ b/glm/gtx/simd_quat.hpp @@ -77,13 +77,8 @@ namespace detail typedef tquat bool_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR precision prec = defaultp; -# else - static const length_t components = 4; - static const precision prec = defaultp; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 4; + static GLM_CONSTEXPR_MAYBE precision prec = defaultp; # endif//GLM_META_PROG_HELPERS #ifdef GLM_SIMD_ENABLE_XYZW_UNION diff --git a/glm/gtx/simd_vec4.hpp b/glm/gtx/simd_vec4.hpp index d576bbc2..149f9111 100644 --- a/glm/gtx/simd_vec4.hpp +++ b/glm/gtx/simd_vec4.hpp @@ -100,13 +100,8 @@ namespace detail typedef tvec4 bool_type; # ifdef GLM_META_PROG_HELPERS -# if GLM_HAS_CONSTEXPR - static GLM_CONSTEXPR length_t components = 4; - static GLM_CONSTEXPR precision prec = defaultp; -# else - static const length_t components = 4; - static const precision prec = defaultp; -# endif//GLM_HAS_CONSTEXPR + static GLM_CONSTEXPR_MAYBE length_t components = 4; + static GLM_CONSTEXPR_MAYBE precision prec = defaultp; # endif//GLM_META_PROG_HELPERS #ifdef GLM_SIMD_ENABLE_XYZW_UNION From 9cc7dc1763d8bc38e3c726597acef906336d806a Mon Sep 17 00:00:00 2001 From: Jesse Talavera-Greenberg Date: Mon, 20 Jul 2015 20:18:24 -0400 Subject: [PATCH 67/74] Simplify GLM_FORCE_EXPLICIT_CTOR declarations - Instead of wrapping the declarations, use a macro for the keyword "explicit" --- glm/detail/type_mat2x2.hpp | 9 ++------- glm/detail/type_mat2x3.hpp | 9 ++------- glm/detail/type_mat2x4.hpp | 9 ++------- glm/detail/type_mat3x2.hpp | 9 ++------- glm/detail/type_mat3x3.hpp | 9 ++------- glm/detail/type_mat3x4.hpp | 9 ++------- glm/detail/type_mat4x2.hpp | 9 ++------- glm/detail/type_mat4x3.hpp | 9 ++------- glm/detail/type_mat4x4.hpp | 9 ++------- glm/detail/type_vec1.hpp | 12 +++--------- glm/detail/type_vec2.hpp | 12 +++--------- glm/detail/type_vec3.hpp | 12 +++--------- glm/detail/type_vec4.hpp | 14 ++++---------- glm/gtc/quaternion.hpp | 17 ++++++----------- glm/gtx/dual_quaternion.hpp | 9 ++------- 15 files changed, 39 insertions(+), 118 deletions(-) diff --git a/glm/detail/type_mat2x2.hpp b/glm/detail/type_mat2x2.hpp index 7ebf1e66..8d40179e 100644 --- a/glm/detail/type_mat2x2.hpp +++ b/glm/detail/type_mat2x2.hpp @@ -98,13 +98,8 @@ namespace glm ////////////////////////////////////// // Matrix conversions -# ifdef GLM_FORCE_EXPLICIT_CTOR - template - GLM_FUNC_DECL explicit tmat2x2(tmat2x2 const & m); -# else - template - GLM_FUNC_DECL tmat2x2(tmat2x2 const & m); -# endif + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat2x2(tmat2x2 const & m); GLM_FUNC_DECL explicit tmat2x2(tmat3x3 const & x); GLM_FUNC_DECL explicit tmat2x2(tmat4x4 const & x); diff --git a/glm/detail/type_mat2x3.hpp b/glm/detail/type_mat2x3.hpp index 51a1a862..d079e222 100644 --- a/glm/detail/type_mat2x3.hpp +++ b/glm/detail/type_mat2x3.hpp @@ -94,13 +94,8 @@ namespace glm ////////////////////////////////////// // Matrix conversion -# ifdef GLM_FORCE_EXPLICIT_CTOR - template - GLM_FUNC_DECL explicit tmat2x3(tmat2x3 const & m); -# else - template - GLM_FUNC_DECL tmat2x3(tmat2x3 const & m); -# endif + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat2x3(tmat2x3 const & m); GLM_FUNC_DECL explicit tmat2x3(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat2x3(tmat3x3 const & x); diff --git a/glm/detail/type_mat2x4.hpp b/glm/detail/type_mat2x4.hpp index 9f776899..9ff28845 100644 --- a/glm/detail/type_mat2x4.hpp +++ b/glm/detail/type_mat2x4.hpp @@ -95,13 +95,8 @@ namespace glm ////////////////////////////////////// // Matrix conversions -# ifdef GLM_FORCE_EXPLICIT_CTOR - template - GLM_FUNC_DECL explicit tmat2x4(tmat2x4 const & m); -# else - template - GLM_FUNC_DECL tmat2x4(tmat2x4 const & m); -# endif + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat2x4(tmat2x4 const & m); GLM_FUNC_DECL explicit tmat2x4(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat2x4(tmat3x3 const & x); diff --git a/glm/detail/type_mat3x2.hpp b/glm/detail/type_mat3x2.hpp index 5bbeed79..b02e61aa 100644 --- a/glm/detail/type_mat3x2.hpp +++ b/glm/detail/type_mat3x2.hpp @@ -101,13 +101,8 @@ namespace glm ////////////////////////////////////// // Matrix conversions -# ifdef GLM_FORCE_EXPLICIT_CTOR - template - GLM_FUNC_DECL explicit tmat3x2(tmat3x2 const & m); -# else - template - GLM_FUNC_DECL tmat3x2(tmat3x2 const & m); -# endif + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat3x2(tmat3x2 const & m); GLM_FUNC_DECL explicit tmat3x2(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat3x2(tmat3x3 const & x); diff --git a/glm/detail/type_mat3x3.hpp b/glm/detail/type_mat3x3.hpp index 83b18efb..d9b1105a 100644 --- a/glm/detail/type_mat3x3.hpp +++ b/glm/detail/type_mat3x3.hpp @@ -105,13 +105,8 @@ namespace glm ////////////////////////////////////// // Matrix conversions -# ifdef GLM_FORCE_EXPLICIT_CTOR - template - GLM_FUNC_DECL explicit tmat3x3(tmat3x3 const & m); -# else - template - GLM_FUNC_DECL tmat3x3(tmat3x3 const & m); -# endif + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat3x3(tmat3x3 const & m); GLM_FUNC_DECL explicit tmat3x3(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat3x3(tmat4x4 const & x); diff --git a/glm/detail/type_mat3x4.hpp b/glm/detail/type_mat3x4.hpp index d894c9ee..409c8364 100644 --- a/glm/detail/type_mat3x4.hpp +++ b/glm/detail/type_mat3x4.hpp @@ -100,13 +100,8 @@ namespace glm ////////////////////////////////////// // Matrix conversion -# ifdef GLM_FORCE_EXPLICIT_CTOR - template - GLM_FUNC_DECL explicit tmat3x4(tmat3x4 const & m); -# else - template - GLM_FUNC_DECL tmat3x4(tmat3x4 const & m); -# endif + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat3x4(tmat3x4 const & m); GLM_FUNC_DECL explicit tmat3x4(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat3x4(tmat3x3 const & x); diff --git a/glm/detail/type_mat4x2.hpp b/glm/detail/type_mat4x2.hpp index 95b7d3dc..951c6370 100644 --- a/glm/detail/type_mat4x2.hpp +++ b/glm/detail/type_mat4x2.hpp @@ -106,13 +106,8 @@ namespace glm ////////////////////////////////////// // Matrix conversions -# ifdef GLM_FORCE_EXPLICIT_CTOR - template - GLM_FUNC_DECL explicit tmat4x2(tmat4x2 const & m); -# else - template - GLM_FUNC_DECL tmat4x2(tmat4x2 const & m); -# endif + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat4x2(tmat4x2 const & m); GLM_FUNC_DECL explicit tmat4x2(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat4x2(tmat3x3 const & x); diff --git a/glm/detail/type_mat4x3.hpp b/glm/detail/type_mat4x3.hpp index cab8872c..4433409c 100644 --- a/glm/detail/type_mat4x3.hpp +++ b/glm/detail/type_mat4x3.hpp @@ -105,13 +105,8 @@ namespace glm ////////////////////////////////////// // Matrix conversions -# ifdef GLM_FORCE_EXPLICIT_CTOR - template - GLM_FUNC_DECL explicit tmat4x3(tmat4x3 const & m); -# else - template - GLM_FUNC_DECL tmat4x3(tmat4x3 const & m); -# endif + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat4x3(tmat4x3 const & m); GLM_FUNC_DECL explicit tmat4x3(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat4x3(tmat3x3 const & x); diff --git a/glm/detail/type_mat4x4.hpp b/glm/detail/type_mat4x4.hpp index f34d8fe8..de702383 100644 --- a/glm/detail/type_mat4x4.hpp +++ b/glm/detail/type_mat4x4.hpp @@ -110,13 +110,8 @@ namespace glm ////////////////////////////////////// // Matrix conversions -# ifdef GLM_FORCE_EXPLICIT_CTOR - template - GLM_FUNC_DECL explicit tmat4x4(tmat4x4 const & m); -# else - template - GLM_FUNC_DECL tmat4x4(tmat4x4 const & m); -# endif + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat4x4(tmat4x4 const & m); GLM_FUNC_DECL explicit tmat4x4(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat4x4(tmat3x3 const & x); diff --git a/glm/detail/type_vec1.hpp b/glm/detail/type_vec1.hpp index c1cfea25..6a5e6972 100644 --- a/glm/detail/type_vec1.hpp +++ b/glm/detail/type_vec1.hpp @@ -136,15 +136,9 @@ namespace glm template GLM_FUNC_DECL explicit tvec1(tvec4 const & v); -# ifdef GLM_FORCE_EXPLICIT_CTOR - //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template - GLM_FUNC_DECL explicit tvec1(tvec1 const & v); -# else - //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template - GLM_FUNC_DECL tvec1(tvec1 const & v); -# endif + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tvec1(tvec1 const & v); ////////////////////////////////////// // Swizzle constructors diff --git a/glm/detail/type_vec2.hpp b/glm/detail/type_vec2.hpp index b328e88a..f15cd200 100644 --- a/glm/detail/type_vec2.hpp +++ b/glm/detail/type_vec2.hpp @@ -144,15 +144,9 @@ namespace glm template GLM_FUNC_DECL explicit tvec2(tvec4 const & v); -# ifdef GLM_FORCE_EXPLICIT_CTOR - //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template - GLM_FUNC_DECL explicit tvec2(tvec2 const & v); -# else - //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template - GLM_FUNC_DECL tvec2(tvec2 const & v); -# endif + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tvec2(tvec2 const & v); ////////////////////////////////////// // Swizzle constructors diff --git a/glm/detail/type_vec3.hpp b/glm/detail/type_vec3.hpp index 0fcee272..39c9384b 100644 --- a/glm/detail/type_vec3.hpp +++ b/glm/detail/type_vec3.hpp @@ -154,15 +154,9 @@ namespace glm template GLM_FUNC_DECL explicit tvec3(tvec4 const & v); -# ifdef GLM_FORCE_EXPLICIT_CTOR - //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template - GLM_FUNC_DECL explicit tvec3(tvec3 const & v); -# else - //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template - GLM_FUNC_DECL tvec3(tvec3 const & v); -# endif + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tvec3(tvec3 const & v); ////////////////////////////////////// // Swizzle constructors diff --git a/glm/detail/type_vec4.hpp b/glm/detail/type_vec4.hpp index 265f9dae..d61cd8ea 100644 --- a/glm/detail/type_vec4.hpp +++ b/glm/detail/type_vec4.hpp @@ -229,16 +229,10 @@ namespace detail //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) template GLM_FUNC_DECL explicit tvec4(tvec2 const & a, tvec2 const & b); - -# ifdef GLM_FORCE_EXPLICIT_CTOR - //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template - GLM_FUNC_DECL explicit tvec4(tvec4 const & v); -# else - //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template - GLM_FUNC_DECL tvec4(tvec4 const & v); -# endif + + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tvec4(tvec4 const & v); ////////////////////////////////////// // Swizzle constructors diff --git a/glm/gtc/quaternion.hpp b/glm/gtc/quaternion.hpp index 4be2782e..18aa963c 100644 --- a/glm/gtc/quaternion.hpp +++ b/glm/gtc/quaternion.hpp @@ -108,24 +108,19 @@ namespace glm GLM_FUNC_DECL tquat(T const & w, T const & x, T const & y, T const & z); ////////////////////////////////////// - // Convertions + // Conversions + + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tquat(tquat const & q); -# ifdef GLM_FORCE_EXPLICIT_CTOR - template - GLM_FUNC_DECL explicit tquat(tquat const & q); -# else - template - GLM_FUNC_DECL tquat(tquat const & q); -# endif - // explicit conversion operators # if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS GLM_FUNC_DECL explicit operator tmat3x3(); GLM_FUNC_DECL explicit operator tmat4x4(); # endif - + /// Create a quaternion from two normalized axis - /// + /// /// @param u A first normalized axis /// @param v A second normalized axis /// @see gtc_quaternion diff --git a/glm/gtx/dual_quaternion.hpp b/glm/gtx/dual_quaternion.hpp index 3b5c87b4..5faad6a1 100644 --- a/glm/gtx/dual_quaternion.hpp +++ b/glm/gtx/dual_quaternion.hpp @@ -110,13 +110,8 @@ namespace glm ////////////////////////////////////////////////////////////// // tdualquat conversions -# ifdef GLM_FORCE_EXPLICIT_CTOR - template - GLM_FUNC_DECL explicit tdualquat(tdualquat const & q); -# else - template - GLM_FUNC_DECL tdualquat(tdualquat const & q); -# endif + template + GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tdualquat(tdualquat const & q); GLM_FUNC_DECL explicit tdualquat(tmat2x4 const & holder_mat); GLM_FUNC_DECL explicit tdualquat(tmat3x4 const & aug_mat); From 467c386e971b43b3f793acd3c0d8d98404f225a4 Mon Sep 17 00:00:00 2001 From: Jesse Talavera-Greenberg Date: Mon, 20 Jul 2015 20:25:39 -0400 Subject: [PATCH 68/74] Improve the .gitignore - More crap ignored - Some of it may be specific to me - I can't be the only one out there who uses Qt Creator --- .gitignore | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index dc30457a..b726899f 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,16 @@ CMakeCache.txt CMakeFiles Makefile cmake_install.cmake -install_manifest.txt \ No newline at end of file +install_manifest.txt +*.cmake +# ^ May need to add future .cmake files as exceptions + +# Test logs +Testing/* + +# Test input +test/gtc/*.dds + +# Project Files +*.cbp +*.user From 386357f612acae9d2687dbf0e67f3ec25d90cc88 Mon Sep 17 00:00:00 2001 From: Dustin Biser Date: Wed, 22 Jul 2015 11:31:45 -0400 Subject: [PATCH 69/74] Update norm.hpp Fixed documentation typo for distance2 functions "Returns the squared distance between p0 and p1, i.e., length(p0 - p1)" changed to "Returns the squared distance between p0 and p1, i.e., length2(p0 - p1)" --- glm/gtx/norm.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/glm/gtx/norm.hpp b/glm/gtx/norm.hpp index d8fbf2c1..f1d8d1b2 100644 --- a/glm/gtx/norm.hpp +++ b/glm/gtx/norm.hpp @@ -67,14 +67,14 @@ namespace glm GLM_FUNC_DECL typename genType::value_type length2( genType const & x); - //! Returns the squared distance between p0 and p1, i.e., length(p0 - p1). + //! Returns the squared distance between p0 and p1, i.e., length2(p0 - p1). //! From GLM_GTX_norm extension. template GLM_FUNC_DECL T distance2( T const & p0, T const & p1); - //! Returns the squared distance between p0 and p1, i.e., length(p0 - p1). + //! Returns the squared distance between p0 and p1, i.e., length2(p0 - p1). //! From GLM_GTX_norm extension. template GLM_FUNC_DECL typename genType::value_type distance2( From 562ab0b559e2ce95e077161986d6d0dc9eb5f6f8 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 24 Jul 2015 01:24:28 +0200 Subject: [PATCH 70/74] Test fix and warning fixes #364 --- test/core/core_func_integer_bit_count.cpp | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test/core/core_func_integer_bit_count.cpp b/test/core/core_func_integer_bit_count.cpp index 8af4a8d6..c72d63e6 100644 --- a/test/core/core_func_integer_bit_count.cpp +++ b/test/core/core_func_integer_bit_count.cpp @@ -210,7 +210,7 @@ int main() # ifdef NDEBUG int i, n; - static int test[] = {0,0, 1,1, 2,1, 3,2, 4,1, 5,2, 6,2, 7,3, + static unsigned test[] = {0,0, 1,1, 2,1, 3,2, 4,1, 5,2, 6,2, 7,3, 8,1, 9,2, 10,2, 11,3, 12,2, 13,3, 14,3, 15,4, 16,1, 17,2, 0x3F,6, 0x40,1, 0x41,2, 0x7f,7, 0x80,1, 0x81,2, 0xfe,7, 0xff,8, 0x4000,1, 0x4001,2, 0x7000,3, 0x7fff,15, @@ -230,7 +230,7 @@ int main() if (pop0(test[i]) != test[i+1]) error(test[i], pop0(test[i]));} TimestampEnd = std::clock(); - printf("pop0: %d clocks\n", TimestampEnd - TimestampBeg); + printf("pop0: %ld clocks\n", TimestampEnd - TimestampBeg); TimestampBeg = std::clock(); for (std::size_t k = 0; k < Count; ++k) @@ -238,7 +238,7 @@ int main() if (pop1(test[i]) != test[i+1]) error(test[i], pop1(test[i]));} TimestampEnd = std::clock(); - printf("pop1: %d clocks\n", TimestampEnd - TimestampBeg); + printf("pop1: %ld clocks\n", TimestampEnd - TimestampBeg); TimestampBeg = std::clock(); for (std::size_t k = 0; k < Count; ++k) @@ -246,7 +246,7 @@ int main() if (pop2(test[i]) != test[i+1]) error(test[i], pop2(test[i]));} TimestampEnd = std::clock(); - printf("pop2: %d clocks\n", TimestampEnd - TimestampBeg); + printf("pop2: %ld clocks\n", TimestampEnd - TimestampBeg); TimestampBeg = std::clock(); for (std::size_t k = 0; k < Count; ++k) @@ -254,7 +254,7 @@ int main() if (pop3(test[i]) != test[i+1]) error(test[i], pop3(test[i]));} TimestampEnd = std::clock(); - printf("pop3: %d clocks\n", TimestampEnd - TimestampBeg); + printf("pop3: %ld clocks\n", TimestampEnd - TimestampBeg); TimestampBeg = std::clock(); for (std::size_t k = 0; k < Count; ++k) @@ -262,7 +262,7 @@ int main() if (pop4(test[i]) != test[i+1]) error(test[i], pop4(test[i]));} TimestampEnd = std::clock(); - printf("pop4: %d clocks\n", TimestampEnd - TimestampBeg); + printf("pop4: %ld clocks\n", TimestampEnd - TimestampBeg); TimestampBeg = std::clock(); for (std::size_t k = 0; k < Count; ++k) @@ -270,7 +270,7 @@ int main() if (pop5(test[i]) != test[i+1]) error(test[i], pop5(test[i]));} TimestampEnd = std::clock(); - printf("pop5: %d clocks\n", TimestampEnd - TimestampBeg); + printf("pop5: %ld clocks\n", TimestampEnd - TimestampBeg); TimestampBeg = std::clock(); for (std::size_t k = 0; k < Count; ++k) @@ -278,7 +278,7 @@ int main() if (pop5a(test[i]) != test[i+1]) error(test[i], pop5a(test[i]));} TimestampEnd = std::clock(); - printf("pop5a: %d clocks\n", TimestampEnd - TimestampBeg); + printf("pop5a: %ld clocks\n", TimestampEnd - TimestampBeg); TimestampBeg = std::clock(); for (std::size_t k = 0; k < Count; ++k) @@ -286,7 +286,7 @@ int main() if (pop6(test[i]) != test[i+1]) error(test[i], pop6(test[i]));} TimestampEnd = std::clock(); - printf("pop6: %d clocks\n", TimestampEnd - TimestampBeg); + printf("pop6: %ld clocks\n", TimestampEnd - TimestampBeg); TimestampBeg = std::clock(); for (std::size_t k = 0; k < Count; ++k) @@ -295,7 +295,7 @@ int main() if (pop7(test[i]) != test[i+1]) error(test[i], pop7(test[i]));} TimestampEnd = std::clock(); - printf("pop7: %d clocks\n", TimestampEnd - TimestampBeg); + printf("pop7: %ld clocks\n", TimestampEnd - TimestampBeg); TimestampBeg = std::clock(); for (std::size_t k = 0; k < Count; ++k) @@ -304,7 +304,7 @@ int main() if (pop8(test[i]) != test[i+1]) error(test[i], pop8(test[i]));} TimestampEnd = std::clock(); - printf("pop8: %d clocks\n", TimestampEnd - TimestampBeg); + printf("pop8: %ld clocks\n", TimestampEnd - TimestampBeg); TimestampBeg = std::clock(); for (std::size_t k = 0; k < Count; ++k) @@ -313,7 +313,7 @@ int main() if (pop9(test[i]) != test[i+1]) error(test[i], pop9(test[i]));} TimestampEnd = std::clock(); - printf("pop9: %d clocks\n", TimestampEnd - TimestampBeg); + printf("pop9: %ld clocks\n", TimestampEnd - TimestampBeg); if (errors == 0) printf("Passed all %d cases.\n", sizeof(test)/8); From 034d32c3769a5701da7f1fc07e544638862f47b1 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 24 Jul 2015 01:32:51 +0200 Subject: [PATCH 71/74] Fixed tests --- test/gtx/gtx_fast_trigonometry.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/gtx/gtx_fast_trigonometry.cpp b/test/gtx/gtx_fast_trigonometry.cpp index 46faffd5..65264683 100644 --- a/test/gtx/gtx_fast_trigonometry.cpp +++ b/test/gtx/gtx_fast_trigonometry.cpp @@ -270,7 +270,7 @@ namespace taylorCos std::clock_t const TimeStampBegin = std::clock(); for(std::size_t i = 0; i < Samples; ++i) - Results[i] = taylorCos::fastCosNew(AngleShift + glm::vec4(Begin + Steps * i)); + Results[i] = fastCosNew(AngleShift + glm::vec4(Begin + Steps * i)); std::clock_t const TimeStampEnd = std::clock(); @@ -425,7 +425,7 @@ namespace taylorCos Error += perf_cos(Begin, End, Samples); Error += perf_fastCosOld(Begin, End, Samples); Error += perf_fastCosRef(Begin, End, Samples); - //Error += perf_fastCosNew(Begin, End, Samples); + Error += perf_fastCosNew(Begin, End, Samples); Error += perf_fastCosDeterminisctic(Begin, End, Samples); return Error; From b55ff22719e0e3b430214cf7e97350c89584b65d Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 24 Jul 2015 01:47:54 +0200 Subject: [PATCH 72/74] Fixed test --- test/gtx/gtx_fast_trigonometry.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/gtx/gtx_fast_trigonometry.cpp b/test/gtx/gtx_fast_trigonometry.cpp index 65264683..cf5515bd 100644 --- a/test/gtx/gtx_fast_trigonometry.cpp +++ b/test/gtx/gtx_fast_trigonometry.cpp @@ -237,10 +237,10 @@ namespace taylorCos GLM_FUNC_QUALIFIER vecType fastAbs(vecType x) { int* Pointer = reinterpret_cast(&x[0]); - *(((int *) &Pointer[0]) + 1) &= 0x7fffffff; - *(((int *) &Pointer[1]) + 1) &= 0x7fffffff; - *(((int *) &Pointer[2]) + 1) &= 0x7fffffff; - *(((int *) &Pointer[3]) + 1) &= 0x7fffffff; + Pointer[0] &= 0x7fffffff; + Pointer[1] &= 0x7fffffff; + Pointer[2] &= 0x7fffffff; + Pointer[3] &= 0x7fffffff; return x; } @@ -425,7 +425,7 @@ namespace taylorCos Error += perf_cos(Begin, End, Samples); Error += perf_fastCosOld(Begin, End, Samples); Error += perf_fastCosRef(Begin, End, Samples); - Error += perf_fastCosNew(Begin, End, Samples); + //Error += perf_fastCosNew(Begin, End, Samples); Error += perf_fastCosDeterminisctic(Begin, End, Samples); return Error; From f602c8e7adb2063089506bb80eec3a359c610289 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 24 Jul 2015 02:02:24 +0200 Subject: [PATCH 73/74] Updated _MAYBE to follow GLM conventions --- glm/detail/setup.hpp | 8 ++++---- glm/detail/type_mat2x2.hpp | 10 +++++----- glm/detail/type_mat2x3.hpp | 10 +++++----- glm/detail/type_mat2x4.hpp | 10 +++++----- glm/detail/type_mat3x2.hpp | 10 +++++----- glm/detail/type_mat3x3.hpp | 10 +++++----- glm/detail/type_mat3x4.hpp | 10 +++++----- glm/detail/type_mat4x2.hpp | 10 +++++----- glm/detail/type_mat4x3.hpp | 10 +++++----- glm/detail/type_mat4x4.hpp | 10 +++++----- glm/detail/type_vec1.hpp | 6 +++--- glm/detail/type_vec2.hpp | 6 +++--- glm/detail/type_vec3.hpp | 6 +++--- glm/detail/type_vec4.hpp | 6 +++--- glm/gtc/quaternion.hpp | 6 +++--- glm/gtx/dual_quaternion.hpp | 6 +++--- glm/gtx/simd_mat4.hpp | 8 ++++---- glm/gtx/simd_quat.hpp | 4 ++-- glm/gtx/simd_vec4.hpp | 4 ++-- 19 files changed, 75 insertions(+), 75 deletions(-) diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp index 03914395..efac4987 100644 --- a/glm/detail/setup.hpp +++ b/glm/detail/setup.hpp @@ -925,16 +925,16 @@ #if GLM_HAS_CONSTEXPR # define GLM_CONSTEXPR constexpr -# define GLM_CONSTEXPR_MAYBE constexpr +# define GLM_RELAXED_CONSTEXPR constexpr #else # define GLM_CONSTEXPR -# define GLM_CONSTEXPR_MAYBE const +# define GLM_RELAXED_CONSTEXPR const #endif #ifdef GLM_FORCE_EXPLICIT_CTOR -# define GLM_EXPLICIT_CTOR_MAYBE explicit +# define GLM_EXPLICIT explicit #else -# define GLM_EXPLICIT_CTOR_MAYBE +# define GLM_EXPLICIT #endif /////////////////////////////////////////////////////////////////////////////////// diff --git a/glm/detail/type_mat2x2.hpp b/glm/detail/type_mat2x2.hpp index 8d40179e..c24d929a 100644 --- a/glm/detail/type_mat2x2.hpp +++ b/glm/detail/type_mat2x2.hpp @@ -55,10 +55,10 @@ namespace glm friend tvec2 operator/(tvec2 const & v, tmat2x2 const & m); # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 2; - static GLM_CONSTEXPR_MAYBE length_t columns = 2; - static GLM_CONSTEXPR_MAYBE length_t rows = 2; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 2; + static GLM_RELAXED_CONSTEXPR length_t columns = 2; + static GLM_RELAXED_CONSTEXPR length_t rows = 2; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS private: @@ -99,7 +99,7 @@ namespace glm // Matrix conversions template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat2x2(tmat2x2 const & m); + GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat2x2 const & m); GLM_FUNC_DECL explicit tmat2x2(tmat3x3 const & x); GLM_FUNC_DECL explicit tmat2x2(tmat4x4 const & x); diff --git a/glm/detail/type_mat2x3.hpp b/glm/detail/type_mat2x3.hpp index d079e222..f0e4fbdc 100644 --- a/glm/detail/type_mat2x3.hpp +++ b/glm/detail/type_mat2x3.hpp @@ -51,10 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 2; - static GLM_CONSTEXPR_MAYBE length_t cols = 3; - static GLM_CONSTEXPR_MAYBE length_t rows = 2; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 2; + static GLM_RELAXED_CONSTEXPR length_t cols = 3; + static GLM_RELAXED_CONSTEXPR length_t rows = 2; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS private: @@ -95,7 +95,7 @@ namespace glm // Matrix conversion template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat2x3(tmat2x3 const & m); + GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat2x3 const & m); GLM_FUNC_DECL explicit tmat2x3(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat2x3(tmat3x3 const & x); diff --git a/glm/detail/type_mat2x4.hpp b/glm/detail/type_mat2x4.hpp index 9ff28845..6b0f190b 100644 --- a/glm/detail/type_mat2x4.hpp +++ b/glm/detail/type_mat2x4.hpp @@ -51,10 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 2; - static GLM_CONSTEXPR_MAYBE length_t cols = 4; - static GLM_CONSTEXPR_MAYBE length_t rows = 2; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 2; + static GLM_RELAXED_CONSTEXPR length_t cols = 4; + static GLM_RELAXED_CONSTEXPR length_t rows = 2; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS private: @@ -96,7 +96,7 @@ namespace glm // Matrix conversions template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat2x4(tmat2x4 const & m); + GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat2x4 const & m); GLM_FUNC_DECL explicit tmat2x4(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat2x4(tmat3x3 const & x); diff --git a/glm/detail/type_mat3x2.hpp b/glm/detail/type_mat3x2.hpp index b02e61aa..1ee94214 100644 --- a/glm/detail/type_mat3x2.hpp +++ b/glm/detail/type_mat3x2.hpp @@ -51,10 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 3; - static GLM_CONSTEXPR_MAYBE length_t cols = 2; - static GLM_CONSTEXPR_MAYBE length_t rows = 3; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 3; + static GLM_RELAXED_CONSTEXPR length_t cols = 2; + static GLM_RELAXED_CONSTEXPR length_t rows = 3; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS private: @@ -102,7 +102,7 @@ namespace glm // Matrix conversions template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat3x2(tmat3x2 const & m); + GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat3x2 const & m); GLM_FUNC_DECL explicit tmat3x2(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat3x2(tmat3x3 const & x); diff --git a/glm/detail/type_mat3x3.hpp b/glm/detail/type_mat3x3.hpp index d9b1105a..1ad3e6a2 100644 --- a/glm/detail/type_mat3x3.hpp +++ b/glm/detail/type_mat3x3.hpp @@ -50,10 +50,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 3; - static GLM_CONSTEXPR_MAYBE length_t cols = 3; - static GLM_CONSTEXPR_MAYBE length_t rows = 3; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 3; + static GLM_RELAXED_CONSTEXPR length_t cols = 3; + static GLM_RELAXED_CONSTEXPR length_t rows = 3; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS template @@ -106,7 +106,7 @@ namespace glm // Matrix conversions template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat3x3(tmat3x3 const & m); + GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat3x3 const & m); GLM_FUNC_DECL explicit tmat3x3(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat3x3(tmat4x4 const & x); diff --git a/glm/detail/type_mat3x4.hpp b/glm/detail/type_mat3x4.hpp index 409c8364..12a27820 100644 --- a/glm/detail/type_mat3x4.hpp +++ b/glm/detail/type_mat3x4.hpp @@ -51,10 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 3; - static GLM_CONSTEXPR_MAYBE length_t cols = 4; - static GLM_CONSTEXPR_MAYBE length_t rows = 3; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 3; + static GLM_RELAXED_CONSTEXPR length_t cols = 4; + static GLM_RELAXED_CONSTEXPR length_t rows = 3; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS private: @@ -101,7 +101,7 @@ namespace glm // Matrix conversion template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat3x4(tmat3x4 const & m); + GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat3x4 const & m); GLM_FUNC_DECL explicit tmat3x4(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat3x4(tmat3x3 const & x); diff --git a/glm/detail/type_mat4x2.hpp b/glm/detail/type_mat4x2.hpp index 951c6370..99a1dd74 100644 --- a/glm/detail/type_mat4x2.hpp +++ b/glm/detail/type_mat4x2.hpp @@ -51,10 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 4; - static GLM_CONSTEXPR_MAYBE length_t cols = 2; - static GLM_CONSTEXPR_MAYBE length_t rows = 4; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 4; + static GLM_RELAXED_CONSTEXPR length_t cols = 2; + static GLM_RELAXED_CONSTEXPR length_t rows = 4; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS private: @@ -107,7 +107,7 @@ namespace glm // Matrix conversions template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat4x2(tmat4x2 const & m); + GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat4x2 const & m); GLM_FUNC_DECL explicit tmat4x2(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat4x2(tmat3x3 const & x); diff --git a/glm/detail/type_mat4x3.hpp b/glm/detail/type_mat4x3.hpp index 4433409c..a29c7fb2 100644 --- a/glm/detail/type_mat4x3.hpp +++ b/glm/detail/type_mat4x3.hpp @@ -51,10 +51,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 4; - static GLM_CONSTEXPR_MAYBE length_t cols = 3; - static GLM_CONSTEXPR_MAYBE length_t rows = 4; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 4; + static GLM_RELAXED_CONSTEXPR length_t cols = 3; + static GLM_RELAXED_CONSTEXPR length_t rows = 4; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS private: @@ -106,7 +106,7 @@ namespace glm // Matrix conversions template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat4x3(tmat4x3 const & m); + GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat4x3 const & m); GLM_FUNC_DECL explicit tmat4x3(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat4x3(tmat3x3 const & x); diff --git a/glm/detail/type_mat4x4.hpp b/glm/detail/type_mat4x4.hpp index de702383..e8e9bcd4 100644 --- a/glm/detail/type_mat4x4.hpp +++ b/glm/detail/type_mat4x4.hpp @@ -50,10 +50,10 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 4; - static GLM_CONSTEXPR_MAYBE length_t cols = 4; - static GLM_CONSTEXPR_MAYBE length_t rows = 4; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 4; + static GLM_RELAXED_CONSTEXPR length_t cols = 4; + static GLM_RELAXED_CONSTEXPR length_t rows = 4; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS template @@ -111,7 +111,7 @@ namespace glm // Matrix conversions template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tmat4x4(tmat4x4 const & m); + GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat4x4 const & m); GLM_FUNC_DECL explicit tmat4x4(tmat2x2 const & x); GLM_FUNC_DECL explicit tmat4x4(tmat3x3 const & x); diff --git a/glm/detail/type_vec1.hpp b/glm/detail/type_vec1.hpp index 6a5e6972..aef5922d 100644 --- a/glm/detail/type_vec1.hpp +++ b/glm/detail/type_vec1.hpp @@ -56,8 +56,8 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 1; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 1; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS ////////////////////////////////////// @@ -138,7 +138,7 @@ namespace glm //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tvec1(tvec1 const & v); + GLM_FUNC_DECL GLM_EXPLICIT tvec1(tvec1 const & v); ////////////////////////////////////// // Swizzle constructors diff --git a/glm/detail/type_vec2.hpp b/glm/detail/type_vec2.hpp index f15cd200..3609a24f 100644 --- a/glm/detail/type_vec2.hpp +++ b/glm/detail/type_vec2.hpp @@ -56,8 +56,8 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 2; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 2; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS ////////////////////////////////////// @@ -146,7 +146,7 @@ namespace glm //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tvec2(tvec2 const & v); + GLM_FUNC_DECL GLM_EXPLICIT tvec2(tvec2 const & v); ////////////////////////////////////// // Swizzle constructors diff --git a/glm/detail/type_vec3.hpp b/glm/detail/type_vec3.hpp index 39c9384b..9665c55f 100644 --- a/glm/detail/type_vec3.hpp +++ b/glm/detail/type_vec3.hpp @@ -56,8 +56,8 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 3; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 3; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS ////////////////////////////////////// @@ -156,7 +156,7 @@ namespace glm //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tvec3(tvec3 const & v); + GLM_FUNC_DECL GLM_EXPLICIT tvec3(tvec3 const & v); ////////////////////////////////////// // Swizzle constructors diff --git a/glm/detail/type_vec4.hpp b/glm/detail/type_vec4.hpp index d61cd8ea..b48040fd 100644 --- a/glm/detail/type_vec4.hpp +++ b/glm/detail/type_vec4.hpp @@ -110,8 +110,8 @@ namespace detail typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 4; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 4; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS ////////////////////////////////////// @@ -232,7 +232,7 @@ namespace detail //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tvec4(tvec4 const & v); + GLM_FUNC_DECL GLM_EXPLICIT tvec4(tvec4 const & v); ////////////////////////////////////// // Swizzle constructors diff --git a/glm/gtc/quaternion.hpp b/glm/gtc/quaternion.hpp index 18aa963c..07e2f18a 100644 --- a/glm/gtc/quaternion.hpp +++ b/glm/gtc/quaternion.hpp @@ -66,8 +66,8 @@ namespace glm typedef T value_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 4; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 4; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS public: @@ -111,7 +111,7 @@ namespace glm // Conversions template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tquat(tquat const & q); + GLM_FUNC_DECL GLM_EXPLICIT tquat(tquat const & q); // explicit conversion operators # if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS diff --git a/glm/gtx/dual_quaternion.hpp b/glm/gtx/dual_quaternion.hpp index 5faad6a1..624470f4 100644 --- a/glm/gtx/dual_quaternion.hpp +++ b/glm/gtx/dual_quaternion.hpp @@ -65,8 +65,8 @@ namespace glm typedef glm::tquat part_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 8; - static GLM_CONSTEXPR_MAYBE precision prec = P; + static GLM_RELAXED_CONSTEXPR length_t components = 8; + static GLM_RELAXED_CONSTEXPR precision prec = P; # endif//GLM_META_PROG_HELPERS public: @@ -111,7 +111,7 @@ namespace glm // tdualquat conversions template - GLM_FUNC_DECL GLM_EXPLICIT_CTOR_MAYBE tdualquat(tdualquat const & q); + GLM_FUNC_DECL GLM_EXPLICIT tdualquat(tdualquat const & q); GLM_FUNC_DECL explicit tdualquat(tmat2x4 const & holder_mat); GLM_FUNC_DECL explicit tdualquat(tmat3x4 const & aug_mat); diff --git a/glm/gtx/simd_mat4.hpp b/glm/gtx/simd_mat4.hpp index 7373431b..a321d1ed 100644 --- a/glm/gtx/simd_mat4.hpp +++ b/glm/gtx/simd_mat4.hpp @@ -72,10 +72,10 @@ namespace detail typedef fmat4x4SIMD transpose_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 4; - static GLM_CONSTEXPR_MAYBE length_t cols = 4; - static GLM_CONSTEXPR_MAYBE length_t rows = 4; - static GLM_CONSTEXPR_MAYBE precision prec = defaultp; + static GLM_RELAXED_CONSTEXPR length_t components = 4; + static GLM_RELAXED_CONSTEXPR length_t cols = 4; + static GLM_RELAXED_CONSTEXPR length_t rows = 4; + static GLM_RELAXED_CONSTEXPR precision prec = defaultp; # endif//GLM_META_PROG_HELPERS GLM_FUNC_DECL length_t length() const; diff --git a/glm/gtx/simd_quat.hpp b/glm/gtx/simd_quat.hpp index 82df9abf..0c30e501 100644 --- a/glm/gtx/simd_quat.hpp +++ b/glm/gtx/simd_quat.hpp @@ -77,8 +77,8 @@ namespace detail typedef tquat bool_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 4; - static GLM_CONSTEXPR_MAYBE precision prec = defaultp; + static GLM_RELAXED_CONSTEXPR length_t components = 4; + static GLM_RELAXED_CONSTEXPR precision prec = defaultp; # endif//GLM_META_PROG_HELPERS #ifdef GLM_SIMD_ENABLE_XYZW_UNION diff --git a/glm/gtx/simd_vec4.hpp b/glm/gtx/simd_vec4.hpp index 149f9111..905af456 100644 --- a/glm/gtx/simd_vec4.hpp +++ b/glm/gtx/simd_vec4.hpp @@ -100,8 +100,8 @@ namespace detail typedef tvec4 bool_type; # ifdef GLM_META_PROG_HELPERS - static GLM_CONSTEXPR_MAYBE length_t components = 4; - static GLM_CONSTEXPR_MAYBE precision prec = defaultp; + static GLM_RELAXED_CONSTEXPR length_t components = 4; + static GLM_RELAXED_CONSTEXPR precision prec = defaultp; # endif//GLM_META_PROG_HELPERS #ifdef GLM_SIMD_ENABLE_XYZW_UNION From 063c5c7367f6d4e35e9f586cfa337a809cc6083a Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 24 Jul 2015 02:11:55 +0200 Subject: [PATCH 74/74] Fixed quaternion pow #346 --- glm/gtx/quaternion.inl | 41 ++++++++++++++++++----------------------- readme.md | 1 + 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/glm/gtx/quaternion.inl b/glm/gtx/quaternion.inl index 4c5b3d66..7467b42d 100644 --- a/glm/gtx/quaternion.inl +++ b/glm/gtx/quaternion.inl @@ -121,33 +121,28 @@ namespace glm } template - GLM_FUNC_QUALIFIER tquat pow - ( - tquat const & x, - T const & y - ) + GLM_FUNC_QUALIFIER tquat pow(tquat const & x, T const & y) { - if(abs(x.w) > (static_cast(1) - epsilon())) - return x; - T Angle = acos(y); + //Raising to the power of 0 should yield 1 + //Needed to prevent a division by 0 error later on + if(y > -epsilon() && y < epsilon()) + return tquat(1,0,0,0); + + //To deal with non-unit quaternions + T magnitude = sqrt(x.x * x.x + x.y * x.y + x.z * x.z + x.w *x.w); + + //Equivalent to raising a real number to a power + //Needed to prevent a division by 0 error later on + if(abs(x.w / magnitude) > static_cast(1) - epsilon() && abs(x.w / magnitude) < static_cast(1) + epsilon()) + return tquat(pow(x.w, y),0,0,0); + + T Angle = acos(x.w / magnitude); T NewAngle = Angle * y; T Div = sin(NewAngle) / sin(Angle); - return tquat( - cos(NewAngle), - x.x * Div, - x.y * Div, - x.z * Div); - } + T Mag = pow(magnitude, y-1); - //template - //GLM_FUNC_QUALIFIER tquat sqrt - //( - // tquat const & q - //) - //{ - // T q0 = static_cast(1) - dot(q, q); - // return T(2) * (T(1) + q0) * q; - //} + return tquat(cos(NewAngle) * magnitude * Mag, x.x * Div * Mag, x.y * Div * Mag, x.z * Div * Mag); + } template GLM_FUNC_QUALIFIER tvec3 rotate diff --git a/readme.md b/readme.md index 96a131eb..83ff6f8e 100644 --- a/readme.md +++ b/readme.md @@ -78,6 +78,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Fixed isfinite with C++98 compilers #343 - Fixed Intel compiler build error on Linux #354 - Fixed use of libstdc++ with Clang #351 +- Fixed quaternion pow #346 ##### Deprecation: - Removed integer specification for 'mod' in GTC_integer #308