diff --git a/CMakeLists.txt b/CMakeLists.txt index 5925d5fe..962fa640 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,14 @@ cmake_minimum_required(VERSION 2.6 FATAL_ERROR) project(glm) -enable_testing() +set(GLM_VERSION "0.9.7") + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") -list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") include(GNUInstallDirs) +include(CMakePackageConfigHelpers) + +enable_testing() add_definitions(-D_CRT_SECURE_NO_WARNINGS) @@ -129,7 +133,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 @@ -141,6 +144,56 @@ 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_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") + add_library(glm INTERFACE) + target_include_directories(glm INTERFACE + $ + $ + ) + install(TARGETS glm EXPORT glmTargets) + + export( + EXPORT glmTargets + FILE "${CMAKE_CURRENT_BINARY_DIR}/glmTargets.cmake" + ) + + install( + EXPORT glmTargets FILE glmTargets.cmake + DESTINATION ${GLM_INSTALL_CONFIGDIR} + ) +endif() + +export(PACKAGE glm) 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 new file mode 100644 index 00000000..bec9af30 --- /dev/null +++ b/cmake/glmBuildConfig.cmake.in @@ -0,0 +1,6 @@ +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() diff --git a/cmake/glmConfig.cmake.in b/cmake/glmConfig.cmake.in new file mode 100644 index 00000000..3f8a1fe5 --- /dev/null +++ b/cmake/glmConfig.cmake.in @@ -0,0 +1,9 @@ +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") +endif() diff --git a/doc/glm.docx b/doc/glm.docx index 80add995..ce05f6f8 100644 Binary files a/doc/glm.docx and b/doc/glm.docx differ diff --git a/glm/CMakeLists.txt b/glm/CMakeLists.txt index aaeae626..8f2f552e 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}) @@ -32,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/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/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/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 diff --git a/glm/gtx/io.hpp b/glm/gtx/io.hpp index b3842bbd..a52ab9c0 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..92c68732 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/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 5cd084ea..402e815d 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,47 @@ namespace glm return Result; } - //////////////////////// - // mirrorRepeat - - template - GLM_FUNC_QUALIFIER genType mirrorRepeat - ( - genType const & Texcoord - ) + template + GLM_FUNC_QUALIFIER genType mirrorClamp(genType const & Texcoord) { - genType const Clamp = genType(int(glm::floor(Texcoord)) % 2); - genType const Floor = glm::floor(Texcoord); - genType const Rest = Texcoord - Floor; + 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) + { + 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 +149,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 +158,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 +167,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.txt b/readme.md similarity index 65% rename from readme.txt rename to readme.md index b29e01c6..dd1f44a3 100644 --- a/readme.txt +++ b/readme.md @@ -1,115 +1,104 @@ -================================================================================ -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. +![glm](doc/logo.png) -================================================================================ -The Happy Bunny License (Modified MIT License) --------------------------------------------------------------------------------- -Copyright (c) 2005 - 2015 G-Truc Creation +[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). -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: +*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++. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +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... -Restrictions: - By making use of the Software for military purposes, you choose to make a - Bunny unhappy. +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. -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* 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 +- [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 -================================================================================ -The MIT License --------------------------------------------------------------------------------- -Copyright (c) 2005 - 2015 G-Truc Creation +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) or the MIT License](./copying.txt). -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: +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). -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. +```c++ +#include // glm::vec3 +#include // glm::vec4 +#include // glm::mat4 +#include // glm::translate, glm::rotate, glm::scale, glm::perspective -================================================================================ -GLM Usage --------------------------------------------------------------------------------- -GLM is a header only library, there is nothing to build, just include it. -#include +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; +} +``` -More informations in GLM manual: -http://glm.g-truc.net/glm.pdf +## Project Health -================================================================================ -GLM 0.9.7.0: 2015-XX-XX --------------------------------------------------------------------------------- -Features: +| Service | System | Compiler | Status | +| ------- | ------ | -------- | ------ | +| [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) | + +## [Lastest release](https://github.com/g-truc/glm/releases/latest) + +## Release notes + +#### 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 +- Added to perform std::hash on GLM types #320 +- Added for texcoord wrapping -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 +- Added master branch continuous integration service on Linux 64 #332 +- Clarified manual regarding angle unit in GLM, added FAQ 11 #326 -Fixes: +##### 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 +- Fixed perspective fovy argument documentation #327 +- Removed -m64 causing build issues on Linux 32 #331 -Deprecation: +##### Deprecation: - 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](https://github.com/g-truc/glm/releases/tag/0.9.6.3) - 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 @@ -122,17 +111,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 @@ -145,10 +133,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 @@ -168,7 +155,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 @@ -188,7 +175,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 @@ -199,7 +186,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 @@ -208,9 +195,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](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 @@ -230,9 +216,8 @@ GLM 0.9.5.4: 2014-06-21 - 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 @@ -247,9 +232,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 @@ -261,9 +245,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) @@ -274,9 +257,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 @@ -314,9 +296,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](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 @@ -330,9 +311,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 @@ -341,9 +321,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 @@ -354,9 +333,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 @@ -368,9 +346,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 @@ -383,9 +360,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 @@ -396,9 +372,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 @@ -407,9 +382,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](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 @@ -418,9 +392,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 @@ -431,32 +404,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 @@ -466,9 +435,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 @@ -482,55 +450,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 @@ -538,42 +498,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 @@ -581,315 +534,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 -================================================================================ 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_bitfield.cpp b/test/gtc/gtc_bitfield.cpp index 3f1c1ed1..5e4accf5 100644 --- a/test/gtc/gtc_bitfield.cpp +++ b/test/gtc/gtc_bitfield.cpp @@ -631,11 +631,13 @@ 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(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); 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/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_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(); diff --git a/test/gtx/gtx_wrap.cpp b/test/gtx/gtx_wrap.cpp new file mode 100644 index 00000000..b65d94ba --- /dev/null +++ b/test/gtx/gtx_wrap.cpp @@ -0,0 +1,172 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// 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 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() + { + 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 += mirrorClamp::test(); + Error += mirrorRepeat::test(); + + return Error; +} 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)