From b7a7e048a729cc160be0e50e950e6a7cdcce6999 Mon Sep 17 00:00:00 2001 From: NaifBanana <30419422+NaifBanana@users.noreply.github.com> Date: Mon, 15 Jan 2024 17:35:43 -0600 Subject: [PATCH] Adding entire project --- .vscode/settings.json | 52 + CMakeLists.txt | 23 + assets/awesomeface.png | Bin 0 -> 59277 bytes assets/wall.jpg | Bin 0 -> 256989 bytes .../api/v1/query/client-vscode/query.json | 1 + .../reply/cache-v2-ea31c3cf31d456df230b.json | 1899 ++++ .../cmakeFiles-v1-a4977e1577f53f411141.json | 218 + .../codemodel-v2-b9a1872db70d346db780.json | 312 + ...irectory-.-Debug-d0094a50bb2071803777.json | 14 + .../reply/index-2024-01-14T18-20-18-0299.json | 132 + ...Continuous-Debug-cf03795cec8cf1d33622.json | 93 + ...nuousBuild-Debug-8c197916d5a196460a70.json | 93 + ...sConfigure-Debug-5878313f94209419cf56.json | 93 + ...usCoverage-Debug-014248b7f5cc85c06d84.json | 93 + ...usMemCheck-Debug-42cd2c562848850710f0.json | 93 + ...nuousStart-Debug-0be790493f30a7f8328a.json | 93 + ...uousSubmit-Debug-47443a2d325a180bd9c3.json | 93 + ...inuousTest-Debug-b4ad8b056fc8b549ac6e.json | 93 + ...uousUpdate-Debug-425115cf175af89a21d4.json | 93 + ...perimental-Debug-5290bc076cd2d600449b.json | 93 + ...entalBuild-Debug-a3d2f82de9e911e3105e.json | 93 + ...lConfigure-Debug-129e7f8244d240ef7b0a.json | 93 + ...alCoverage-Debug-4c127654617865f623ab.json | 93 + ...alMemCheck-Debug-afda3dd70f2091cd6d8a.json | 93 + ...entalStart-Debug-060fadf57e93ff956dee.json | 93 + ...ntalSubmit-Debug-256184777f5dce9a6dc7.json | 93 + ...mentalTest-Debug-9b5a332d5bbd606e1154.json | 93 + ...ntalUpdate-Debug-cd17e68d94c51653532a.json | 93 + ...aphicsTest-Debug-ea0a998cccfe2e6e4023.json | 198 + ...et-Nightly-Debug-8dd20071dc1840f4a657.json | 93 + ...ghtlyBuild-Debug-a805b907e72c7603d5af.json | 93 + ...yConfigure-Debug-82faf67b49b0283d29a2.json | 93 + ...lyCoverage-Debug-f4dd596154ca43a53f17.json | 93 + ...lyMemCheck-Debug-f5546854fee7443f4e90.json | 93 + ...emoryCheck-Debug-069d28ec4b91fdcc3dd0.json | 93 + ...ghtlyStart-Debug-25a2575162593527d92c.json | 93 + ...htlySubmit-Debug-2c5f1b197a61e5d2f7d8.json | 93 + ...ightlyTest-Debug-e10ecd01260bfb23e81a.json | 93 + ...htlyUpdate-Debug-aefebc1d49de86a4fc61.json | 93 + .../toolchains-v1-e719e28fe32911e094f8.json | 140 + build/CMakeCache.txt | 547 ++ build/CMakeFiles/3.28.1/CMakeCCompiler.cmake | 74 + .../CMakeFiles/3.28.1/CMakeCXXCompiler.cmake | 85 + .../3.28.1/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 133316 bytes .../3.28.1/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 133335 bytes build/CMakeFiles/3.28.1/CMakeRCCompiler.cmake | 6 + build/CMakeFiles/3.28.1/CMakeSystem.cmake | 15 + .../3.28.1/CompilerIdC/CMakeCCompilerId.c | 880 ++ build/CMakeFiles/3.28.1/CompilerIdC/a.exe | Bin 0 -> 133903 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 869 ++ build/CMakeFiles/3.28.1/CompilerIdCXX/a.exe | Bin 0 -> 133931 bytes build/CMakeFiles/CMakeConfigureLog.yaml | 608 ++ .../CMakeDirectoryInformation.cmake | 16 + build/CMakeFiles/CMakeRuleHashes.txt | 29 + .../Continuous.dir/DependInfo.cmake | 22 + build/CMakeFiles/Continuous.dir/build.make | 86 + .../Continuous.dir/cmake_clean.cmake | 8 + .../Continuous.dir/compiler_depend.make | 2 + .../Continuous.dir/compiler_depend.ts | 2 + build/CMakeFiles/Continuous.dir/progress.make | 1 + .../ContinuousBuild.dir/DependInfo.cmake | 22 + .../CMakeFiles/ContinuousBuild.dir/build.make | 86 + .../ContinuousBuild.dir/cmake_clean.cmake | 8 + .../ContinuousBuild.dir/compiler_depend.make | 2 + .../ContinuousBuild.dir/compiler_depend.ts | 2 + .../ContinuousBuild.dir/progress.make | 1 + .../ContinuousConfigure.dir/DependInfo.cmake | 22 + .../ContinuousConfigure.dir/build.make | 86 + .../ContinuousConfigure.dir/cmake_clean.cmake | 8 + .../compiler_depend.make | 2 + .../compiler_depend.ts | 2 + .../ContinuousConfigure.dir/progress.make | 1 + .../ContinuousCoverage.dir/DependInfo.cmake | 22 + .../ContinuousCoverage.dir/build.make | 86 + .../ContinuousCoverage.dir/cmake_clean.cmake | 8 + .../compiler_depend.make | 2 + .../ContinuousCoverage.dir/compiler_depend.ts | 2 + .../ContinuousCoverage.dir/progress.make | 1 + .../ContinuousMemCheck.dir/DependInfo.cmake | 22 + .../ContinuousMemCheck.dir/build.make | 86 + .../ContinuousMemCheck.dir/cmake_clean.cmake | 8 + .../compiler_depend.make | 2 + .../ContinuousMemCheck.dir/compiler_depend.ts | 2 + .../ContinuousMemCheck.dir/progress.make | 1 + .../ContinuousStart.dir/DependInfo.cmake | 22 + .../CMakeFiles/ContinuousStart.dir/build.make | 86 + .../ContinuousStart.dir/cmake_clean.cmake | 8 + .../ContinuousStart.dir/compiler_depend.make | 2 + .../ContinuousStart.dir/compiler_depend.ts | 2 + .../ContinuousStart.dir/progress.make | 1 + .../ContinuousSubmit.dir/DependInfo.cmake | 22 + .../ContinuousSubmit.dir/build.make | 86 + .../ContinuousSubmit.dir/cmake_clean.cmake | 8 + .../ContinuousSubmit.dir/compiler_depend.make | 2 + .../ContinuousSubmit.dir/compiler_depend.ts | 2 + .../ContinuousSubmit.dir/progress.make | 1 + .../ContinuousTest.dir/DependInfo.cmake | 22 + .../CMakeFiles/ContinuousTest.dir/build.make | 86 + .../ContinuousTest.dir/cmake_clean.cmake | 8 + .../ContinuousTest.dir/compiler_depend.make | 2 + .../ContinuousTest.dir/compiler_depend.ts | 2 + .../ContinuousTest.dir/progress.make | 1 + .../ContinuousUpdate.dir/DependInfo.cmake | 22 + .../ContinuousUpdate.dir/build.make | 86 + .../ContinuousUpdate.dir/cmake_clean.cmake | 8 + .../ContinuousUpdate.dir/compiler_depend.make | 2 + .../ContinuousUpdate.dir/compiler_depend.ts | 2 + .../ContinuousUpdate.dir/progress.make | 1 + .../Experimental.dir/DependInfo.cmake | 22 + build/CMakeFiles/Experimental.dir/build.make | 86 + .../Experimental.dir/cmake_clean.cmake | 8 + .../Experimental.dir/compiler_depend.make | 2 + .../Experimental.dir/compiler_depend.ts | 2 + .../CMakeFiles/Experimental.dir/progress.make | 1 + .../ExperimentalBuild.dir/DependInfo.cmake | 22 + .../ExperimentalBuild.dir/build.make | 86 + .../ExperimentalBuild.dir/cmake_clean.cmake | 8 + .../compiler_depend.make | 2 + .../ExperimentalBuild.dir/compiler_depend.ts | 2 + .../ExperimentalBuild.dir/progress.make | 1 + .../DependInfo.cmake | 22 + .../ExperimentalConfigure.dir/build.make | 86 + .../cmake_clean.cmake | 8 + .../compiler_depend.make | 2 + .../compiler_depend.ts | 2 + .../ExperimentalConfigure.dir/progress.make | 1 + .../ExperimentalCoverage.dir/DependInfo.cmake | 22 + .../ExperimentalCoverage.dir/build.make | 86 + .../cmake_clean.cmake | 8 + .../compiler_depend.make | 2 + .../compiler_depend.ts | 2 + .../ExperimentalCoverage.dir/progress.make | 1 + .../ExperimentalMemCheck.dir/DependInfo.cmake | 22 + .../ExperimentalMemCheck.dir/build.make | 86 + .../cmake_clean.cmake | 8 + .../compiler_depend.make | 2 + .../compiler_depend.ts | 2 + .../ExperimentalMemCheck.dir/progress.make | 1 + .../ExperimentalStart.dir/DependInfo.cmake | 22 + .../ExperimentalStart.dir/build.make | 86 + .../ExperimentalStart.dir/cmake_clean.cmake | 8 + .../compiler_depend.make | 2 + .../ExperimentalStart.dir/compiler_depend.ts | 2 + .../ExperimentalStart.dir/progress.make | 1 + .../ExperimentalSubmit.dir/DependInfo.cmake | 22 + .../ExperimentalSubmit.dir/build.make | 86 + .../ExperimentalSubmit.dir/cmake_clean.cmake | 8 + .../compiler_depend.make | 2 + .../ExperimentalSubmit.dir/compiler_depend.ts | 2 + .../ExperimentalSubmit.dir/progress.make | 1 + .../ExperimentalTest.dir/DependInfo.cmake | 22 + .../ExperimentalTest.dir/build.make | 86 + .../ExperimentalTest.dir/cmake_clean.cmake | 8 + .../ExperimentalTest.dir/compiler_depend.make | 2 + .../ExperimentalTest.dir/compiler_depend.ts | 2 + .../ExperimentalTest.dir/progress.make | 1 + .../ExperimentalUpdate.dir/DependInfo.cmake | 22 + .../ExperimentalUpdate.dir/build.make | 86 + .../ExperimentalUpdate.dir/cmake_clean.cmake | 8 + .../compiler_depend.make | 2 + .../ExperimentalUpdate.dir/compiler_depend.ts | 2 + .../ExperimentalUpdate.dir/progress.make | 1 + .../Projects/C++/libs/glad/src/glad.c.obj | Bin 0 -> 168555 bytes .../Projects/C++/libs/glad/src/glad.c.obj.d | 225 + .../GraphicsTest.dir/DependInfo.cmake | 26 + build/CMakeFiles/GraphicsTest.dir/build.make | 163 + .../GraphicsTest.dir/cmake_clean.cmake | 19 + .../GraphicsTest.dir/compiler_depend.make | 2 + .../GraphicsTest.dir/compiler_depend.ts | 2 + build/CMakeFiles/GraphicsTest.dir/depend.make | 2 + build/CMakeFiles/GraphicsTest.dir/flags.make | 17 + .../CMakeFiles/GraphicsTest.dir/funcs.cpp.obj | Bin 0 -> 3915 bytes .../GraphicsTest.dir/funcs.cpp.obj.d | 15 + .../GraphicsTest.dir/includes_C.rsp | 1 + .../GraphicsTest.dir/includes_CXX.rsp | 1 + build/CMakeFiles/GraphicsTest.dir/link.txt | 3 + .../CMakeFiles/GraphicsTest.dir/linkLibs.rsp | 1 + .../CMakeFiles/GraphicsTest.dir/main.cpp.obj | Bin 0 -> 454890 bytes .../GraphicsTest.dir/main.cpp.obj.d | 373 + build/CMakeFiles/GraphicsTest.dir/objects.a | Bin 0 -> 729030 bytes .../CMakeFiles/GraphicsTest.dir/objects1.rsp | 1 + .../CMakeFiles/GraphicsTest.dir/progress.make | 6 + .../GraphicsTest.dir/shader.cpp.obj | Bin 0 -> 77065 bytes .../GraphicsTest.dir/shader.cpp.obj.d | 151 + build/CMakeFiles/Makefile.cmake | 94 + build/CMakeFiles/Makefile2 | 867 ++ build/CMakeFiles/Nightly.dir/DependInfo.cmake | 22 + build/CMakeFiles/Nightly.dir/build.make | 86 + .../CMakeFiles/Nightly.dir/cmake_clean.cmake | 8 + .../Nightly.dir/compiler_depend.make | 2 + .../CMakeFiles/Nightly.dir/compiler_depend.ts | 2 + build/CMakeFiles/Nightly.dir/progress.make | 1 + .../NightlyBuild.dir/DependInfo.cmake | 22 + build/CMakeFiles/NightlyBuild.dir/build.make | 86 + .../NightlyBuild.dir/cmake_clean.cmake | 8 + .../NightlyBuild.dir/compiler_depend.make | 2 + .../NightlyBuild.dir/compiler_depend.ts | 2 + .../CMakeFiles/NightlyBuild.dir/progress.make | 1 + .../NightlyConfigure.dir/DependInfo.cmake | 22 + .../NightlyConfigure.dir/build.make | 86 + .../NightlyConfigure.dir/cmake_clean.cmake | 8 + .../NightlyConfigure.dir/compiler_depend.make | 2 + .../NightlyConfigure.dir/compiler_depend.ts | 2 + .../NightlyConfigure.dir/progress.make | 1 + .../NightlyCoverage.dir/DependInfo.cmake | 22 + .../CMakeFiles/NightlyCoverage.dir/build.make | 86 + .../NightlyCoverage.dir/cmake_clean.cmake | 8 + .../NightlyCoverage.dir/compiler_depend.make | 2 + .../NightlyCoverage.dir/compiler_depend.ts | 2 + .../NightlyCoverage.dir/progress.make | 1 + .../NightlyMemCheck.dir/DependInfo.cmake | 22 + .../CMakeFiles/NightlyMemCheck.dir/build.make | 86 + .../NightlyMemCheck.dir/cmake_clean.cmake | 8 + .../NightlyMemCheck.dir/compiler_depend.make | 2 + .../NightlyMemCheck.dir/compiler_depend.ts | 2 + .../NightlyMemCheck.dir/progress.make | 1 + .../NightlyMemoryCheck.dir/DependInfo.cmake | 22 + .../NightlyMemoryCheck.dir/build.make | 86 + .../NightlyMemoryCheck.dir/cmake_clean.cmake | 8 + .../compiler_depend.make | 2 + .../NightlyMemoryCheck.dir/compiler_depend.ts | 2 + .../NightlyMemoryCheck.dir/progress.make | 1 + .../NightlyStart.dir/DependInfo.cmake | 22 + build/CMakeFiles/NightlyStart.dir/build.make | 86 + .../NightlyStart.dir/cmake_clean.cmake | 8 + .../NightlyStart.dir/compiler_depend.make | 2 + .../NightlyStart.dir/compiler_depend.ts | 2 + .../CMakeFiles/NightlyStart.dir/progress.make | 1 + .../NightlySubmit.dir/DependInfo.cmake | 22 + build/CMakeFiles/NightlySubmit.dir/build.make | 86 + .../NightlySubmit.dir/cmake_clean.cmake | 8 + .../NightlySubmit.dir/compiler_depend.make | 2 + .../NightlySubmit.dir/compiler_depend.ts | 2 + .../NightlySubmit.dir/progress.make | 1 + .../NightlyTest.dir/DependInfo.cmake | 22 + build/CMakeFiles/NightlyTest.dir/build.make | 86 + .../NightlyTest.dir/cmake_clean.cmake | 8 + .../NightlyTest.dir/compiler_depend.make | 2 + .../NightlyTest.dir/compiler_depend.ts | 2 + .../CMakeFiles/NightlyTest.dir/progress.make | 1 + .../NightlyUpdate.dir/DependInfo.cmake | 22 + build/CMakeFiles/NightlyUpdate.dir/build.make | 86 + .../NightlyUpdate.dir/cmake_clean.cmake | 8 + .../NightlyUpdate.dir/compiler_depend.make | 2 + .../NightlyUpdate.dir/compiler_depend.ts | 2 + .../NightlyUpdate.dir/progress.make | 1 + build/CMakeFiles/TargetDirectories.txt | 34 + build/CMakeFiles/cmake.check_cache | 1 + build/CMakeFiles/progress.marks | 1 + build/CPackConfig.cmake | 76 + build/CPackSourceConfig.cmake | 84 + build/CTestTestfile.cmake | 6 + build/DartConfiguration.tcl | 106 + build/GraphicsTest.exe | Bin 0 -> 1081315 bytes build/Makefile | 686 ++ build/Testing/20231226-0809/Test.xml | 34 + build/Testing/20231227-0946/Test.xml | 34 + build/Testing/20231228-1823/Test.xml | 34 + build/Testing/20240114-1820/Test.xml | 34 + build/Testing/TAG | 3 + .../Temporary/LastTest_20231226-0809.log | 3 + .../Temporary/LastTest_20231227-0946.log | 3 + .../Temporary/LastTest_20231228-1823.log | 3 + .../Temporary/LastTest_20240114-1820.log | 3 + build/awesomeface.png | Bin 0 -> 59277 bytes build/cmake_install.cmake | 49 + build/compile_commands.json | 26 + build/wall.jpg | Bin 0 -> 256989 bytes data.cpp | 12 + dep/GLFW/glfw3.h | 5932 ++++++++++++ dep/GLFW/glfw3native.h | 634 ++ dep/glad/glad.h | 3611 ++++++++ dep/glm/CMakeLists.txt | 70 + dep/glm/common.hpp | 539 ++ dep/glm/detail/_features.hpp | 394 + dep/glm/detail/_fixes.hpp | 27 + dep/glm/detail/_noise.hpp | 81 + dep/glm/detail/_swizzle.hpp | 804 ++ dep/glm/detail/_swizzle_func.hpp | 682 ++ dep/glm/detail/_vectorize.hpp | 162 + dep/glm/detail/compute_common.hpp | 50 + dep/glm/detail/compute_vector_relational.hpp | 30 + dep/glm/detail/func_common.inl | 792 ++ dep/glm/detail/func_common_simd.inl | 231 + dep/glm/detail/func_exponential.inl | 152 + dep/glm/detail/func_exponential_simd.inl | 37 + dep/glm/detail/func_geometric.inl | 243 + dep/glm/detail/func_geometric_simd.inl | 163 + dep/glm/detail/func_integer.inl | 372 + dep/glm/detail/func_integer_simd.inl | 65 + dep/glm/detail/func_matrix.inl | 398 + dep/glm/detail/func_matrix_simd.inl | 249 + dep/glm/detail/func_packing.inl | 189 + dep/glm/detail/func_packing_simd.inl | 6 + dep/glm/detail/func_trigonometric.inl | 197 + dep/glm/detail/func_trigonometric_simd.inl | 0 dep/glm/detail/func_vector_relational.inl | 87 + .../detail/func_vector_relational_simd.inl | 6 + dep/glm/detail/glm.cpp | 263 + dep/glm/detail/qualifier.hpp | 230 + dep/glm/detail/setup.hpp | 1135 +++ dep/glm/detail/type_float.hpp | 68 + dep/glm/detail/type_half.hpp | 16 + dep/glm/detail/type_half.inl | 241 + dep/glm/detail/type_mat2x2.hpp | 177 + dep/glm/detail/type_mat2x2.inl | 536 ++ dep/glm/detail/type_mat2x3.hpp | 159 + dep/glm/detail/type_mat2x3.inl | 510 ++ dep/glm/detail/type_mat2x4.hpp | 161 + dep/glm/detail/type_mat2x4.inl | 520 ++ dep/glm/detail/type_mat3x2.hpp | 167 + dep/glm/detail/type_mat3x2.inl | 532 ++ dep/glm/detail/type_mat3x3.hpp | 184 + dep/glm/detail/type_mat3x3.inl | 601 ++ dep/glm/detail/type_mat3x4.hpp | 166 + dep/glm/detail/type_mat3x4.inl | 578 ++ dep/glm/detail/type_mat4x2.hpp | 171 + dep/glm/detail/type_mat4x2.inl | 574 ++ dep/glm/detail/type_mat4x3.hpp | 171 + dep/glm/detail/type_mat4x3.inl | 598 ++ dep/glm/detail/type_mat4x4.hpp | 189 + dep/glm/detail/type_mat4x4.inl | 706 ++ dep/glm/detail/type_mat4x4_simd.inl | 6 + dep/glm/detail/type_quat.hpp | 186 + dep/glm/detail/type_quat.inl | 408 + dep/glm/detail/type_quat_simd.inl | 188 + dep/glm/detail/type_vec1.hpp | 308 + dep/glm/detail/type_vec1.inl | 551 ++ dep/glm/detail/type_vec2.hpp | 399 + dep/glm/detail/type_vec2.inl | 913 ++ dep/glm/detail/type_vec3.hpp | 432 + dep/glm/detail/type_vec3.inl | 1068 +++ dep/glm/detail/type_vec4.hpp | 505 ++ dep/glm/detail/type_vec4.inl | 1140 +++ dep/glm/detail/type_vec4_simd.inl | 775 ++ dep/glm/exponential.hpp | 110 + dep/glm/ext.hpp | 253 + dep/glm/ext/matrix_clip_space.hpp | 522 ++ dep/glm/ext/matrix_clip_space.inl | 555 ++ dep/glm/ext/matrix_common.hpp | 36 + dep/glm/ext/matrix_common.inl | 16 + dep/glm/ext/matrix_double2x2.hpp | 23 + dep/glm/ext/matrix_double2x2_precision.hpp | 49 + dep/glm/ext/matrix_double2x3.hpp | 18 + dep/glm/ext/matrix_double2x3_precision.hpp | 31 + dep/glm/ext/matrix_double2x4.hpp | 18 + dep/glm/ext/matrix_double2x4_precision.hpp | 31 + dep/glm/ext/matrix_double3x2.hpp | 18 + dep/glm/ext/matrix_double3x2_precision.hpp | 31 + dep/glm/ext/matrix_double3x3.hpp | 23 + dep/glm/ext/matrix_double3x3_precision.hpp | 49 + dep/glm/ext/matrix_double3x4.hpp | 18 + dep/glm/ext/matrix_double3x4_precision.hpp | 31 + dep/glm/ext/matrix_double4x2.hpp | 18 + dep/glm/ext/matrix_double4x2_precision.hpp | 31 + dep/glm/ext/matrix_double4x3.hpp | 18 + dep/glm/ext/matrix_double4x3_precision.hpp | 31 + dep/glm/ext/matrix_double4x4.hpp | 23 + dep/glm/ext/matrix_double4x4_precision.hpp | 49 + dep/glm/ext/matrix_float2x2.hpp | 23 + dep/glm/ext/matrix_float2x2_precision.hpp | 49 + dep/glm/ext/matrix_float2x3.hpp | 18 + dep/glm/ext/matrix_float2x3_precision.hpp | 31 + dep/glm/ext/matrix_float2x4.hpp | 18 + dep/glm/ext/matrix_float2x4_precision.hpp | 31 + dep/glm/ext/matrix_float3x2.hpp | 18 + dep/glm/ext/matrix_float3x2_precision.hpp | 31 + dep/glm/ext/matrix_float3x3.hpp | 23 + dep/glm/ext/matrix_float3x3_precision.hpp | 49 + dep/glm/ext/matrix_float3x4.hpp | 18 + dep/glm/ext/matrix_float3x4_precision.hpp | 31 + dep/glm/ext/matrix_float4x2.hpp | 18 + dep/glm/ext/matrix_float4x2_precision.hpp | 31 + dep/glm/ext/matrix_float4x3.hpp | 18 + dep/glm/ext/matrix_float4x3_precision.hpp | 31 + dep/glm/ext/matrix_float4x4.hpp | 23 + dep/glm/ext/matrix_float4x4_precision.hpp | 49 + dep/glm/ext/matrix_int2x2.hpp | 38 + dep/glm/ext/matrix_int2x2_sized.hpp | 70 + dep/glm/ext/matrix_int2x3.hpp | 33 + dep/glm/ext/matrix_int2x3_sized.hpp | 49 + dep/glm/ext/matrix_int2x4.hpp | 33 + dep/glm/ext/matrix_int2x4_sized.hpp | 49 + dep/glm/ext/matrix_int3x2.hpp | 33 + dep/glm/ext/matrix_int3x2_sized.hpp | 49 + dep/glm/ext/matrix_int3x3.hpp | 38 + dep/glm/ext/matrix_int3x3_sized.hpp | 70 + dep/glm/ext/matrix_int3x4.hpp | 33 + dep/glm/ext/matrix_int3x4_sized.hpp | 49 + dep/glm/ext/matrix_int4x2.hpp | 33 + dep/glm/ext/matrix_int4x2_sized.hpp | 49 + dep/glm/ext/matrix_int4x3.hpp | 33 + dep/glm/ext/matrix_int4x3_sized.hpp | 49 + dep/glm/ext/matrix_int4x4.hpp | 38 + dep/glm/ext/matrix_int4x4_sized.hpp | 70 + dep/glm/ext/matrix_projection.hpp | 149 + dep/glm/ext/matrix_projection.inl | 106 + dep/glm/ext/matrix_relational.hpp | 132 + dep/glm/ext/matrix_relational.inl | 82 + dep/glm/ext/matrix_transform.hpp | 144 + dep/glm/ext/matrix_transform.inl | 152 + dep/glm/ext/matrix_uint2x2.hpp | 38 + dep/glm/ext/matrix_uint2x2_sized.hpp | 70 + dep/glm/ext/matrix_uint2x3.hpp | 33 + dep/glm/ext/matrix_uint2x3_sized.hpp | 49 + dep/glm/ext/matrix_uint2x4.hpp | 33 + dep/glm/ext/matrix_uint2x4_sized.hpp | 49 + dep/glm/ext/matrix_uint3x2.hpp | 33 + dep/glm/ext/matrix_uint3x2_sized.hpp | 49 + dep/glm/ext/matrix_uint3x3.hpp | 38 + dep/glm/ext/matrix_uint3x3_sized.hpp | 70 + dep/glm/ext/matrix_uint3x4.hpp | 33 + dep/glm/ext/matrix_uint3x4_sized.hpp | 49 + dep/glm/ext/matrix_uint4x2.hpp | 33 + dep/glm/ext/matrix_uint4x2_sized.hpp | 49 + dep/glm/ext/matrix_uint4x3.hpp | 33 + dep/glm/ext/matrix_uint4x3_sized.hpp | 49 + dep/glm/ext/matrix_uint4x4.hpp | 38 + dep/glm/ext/matrix_uint4x4_sized.hpp | 70 + dep/glm/ext/quaternion_common.hpp | 135 + dep/glm/ext/quaternion_common.inl | 144 + dep/glm/ext/quaternion_common_simd.inl | 18 + dep/glm/ext/quaternion_double.hpp | 39 + dep/glm/ext/quaternion_double_precision.hpp | 42 + dep/glm/ext/quaternion_exponential.hpp | 63 + dep/glm/ext/quaternion_exponential.inl | 85 + dep/glm/ext/quaternion_float.hpp | 39 + dep/glm/ext/quaternion_float_precision.hpp | 36 + dep/glm/ext/quaternion_geometric.hpp | 70 + dep/glm/ext/quaternion_geometric.inl | 36 + dep/glm/ext/quaternion_relational.hpp | 62 + dep/glm/ext/quaternion_relational.inl | 35 + dep/glm/ext/quaternion_transform.hpp | 47 + dep/glm/ext/quaternion_transform.inl | 24 + dep/glm/ext/quaternion_trigonometric.hpp | 63 + dep/glm/ext/quaternion_trigonometric.inl | 34 + dep/glm/ext/scalar_common.hpp | 157 + dep/glm/ext/scalar_common.inl | 152 + dep/glm/ext/scalar_constants.hpp | 40 + dep/glm/ext/scalar_constants.inl | 24 + dep/glm/ext/scalar_int_sized.hpp | 70 + dep/glm/ext/scalar_integer.hpp | 92 + dep/glm/ext/scalar_integer.inl | 243 + dep/glm/ext/scalar_packing.hpp | 32 + dep/glm/ext/scalar_packing.inl | 0 dep/glm/ext/scalar_relational.hpp | 65 + dep/glm/ext/scalar_relational.inl | 40 + dep/glm/ext/scalar_uint_sized.hpp | 70 + dep/glm/ext/scalar_ulp.hpp | 74 + dep/glm/ext/scalar_ulp.inl | 284 + dep/glm/ext/vector_bool1.hpp | 30 + dep/glm/ext/vector_bool1_precision.hpp | 34 + dep/glm/ext/vector_bool2.hpp | 18 + dep/glm/ext/vector_bool2_precision.hpp | 31 + dep/glm/ext/vector_bool3.hpp | 18 + dep/glm/ext/vector_bool3_precision.hpp | 31 + dep/glm/ext/vector_bool4.hpp | 18 + dep/glm/ext/vector_bool4_precision.hpp | 31 + dep/glm/ext/vector_common.hpp | 204 + dep/glm/ext/vector_common.inl | 129 + dep/glm/ext/vector_double1.hpp | 31 + dep/glm/ext/vector_double1_precision.hpp | 36 + dep/glm/ext/vector_double2.hpp | 18 + dep/glm/ext/vector_double2_precision.hpp | 31 + dep/glm/ext/vector_double3.hpp | 18 + dep/glm/ext/vector_double3_precision.hpp | 34 + dep/glm/ext/vector_double4.hpp | 18 + dep/glm/ext/vector_double4_precision.hpp | 35 + dep/glm/ext/vector_float1.hpp | 31 + dep/glm/ext/vector_float1_precision.hpp | 36 + dep/glm/ext/vector_float2.hpp | 18 + dep/glm/ext/vector_float2_precision.hpp | 31 + dep/glm/ext/vector_float3.hpp | 18 + dep/glm/ext/vector_float3_precision.hpp | 31 + dep/glm/ext/vector_float4.hpp | 18 + dep/glm/ext/vector_float4_precision.hpp | 31 + dep/glm/ext/vector_int1.hpp | 32 + dep/glm/ext/vector_int1_sized.hpp | 49 + dep/glm/ext/vector_int2.hpp | 18 + dep/glm/ext/vector_int2_sized.hpp | 49 + dep/glm/ext/vector_int3.hpp | 18 + dep/glm/ext/vector_int3_sized.hpp | 49 + dep/glm/ext/vector_int4.hpp | 18 + dep/glm/ext/vector_int4_sized.hpp | 49 + dep/glm/ext/vector_integer.hpp | 149 + dep/glm/ext/vector_integer.inl | 85 + dep/glm/ext/vector_packing.hpp | 32 + dep/glm/ext/vector_packing.inl | 0 dep/glm/ext/vector_relational.hpp | 107 + dep/glm/ext/vector_relational.inl | 75 + dep/glm/ext/vector_uint1.hpp | 32 + dep/glm/ext/vector_uint1_sized.hpp | 49 + dep/glm/ext/vector_uint2.hpp | 18 + dep/glm/ext/vector_uint2_sized.hpp | 49 + dep/glm/ext/vector_uint3.hpp | 18 + dep/glm/ext/vector_uint3_sized.hpp | 49 + dep/glm/ext/vector_uint4.hpp | 18 + dep/glm/ext/vector_uint4_sized.hpp | 49 + dep/glm/ext/vector_ulp.hpp | 109 + dep/glm/ext/vector_ulp.inl | 74 + dep/glm/fwd.hpp | 1233 +++ dep/glm/geometric.hpp | 116 + dep/glm/glm.hpp | 136 + dep/glm/gtc/bitfield.hpp | 266 + dep/glm/gtc/bitfield.inl | 626 ++ dep/glm/gtc/color_space.hpp | 56 + dep/glm/gtc/color_space.inl | 84 + dep/glm/gtc/constants.hpp | 165 + dep/glm/gtc/constants.inl | 167 + dep/glm/gtc/epsilon.hpp | 60 + dep/glm/gtc/epsilon.inl | 80 + dep/glm/gtc/integer.hpp | 65 + dep/glm/gtc/integer.inl | 68 + dep/glm/gtc/matrix_access.hpp | 60 + dep/glm/gtc/matrix_access.inl | 62 + dep/glm/gtc/matrix_integer.hpp | 433 + dep/glm/gtc/matrix_inverse.hpp | 50 + dep/glm/gtc/matrix_inverse.inl | 118 + dep/glm/gtc/matrix_transform.hpp | 36 + dep/glm/gtc/matrix_transform.inl | 3 + dep/glm/gtc/noise.hpp | 61 + dep/glm/gtc/noise.inl | 807 ++ dep/glm/gtc/packing.hpp | 728 ++ dep/glm/gtc/packing.inl | 938 ++ dep/glm/gtc/quaternion.hpp | 173 + dep/glm/gtc/quaternion.inl | 202 + dep/glm/gtc/quaternion_simd.inl | 0 dep/glm/gtc/random.hpp | 82 + dep/glm/gtc/random.inl | 303 + dep/glm/gtc/reciprocal.hpp | 135 + dep/glm/gtc/reciprocal.inl | 191 + dep/glm/gtc/round.hpp | 160 + dep/glm/gtc/round.inl | 155 + dep/glm/gtc/type_aligned.hpp | 1315 +++ dep/glm/gtc/type_precision.hpp | 2094 +++++ dep/glm/gtc/type_precision.inl | 6 + dep/glm/gtc/type_ptr.hpp | 230 + dep/glm/gtc/type_ptr.inl | 386 + dep/glm/gtc/ulp.hpp | 152 + dep/glm/gtc/ulp.inl | 173 + dep/glm/gtc/vec1.hpp | 30 + dep/glm/gtx/associated_min_max.hpp | 207 + dep/glm/gtx/associated_min_max.inl | 354 + dep/glm/gtx/bit.hpp | 98 + dep/glm/gtx/bit.inl | 92 + dep/glm/gtx/closest_point.hpp | 49 + dep/glm/gtx/closest_point.inl | 45 + dep/glm/gtx/color_encoding.hpp | 54 + dep/glm/gtx/color_encoding.inl | 45 + dep/glm/gtx/color_space.hpp | 72 + dep/glm/gtx/color_space.inl | 141 + dep/glm/gtx/color_space_YCoCg.hpp | 60 + dep/glm/gtx/color_space_YCoCg.inl | 107 + dep/glm/gtx/common.hpp | 76 + dep/glm/gtx/common.inl | 125 + dep/glm/gtx/compatibility.hpp | 133 + dep/glm/gtx/compatibility.inl | 62 + dep/glm/gtx/component_wise.hpp | 69 + dep/glm/gtx/component_wise.inl | 127 + dep/glm/gtx/dual_quaternion.hpp | 274 + dep/glm/gtx/dual_quaternion.inl | 352 + dep/glm/gtx/easing.hpp | 219 + dep/glm/gtx/easing.inl | 436 + dep/glm/gtx/euler_angles.hpp | 335 + dep/glm/gtx/euler_angles.inl | 899 ++ dep/glm/gtx/extend.hpp | 42 + dep/glm/gtx/extend.inl | 48 + dep/glm/gtx/extended_min_max.hpp | 137 + dep/glm/gtx/extended_min_max.inl | 138 + dep/glm/gtx/exterior_product.hpp | 45 + dep/glm/gtx/exterior_product.inl | 26 + dep/glm/gtx/fast_exponential.hpp | 95 + dep/glm/gtx/fast_exponential.inl | 136 + dep/glm/gtx/fast_square_root.hpp | 92 + dep/glm/gtx/fast_square_root.inl | 75 + dep/glm/gtx/fast_trigonometry.hpp | 79 + dep/glm/gtx/fast_trigonometry.inl | 142 + dep/glm/gtx/float_notmalize.inl | 13 + dep/glm/gtx/functions.hpp | 56 + dep/glm/gtx/functions.inl | 30 + dep/glm/gtx/gradient_paint.hpp | 53 + dep/glm/gtx/gradient_paint.inl | 36 + dep/glm/gtx/handed_coordinate_space.hpp | 50 + dep/glm/gtx/handed_coordinate_space.inl | 26 + dep/glm/gtx/hash.hpp | 142 + dep/glm/gtx/hash.inl | 184 + dep/glm/gtx/integer.hpp | 76 + dep/glm/gtx/integer.inl | 185 + dep/glm/gtx/intersect.hpp | 92 + dep/glm/gtx/intersect.inl | 200 + dep/glm/gtx/io.hpp | 201 + dep/glm/gtx/io.inl | 440 + dep/glm/gtx/log_base.hpp | 48 + dep/glm/gtx/log_base.inl | 16 + dep/glm/gtx/matrix_cross_product.hpp | 47 + dep/glm/gtx/matrix_cross_product.inl | 37 + dep/glm/gtx/matrix_decompose.hpp | 46 + dep/glm/gtx/matrix_decompose.inl | 186 + dep/glm/gtx/matrix_factorisation.hpp | 69 + dep/glm/gtx/matrix_factorisation.inl | 84 + dep/glm/gtx/matrix_interpolation.hpp | 60 + dep/glm/gtx/matrix_interpolation.inl | 129 + dep/glm/gtx/matrix_major_storage.hpp | 119 + dep/glm/gtx/matrix_major_storage.inl | 166 + dep/glm/gtx/matrix_operation.hpp | 103 + dep/glm/gtx/matrix_operation.inl | 176 + dep/glm/gtx/matrix_query.hpp | 77 + dep/glm/gtx/matrix_query.inl | 113 + dep/glm/gtx/matrix_transform_2d.hpp | 81 + dep/glm/gtx/matrix_transform_2d.inl | 68 + dep/glm/gtx/mixed_product.hpp | 41 + dep/glm/gtx/mixed_product.inl | 15 + dep/glm/gtx/norm.hpp | 88 + dep/glm/gtx/norm.inl | 95 + dep/glm/gtx/normal.hpp | 41 + dep/glm/gtx/normal.inl | 15 + dep/glm/gtx/normalize_dot.hpp | 49 + dep/glm/gtx/normalize_dot.inl | 16 + dep/glm/gtx/number_precision.hpp | 61 + dep/glm/gtx/number_precision.inl | 6 + dep/glm/gtx/optimum_pow.hpp | 54 + dep/glm/gtx/optimum_pow.inl | 22 + dep/glm/gtx/orthonormalize.hpp | 49 + dep/glm/gtx/orthonormalize.inl | 29 + dep/glm/gtx/perpendicular.hpp | 41 + dep/glm/gtx/perpendicular.inl | 10 + dep/glm/gtx/polar_coordinates.hpp | 48 + dep/glm/gtx/polar_coordinates.inl | 36 + dep/glm/gtx/projection.hpp | 43 + dep/glm/gtx/projection.inl | 10 + dep/glm/gtx/quaternion.hpp | 174 + dep/glm/gtx/quaternion.inl | 159 + dep/glm/gtx/range.hpp | 98 + dep/glm/gtx/raw_data.hpp | 51 + dep/glm/gtx/raw_data.inl | 2 + dep/glm/gtx/rotate_normalized_axis.hpp | 68 + dep/glm/gtx/rotate_normalized_axis.inl | 58 + dep/glm/gtx/rotate_vector.hpp | 123 + dep/glm/gtx/rotate_vector.inl | 187 + dep/glm/gtx/scalar_multiplication.hpp | 75 + dep/glm/gtx/scalar_relational.hpp | 36 + dep/glm/gtx/scalar_relational.inl | 88 + dep/glm/gtx/spline.hpp | 65 + dep/glm/gtx/spline.inl | 60 + dep/glm/gtx/std_based_type.hpp | 68 + dep/glm/gtx/std_based_type.inl | 6 + dep/glm/gtx/string_cast.hpp | 52 + dep/glm/gtx/string_cast.inl | 492 + dep/glm/gtx/texture.hpp | 46 + dep/glm/gtx/texture.inl | 17 + dep/glm/gtx/transform.hpp | 60 + dep/glm/gtx/transform.inl | 23 + dep/glm/gtx/transform2.hpp | 89 + dep/glm/gtx/transform2.inl | 125 + dep/glm/gtx/type_aligned.hpp | 982 ++ dep/glm/gtx/type_aligned.inl | 6 + dep/glm/gtx/type_trait.hpp | 85 + dep/glm/gtx/type_trait.inl | 61 + dep/glm/gtx/vec_swizzle.hpp | 2782 ++++++ dep/glm/gtx/vector_angle.hpp | 57 + dep/glm/gtx/vector_angle.inl | 44 + dep/glm/gtx/vector_query.hpp | 66 + dep/glm/gtx/vector_query.inl | 154 + dep/glm/gtx/wrap.hpp | 37 + dep/glm/gtx/wrap.inl | 6 + dep/glm/integer.hpp | 212 + dep/glm/mat2x2.hpp | 9 + dep/glm/mat2x3.hpp | 9 + dep/glm/mat2x4.hpp | 9 + dep/glm/mat3x2.hpp | 9 + dep/glm/mat3x3.hpp | 8 + dep/glm/mat3x4.hpp | 8 + dep/glm/mat4x2.hpp | 9 + dep/glm/mat4x3.hpp | 8 + dep/glm/mat4x4.hpp | 9 + dep/glm/matrix.hpp | 161 + dep/glm/packing.hpp | 173 + dep/glm/simd/common.h | 240 + dep/glm/simd/exponential.h | 20 + dep/glm/simd/geometric.h | 124 + dep/glm/simd/integer.h | 115 + dep/glm/simd/matrix.h | 1028 +++ dep/glm/simd/neon.h | 155 + dep/glm/simd/packing.h | 8 + dep/glm/simd/platform.h | 398 + dep/glm/simd/trigonometric.h | 9 + dep/glm/simd/vector_relational.h | 8 + dep/glm/trigonometric.hpp | 210 + dep/glm/vec2.hpp | 14 + dep/glm/vec3.hpp | 14 + dep/glm/vec4.hpp | 15 + dep/glm/vector_relational.hpp | 121 + dep/stb_image.h | 7985 +++++++++++++++++ funcs.cpp | 11 + include/funcs.h | 6 + include/shader.h | 18 + main.cpp | 121 + opengl.pdf - Shortcut.lnk | Bin 0 -> 1206 bytes shad/frag.fs | 15 + shad/vert.vs | 16 + shader.cpp | 77 + 701 files changed, 96167 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 CMakeLists.txt create mode 100644 assets/awesomeface.png create mode 100644 assets/wall.jpg create mode 100644 build/.cmake/api/v1/query/client-vscode/query.json create mode 100644 build/.cmake/api/v1/reply/cache-v2-ea31c3cf31d456df230b.json create mode 100644 build/.cmake/api/v1/reply/cmakeFiles-v1-a4977e1577f53f411141.json create mode 100644 build/.cmake/api/v1/reply/codemodel-v2-b9a1872db70d346db780.json create mode 100644 build/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json create mode 100644 build/.cmake/api/v1/reply/index-2024-01-14T18-20-18-0299.json create mode 100644 build/.cmake/api/v1/reply/target-Continuous-Debug-cf03795cec8cf1d33622.json create mode 100644 build/.cmake/api/v1/reply/target-ContinuousBuild-Debug-8c197916d5a196460a70.json create mode 100644 build/.cmake/api/v1/reply/target-ContinuousConfigure-Debug-5878313f94209419cf56.json create mode 100644 build/.cmake/api/v1/reply/target-ContinuousCoverage-Debug-014248b7f5cc85c06d84.json create mode 100644 build/.cmake/api/v1/reply/target-ContinuousMemCheck-Debug-42cd2c562848850710f0.json create mode 100644 build/.cmake/api/v1/reply/target-ContinuousStart-Debug-0be790493f30a7f8328a.json create mode 100644 build/.cmake/api/v1/reply/target-ContinuousSubmit-Debug-47443a2d325a180bd9c3.json create mode 100644 build/.cmake/api/v1/reply/target-ContinuousTest-Debug-b4ad8b056fc8b549ac6e.json create mode 100644 build/.cmake/api/v1/reply/target-ContinuousUpdate-Debug-425115cf175af89a21d4.json create mode 100644 build/.cmake/api/v1/reply/target-Experimental-Debug-5290bc076cd2d600449b.json create mode 100644 build/.cmake/api/v1/reply/target-ExperimentalBuild-Debug-a3d2f82de9e911e3105e.json create mode 100644 build/.cmake/api/v1/reply/target-ExperimentalConfigure-Debug-129e7f8244d240ef7b0a.json create mode 100644 build/.cmake/api/v1/reply/target-ExperimentalCoverage-Debug-4c127654617865f623ab.json create mode 100644 build/.cmake/api/v1/reply/target-ExperimentalMemCheck-Debug-afda3dd70f2091cd6d8a.json create mode 100644 build/.cmake/api/v1/reply/target-ExperimentalStart-Debug-060fadf57e93ff956dee.json create mode 100644 build/.cmake/api/v1/reply/target-ExperimentalSubmit-Debug-256184777f5dce9a6dc7.json create mode 100644 build/.cmake/api/v1/reply/target-ExperimentalTest-Debug-9b5a332d5bbd606e1154.json create mode 100644 build/.cmake/api/v1/reply/target-ExperimentalUpdate-Debug-cd17e68d94c51653532a.json create mode 100644 build/.cmake/api/v1/reply/target-GraphicsTest-Debug-ea0a998cccfe2e6e4023.json create mode 100644 build/.cmake/api/v1/reply/target-Nightly-Debug-8dd20071dc1840f4a657.json create mode 100644 build/.cmake/api/v1/reply/target-NightlyBuild-Debug-a805b907e72c7603d5af.json create mode 100644 build/.cmake/api/v1/reply/target-NightlyConfigure-Debug-82faf67b49b0283d29a2.json create mode 100644 build/.cmake/api/v1/reply/target-NightlyCoverage-Debug-f4dd596154ca43a53f17.json create mode 100644 build/.cmake/api/v1/reply/target-NightlyMemCheck-Debug-f5546854fee7443f4e90.json create mode 100644 build/.cmake/api/v1/reply/target-NightlyMemoryCheck-Debug-069d28ec4b91fdcc3dd0.json create mode 100644 build/.cmake/api/v1/reply/target-NightlyStart-Debug-25a2575162593527d92c.json create mode 100644 build/.cmake/api/v1/reply/target-NightlySubmit-Debug-2c5f1b197a61e5d2f7d8.json create mode 100644 build/.cmake/api/v1/reply/target-NightlyTest-Debug-e10ecd01260bfb23e81a.json create mode 100644 build/.cmake/api/v1/reply/target-NightlyUpdate-Debug-aefebc1d49de86a4fc61.json create mode 100644 build/.cmake/api/v1/reply/toolchains-v1-e719e28fe32911e094f8.json create mode 100644 build/CMakeCache.txt create mode 100644 build/CMakeFiles/3.28.1/CMakeCCompiler.cmake create mode 100644 build/CMakeFiles/3.28.1/CMakeCXXCompiler.cmake create mode 100644 build/CMakeFiles/3.28.1/CMakeDetermineCompilerABI_C.bin create mode 100644 build/CMakeFiles/3.28.1/CMakeDetermineCompilerABI_CXX.bin create mode 100644 build/CMakeFiles/3.28.1/CMakeRCCompiler.cmake create mode 100644 build/CMakeFiles/3.28.1/CMakeSystem.cmake create mode 100644 build/CMakeFiles/3.28.1/CompilerIdC/CMakeCCompilerId.c create mode 100644 build/CMakeFiles/3.28.1/CompilerIdC/a.exe create mode 100644 build/CMakeFiles/3.28.1/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100644 build/CMakeFiles/3.28.1/CompilerIdCXX/a.exe create mode 100644 build/CMakeFiles/CMakeConfigureLog.yaml create mode 100644 build/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 build/CMakeFiles/CMakeRuleHashes.txt create mode 100644 build/CMakeFiles/Continuous.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/Continuous.dir/build.make create mode 100644 build/CMakeFiles/Continuous.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/Continuous.dir/compiler_depend.make create mode 100644 build/CMakeFiles/Continuous.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/Continuous.dir/progress.make create mode 100644 build/CMakeFiles/ContinuousBuild.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ContinuousBuild.dir/build.make create mode 100644 build/CMakeFiles/ContinuousBuild.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ContinuousBuild.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ContinuousBuild.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ContinuousBuild.dir/progress.make create mode 100644 build/CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ContinuousConfigure.dir/build.make create mode 100644 build/CMakeFiles/ContinuousConfigure.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ContinuousConfigure.dir/progress.make create mode 100644 build/CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ContinuousCoverage.dir/build.make create mode 100644 build/CMakeFiles/ContinuousCoverage.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ContinuousCoverage.dir/progress.make create mode 100644 build/CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ContinuousMemCheck.dir/build.make create mode 100644 build/CMakeFiles/ContinuousMemCheck.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ContinuousMemCheck.dir/progress.make create mode 100644 build/CMakeFiles/ContinuousStart.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ContinuousStart.dir/build.make create mode 100644 build/CMakeFiles/ContinuousStart.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ContinuousStart.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ContinuousStart.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ContinuousStart.dir/progress.make create mode 100644 build/CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ContinuousSubmit.dir/build.make create mode 100644 build/CMakeFiles/ContinuousSubmit.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ContinuousSubmit.dir/progress.make create mode 100644 build/CMakeFiles/ContinuousTest.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ContinuousTest.dir/build.make create mode 100644 build/CMakeFiles/ContinuousTest.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ContinuousTest.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ContinuousTest.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ContinuousTest.dir/progress.make create mode 100644 build/CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ContinuousUpdate.dir/build.make create mode 100644 build/CMakeFiles/ContinuousUpdate.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ContinuousUpdate.dir/progress.make create mode 100644 build/CMakeFiles/Experimental.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/Experimental.dir/build.make create mode 100644 build/CMakeFiles/Experimental.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/Experimental.dir/compiler_depend.make create mode 100644 build/CMakeFiles/Experimental.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/Experimental.dir/progress.make create mode 100644 build/CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ExperimentalBuild.dir/build.make create mode 100644 build/CMakeFiles/ExperimentalBuild.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ExperimentalBuild.dir/progress.make create mode 100644 build/CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ExperimentalConfigure.dir/build.make create mode 100644 build/CMakeFiles/ExperimentalConfigure.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ExperimentalConfigure.dir/progress.make create mode 100644 build/CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ExperimentalCoverage.dir/build.make create mode 100644 build/CMakeFiles/ExperimentalCoverage.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ExperimentalCoverage.dir/progress.make create mode 100644 build/CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ExperimentalMemCheck.dir/build.make create mode 100644 build/CMakeFiles/ExperimentalMemCheck.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ExperimentalMemCheck.dir/progress.make create mode 100644 build/CMakeFiles/ExperimentalStart.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ExperimentalStart.dir/build.make create mode 100644 build/CMakeFiles/ExperimentalStart.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ExperimentalStart.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ExperimentalStart.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ExperimentalStart.dir/progress.make create mode 100644 build/CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ExperimentalSubmit.dir/build.make create mode 100644 build/CMakeFiles/ExperimentalSubmit.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ExperimentalSubmit.dir/progress.make create mode 100644 build/CMakeFiles/ExperimentalTest.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ExperimentalTest.dir/build.make create mode 100644 build/CMakeFiles/ExperimentalTest.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ExperimentalTest.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ExperimentalTest.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ExperimentalTest.dir/progress.make create mode 100644 build/CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/ExperimentalUpdate.dir/build.make create mode 100644 build/CMakeFiles/ExperimentalUpdate.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.make create mode 100644 build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/ExperimentalUpdate.dir/progress.make create mode 100644 build/CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj create mode 100644 build/CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj.d create mode 100644 build/CMakeFiles/GraphicsTest.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/GraphicsTest.dir/build.make create mode 100644 build/CMakeFiles/GraphicsTest.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/GraphicsTest.dir/compiler_depend.make create mode 100644 build/CMakeFiles/GraphicsTest.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/GraphicsTest.dir/depend.make create mode 100644 build/CMakeFiles/GraphicsTest.dir/flags.make create mode 100644 build/CMakeFiles/GraphicsTest.dir/funcs.cpp.obj create mode 100644 build/CMakeFiles/GraphicsTest.dir/funcs.cpp.obj.d create mode 100644 build/CMakeFiles/GraphicsTest.dir/includes_C.rsp create mode 100644 build/CMakeFiles/GraphicsTest.dir/includes_CXX.rsp create mode 100644 build/CMakeFiles/GraphicsTest.dir/link.txt create mode 100644 build/CMakeFiles/GraphicsTest.dir/linkLibs.rsp create mode 100644 build/CMakeFiles/GraphicsTest.dir/main.cpp.obj create mode 100644 build/CMakeFiles/GraphicsTest.dir/main.cpp.obj.d create mode 100644 build/CMakeFiles/GraphicsTest.dir/objects.a create mode 100644 build/CMakeFiles/GraphicsTest.dir/objects1.rsp create mode 100644 build/CMakeFiles/GraphicsTest.dir/progress.make create mode 100644 build/CMakeFiles/GraphicsTest.dir/shader.cpp.obj create mode 100644 build/CMakeFiles/GraphicsTest.dir/shader.cpp.obj.d create mode 100644 build/CMakeFiles/Makefile.cmake create mode 100644 build/CMakeFiles/Makefile2 create mode 100644 build/CMakeFiles/Nightly.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/Nightly.dir/build.make create mode 100644 build/CMakeFiles/Nightly.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/Nightly.dir/compiler_depend.make create mode 100644 build/CMakeFiles/Nightly.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/Nightly.dir/progress.make create mode 100644 build/CMakeFiles/NightlyBuild.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/NightlyBuild.dir/build.make create mode 100644 build/CMakeFiles/NightlyBuild.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/NightlyBuild.dir/compiler_depend.make create mode 100644 build/CMakeFiles/NightlyBuild.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/NightlyBuild.dir/progress.make create mode 100644 build/CMakeFiles/NightlyConfigure.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/NightlyConfigure.dir/build.make create mode 100644 build/CMakeFiles/NightlyConfigure.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/NightlyConfigure.dir/compiler_depend.make create mode 100644 build/CMakeFiles/NightlyConfigure.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/NightlyConfigure.dir/progress.make create mode 100644 build/CMakeFiles/NightlyCoverage.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/NightlyCoverage.dir/build.make create mode 100644 build/CMakeFiles/NightlyCoverage.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/NightlyCoverage.dir/compiler_depend.make create mode 100644 build/CMakeFiles/NightlyCoverage.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/NightlyCoverage.dir/progress.make create mode 100644 build/CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/NightlyMemCheck.dir/build.make create mode 100644 build/CMakeFiles/NightlyMemCheck.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.make create mode 100644 build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/NightlyMemCheck.dir/progress.make create mode 100644 build/CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/NightlyMemoryCheck.dir/build.make create mode 100644 build/CMakeFiles/NightlyMemoryCheck.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.make create mode 100644 build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/NightlyMemoryCheck.dir/progress.make create mode 100644 build/CMakeFiles/NightlyStart.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/NightlyStart.dir/build.make create mode 100644 build/CMakeFiles/NightlyStart.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/NightlyStart.dir/compiler_depend.make create mode 100644 build/CMakeFiles/NightlyStart.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/NightlyStart.dir/progress.make create mode 100644 build/CMakeFiles/NightlySubmit.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/NightlySubmit.dir/build.make create mode 100644 build/CMakeFiles/NightlySubmit.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/NightlySubmit.dir/compiler_depend.make create mode 100644 build/CMakeFiles/NightlySubmit.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/NightlySubmit.dir/progress.make create mode 100644 build/CMakeFiles/NightlyTest.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/NightlyTest.dir/build.make create mode 100644 build/CMakeFiles/NightlyTest.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/NightlyTest.dir/compiler_depend.make create mode 100644 build/CMakeFiles/NightlyTest.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/NightlyTest.dir/progress.make create mode 100644 build/CMakeFiles/NightlyUpdate.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/NightlyUpdate.dir/build.make create mode 100644 build/CMakeFiles/NightlyUpdate.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/NightlyUpdate.dir/compiler_depend.make create mode 100644 build/CMakeFiles/NightlyUpdate.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/NightlyUpdate.dir/progress.make create mode 100644 build/CMakeFiles/TargetDirectories.txt create mode 100644 build/CMakeFiles/cmake.check_cache create mode 100644 build/CMakeFiles/progress.marks create mode 100644 build/CPackConfig.cmake create mode 100644 build/CPackSourceConfig.cmake create mode 100644 build/CTestTestfile.cmake create mode 100644 build/DartConfiguration.tcl create mode 100644 build/GraphicsTest.exe create mode 100644 build/Makefile create mode 100644 build/Testing/20231226-0809/Test.xml create mode 100644 build/Testing/20231227-0946/Test.xml create mode 100644 build/Testing/20231228-1823/Test.xml create mode 100644 build/Testing/20240114-1820/Test.xml create mode 100644 build/Testing/TAG create mode 100644 build/Testing/Temporary/LastTest_20231226-0809.log create mode 100644 build/Testing/Temporary/LastTest_20231227-0946.log create mode 100644 build/Testing/Temporary/LastTest_20231228-1823.log create mode 100644 build/Testing/Temporary/LastTest_20240114-1820.log create mode 100644 build/awesomeface.png create mode 100644 build/cmake_install.cmake create mode 100644 build/compile_commands.json create mode 100644 build/wall.jpg create mode 100644 data.cpp create mode 100644 dep/GLFW/glfw3.h create mode 100644 dep/GLFW/glfw3native.h create mode 100644 dep/glad/glad.h create mode 100644 dep/glm/CMakeLists.txt create mode 100644 dep/glm/common.hpp create mode 100644 dep/glm/detail/_features.hpp create mode 100644 dep/glm/detail/_fixes.hpp create mode 100644 dep/glm/detail/_noise.hpp create mode 100644 dep/glm/detail/_swizzle.hpp create mode 100644 dep/glm/detail/_swizzle_func.hpp create mode 100644 dep/glm/detail/_vectorize.hpp create mode 100644 dep/glm/detail/compute_common.hpp create mode 100644 dep/glm/detail/compute_vector_relational.hpp create mode 100644 dep/glm/detail/func_common.inl create mode 100644 dep/glm/detail/func_common_simd.inl create mode 100644 dep/glm/detail/func_exponential.inl create mode 100644 dep/glm/detail/func_exponential_simd.inl create mode 100644 dep/glm/detail/func_geometric.inl create mode 100644 dep/glm/detail/func_geometric_simd.inl create mode 100644 dep/glm/detail/func_integer.inl create mode 100644 dep/glm/detail/func_integer_simd.inl create mode 100644 dep/glm/detail/func_matrix.inl create mode 100644 dep/glm/detail/func_matrix_simd.inl create mode 100644 dep/glm/detail/func_packing.inl create mode 100644 dep/glm/detail/func_packing_simd.inl create mode 100644 dep/glm/detail/func_trigonometric.inl create mode 100644 dep/glm/detail/func_trigonometric_simd.inl create mode 100644 dep/glm/detail/func_vector_relational.inl create mode 100644 dep/glm/detail/func_vector_relational_simd.inl create mode 100644 dep/glm/detail/glm.cpp create mode 100644 dep/glm/detail/qualifier.hpp create mode 100644 dep/glm/detail/setup.hpp create mode 100644 dep/glm/detail/type_float.hpp create mode 100644 dep/glm/detail/type_half.hpp create mode 100644 dep/glm/detail/type_half.inl create mode 100644 dep/glm/detail/type_mat2x2.hpp create mode 100644 dep/glm/detail/type_mat2x2.inl create mode 100644 dep/glm/detail/type_mat2x3.hpp create mode 100644 dep/glm/detail/type_mat2x3.inl create mode 100644 dep/glm/detail/type_mat2x4.hpp create mode 100644 dep/glm/detail/type_mat2x4.inl create mode 100644 dep/glm/detail/type_mat3x2.hpp create mode 100644 dep/glm/detail/type_mat3x2.inl create mode 100644 dep/glm/detail/type_mat3x3.hpp create mode 100644 dep/glm/detail/type_mat3x3.inl create mode 100644 dep/glm/detail/type_mat3x4.hpp create mode 100644 dep/glm/detail/type_mat3x4.inl create mode 100644 dep/glm/detail/type_mat4x2.hpp create mode 100644 dep/glm/detail/type_mat4x2.inl create mode 100644 dep/glm/detail/type_mat4x3.hpp create mode 100644 dep/glm/detail/type_mat4x3.inl create mode 100644 dep/glm/detail/type_mat4x4.hpp create mode 100644 dep/glm/detail/type_mat4x4.inl create mode 100644 dep/glm/detail/type_mat4x4_simd.inl create mode 100644 dep/glm/detail/type_quat.hpp create mode 100644 dep/glm/detail/type_quat.inl create mode 100644 dep/glm/detail/type_quat_simd.inl create mode 100644 dep/glm/detail/type_vec1.hpp create mode 100644 dep/glm/detail/type_vec1.inl create mode 100644 dep/glm/detail/type_vec2.hpp create mode 100644 dep/glm/detail/type_vec2.inl create mode 100644 dep/glm/detail/type_vec3.hpp create mode 100644 dep/glm/detail/type_vec3.inl create mode 100644 dep/glm/detail/type_vec4.hpp create mode 100644 dep/glm/detail/type_vec4.inl create mode 100644 dep/glm/detail/type_vec4_simd.inl create mode 100644 dep/glm/exponential.hpp create mode 100644 dep/glm/ext.hpp create mode 100644 dep/glm/ext/matrix_clip_space.hpp create mode 100644 dep/glm/ext/matrix_clip_space.inl create mode 100644 dep/glm/ext/matrix_common.hpp create mode 100644 dep/glm/ext/matrix_common.inl create mode 100644 dep/glm/ext/matrix_double2x2.hpp create mode 100644 dep/glm/ext/matrix_double2x2_precision.hpp create mode 100644 dep/glm/ext/matrix_double2x3.hpp create mode 100644 dep/glm/ext/matrix_double2x3_precision.hpp create mode 100644 dep/glm/ext/matrix_double2x4.hpp create mode 100644 dep/glm/ext/matrix_double2x4_precision.hpp create mode 100644 dep/glm/ext/matrix_double3x2.hpp create mode 100644 dep/glm/ext/matrix_double3x2_precision.hpp create mode 100644 dep/glm/ext/matrix_double3x3.hpp create mode 100644 dep/glm/ext/matrix_double3x3_precision.hpp create mode 100644 dep/glm/ext/matrix_double3x4.hpp create mode 100644 dep/glm/ext/matrix_double3x4_precision.hpp create mode 100644 dep/glm/ext/matrix_double4x2.hpp create mode 100644 dep/glm/ext/matrix_double4x2_precision.hpp create mode 100644 dep/glm/ext/matrix_double4x3.hpp create mode 100644 dep/glm/ext/matrix_double4x3_precision.hpp create mode 100644 dep/glm/ext/matrix_double4x4.hpp create mode 100644 dep/glm/ext/matrix_double4x4_precision.hpp create mode 100644 dep/glm/ext/matrix_float2x2.hpp create mode 100644 dep/glm/ext/matrix_float2x2_precision.hpp create mode 100644 dep/glm/ext/matrix_float2x3.hpp create mode 100644 dep/glm/ext/matrix_float2x3_precision.hpp create mode 100644 dep/glm/ext/matrix_float2x4.hpp create mode 100644 dep/glm/ext/matrix_float2x4_precision.hpp create mode 100644 dep/glm/ext/matrix_float3x2.hpp create mode 100644 dep/glm/ext/matrix_float3x2_precision.hpp create mode 100644 dep/glm/ext/matrix_float3x3.hpp create mode 100644 dep/glm/ext/matrix_float3x3_precision.hpp create mode 100644 dep/glm/ext/matrix_float3x4.hpp create mode 100644 dep/glm/ext/matrix_float3x4_precision.hpp create mode 100644 dep/glm/ext/matrix_float4x2.hpp create mode 100644 dep/glm/ext/matrix_float4x2_precision.hpp create mode 100644 dep/glm/ext/matrix_float4x3.hpp create mode 100644 dep/glm/ext/matrix_float4x3_precision.hpp create mode 100644 dep/glm/ext/matrix_float4x4.hpp create mode 100644 dep/glm/ext/matrix_float4x4_precision.hpp create mode 100644 dep/glm/ext/matrix_int2x2.hpp create mode 100644 dep/glm/ext/matrix_int2x2_sized.hpp create mode 100644 dep/glm/ext/matrix_int2x3.hpp create mode 100644 dep/glm/ext/matrix_int2x3_sized.hpp create mode 100644 dep/glm/ext/matrix_int2x4.hpp create mode 100644 dep/glm/ext/matrix_int2x4_sized.hpp create mode 100644 dep/glm/ext/matrix_int3x2.hpp create mode 100644 dep/glm/ext/matrix_int3x2_sized.hpp create mode 100644 dep/glm/ext/matrix_int3x3.hpp create mode 100644 dep/glm/ext/matrix_int3x3_sized.hpp create mode 100644 dep/glm/ext/matrix_int3x4.hpp create mode 100644 dep/glm/ext/matrix_int3x4_sized.hpp create mode 100644 dep/glm/ext/matrix_int4x2.hpp create mode 100644 dep/glm/ext/matrix_int4x2_sized.hpp create mode 100644 dep/glm/ext/matrix_int4x3.hpp create mode 100644 dep/glm/ext/matrix_int4x3_sized.hpp create mode 100644 dep/glm/ext/matrix_int4x4.hpp create mode 100644 dep/glm/ext/matrix_int4x4_sized.hpp create mode 100644 dep/glm/ext/matrix_projection.hpp create mode 100644 dep/glm/ext/matrix_projection.inl create mode 100644 dep/glm/ext/matrix_relational.hpp create mode 100644 dep/glm/ext/matrix_relational.inl create mode 100644 dep/glm/ext/matrix_transform.hpp create mode 100644 dep/glm/ext/matrix_transform.inl create mode 100644 dep/glm/ext/matrix_uint2x2.hpp create mode 100644 dep/glm/ext/matrix_uint2x2_sized.hpp create mode 100644 dep/glm/ext/matrix_uint2x3.hpp create mode 100644 dep/glm/ext/matrix_uint2x3_sized.hpp create mode 100644 dep/glm/ext/matrix_uint2x4.hpp create mode 100644 dep/glm/ext/matrix_uint2x4_sized.hpp create mode 100644 dep/glm/ext/matrix_uint3x2.hpp create mode 100644 dep/glm/ext/matrix_uint3x2_sized.hpp create mode 100644 dep/glm/ext/matrix_uint3x3.hpp create mode 100644 dep/glm/ext/matrix_uint3x3_sized.hpp create mode 100644 dep/glm/ext/matrix_uint3x4.hpp create mode 100644 dep/glm/ext/matrix_uint3x4_sized.hpp create mode 100644 dep/glm/ext/matrix_uint4x2.hpp create mode 100644 dep/glm/ext/matrix_uint4x2_sized.hpp create mode 100644 dep/glm/ext/matrix_uint4x3.hpp create mode 100644 dep/glm/ext/matrix_uint4x3_sized.hpp create mode 100644 dep/glm/ext/matrix_uint4x4.hpp create mode 100644 dep/glm/ext/matrix_uint4x4_sized.hpp create mode 100644 dep/glm/ext/quaternion_common.hpp create mode 100644 dep/glm/ext/quaternion_common.inl create mode 100644 dep/glm/ext/quaternion_common_simd.inl create mode 100644 dep/glm/ext/quaternion_double.hpp create mode 100644 dep/glm/ext/quaternion_double_precision.hpp create mode 100644 dep/glm/ext/quaternion_exponential.hpp create mode 100644 dep/glm/ext/quaternion_exponential.inl create mode 100644 dep/glm/ext/quaternion_float.hpp create mode 100644 dep/glm/ext/quaternion_float_precision.hpp create mode 100644 dep/glm/ext/quaternion_geometric.hpp create mode 100644 dep/glm/ext/quaternion_geometric.inl create mode 100644 dep/glm/ext/quaternion_relational.hpp create mode 100644 dep/glm/ext/quaternion_relational.inl create mode 100644 dep/glm/ext/quaternion_transform.hpp create mode 100644 dep/glm/ext/quaternion_transform.inl create mode 100644 dep/glm/ext/quaternion_trigonometric.hpp create mode 100644 dep/glm/ext/quaternion_trigonometric.inl create mode 100644 dep/glm/ext/scalar_common.hpp create mode 100644 dep/glm/ext/scalar_common.inl create mode 100644 dep/glm/ext/scalar_constants.hpp create mode 100644 dep/glm/ext/scalar_constants.inl create mode 100644 dep/glm/ext/scalar_int_sized.hpp create mode 100644 dep/glm/ext/scalar_integer.hpp create mode 100644 dep/glm/ext/scalar_integer.inl create mode 100644 dep/glm/ext/scalar_packing.hpp create mode 100644 dep/glm/ext/scalar_packing.inl create mode 100644 dep/glm/ext/scalar_relational.hpp create mode 100644 dep/glm/ext/scalar_relational.inl create mode 100644 dep/glm/ext/scalar_uint_sized.hpp create mode 100644 dep/glm/ext/scalar_ulp.hpp create mode 100644 dep/glm/ext/scalar_ulp.inl create mode 100644 dep/glm/ext/vector_bool1.hpp create mode 100644 dep/glm/ext/vector_bool1_precision.hpp create mode 100644 dep/glm/ext/vector_bool2.hpp create mode 100644 dep/glm/ext/vector_bool2_precision.hpp create mode 100644 dep/glm/ext/vector_bool3.hpp create mode 100644 dep/glm/ext/vector_bool3_precision.hpp create mode 100644 dep/glm/ext/vector_bool4.hpp create mode 100644 dep/glm/ext/vector_bool4_precision.hpp create mode 100644 dep/glm/ext/vector_common.hpp create mode 100644 dep/glm/ext/vector_common.inl create mode 100644 dep/glm/ext/vector_double1.hpp create mode 100644 dep/glm/ext/vector_double1_precision.hpp create mode 100644 dep/glm/ext/vector_double2.hpp create mode 100644 dep/glm/ext/vector_double2_precision.hpp create mode 100644 dep/glm/ext/vector_double3.hpp create mode 100644 dep/glm/ext/vector_double3_precision.hpp create mode 100644 dep/glm/ext/vector_double4.hpp create mode 100644 dep/glm/ext/vector_double4_precision.hpp create mode 100644 dep/glm/ext/vector_float1.hpp create mode 100644 dep/glm/ext/vector_float1_precision.hpp create mode 100644 dep/glm/ext/vector_float2.hpp create mode 100644 dep/glm/ext/vector_float2_precision.hpp create mode 100644 dep/glm/ext/vector_float3.hpp create mode 100644 dep/glm/ext/vector_float3_precision.hpp create mode 100644 dep/glm/ext/vector_float4.hpp create mode 100644 dep/glm/ext/vector_float4_precision.hpp create mode 100644 dep/glm/ext/vector_int1.hpp create mode 100644 dep/glm/ext/vector_int1_sized.hpp create mode 100644 dep/glm/ext/vector_int2.hpp create mode 100644 dep/glm/ext/vector_int2_sized.hpp create mode 100644 dep/glm/ext/vector_int3.hpp create mode 100644 dep/glm/ext/vector_int3_sized.hpp create mode 100644 dep/glm/ext/vector_int4.hpp create mode 100644 dep/glm/ext/vector_int4_sized.hpp create mode 100644 dep/glm/ext/vector_integer.hpp create mode 100644 dep/glm/ext/vector_integer.inl create mode 100644 dep/glm/ext/vector_packing.hpp create mode 100644 dep/glm/ext/vector_packing.inl create mode 100644 dep/glm/ext/vector_relational.hpp create mode 100644 dep/glm/ext/vector_relational.inl create mode 100644 dep/glm/ext/vector_uint1.hpp create mode 100644 dep/glm/ext/vector_uint1_sized.hpp create mode 100644 dep/glm/ext/vector_uint2.hpp create mode 100644 dep/glm/ext/vector_uint2_sized.hpp create mode 100644 dep/glm/ext/vector_uint3.hpp create mode 100644 dep/glm/ext/vector_uint3_sized.hpp create mode 100644 dep/glm/ext/vector_uint4.hpp create mode 100644 dep/glm/ext/vector_uint4_sized.hpp create mode 100644 dep/glm/ext/vector_ulp.hpp create mode 100644 dep/glm/ext/vector_ulp.inl create mode 100644 dep/glm/fwd.hpp create mode 100644 dep/glm/geometric.hpp create mode 100644 dep/glm/glm.hpp create mode 100644 dep/glm/gtc/bitfield.hpp create mode 100644 dep/glm/gtc/bitfield.inl create mode 100644 dep/glm/gtc/color_space.hpp create mode 100644 dep/glm/gtc/color_space.inl create mode 100644 dep/glm/gtc/constants.hpp create mode 100644 dep/glm/gtc/constants.inl create mode 100644 dep/glm/gtc/epsilon.hpp create mode 100644 dep/glm/gtc/epsilon.inl create mode 100644 dep/glm/gtc/integer.hpp create mode 100644 dep/glm/gtc/integer.inl create mode 100644 dep/glm/gtc/matrix_access.hpp create mode 100644 dep/glm/gtc/matrix_access.inl create mode 100644 dep/glm/gtc/matrix_integer.hpp create mode 100644 dep/glm/gtc/matrix_inverse.hpp create mode 100644 dep/glm/gtc/matrix_inverse.inl create mode 100644 dep/glm/gtc/matrix_transform.hpp create mode 100644 dep/glm/gtc/matrix_transform.inl create mode 100644 dep/glm/gtc/noise.hpp create mode 100644 dep/glm/gtc/noise.inl create mode 100644 dep/glm/gtc/packing.hpp create mode 100644 dep/glm/gtc/packing.inl create mode 100644 dep/glm/gtc/quaternion.hpp create mode 100644 dep/glm/gtc/quaternion.inl create mode 100644 dep/glm/gtc/quaternion_simd.inl create mode 100644 dep/glm/gtc/random.hpp create mode 100644 dep/glm/gtc/random.inl create mode 100644 dep/glm/gtc/reciprocal.hpp create mode 100644 dep/glm/gtc/reciprocal.inl create mode 100644 dep/glm/gtc/round.hpp create mode 100644 dep/glm/gtc/round.inl create mode 100644 dep/glm/gtc/type_aligned.hpp create mode 100644 dep/glm/gtc/type_precision.hpp create mode 100644 dep/glm/gtc/type_precision.inl create mode 100644 dep/glm/gtc/type_ptr.hpp create mode 100644 dep/glm/gtc/type_ptr.inl create mode 100644 dep/glm/gtc/ulp.hpp create mode 100644 dep/glm/gtc/ulp.inl create mode 100644 dep/glm/gtc/vec1.hpp create mode 100644 dep/glm/gtx/associated_min_max.hpp create mode 100644 dep/glm/gtx/associated_min_max.inl create mode 100644 dep/glm/gtx/bit.hpp create mode 100644 dep/glm/gtx/bit.inl create mode 100644 dep/glm/gtx/closest_point.hpp create mode 100644 dep/glm/gtx/closest_point.inl create mode 100644 dep/glm/gtx/color_encoding.hpp create mode 100644 dep/glm/gtx/color_encoding.inl create mode 100644 dep/glm/gtx/color_space.hpp create mode 100644 dep/glm/gtx/color_space.inl create mode 100644 dep/glm/gtx/color_space_YCoCg.hpp create mode 100644 dep/glm/gtx/color_space_YCoCg.inl create mode 100644 dep/glm/gtx/common.hpp create mode 100644 dep/glm/gtx/common.inl create mode 100644 dep/glm/gtx/compatibility.hpp create mode 100644 dep/glm/gtx/compatibility.inl create mode 100644 dep/glm/gtx/component_wise.hpp create mode 100644 dep/glm/gtx/component_wise.inl create mode 100644 dep/glm/gtx/dual_quaternion.hpp create mode 100644 dep/glm/gtx/dual_quaternion.inl create mode 100644 dep/glm/gtx/easing.hpp create mode 100644 dep/glm/gtx/easing.inl create mode 100644 dep/glm/gtx/euler_angles.hpp create mode 100644 dep/glm/gtx/euler_angles.inl create mode 100644 dep/glm/gtx/extend.hpp create mode 100644 dep/glm/gtx/extend.inl create mode 100644 dep/glm/gtx/extended_min_max.hpp create mode 100644 dep/glm/gtx/extended_min_max.inl create mode 100644 dep/glm/gtx/exterior_product.hpp create mode 100644 dep/glm/gtx/exterior_product.inl create mode 100644 dep/glm/gtx/fast_exponential.hpp create mode 100644 dep/glm/gtx/fast_exponential.inl create mode 100644 dep/glm/gtx/fast_square_root.hpp create mode 100644 dep/glm/gtx/fast_square_root.inl create mode 100644 dep/glm/gtx/fast_trigonometry.hpp create mode 100644 dep/glm/gtx/fast_trigonometry.inl create mode 100644 dep/glm/gtx/float_notmalize.inl create mode 100644 dep/glm/gtx/functions.hpp create mode 100644 dep/glm/gtx/functions.inl create mode 100644 dep/glm/gtx/gradient_paint.hpp create mode 100644 dep/glm/gtx/gradient_paint.inl create mode 100644 dep/glm/gtx/handed_coordinate_space.hpp create mode 100644 dep/glm/gtx/handed_coordinate_space.inl create mode 100644 dep/glm/gtx/hash.hpp create mode 100644 dep/glm/gtx/hash.inl create mode 100644 dep/glm/gtx/integer.hpp create mode 100644 dep/glm/gtx/integer.inl create mode 100644 dep/glm/gtx/intersect.hpp create mode 100644 dep/glm/gtx/intersect.inl create mode 100644 dep/glm/gtx/io.hpp create mode 100644 dep/glm/gtx/io.inl create mode 100644 dep/glm/gtx/log_base.hpp create mode 100644 dep/glm/gtx/log_base.inl create mode 100644 dep/glm/gtx/matrix_cross_product.hpp create mode 100644 dep/glm/gtx/matrix_cross_product.inl create mode 100644 dep/glm/gtx/matrix_decompose.hpp create mode 100644 dep/glm/gtx/matrix_decompose.inl create mode 100644 dep/glm/gtx/matrix_factorisation.hpp create mode 100644 dep/glm/gtx/matrix_factorisation.inl create mode 100644 dep/glm/gtx/matrix_interpolation.hpp create mode 100644 dep/glm/gtx/matrix_interpolation.inl create mode 100644 dep/glm/gtx/matrix_major_storage.hpp create mode 100644 dep/glm/gtx/matrix_major_storage.inl create mode 100644 dep/glm/gtx/matrix_operation.hpp create mode 100644 dep/glm/gtx/matrix_operation.inl create mode 100644 dep/glm/gtx/matrix_query.hpp create mode 100644 dep/glm/gtx/matrix_query.inl create mode 100644 dep/glm/gtx/matrix_transform_2d.hpp create mode 100644 dep/glm/gtx/matrix_transform_2d.inl create mode 100644 dep/glm/gtx/mixed_product.hpp create mode 100644 dep/glm/gtx/mixed_product.inl create mode 100644 dep/glm/gtx/norm.hpp create mode 100644 dep/glm/gtx/norm.inl create mode 100644 dep/glm/gtx/normal.hpp create mode 100644 dep/glm/gtx/normal.inl create mode 100644 dep/glm/gtx/normalize_dot.hpp create mode 100644 dep/glm/gtx/normalize_dot.inl create mode 100644 dep/glm/gtx/number_precision.hpp create mode 100644 dep/glm/gtx/number_precision.inl create mode 100644 dep/glm/gtx/optimum_pow.hpp create mode 100644 dep/glm/gtx/optimum_pow.inl create mode 100644 dep/glm/gtx/orthonormalize.hpp create mode 100644 dep/glm/gtx/orthonormalize.inl create mode 100644 dep/glm/gtx/perpendicular.hpp create mode 100644 dep/glm/gtx/perpendicular.inl create mode 100644 dep/glm/gtx/polar_coordinates.hpp create mode 100644 dep/glm/gtx/polar_coordinates.inl create mode 100644 dep/glm/gtx/projection.hpp create mode 100644 dep/glm/gtx/projection.inl create mode 100644 dep/glm/gtx/quaternion.hpp create mode 100644 dep/glm/gtx/quaternion.inl create mode 100644 dep/glm/gtx/range.hpp create mode 100644 dep/glm/gtx/raw_data.hpp create mode 100644 dep/glm/gtx/raw_data.inl create mode 100644 dep/glm/gtx/rotate_normalized_axis.hpp create mode 100644 dep/glm/gtx/rotate_normalized_axis.inl create mode 100644 dep/glm/gtx/rotate_vector.hpp create mode 100644 dep/glm/gtx/rotate_vector.inl create mode 100644 dep/glm/gtx/scalar_multiplication.hpp create mode 100644 dep/glm/gtx/scalar_relational.hpp create mode 100644 dep/glm/gtx/scalar_relational.inl create mode 100644 dep/glm/gtx/spline.hpp create mode 100644 dep/glm/gtx/spline.inl create mode 100644 dep/glm/gtx/std_based_type.hpp create mode 100644 dep/glm/gtx/std_based_type.inl create mode 100644 dep/glm/gtx/string_cast.hpp create mode 100644 dep/glm/gtx/string_cast.inl create mode 100644 dep/glm/gtx/texture.hpp create mode 100644 dep/glm/gtx/texture.inl create mode 100644 dep/glm/gtx/transform.hpp create mode 100644 dep/glm/gtx/transform.inl create mode 100644 dep/glm/gtx/transform2.hpp create mode 100644 dep/glm/gtx/transform2.inl create mode 100644 dep/glm/gtx/type_aligned.hpp create mode 100644 dep/glm/gtx/type_aligned.inl create mode 100644 dep/glm/gtx/type_trait.hpp create mode 100644 dep/glm/gtx/type_trait.inl create mode 100644 dep/glm/gtx/vec_swizzle.hpp create mode 100644 dep/glm/gtx/vector_angle.hpp create mode 100644 dep/glm/gtx/vector_angle.inl create mode 100644 dep/glm/gtx/vector_query.hpp create mode 100644 dep/glm/gtx/vector_query.inl create mode 100644 dep/glm/gtx/wrap.hpp create mode 100644 dep/glm/gtx/wrap.inl create mode 100644 dep/glm/integer.hpp create mode 100644 dep/glm/mat2x2.hpp create mode 100644 dep/glm/mat2x3.hpp create mode 100644 dep/glm/mat2x4.hpp create mode 100644 dep/glm/mat3x2.hpp create mode 100644 dep/glm/mat3x3.hpp create mode 100644 dep/glm/mat3x4.hpp create mode 100644 dep/glm/mat4x2.hpp create mode 100644 dep/glm/mat4x3.hpp create mode 100644 dep/glm/mat4x4.hpp create mode 100644 dep/glm/matrix.hpp create mode 100644 dep/glm/packing.hpp create mode 100644 dep/glm/simd/common.h create mode 100644 dep/glm/simd/exponential.h create mode 100644 dep/glm/simd/geometric.h create mode 100644 dep/glm/simd/integer.h create mode 100644 dep/glm/simd/matrix.h create mode 100644 dep/glm/simd/neon.h create mode 100644 dep/glm/simd/packing.h create mode 100644 dep/glm/simd/platform.h create mode 100644 dep/glm/simd/trigonometric.h create mode 100644 dep/glm/simd/vector_relational.h create mode 100644 dep/glm/trigonometric.hpp create mode 100644 dep/glm/vec2.hpp create mode 100644 dep/glm/vec3.hpp create mode 100644 dep/glm/vec4.hpp create mode 100644 dep/glm/vector_relational.hpp create mode 100644 dep/stb_image.h create mode 100644 funcs.cpp create mode 100644 include/funcs.h create mode 100644 include/shader.h create mode 100644 main.cpp create mode 100644 opengl.pdf - Shortcut.lnk create mode 100644 shad/frag.fs create mode 100644 shad/vert.vs create mode 100644 shader.cpp diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e3a9507 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,52 @@ +{ + "files.associations": { + "iostream": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp" + } +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..080bb72 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.5.0) +project(GraphicsTest VERSION 0.1.0 LANGUAGES C CXX) + +include(CTest) +enable_testing() + + +set(CPACK_PROJECT_NAME ${PROJECT_NAME}) +set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) +include(CPack) + +include_directories(./dep ./include) +link_directories(../libs/glfw-3.3.9/build/src) + +add_executable(GraphicsTest main.cpp funcs.cpp shader.cpp ../libs/glad/src/glad.c) +target_link_libraries(GraphicsTest glfw3) + +set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) +set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) +set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) + +find_package(OpenGL REQUIRED) +target_link_libraries(GraphicsTest OpenGL::GL) \ No newline at end of file diff --git a/assets/awesomeface.png b/assets/awesomeface.png new file mode 100644 index 0000000000000000000000000000000000000000..9840caf3e7f4914ea1c6c15f688ffaf2cf44bae8 GIT binary patch literal 59277 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 Q0|5VhP*hj=DQ6!3fBcW&%>V!Z literal 0 HcmV?d00001 diff --git a/assets/wall.jpg b/assets/wall.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49631987d967c1201286664f2d6032525f9fe1e8 GIT binary patch literal 256989 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࣮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

&shoeJMBBztTS9`;l|qbF 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

~DU&+q6r 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

+cN8I83`olICW^C^LPSA%8qx6%~ltMDp1yO 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

E+m)_}JJdwsog%%AOO9eCYc*w7Is-5Z$7nDKdHi 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⁣Xl`>oUQVf}lv{=G;4eoO!UQ2+j3 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 yr4K6*$Qg3ThX=_mzw|gd(QjLOoov5_Rs(K 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 literal 0 HcmV?d00001 diff --git a/build/CMakeFiles/3.28.1/CMakeRCCompiler.cmake b/build/CMakeFiles/3.28.1/CMakeRCCompiler.cmake new file mode 100644 index 0000000..eea0e6e --- /dev/null +++ b/build/CMakeFiles/3.28.1/CMakeRCCompiler.cmake @@ -0,0 +1,6 @@ +set(CMAKE_RC_COMPILER "C:/msys64/ucrt64/bin/windres.exe") +set(CMAKE_RC_COMPILER_ARG1 "") +set(CMAKE_RC_COMPILER_LOADED 1) +set(CMAKE_RC_SOURCE_FILE_EXTENSIONS rc;RC) +set(CMAKE_RC_OUTPUT_EXTENSION .obj) +set(CMAKE_RC_COMPILER_ENV_VAR "RC") diff --git a/build/CMakeFiles/3.28.1/CMakeSystem.cmake b/build/CMakeFiles/3.28.1/CMakeSystem.cmake new file mode 100644 index 0000000..e1deade --- /dev/null +++ b/build/CMakeFiles/3.28.1/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Windows-10.0.22621") +set(CMAKE_HOST_SYSTEM_NAME "Windows") +set(CMAKE_HOST_SYSTEM_VERSION "10.0.22621") +set(CMAKE_HOST_SYSTEM_PROCESSOR "AMD64") + + + +set(CMAKE_SYSTEM "Windows-10.0.22621") +set(CMAKE_SYSTEM_NAME "Windows") +set(CMAKE_SYSTEM_VERSION "10.0.22621") +set(CMAKE_SYSTEM_PROCESSOR "AMD64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/build/CMakeFiles/3.28.1/CompilerIdC/CMakeCCompilerId.c b/build/CMakeFiles/3.28.1/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..0a0ec9b --- /dev/null +++ b/build/CMakeFiles/3.28.1/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,880 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif __STDC_VERSION__ > 201710L +# define C_VERSION "23" +#elif __STDC_VERSION__ >= 201710L +# define C_VERSION "17" +#elif __STDC_VERSION__ >= 201000L +# define C_VERSION "11" +#elif __STDC_VERSION__ >= 199901L +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/build/CMakeFiles/3.28.1/CompilerIdC/a.exe b/build/CMakeFiles/3.28.1/CompilerIdC/a.exe new file mode 100644 index 0000000000000000000000000000000000000000..de6eeec22944b33da8605ca2c14c5a4a3f0b5895 GIT binary patch literal 133903 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

mI!cY!j&_vJr^d*o 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 literal 0 HcmV?d00001 diff --git a/build/CMakeFiles/3.28.1/CompilerIdCXX/CMakeCXXCompilerId.cpp b/build/CMakeFiles/3.28.1/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..9c9c90e --- /dev/null +++ b/build/CMakeFiles/3.28.1/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,869 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__COMO__) +# define COMPILER_ID "Comeau" + /* __COMO_VERSION__ = VRR */ +# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) +# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) + +#elif defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +# if defined(__INTEL_CXX11_MODE__) +# if defined(__cpp_aggregate_nsdmi) +# define CXX_STD 201402L +# else +# define CXX_STD 201103L +# endif +# else +# define CXX_STD 199711L +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# define CXX_STD _MSVC_LANG +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > 202002L + "23" +#elif CXX_STD > 201703L + "20" +#elif CXX_STD >= 201703L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/build/CMakeFiles/3.28.1/CompilerIdCXX/a.exe b/build/CMakeFiles/3.28.1/CompilerIdCXX/a.exe new file mode 100644 index 0000000000000000000000000000000000000000..4d9aedb65a0559da54c4f2ac3c7c135be9e9cd31 GIT binary patch literal 133931 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 PKRTu!3#I?K(eVET%73)h literal 0 HcmV?d00001 diff --git a/build/CMakeFiles/CMakeConfigureLog.yaml b/build/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..d27baeb --- /dev/null +++ b/build/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,608 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineSystem.cmake:233 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The system is: Windows - 10.0.22621 - AMD64 + - + kind: "message-v1" + backtrace: + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: C:/msys64/ucrt64/bin/gcc.exe + Build flags: + Id flags: + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.exe" + + The C compiler identification is GNU, found in: + C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/3.28.1/CompilerIdC/a.exe + + - + kind: "message-v1" + backtrace: + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: C:/msys64/ucrt64/bin/g++.exe + Build flags: + Id flags: + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.exe" + + The CXX compiler identification is GNU, found in: + C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/3.28.1/CompilerIdCXX/a.exe + + - + kind: "try_compile-v1" + backtrace: + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:57 (try_compile)" + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-lja2hk" + binary: "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-lja2hk" + cmakeVariables: + CMAKE_C_FLAGS: "" + CMAKE_EXE_LINKER_FLAGS: "" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: 'C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-lja2hk' + + Run Build Command(s): "C:/Program Files/CMake/bin/cmake.exe" -E env VERBOSE=1 C:/msys64/ucrt64/bin/mingw32-make.exe -f Makefile cmTC_62da6/fast + C:/msys64/ucrt64/bin/mingw32-make.exe -f CMakeFiles\\cmTC_62da6.dir\\build.make CMakeFiles/cmTC_62da6.dir/build + mingw32-make[1]: Entering directory 'C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-lja2hk' + Building C object CMakeFiles/cmTC_62da6.dir/CMakeCCompilerABI.c.obj + C:\\msys64\\ucrt64\\bin\\gcc.exe -v -o CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.obj -c "C:\\Program Files\\CMake\\share\\cmake-3.28\\Modules\\CMakeCCompilerABI.c" + Using built-in specs. + COLLECT_GCC=C:\\msys64\\ucrt64\\bin\\gcc.exe + Target: x86_64-w64-mingw32 + Configured with: ../gcc-13.2.0/configure --prefix=/ucrt64 --with-local-prefix=/ucrt64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/ucrt64/include --libexecdir=/ucrt64/lib --enable-bootstrap --enable-checking=release --with-arch=nocona --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-libssp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/ucrt64 --with-mpfr=/ucrt64 --with-mpc=/ucrt64 --with-isl=/ucrt64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --disable-libstdcxx-debug --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++ + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.2.0 (Rev2, Built by MSYS2 project) + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.obj' '-c' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_62da6.dir\\' + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/cc1.exe -quiet -v -iprefix C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/ -D_REENTRANT C:\\Program Files\\CMake\\share\\cmake-3.28\\Modules\\CMakeCCompilerABI.c -quiet -dumpdir CMakeFiles\\cmTC_62da6.dir\\ -dumpbase CMakeCCompilerABI.c.c -dumpbase-ext .c -mtune=generic -march=nocona -version -o C:\\Users\\naifa\\AppData\\Local\\Temp\\cc1wAEHw.s + GNU C17 (Rev2, Built by MSYS2 project) version 13.2.0 (x86_64-w64-mingw32) + compiled by GNU C version 13.2.0, GMP version 6.3.0, MPFR version 4.2.0-p12, MPC version 1.3.1, isl version isl-0.26-GMP + + warning: MPFR header version 4.2.0-p12 differs from library version 4.2.1. + GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 + ignoring nonexistent directory "C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/include" + ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/include" + ignoring nonexistent directory "D:/a/msys64/ucrt64/include" + ignoring nonexistent directory "/ucrt64/include" + ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed" + ignoring nonexistent directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/include" + ignoring nonexistent directory "D:/a/msys64/ucrt64/include" + #include "..." search starts here: + #include <...> search starts here: + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed + End of search list. + Compiler executable checksum: 2525de6edb9883e34ae4135f4eaa3cf3 + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.obj' '-c' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_62da6.dir\\' + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.obj C:\\Users\\naifa\\AppData\\Local\\Temp\\cc1wAEHw.s + GNU assembler version 2.41 (x86_64-w64-mingw32) using BFD version (GNU Binutils) 2.41 + COMPILER_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/;C:/msys64/ucrt64/bin/../lib/gcc/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ + LIBRARY_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/;C:/msys64/ucrt64/bin/../lib/gcc/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../ + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.obj' '-c' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.' + Linking C executable cmTC_62da6.exe + "C:\\Program Files\\CMake\\bin\\cmake.exe" -E cmake_link_script CMakeFiles\\cmTC_62da6.dir\\link.txt --verbose=1 + "C:\\Program Files\\CMake\\bin\\cmake.exe" -E rm -f CMakeFiles\\cmTC_62da6.dir/objects.a + C:\\msys64\\ucrt64\\bin\\ar.exe qc CMakeFiles\\cmTC_62da6.dir/objects.a @CMakeFiles\\cmTC_62da6.dir\\objects1.rsp + C:\\msys64\\ucrt64\\bin\\gcc.exe -v -Wl,--whole-archive CMakeFiles\\cmTC_62da6.dir/objects.a -Wl,--no-whole-archive -o cmTC_62da6.exe -Wl,--out-implib,libcmTC_62da6.dll.a -Wl,--major-image-version,0,--minor-image-version,0 + Using built-in specs. + COLLECT_GCC=C:\\msys64\\ucrt64\\bin\\gcc.exe + COLLECT_LTO_WRAPPER=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exe + Target: x86_64-w64-mingw32 + Configured with: ../gcc-13.2.0/configure --prefix=/ucrt64 --with-local-prefix=/ucrt64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/ucrt64/include --libexecdir=/ucrt64/lib --enable-bootstrap --enable-checking=release --with-arch=nocona --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-libssp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/ucrt64 --with-mpfr=/ucrt64 --with-mpc=/ucrt64 --with-isl=/ucrt64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --disable-libstdcxx-debug --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++ + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.2.0 (Rev2, Built by MSYS2 project) + COMPILER_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/;C:/msys64/ucrt64/bin/../lib/gcc/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ + LIBRARY_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/;C:/msys64/ucrt64/bin/../lib/gcc/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../ + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_62da6.exe' '-mtune=generic' '-march=nocona' '-dumpdir' 'cmTC_62da6.' + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/collect2.exe -plugin C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/liblto_plugin.dll -plugin-opt=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\\Users\\naifa\\AppData\\Local\\Temp\\ccLGiYQH.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lkernel32 -m i386pep -Bdynamic -o cmTC_62da6.exe C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/crt2.o C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0 -LC:/msys64/ucrt64/bin/../lib/gcc -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../.. --whole-archive CMakeFiles\\cmTC_62da6.dir/objects.a --no-whole-archive --out-implib libcmTC_62da6.dll.a --major-image-version 0 --minor-image-version 0 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lkernel32 -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lkernel32 C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/default-manifest.o C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_62da6.exe' '-mtune=generic' '-march=nocona' '-dumpdir' 'cmTC_62da6.' + mingw32-make[1]: Leaving directory 'C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-lja2hk' + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:127 (message)" + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include] + add: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include] + add: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed] + end of search list found + collapse include dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include] ==> [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include] + collapse include dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include] ==> [C:/msys64/ucrt64/include] + collapse include dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed] ==> [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed] + implicit include dirs: [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include;C:/msys64/ucrt64/include;C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed] + + + - + kind: "message-v1" + backtrace: + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:159 (message)" + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld\\.exe|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + ignore line: [Change Dir: 'C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-lja2hk'] + ignore line: [] + ignore line: [Run Build Command(s): "C:/Program Files/CMake/bin/cmake.exe" -E env VERBOSE=1 C:/msys64/ucrt64/bin/mingw32-make.exe -f Makefile cmTC_62da6/fast] + ignore line: [C:/msys64/ucrt64/bin/mingw32-make.exe -f CMakeFiles\\cmTC_62da6.dir\\build.make CMakeFiles/cmTC_62da6.dir/build] + ignore line: [mingw32-make[1]: Entering directory 'C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-lja2hk'] + ignore line: [Building C object CMakeFiles/cmTC_62da6.dir/CMakeCCompilerABI.c.obj] + ignore line: [C:\\msys64\\ucrt64\\bin\\gcc.exe -v -o CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.obj -c "C:\\Program Files\\CMake\\share\\cmake-3.28\\Modules\\CMakeCCompilerABI.c"] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=C:\\msys64\\ucrt64\\bin\\gcc.exe] + ignore line: [Target: x86_64-w64-mingw32] + ignore line: [Configured with: ../gcc-13.2.0/configure --prefix=/ucrt64 --with-local-prefix=/ucrt64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/ucrt64/include --libexecdir=/ucrt64/lib --enable-bootstrap --enable-checking=release --with-arch=nocona --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-libssp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/ucrt64 --with-mpfr=/ucrt64 --with-mpc=/ucrt64 --with-isl=/ucrt64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --disable-libstdcxx-debug --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.2.0 (Rev2 Built by MSYS2 project) ] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.obj' '-c' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_62da6.dir\\'] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/cc1.exe -quiet -v -iprefix C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/ -D_REENTRANT C:\\Program Files\\CMake\\share\\cmake-3.28\\Modules\\CMakeCCompilerABI.c -quiet -dumpdir CMakeFiles\\cmTC_62da6.dir\\ -dumpbase CMakeCCompilerABI.c.c -dumpbase-ext .c -mtune=generic -march=nocona -version -o C:\\Users\\naifa\\AppData\\Local\\Temp\\cc1wAEHw.s] + ignore line: [GNU C17 (Rev2 Built by MSYS2 project) version 13.2.0 (x86_64-w64-mingw32)] + ignore line: [ compiled by GNU C version 13.2.0 GMP version 6.3.0 MPFR version 4.2.0-p12 MPC version 1.3.1 isl version isl-0.26-GMP] + ignore line: [] + ignore line: [warning: MPFR header version 4.2.0-p12 differs from library version 4.2.1.] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring nonexistent directory "C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/include"] + ignore line: [ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/include"] + ignore line: [ignoring nonexistent directory "D:/a/msys64/ucrt64/include"] + ignore line: [ignoring nonexistent directory "/ucrt64/include"] + ignore line: [ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed"] + ignore line: [ignoring nonexistent directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/include"] + ignore line: [ignoring nonexistent directory "D:/a/msys64/ucrt64/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed] + ignore line: [End of search list.] + ignore line: [Compiler executable checksum: 2525de6edb9883e34ae4135f4eaa3cf3] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.obj' '-c' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_62da6.dir\\'] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.obj C:\\Users\\naifa\\AppData\\Local\\Temp\\cc1wAEHw.s] + ignore line: [GNU assembler version 2.41 (x86_64-w64-mingw32) using BFD version (GNU Binutils) 2.41] + ignore line: [COMPILER_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/] + ignore line: [LIBRARY_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.obj' '-c' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_62da6.dir\\CMakeCCompilerABI.c.'] + ignore line: [Linking C executable cmTC_62da6.exe] + ignore line: ["C:\\Program Files\\CMake\\bin\\cmake.exe" -E cmake_link_script CMakeFiles\\cmTC_62da6.dir\\link.txt --verbose=1] + ignore line: ["C:\\Program Files\\CMake\\bin\\cmake.exe" -E rm -f CMakeFiles\\cmTC_62da6.dir/objects.a] + ignore line: [C:\\msys64\\ucrt64\\bin\\ar.exe qc CMakeFiles\\cmTC_62da6.dir/objects.a @CMakeFiles\\cmTC_62da6.dir\\objects1.rsp] + ignore line: [C:\\msys64\\ucrt64\\bin\\gcc.exe -v -Wl --whole-archive CMakeFiles\\cmTC_62da6.dir/objects.a -Wl --no-whole-archive -o cmTC_62da6.exe -Wl --out-implib libcmTC_62da6.dll.a -Wl --major-image-version 0 --minor-image-version 0 ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=C:\\msys64\\ucrt64\\bin\\gcc.exe] + ignore line: [COLLECT_LTO_WRAPPER=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exe] + ignore line: [Target: x86_64-w64-mingw32] + ignore line: [Configured with: ../gcc-13.2.0/configure --prefix=/ucrt64 --with-local-prefix=/ucrt64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/ucrt64/include --libexecdir=/ucrt64/lib --enable-bootstrap --enable-checking=release --with-arch=nocona --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-libssp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/ucrt64 --with-mpfr=/ucrt64 --with-mpc=/ucrt64 --with-isl=/ucrt64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --disable-libstdcxx-debug --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.2.0 (Rev2 Built by MSYS2 project) ] + ignore line: [COMPILER_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/] + ignore line: [LIBRARY_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_62da6.exe' '-mtune=generic' '-march=nocona' '-dumpdir' 'cmTC_62da6.'] + link line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/collect2.exe -plugin C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/liblto_plugin.dll -plugin-opt=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\\Users\\naifa\\AppData\\Local\\Temp\\ccLGiYQH.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lkernel32 -m i386pep -Bdynamic -o cmTC_62da6.exe C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/crt2.o C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0 -LC:/msys64/ucrt64/bin/../lib/gcc -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../.. --whole-archive CMakeFiles\\cmTC_62da6.dir/objects.a --no-whole-archive --out-implib libcmTC_62da6.dll.a --major-image-version 0 --minor-image-version 0 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lkernel32 -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lkernel32 C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/default-manifest.o C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/collect2.exe] ==> ignore + arg [-plugin] ==> ignore + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/liblto_plugin.dll] ==> ignore + arg [-plugin-opt=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exe] ==> ignore + arg [-plugin-opt=-fresolution=C:\\Users\\naifa\\AppData\\Local\\Temp\\ccLGiYQH.res] ==> ignore + arg [-plugin-opt=-pass-through=-lmingw32] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_eh] ==> ignore + arg [-plugin-opt=-pass-through=-lmoldname] ==> ignore + arg [-plugin-opt=-pass-through=-lmingwex] ==> ignore + arg [-plugin-opt=-pass-through=-lmsvcrt] ==> ignore + arg [-plugin-opt=-pass-through=-lkernel32] ==> ignore + arg [-plugin-opt=-pass-through=-lpthread] ==> ignore + arg [-plugin-opt=-pass-through=-ladvapi32] ==> ignore + arg [-plugin-opt=-pass-through=-lshell32] ==> ignore + arg [-plugin-opt=-pass-through=-luser32] ==> ignore + arg [-plugin-opt=-pass-through=-lkernel32] ==> ignore + arg [-plugin-opt=-pass-through=-lmingw32] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_eh] ==> ignore + arg [-plugin-opt=-pass-through=-lmoldname] ==> ignore + arg [-plugin-opt=-pass-through=-lmingwex] ==> ignore + arg [-plugin-opt=-pass-through=-lmsvcrt] ==> ignore + arg [-plugin-opt=-pass-through=-lkernel32] ==> ignore + arg [-m] ==> ignore + arg [i386pep] ==> ignore + arg [-Bdynamic] ==> search dynamic + arg [-o] ==> ignore + arg [cmTC_62da6.exe] ==> ignore + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/crt2.o] ==> obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/crt2.o] + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o] ==> obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../..] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../..] + arg [--whole-archive] ==> ignore + arg [CMakeFiles\\cmTC_62da6.dir/objects.a] ==> ignore + arg [--no-whole-archive] ==> ignore + arg [--out-implib] ==> ignore + arg [libcmTC_62da6.dll.a] ==> ignore + arg [--major-image-version] ==> ignore + arg [0] ==> ignore + arg [--minor-image-version] ==> ignore + arg [0] ==> ignore + arg [-lmingw32] ==> lib [mingw32] + arg [-lgcc] ==> lib [gcc] + arg [-lgcc_eh] ==> lib [gcc_eh] + arg [-lmoldname] ==> lib [moldname] + arg [-lmingwex] ==> lib [mingwex] + arg [-lmsvcrt] ==> lib [msvcrt] + arg [-lkernel32] ==> lib [kernel32] + arg [-lpthread] ==> lib [pthread] + arg [-ladvapi32] ==> lib [advapi32] + arg [-lshell32] ==> lib [shell32] + arg [-luser32] ==> lib [user32] + arg [-lkernel32] ==> lib [kernel32] + arg [-lmingw32] ==> lib [mingw32] + arg [-lgcc] ==> lib [gcc] + arg [-lgcc_eh] ==> lib [gcc_eh] + arg [-lmoldname] ==> lib [moldname] + arg [-lmingwex] ==> lib [mingwex] + arg [-lmsvcrt] ==> lib [msvcrt] + arg [-lkernel32] ==> lib [kernel32] + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/default-manifest.o] ==> obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/default-manifest.o] + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] ==> obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] + remove lib [gcc_eh] + remove lib [msvcrt] + remove lib [gcc_eh] + remove lib [msvcrt] + collapse obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/crt2.o] ==> [C:/msys64/ucrt64/lib/crt2.o] + collapse obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o] ==> [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o] + collapse obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/default-manifest.o] ==> [C:/msys64/ucrt64/lib/default-manifest.o] + collapse obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] ==> [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0] ==> [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc] ==> [C:/msys64/ucrt64/lib/gcc] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib] ==> [C:/msys64/ucrt64/x86_64-w64-mingw32/lib] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib] ==> [C:/msys64/ucrt64/lib] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib] ==> [C:/msys64/ucrt64/x86_64-w64-mingw32/lib] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../..] ==> [C:/msys64/ucrt64/lib] + implicit libs: [mingw32;gcc;moldname;mingwex;kernel32;pthread;advapi32;shell32;user32;kernel32;mingw32;gcc;moldname;mingwex;kernel32] + implicit objs: [C:/msys64/ucrt64/lib/crt2.o;C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o;C:/msys64/ucrt64/lib/default-manifest.o;C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] + implicit dirs: [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0;C:/msys64/ucrt64/lib/gcc;C:/msys64/ucrt64/x86_64-w64-mingw32/lib;C:/msys64/ucrt64/lib] + implicit fwks: [] + + + - + kind: "try_compile-v1" + backtrace: + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:57 (try_compile)" + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-g1faql" + binary: "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-g1faql" + cmakeVariables: + CMAKE_CXX_FLAGS: "" + CMAKE_EXE_LINKER_FLAGS: "" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: 'C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-g1faql' + + Run Build Command(s): "C:/Program Files/CMake/bin/cmake.exe" -E env VERBOSE=1 C:/msys64/ucrt64/bin/mingw32-make.exe -f Makefile cmTC_91d01/fast + C:/msys64/ucrt64/bin/mingw32-make.exe -f CMakeFiles\\cmTC_91d01.dir\\build.make CMakeFiles/cmTC_91d01.dir/build + mingw32-make[1]: Entering directory 'C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-g1faql' + Building CXX object CMakeFiles/cmTC_91d01.dir/CMakeCXXCompilerABI.cpp.obj + C:\\msys64\\ucrt64\\bin\\g++.exe -v -o CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.obj -c "C:\\Program Files\\CMake\\share\\cmake-3.28\\Modules\\CMakeCXXCompilerABI.cpp" + Using built-in specs. + COLLECT_GCC=C:\\msys64\\ucrt64\\bin\\g++.exe + Target: x86_64-w64-mingw32 + Configured with: ../gcc-13.2.0/configure --prefix=/ucrt64 --with-local-prefix=/ucrt64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/ucrt64/include --libexecdir=/ucrt64/lib --enable-bootstrap --enable-checking=release --with-arch=nocona --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-libssp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/ucrt64 --with-mpfr=/ucrt64 --with-mpc=/ucrt64 --with-isl=/ucrt64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --disable-libstdcxx-debug --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++ + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.2.0 (Rev2, Built by MSYS2 project) + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_91d01.dir\\' + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/cc1plus.exe -quiet -v -iprefix C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/ -D_REENTRANT C:\\Program Files\\CMake\\share\\cmake-3.28\\Modules\\CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles\\cmTC_91d01.dir\\ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=nocona -version -o C:\\Users\\naifa\\AppData\\Local\\Temp\\ccWZUkbf.s + GNU C++17 (Rev2, Built by MSYS2 project) version 13.2.0 (x86_64-w64-mingw32) + compiled by GNU C version 13.2.0, GMP version 6.3.0, MPFR version 4.2.0-p12, MPC version 1.3.1, isl version isl-0.26-GMP + + warning: MPFR header version 4.2.0-p12 differs from library version 4.2.1. + GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 + ignoring nonexistent directory "C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/include" + ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0" + ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/x86_64-w64-mingw32" + ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/backward" + ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/include" + ignoring nonexistent directory "D:/a/msys64/ucrt64/include" + ignoring nonexistent directory "/ucrt64/include" + ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed" + ignoring nonexistent directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/include" + ignoring nonexistent directory "D:/a/msys64/ucrt64/include" + #include "..." search starts here: + #include <...> search starts here: + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0 + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/x86_64-w64-mingw32 + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/backward + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed + End of search list. + Compiler executable checksum: 68b9ef74367bf7a039b43cfcfb380dfa + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_91d01.dir\\' + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.obj C:\\Users\\naifa\\AppData\\Local\\Temp\\ccWZUkbf.s + GNU assembler version 2.41 (x86_64-w64-mingw32) using BFD version (GNU Binutils) 2.41 + COMPILER_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/;C:/msys64/ucrt64/bin/../lib/gcc/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ + LIBRARY_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/;C:/msys64/ucrt64/bin/../lib/gcc/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../ + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.' + Linking CXX executable cmTC_91d01.exe + "C:\\Program Files\\CMake\\bin\\cmake.exe" -E cmake_link_script CMakeFiles\\cmTC_91d01.dir\\link.txt --verbose=1 + "C:\\Program Files\\CMake\\bin\\cmake.exe" -E rm -f CMakeFiles\\cmTC_91d01.dir/objects.a + C:\\msys64\\ucrt64\\bin\\ar.exe qc CMakeFiles\\cmTC_91d01.dir/objects.a @CMakeFiles\\cmTC_91d01.dir\\objects1.rsp + C:\\msys64\\ucrt64\\bin\\g++.exe -v -Wl,--whole-archive CMakeFiles\\cmTC_91d01.dir/objects.a -Wl,--no-whole-archive -o cmTC_91d01.exe -Wl,--out-implib,libcmTC_91d01.dll.a -Wl,--major-image-version,0,--minor-image-version,0 + Using built-in specs. + COLLECT_GCC=C:\\msys64\\ucrt64\\bin\\g++.exe + COLLECT_LTO_WRAPPER=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exe + Target: x86_64-w64-mingw32 + Configured with: ../gcc-13.2.0/configure --prefix=/ucrt64 --with-local-prefix=/ucrt64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/ucrt64/include --libexecdir=/ucrt64/lib --enable-bootstrap --enable-checking=release --with-arch=nocona --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-libssp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/ucrt64 --with-mpfr=/ucrt64 --with-mpc=/ucrt64 --with-isl=/ucrt64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --disable-libstdcxx-debug --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++ + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.2.0 (Rev2, Built by MSYS2 project) + COMPILER_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/;C:/msys64/ucrt64/bin/../lib/gcc/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ + LIBRARY_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/;C:/msys64/ucrt64/bin/../lib/gcc/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/;C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../ + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_91d01.exe' '-shared-libgcc' '-mtune=generic' '-march=nocona' '-dumpdir' 'cmTC_91d01.' + C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/collect2.exe -plugin C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/liblto_plugin.dll -plugin-opt=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\\Users\\naifa\\AppData\\Local\\Temp\\cc0nIpxu.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lkernel32 -m i386pep -Bdynamic -o cmTC_91d01.exe C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/crt2.o C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0 -LC:/msys64/ucrt64/bin/../lib/gcc -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../.. --whole-archive CMakeFiles\\cmTC_91d01.dir/objects.a --no-whole-archive --out-implib libcmTC_91d01.dll.a --major-image-version 0 --minor-image-version 0 -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lkernel32 -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lkernel32 C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/default-manifest.o C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_91d01.exe' '-shared-libgcc' '-mtune=generic' '-march=nocona' '-dumpdir' 'cmTC_91d01.' + mingw32-make[1]: Leaving directory 'C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-g1faql' + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:127 (message)" + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0] + add: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/x86_64-w64-mingw32] + add: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/backward] + add: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include] + add: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include] + add: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed] + end of search list found + collapse include dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0] ==> [C:/msys64/ucrt64/include/c++/13.2.0] + collapse include dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/x86_64-w64-mingw32] ==> [C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32] + collapse include dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/backward] ==> [C:/msys64/ucrt64/include/c++/13.2.0/backward] + collapse include dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include] ==> [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include] + collapse include dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include] ==> [C:/msys64/ucrt64/include] + collapse include dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed] ==> [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed] + implicit include dirs: [C:/msys64/ucrt64/include/c++/13.2.0;C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32;C:/msys64/ucrt64/include/c++/13.2.0/backward;C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include;C:/msys64/ucrt64/include;C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed] + + + - + kind: "message-v1" + backtrace: + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:159 (message)" + - "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld\\.exe|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + ignore line: [Change Dir: 'C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-g1faql'] + ignore line: [] + ignore line: [Run Build Command(s): "C:/Program Files/CMake/bin/cmake.exe" -E env VERBOSE=1 C:/msys64/ucrt64/bin/mingw32-make.exe -f Makefile cmTC_91d01/fast] + ignore line: [C:/msys64/ucrt64/bin/mingw32-make.exe -f CMakeFiles\\cmTC_91d01.dir\\build.make CMakeFiles/cmTC_91d01.dir/build] + ignore line: [mingw32-make[1]: Entering directory 'C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/CMakeScratch/TryCompile-g1faql'] + ignore line: [Building CXX object CMakeFiles/cmTC_91d01.dir/CMakeCXXCompilerABI.cpp.obj] + ignore line: [C:\\msys64\\ucrt64\\bin\\g++.exe -v -o CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.obj -c "C:\\Program Files\\CMake\\share\\cmake-3.28\\Modules\\CMakeCXXCompilerABI.cpp"] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=C:\\msys64\\ucrt64\\bin\\g++.exe] + ignore line: [Target: x86_64-w64-mingw32] + ignore line: [Configured with: ../gcc-13.2.0/configure --prefix=/ucrt64 --with-local-prefix=/ucrt64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/ucrt64/include --libexecdir=/ucrt64/lib --enable-bootstrap --enable-checking=release --with-arch=nocona --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-libssp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/ucrt64 --with-mpfr=/ucrt64 --with-mpc=/ucrt64 --with-isl=/ucrt64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --disable-libstdcxx-debug --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.2.0 (Rev2 Built by MSYS2 project) ] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_91d01.dir\\'] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/cc1plus.exe -quiet -v -iprefix C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/ -D_REENTRANT C:\\Program Files\\CMake\\share\\cmake-3.28\\Modules\\CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles\\cmTC_91d01.dir\\ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=nocona -version -o C:\\Users\\naifa\\AppData\\Local\\Temp\\ccWZUkbf.s] + ignore line: [GNU C++17 (Rev2 Built by MSYS2 project) version 13.2.0 (x86_64-w64-mingw32)] + ignore line: [ compiled by GNU C version 13.2.0 GMP version 6.3.0 MPFR version 4.2.0-p12 MPC version 1.3.1 isl version isl-0.26-GMP] + ignore line: [] + ignore line: [warning: MPFR header version 4.2.0-p12 differs from library version 4.2.1.] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring nonexistent directory "C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/include"] + ignore line: [ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0"] + ignore line: [ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/x86_64-w64-mingw32"] + ignore line: [ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/backward"] + ignore line: [ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/include"] + ignore line: [ignoring nonexistent directory "D:/a/msys64/ucrt64/include"] + ignore line: [ignoring nonexistent directory "/ucrt64/include"] + ignore line: [ignoring duplicate directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed"] + ignore line: [ignoring nonexistent directory "C:/msys64/ucrt64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/include"] + ignore line: [ignoring nonexistent directory "D:/a/msys64/ucrt64/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/x86_64-w64-mingw32] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include/c++/13.2.0/backward] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../include] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/include-fixed] + ignore line: [End of search list.] + ignore line: [Compiler executable checksum: 68b9ef74367bf7a039b43cfcfb380dfa] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_91d01.dir\\'] + ignore line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.obj C:\\Users\\naifa\\AppData\\Local\\Temp\\ccWZUkbf.s] + ignore line: [GNU assembler version 2.41 (x86_64-w64-mingw32) using BFD version (GNU Binutils) 2.41] + ignore line: [COMPILER_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/] + ignore line: [LIBRARY_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.obj' '-c' '-shared-libgcc' '-mtune=generic' '-march=nocona' '-dumpdir' 'CMakeFiles\\cmTC_91d01.dir\\CMakeCXXCompilerABI.cpp.'] + ignore line: [Linking CXX executable cmTC_91d01.exe] + ignore line: ["C:\\Program Files\\CMake\\bin\\cmake.exe" -E cmake_link_script CMakeFiles\\cmTC_91d01.dir\\link.txt --verbose=1] + ignore line: ["C:\\Program Files\\CMake\\bin\\cmake.exe" -E rm -f CMakeFiles\\cmTC_91d01.dir/objects.a] + ignore line: [C:\\msys64\\ucrt64\\bin\\ar.exe qc CMakeFiles\\cmTC_91d01.dir/objects.a @CMakeFiles\\cmTC_91d01.dir\\objects1.rsp] + ignore line: [C:\\msys64\\ucrt64\\bin\\g++.exe -v -Wl --whole-archive CMakeFiles\\cmTC_91d01.dir/objects.a -Wl --no-whole-archive -o cmTC_91d01.exe -Wl --out-implib libcmTC_91d01.dll.a -Wl --major-image-version 0 --minor-image-version 0 ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=C:\\msys64\\ucrt64\\bin\\g++.exe] + ignore line: [COLLECT_LTO_WRAPPER=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exe] + ignore line: [Target: x86_64-w64-mingw32] + ignore line: [Configured with: ../gcc-13.2.0/configure --prefix=/ucrt64 --with-local-prefix=/ucrt64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/ucrt64/include --libexecdir=/ucrt64/lib --enable-bootstrap --enable-checking=release --with-arch=nocona --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-libssp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/ucrt64 --with-mpfr=/ucrt64 --with-mpc=/ucrt64 --with-isl=/ucrt64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --disable-libstdcxx-debug --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.2.0 (Rev2 Built by MSYS2 project) ] + ignore line: [COMPILER_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/] + ignore line: [LIBRARY_PATH=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/] + ignore line: [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_91d01.exe' '-shared-libgcc' '-mtune=generic' '-march=nocona' '-dumpdir' 'cmTC_91d01.'] + link line: [ C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/collect2.exe -plugin C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/liblto_plugin.dll -plugin-opt=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\\Users\\naifa\\AppData\\Local\\Temp\\cc0nIpxu.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lkernel32 -m i386pep -Bdynamic -o cmTC_91d01.exe C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/crt2.o C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0 -LC:/msys64/ucrt64/bin/../lib/gcc -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib -LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../.. --whole-archive CMakeFiles\\cmTC_91d01.dir/objects.a --no-whole-archive --out-implib libcmTC_91d01.dll.a --major-image-version 0 --minor-image-version 0 -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lkernel32 -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lkernel32 C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/default-manifest.o C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/collect2.exe] ==> ignore + arg [-plugin] ==> ignore + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/liblto_plugin.dll] ==> ignore + arg [-plugin-opt=C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exe] ==> ignore + arg [-plugin-opt=-fresolution=C:\\Users\\naifa\\AppData\\Local\\Temp\\cc0nIpxu.res] ==> ignore + arg [-plugin-opt=-pass-through=-lmingw32] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lmoldname] ==> ignore + arg [-plugin-opt=-pass-through=-lmingwex] ==> ignore + arg [-plugin-opt=-pass-through=-lmsvcrt] ==> ignore + arg [-plugin-opt=-pass-through=-lkernel32] ==> ignore + arg [-plugin-opt=-pass-through=-lpthread] ==> ignore + arg [-plugin-opt=-pass-through=-ladvapi32] ==> ignore + arg [-plugin-opt=-pass-through=-lshell32] ==> ignore + arg [-plugin-opt=-pass-through=-luser32] ==> ignore + arg [-plugin-opt=-pass-through=-lkernel32] ==> ignore + arg [-plugin-opt=-pass-through=-lmingw32] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lmoldname] ==> ignore + arg [-plugin-opt=-pass-through=-lmingwex] ==> ignore + arg [-plugin-opt=-pass-through=-lmsvcrt] ==> ignore + arg [-plugin-opt=-pass-through=-lkernel32] ==> ignore + arg [-m] ==> ignore + arg [i386pep] ==> ignore + arg [-Bdynamic] ==> search dynamic + arg [-o] ==> ignore + arg [cmTC_91d01.exe] ==> ignore + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/crt2.o] ==> obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/crt2.o] + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o] ==> obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib] + arg [-LC:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../..] ==> dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../..] + arg [--whole-archive] ==> ignore + arg [CMakeFiles\\cmTC_91d01.dir/objects.a] ==> ignore + arg [--no-whole-archive] ==> ignore + arg [--out-implib] ==> ignore + arg [libcmTC_91d01.dll.a] ==> ignore + arg [--major-image-version] ==> ignore + arg [0] ==> ignore + arg [--minor-image-version] ==> ignore + arg [0] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lmingw32] ==> lib [mingw32] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lmoldname] ==> lib [moldname] + arg [-lmingwex] ==> lib [mingwex] + arg [-lmsvcrt] ==> lib [msvcrt] + arg [-lkernel32] ==> lib [kernel32] + arg [-lpthread] ==> lib [pthread] + arg [-ladvapi32] ==> lib [advapi32] + arg [-lshell32] ==> lib [shell32] + arg [-luser32] ==> lib [user32] + arg [-lkernel32] ==> lib [kernel32] + arg [-lmingw32] ==> lib [mingw32] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lmoldname] ==> lib [moldname] + arg [-lmingwex] ==> lib [mingwex] + arg [-lmsvcrt] ==> lib [msvcrt] + arg [-lkernel32] ==> lib [kernel32] + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/default-manifest.o] ==> obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/default-manifest.o] + arg [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] ==> obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] + remove lib [msvcrt] + remove lib [msvcrt] + collapse obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/crt2.o] ==> [C:/msys64/ucrt64/lib/crt2.o] + collapse obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o] ==> [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o] + collapse obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib/default-manifest.o] ==> [C:/msys64/ucrt64/lib/default-manifest.o] + collapse obj [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] ==> [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0] ==> [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc] ==> [C:/msys64/ucrt64/lib/gcc] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib] ==> [C:/msys64/ucrt64/x86_64-w64-mingw32/lib] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../lib] ==> [C:/msys64/ucrt64/lib] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib] ==> [C:/msys64/ucrt64/x86_64-w64-mingw32/lib] + collapse library dir [C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../..] ==> [C:/msys64/ucrt64/lib] + implicit libs: [stdc++;mingw32;gcc_s;gcc;moldname;mingwex;kernel32;pthread;advapi32;shell32;user32;kernel32;mingw32;gcc_s;gcc;moldname;mingwex;kernel32] + implicit objs: [C:/msys64/ucrt64/lib/crt2.o;C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o;C:/msys64/ucrt64/lib/default-manifest.o;C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/crtend.o] + implicit dirs: [C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0;C:/msys64/ucrt64/lib/gcc;C:/msys64/ucrt64/x86_64-w64-mingw32/lib;C:/msys64/ucrt64/lib] + implicit fwks: [] + + +... diff --git a/build/CMakeFiles/CMakeDirectoryInformation.cmake b/build/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c45f17c --- /dev/null +++ b/build/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "C:/Users/naifa/Documents/Projects/C++/GraphicsTest") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/CMakeFiles/CMakeRuleHashes.txt b/build/CMakeFiles/CMakeRuleHashes.txt new file mode 100644 index 0000000..caa140a --- /dev/null +++ b/build/CMakeFiles/CMakeRuleHashes.txt @@ -0,0 +1,29 @@ +# Hashes of file build rules. +2b82df4676d707e82c8d09543d23a9b7 CMakeFiles/Continuous +a51c0fc403f22835bc93eece536619bc CMakeFiles/ContinuousBuild +db04f4ff8f3c4430272e7e129170e3b3 CMakeFiles/ContinuousConfigure +17ef0ba718439f6952941b3dcdf161b3 CMakeFiles/ContinuousCoverage +6afae62387e9386786b0213e0c96ce94 CMakeFiles/ContinuousMemCheck +5bb1ec0ab245d63e1b5506e5b317a2d2 CMakeFiles/ContinuousStart +f914551eed28e4b09cdbefbbbbb4f696 CMakeFiles/ContinuousSubmit +cbed2772f349f0b50ff5327904b3d876 CMakeFiles/ContinuousTest +e1b2a820d2f099ab39a4deecb13059fd CMakeFiles/ContinuousUpdate +70ea264ce8ce7063767d1cd77a0d1108 CMakeFiles/Experimental +3c557d24e50b2f05dbfd1a550f48b17d CMakeFiles/ExperimentalBuild +903f66a29ebf1183a51c4e756bc01e01 CMakeFiles/ExperimentalConfigure +36cdb521ac4964fda9af0573a2a106eb CMakeFiles/ExperimentalCoverage +1878a1ca6a731e9da1abe63abe0aca5b CMakeFiles/ExperimentalMemCheck +7346948bd565d63875f6c46b05ded378 CMakeFiles/ExperimentalStart +a0a48ee7dd296d56585f1fd354156dd2 CMakeFiles/ExperimentalSubmit +671d9cd65c34b0f22174f494a577520b CMakeFiles/ExperimentalTest +8600ec566cd3612f9bc231d8d296db80 CMakeFiles/ExperimentalUpdate +454ed535587f8c94109647d554c55567 CMakeFiles/Nightly +e753c4aba383ede4dc721848dbac7d7e CMakeFiles/NightlyBuild +494c3024e954e2a7f447c21cb6a09def CMakeFiles/NightlyConfigure +49c3bac524eafb08efb439df2dee6fe9 CMakeFiles/NightlyCoverage +e772183e5b9f60af7ccf7d898b599d36 CMakeFiles/NightlyMemCheck +bcc2e265cbafe686c7f03a4b94887f66 CMakeFiles/NightlyMemoryCheck +ea3ead8c4277dcb9e6a230fbbeb686e3 CMakeFiles/NightlyStart +41adf95995d2ab89dc2e4e6311c2d97d CMakeFiles/NightlySubmit +6334fc317ee61abd7c493778e97d07cd CMakeFiles/NightlyTest +b967979578dd0c47cb6893d95429951b CMakeFiles/NightlyUpdate diff --git a/build/CMakeFiles/Continuous.dir/DependInfo.cmake b/build/CMakeFiles/Continuous.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/Continuous.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/Continuous.dir/build.make b/build/CMakeFiles/Continuous.dir/build.make new file mode 100644 index 0000000..2986517 --- /dev/null +++ b/build/CMakeFiles/Continuous.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for Continuous. + +# Include any custom commands dependencies for this target. +include CMakeFiles/Continuous.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/Continuous.dir/progress.make + +CMakeFiles/Continuous: + "C:\Program Files\CMake\bin\ctest.exe" -D Continuous + +Continuous: CMakeFiles/Continuous +Continuous: CMakeFiles/Continuous.dir/build.make +.PHONY : Continuous + +# Rule to build all files generated by this target. +CMakeFiles/Continuous.dir/build: Continuous +.PHONY : CMakeFiles/Continuous.dir/build + +CMakeFiles/Continuous.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\Continuous.dir\cmake_clean.cmake +.PHONY : CMakeFiles/Continuous.dir/clean + +CMakeFiles/Continuous.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\Continuous.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/Continuous.dir/depend + diff --git a/build/CMakeFiles/Continuous.dir/cmake_clean.cmake b/build/CMakeFiles/Continuous.dir/cmake_clean.cmake new file mode 100644 index 0000000..7e1791c --- /dev/null +++ b/build/CMakeFiles/Continuous.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/Continuous" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/Continuous.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/Continuous.dir/compiler_depend.make b/build/CMakeFiles/Continuous.dir/compiler_depend.make new file mode 100644 index 0000000..4e014e0 --- /dev/null +++ b/build/CMakeFiles/Continuous.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for Continuous. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/Continuous.dir/compiler_depend.ts b/build/CMakeFiles/Continuous.dir/compiler_depend.ts new file mode 100644 index 0000000..8630362 --- /dev/null +++ b/build/CMakeFiles/Continuous.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for Continuous. diff --git a/build/CMakeFiles/Continuous.dir/progress.make b/build/CMakeFiles/Continuous.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/Continuous.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ContinuousBuild.dir/DependInfo.cmake b/build/CMakeFiles/ContinuousBuild.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ContinuousBuild.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ContinuousBuild.dir/build.make b/build/CMakeFiles/ContinuousBuild.dir/build.make new file mode 100644 index 0000000..cf7eff2 --- /dev/null +++ b/build/CMakeFiles/ContinuousBuild.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ContinuousBuild. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousBuild.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousBuild.dir/progress.make + +CMakeFiles/ContinuousBuild: + "C:\Program Files\CMake\bin\ctest.exe" -D ContinuousBuild + +ContinuousBuild: CMakeFiles/ContinuousBuild +ContinuousBuild: CMakeFiles/ContinuousBuild.dir/build.make +.PHONY : ContinuousBuild + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousBuild.dir/build: ContinuousBuild +.PHONY : CMakeFiles/ContinuousBuild.dir/build + +CMakeFiles/ContinuousBuild.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ContinuousBuild.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousBuild.dir/clean + +CMakeFiles/ContinuousBuild.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ContinuousBuild.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ContinuousBuild.dir/depend + diff --git a/build/CMakeFiles/ContinuousBuild.dir/cmake_clean.cmake b/build/CMakeFiles/ContinuousBuild.dir/cmake_clean.cmake new file mode 100644 index 0000000..afccd13 --- /dev/null +++ b/build/CMakeFiles/ContinuousBuild.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousBuild" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousBuild.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.make b/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.make new file mode 100644 index 0000000..00b62ad --- /dev/null +++ b/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousBuild. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.ts b/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.ts new file mode 100644 index 0000000..1cb8618 --- /dev/null +++ b/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousBuild. diff --git a/build/CMakeFiles/ContinuousBuild.dir/progress.make b/build/CMakeFiles/ContinuousBuild.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ContinuousBuild.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake b/build/CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ContinuousConfigure.dir/build.make b/build/CMakeFiles/ContinuousConfigure.dir/build.make new file mode 100644 index 0000000..6d5a5ef --- /dev/null +++ b/build/CMakeFiles/ContinuousConfigure.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ContinuousConfigure. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousConfigure.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousConfigure.dir/progress.make + +CMakeFiles/ContinuousConfigure: + "C:\Program Files\CMake\bin\ctest.exe" -D ContinuousConfigure + +ContinuousConfigure: CMakeFiles/ContinuousConfigure +ContinuousConfigure: CMakeFiles/ContinuousConfigure.dir/build.make +.PHONY : ContinuousConfigure + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousConfigure.dir/build: ContinuousConfigure +.PHONY : CMakeFiles/ContinuousConfigure.dir/build + +CMakeFiles/ContinuousConfigure.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ContinuousConfigure.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousConfigure.dir/clean + +CMakeFiles/ContinuousConfigure.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ContinuousConfigure.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ContinuousConfigure.dir/depend + diff --git a/build/CMakeFiles/ContinuousConfigure.dir/cmake_clean.cmake b/build/CMakeFiles/ContinuousConfigure.dir/cmake_clean.cmake new file mode 100644 index 0000000..eb51e20 --- /dev/null +++ b/build/CMakeFiles/ContinuousConfigure.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousConfigure" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousConfigure.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.make b/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.make new file mode 100644 index 0000000..584c8bb --- /dev/null +++ b/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousConfigure. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.ts b/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.ts new file mode 100644 index 0000000..c8a3427 --- /dev/null +++ b/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousConfigure. diff --git a/build/CMakeFiles/ContinuousConfigure.dir/progress.make b/build/CMakeFiles/ContinuousConfigure.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ContinuousConfigure.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake b/build/CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ContinuousCoverage.dir/build.make b/build/CMakeFiles/ContinuousCoverage.dir/build.make new file mode 100644 index 0000000..b05c8eb --- /dev/null +++ b/build/CMakeFiles/ContinuousCoverage.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ContinuousCoverage. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousCoverage.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousCoverage.dir/progress.make + +CMakeFiles/ContinuousCoverage: + "C:\Program Files\CMake\bin\ctest.exe" -D ContinuousCoverage + +ContinuousCoverage: CMakeFiles/ContinuousCoverage +ContinuousCoverage: CMakeFiles/ContinuousCoverage.dir/build.make +.PHONY : ContinuousCoverage + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousCoverage.dir/build: ContinuousCoverage +.PHONY : CMakeFiles/ContinuousCoverage.dir/build + +CMakeFiles/ContinuousCoverage.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ContinuousCoverage.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousCoverage.dir/clean + +CMakeFiles/ContinuousCoverage.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ContinuousCoverage.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ContinuousCoverage.dir/depend + diff --git a/build/CMakeFiles/ContinuousCoverage.dir/cmake_clean.cmake b/build/CMakeFiles/ContinuousCoverage.dir/cmake_clean.cmake new file mode 100644 index 0000000..6115f89 --- /dev/null +++ b/build/CMakeFiles/ContinuousCoverage.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousCoverage" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousCoverage.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.make b/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.make new file mode 100644 index 0000000..8d1a807 --- /dev/null +++ b/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousCoverage. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.ts b/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.ts new file mode 100644 index 0000000..23d476b --- /dev/null +++ b/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousCoverage. diff --git a/build/CMakeFiles/ContinuousCoverage.dir/progress.make b/build/CMakeFiles/ContinuousCoverage.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ContinuousCoverage.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake b/build/CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ContinuousMemCheck.dir/build.make b/build/CMakeFiles/ContinuousMemCheck.dir/build.make new file mode 100644 index 0000000..bbfe050 --- /dev/null +++ b/build/CMakeFiles/ContinuousMemCheck.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ContinuousMemCheck. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousMemCheck.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousMemCheck.dir/progress.make + +CMakeFiles/ContinuousMemCheck: + "C:\Program Files\CMake\bin\ctest.exe" -D ContinuousMemCheck + +ContinuousMemCheck: CMakeFiles/ContinuousMemCheck +ContinuousMemCheck: CMakeFiles/ContinuousMemCheck.dir/build.make +.PHONY : ContinuousMemCheck + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousMemCheck.dir/build: ContinuousMemCheck +.PHONY : CMakeFiles/ContinuousMemCheck.dir/build + +CMakeFiles/ContinuousMemCheck.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ContinuousMemCheck.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousMemCheck.dir/clean + +CMakeFiles/ContinuousMemCheck.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ContinuousMemCheck.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ContinuousMemCheck.dir/depend + diff --git a/build/CMakeFiles/ContinuousMemCheck.dir/cmake_clean.cmake b/build/CMakeFiles/ContinuousMemCheck.dir/cmake_clean.cmake new file mode 100644 index 0000000..ad69e7f --- /dev/null +++ b/build/CMakeFiles/ContinuousMemCheck.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousMemCheck" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousMemCheck.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.make b/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.make new file mode 100644 index 0000000..930bb61 --- /dev/null +++ b/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousMemCheck. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.ts b/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.ts new file mode 100644 index 0000000..4f4fc23 --- /dev/null +++ b/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousMemCheck. diff --git a/build/CMakeFiles/ContinuousMemCheck.dir/progress.make b/build/CMakeFiles/ContinuousMemCheck.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ContinuousMemCheck.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ContinuousStart.dir/DependInfo.cmake b/build/CMakeFiles/ContinuousStart.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ContinuousStart.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ContinuousStart.dir/build.make b/build/CMakeFiles/ContinuousStart.dir/build.make new file mode 100644 index 0000000..c3cc0bc --- /dev/null +++ b/build/CMakeFiles/ContinuousStart.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ContinuousStart. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousStart.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousStart.dir/progress.make + +CMakeFiles/ContinuousStart: + "C:\Program Files\CMake\bin\ctest.exe" -D ContinuousStart + +ContinuousStart: CMakeFiles/ContinuousStart +ContinuousStart: CMakeFiles/ContinuousStart.dir/build.make +.PHONY : ContinuousStart + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousStart.dir/build: ContinuousStart +.PHONY : CMakeFiles/ContinuousStart.dir/build + +CMakeFiles/ContinuousStart.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ContinuousStart.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousStart.dir/clean + +CMakeFiles/ContinuousStart.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ContinuousStart.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ContinuousStart.dir/depend + diff --git a/build/CMakeFiles/ContinuousStart.dir/cmake_clean.cmake b/build/CMakeFiles/ContinuousStart.dir/cmake_clean.cmake new file mode 100644 index 0000000..13d5b2b --- /dev/null +++ b/build/CMakeFiles/ContinuousStart.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousStart" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousStart.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ContinuousStart.dir/compiler_depend.make b/build/CMakeFiles/ContinuousStart.dir/compiler_depend.make new file mode 100644 index 0000000..af62614 --- /dev/null +++ b/build/CMakeFiles/ContinuousStart.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousStart. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ContinuousStart.dir/compiler_depend.ts b/build/CMakeFiles/ContinuousStart.dir/compiler_depend.ts new file mode 100644 index 0000000..fcc8893 --- /dev/null +++ b/build/CMakeFiles/ContinuousStart.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousStart. diff --git a/build/CMakeFiles/ContinuousStart.dir/progress.make b/build/CMakeFiles/ContinuousStart.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ContinuousStart.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake b/build/CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ContinuousSubmit.dir/build.make b/build/CMakeFiles/ContinuousSubmit.dir/build.make new file mode 100644 index 0000000..e2ea71b --- /dev/null +++ b/build/CMakeFiles/ContinuousSubmit.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ContinuousSubmit. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousSubmit.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousSubmit.dir/progress.make + +CMakeFiles/ContinuousSubmit: + "C:\Program Files\CMake\bin\ctest.exe" -D ContinuousSubmit + +ContinuousSubmit: CMakeFiles/ContinuousSubmit +ContinuousSubmit: CMakeFiles/ContinuousSubmit.dir/build.make +.PHONY : ContinuousSubmit + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousSubmit.dir/build: ContinuousSubmit +.PHONY : CMakeFiles/ContinuousSubmit.dir/build + +CMakeFiles/ContinuousSubmit.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ContinuousSubmit.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousSubmit.dir/clean + +CMakeFiles/ContinuousSubmit.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ContinuousSubmit.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ContinuousSubmit.dir/depend + diff --git a/build/CMakeFiles/ContinuousSubmit.dir/cmake_clean.cmake b/build/CMakeFiles/ContinuousSubmit.dir/cmake_clean.cmake new file mode 100644 index 0000000..cc66ba3 --- /dev/null +++ b/build/CMakeFiles/ContinuousSubmit.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousSubmit" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousSubmit.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.make b/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.make new file mode 100644 index 0000000..3380916 --- /dev/null +++ b/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousSubmit. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.ts b/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.ts new file mode 100644 index 0000000..73d7404 --- /dev/null +++ b/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousSubmit. diff --git a/build/CMakeFiles/ContinuousSubmit.dir/progress.make b/build/CMakeFiles/ContinuousSubmit.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ContinuousSubmit.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ContinuousTest.dir/DependInfo.cmake b/build/CMakeFiles/ContinuousTest.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ContinuousTest.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ContinuousTest.dir/build.make b/build/CMakeFiles/ContinuousTest.dir/build.make new file mode 100644 index 0000000..6cf36eb --- /dev/null +++ b/build/CMakeFiles/ContinuousTest.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ContinuousTest. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousTest.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousTest.dir/progress.make + +CMakeFiles/ContinuousTest: + "C:\Program Files\CMake\bin\ctest.exe" -D ContinuousTest + +ContinuousTest: CMakeFiles/ContinuousTest +ContinuousTest: CMakeFiles/ContinuousTest.dir/build.make +.PHONY : ContinuousTest + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousTest.dir/build: ContinuousTest +.PHONY : CMakeFiles/ContinuousTest.dir/build + +CMakeFiles/ContinuousTest.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ContinuousTest.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousTest.dir/clean + +CMakeFiles/ContinuousTest.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ContinuousTest.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ContinuousTest.dir/depend + diff --git a/build/CMakeFiles/ContinuousTest.dir/cmake_clean.cmake b/build/CMakeFiles/ContinuousTest.dir/cmake_clean.cmake new file mode 100644 index 0000000..ff11d48 --- /dev/null +++ b/build/CMakeFiles/ContinuousTest.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousTest" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousTest.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ContinuousTest.dir/compiler_depend.make b/build/CMakeFiles/ContinuousTest.dir/compiler_depend.make new file mode 100644 index 0000000..24d664a --- /dev/null +++ b/build/CMakeFiles/ContinuousTest.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousTest. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ContinuousTest.dir/compiler_depend.ts b/build/CMakeFiles/ContinuousTest.dir/compiler_depend.ts new file mode 100644 index 0000000..bd7c1d1 --- /dev/null +++ b/build/CMakeFiles/ContinuousTest.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousTest. diff --git a/build/CMakeFiles/ContinuousTest.dir/progress.make b/build/CMakeFiles/ContinuousTest.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ContinuousTest.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake b/build/CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ContinuousUpdate.dir/build.make b/build/CMakeFiles/ContinuousUpdate.dir/build.make new file mode 100644 index 0000000..556bd6a --- /dev/null +++ b/build/CMakeFiles/ContinuousUpdate.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ContinuousUpdate. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousUpdate.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousUpdate.dir/progress.make + +CMakeFiles/ContinuousUpdate: + "C:\Program Files\CMake\bin\ctest.exe" -D ContinuousUpdate + +ContinuousUpdate: CMakeFiles/ContinuousUpdate +ContinuousUpdate: CMakeFiles/ContinuousUpdate.dir/build.make +.PHONY : ContinuousUpdate + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousUpdate.dir/build: ContinuousUpdate +.PHONY : CMakeFiles/ContinuousUpdate.dir/build + +CMakeFiles/ContinuousUpdate.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ContinuousUpdate.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousUpdate.dir/clean + +CMakeFiles/ContinuousUpdate.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ContinuousUpdate.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ContinuousUpdate.dir/depend + diff --git a/build/CMakeFiles/ContinuousUpdate.dir/cmake_clean.cmake b/build/CMakeFiles/ContinuousUpdate.dir/cmake_clean.cmake new file mode 100644 index 0000000..7a77a24 --- /dev/null +++ b/build/CMakeFiles/ContinuousUpdate.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousUpdate" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousUpdate.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.make b/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.make new file mode 100644 index 0000000..b373226 --- /dev/null +++ b/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousUpdate. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.ts b/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.ts new file mode 100644 index 0000000..ed8de92 --- /dev/null +++ b/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousUpdate. diff --git a/build/CMakeFiles/ContinuousUpdate.dir/progress.make b/build/CMakeFiles/ContinuousUpdate.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ContinuousUpdate.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/Experimental.dir/DependInfo.cmake b/build/CMakeFiles/Experimental.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/Experimental.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/Experimental.dir/build.make b/build/CMakeFiles/Experimental.dir/build.make new file mode 100644 index 0000000..bf940f3 --- /dev/null +++ b/build/CMakeFiles/Experimental.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for Experimental. + +# Include any custom commands dependencies for this target. +include CMakeFiles/Experimental.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/Experimental.dir/progress.make + +CMakeFiles/Experimental: + "C:\Program Files\CMake\bin\ctest.exe" -D Experimental + +Experimental: CMakeFiles/Experimental +Experimental: CMakeFiles/Experimental.dir/build.make +.PHONY : Experimental + +# Rule to build all files generated by this target. +CMakeFiles/Experimental.dir/build: Experimental +.PHONY : CMakeFiles/Experimental.dir/build + +CMakeFiles/Experimental.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\Experimental.dir\cmake_clean.cmake +.PHONY : CMakeFiles/Experimental.dir/clean + +CMakeFiles/Experimental.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\Experimental.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/Experimental.dir/depend + diff --git a/build/CMakeFiles/Experimental.dir/cmake_clean.cmake b/build/CMakeFiles/Experimental.dir/cmake_clean.cmake new file mode 100644 index 0000000..799e708 --- /dev/null +++ b/build/CMakeFiles/Experimental.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/Experimental" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/Experimental.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/Experimental.dir/compiler_depend.make b/build/CMakeFiles/Experimental.dir/compiler_depend.make new file mode 100644 index 0000000..df83d58 --- /dev/null +++ b/build/CMakeFiles/Experimental.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for Experimental. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/Experimental.dir/compiler_depend.ts b/build/CMakeFiles/Experimental.dir/compiler_depend.ts new file mode 100644 index 0000000..2619b9b --- /dev/null +++ b/build/CMakeFiles/Experimental.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for Experimental. diff --git a/build/CMakeFiles/Experimental.dir/progress.make b/build/CMakeFiles/Experimental.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/Experimental.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake b/build/CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ExperimentalBuild.dir/build.make b/build/CMakeFiles/ExperimentalBuild.dir/build.make new file mode 100644 index 0000000..4af6d3a --- /dev/null +++ b/build/CMakeFiles/ExperimentalBuild.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ExperimentalBuild. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalBuild.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalBuild.dir/progress.make + +CMakeFiles/ExperimentalBuild: + "C:\Program Files\CMake\bin\ctest.exe" -D ExperimentalBuild + +ExperimentalBuild: CMakeFiles/ExperimentalBuild +ExperimentalBuild: CMakeFiles/ExperimentalBuild.dir/build.make +.PHONY : ExperimentalBuild + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalBuild.dir/build: ExperimentalBuild +.PHONY : CMakeFiles/ExperimentalBuild.dir/build + +CMakeFiles/ExperimentalBuild.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ExperimentalBuild.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalBuild.dir/clean + +CMakeFiles/ExperimentalBuild.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ExperimentalBuild.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ExperimentalBuild.dir/depend + diff --git a/build/CMakeFiles/ExperimentalBuild.dir/cmake_clean.cmake b/build/CMakeFiles/ExperimentalBuild.dir/cmake_clean.cmake new file mode 100644 index 0000000..3354e3f --- /dev/null +++ b/build/CMakeFiles/ExperimentalBuild.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalBuild" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalBuild.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.make b/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.make new file mode 100644 index 0000000..7608631 --- /dev/null +++ b/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalBuild. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.ts b/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.ts new file mode 100644 index 0000000..34d9160 --- /dev/null +++ b/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalBuild. diff --git a/build/CMakeFiles/ExperimentalBuild.dir/progress.make b/build/CMakeFiles/ExperimentalBuild.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ExperimentalBuild.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake b/build/CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ExperimentalConfigure.dir/build.make b/build/CMakeFiles/ExperimentalConfigure.dir/build.make new file mode 100644 index 0000000..7cd9cf7 --- /dev/null +++ b/build/CMakeFiles/ExperimentalConfigure.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ExperimentalConfigure. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalConfigure.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalConfigure.dir/progress.make + +CMakeFiles/ExperimentalConfigure: + "C:\Program Files\CMake\bin\ctest.exe" -D ExperimentalConfigure + +ExperimentalConfigure: CMakeFiles/ExperimentalConfigure +ExperimentalConfigure: CMakeFiles/ExperimentalConfigure.dir/build.make +.PHONY : ExperimentalConfigure + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalConfigure.dir/build: ExperimentalConfigure +.PHONY : CMakeFiles/ExperimentalConfigure.dir/build + +CMakeFiles/ExperimentalConfigure.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ExperimentalConfigure.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalConfigure.dir/clean + +CMakeFiles/ExperimentalConfigure.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ExperimentalConfigure.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ExperimentalConfigure.dir/depend + diff --git a/build/CMakeFiles/ExperimentalConfigure.dir/cmake_clean.cmake b/build/CMakeFiles/ExperimentalConfigure.dir/cmake_clean.cmake new file mode 100644 index 0000000..69e4a71 --- /dev/null +++ b/build/CMakeFiles/ExperimentalConfigure.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalConfigure" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalConfigure.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.make b/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.make new file mode 100644 index 0000000..0738796 --- /dev/null +++ b/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalConfigure. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.ts b/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.ts new file mode 100644 index 0000000..51fc32c --- /dev/null +++ b/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalConfigure. diff --git a/build/CMakeFiles/ExperimentalConfigure.dir/progress.make b/build/CMakeFiles/ExperimentalConfigure.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ExperimentalConfigure.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake b/build/CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ExperimentalCoverage.dir/build.make b/build/CMakeFiles/ExperimentalCoverage.dir/build.make new file mode 100644 index 0000000..1db3078 --- /dev/null +++ b/build/CMakeFiles/ExperimentalCoverage.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ExperimentalCoverage. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalCoverage.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalCoverage.dir/progress.make + +CMakeFiles/ExperimentalCoverage: + "C:\Program Files\CMake\bin\ctest.exe" -D ExperimentalCoverage + +ExperimentalCoverage: CMakeFiles/ExperimentalCoverage +ExperimentalCoverage: CMakeFiles/ExperimentalCoverage.dir/build.make +.PHONY : ExperimentalCoverage + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalCoverage.dir/build: ExperimentalCoverage +.PHONY : CMakeFiles/ExperimentalCoverage.dir/build + +CMakeFiles/ExperimentalCoverage.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ExperimentalCoverage.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalCoverage.dir/clean + +CMakeFiles/ExperimentalCoverage.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ExperimentalCoverage.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ExperimentalCoverage.dir/depend + diff --git a/build/CMakeFiles/ExperimentalCoverage.dir/cmake_clean.cmake b/build/CMakeFiles/ExperimentalCoverage.dir/cmake_clean.cmake new file mode 100644 index 0000000..b8d6597 --- /dev/null +++ b/build/CMakeFiles/ExperimentalCoverage.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalCoverage" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalCoverage.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.make b/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.make new file mode 100644 index 0000000..4c327cb --- /dev/null +++ b/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalCoverage. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.ts b/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.ts new file mode 100644 index 0000000..d3bffd3 --- /dev/null +++ b/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalCoverage. diff --git a/build/CMakeFiles/ExperimentalCoverage.dir/progress.make b/build/CMakeFiles/ExperimentalCoverage.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ExperimentalCoverage.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake b/build/CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ExperimentalMemCheck.dir/build.make b/build/CMakeFiles/ExperimentalMemCheck.dir/build.make new file mode 100644 index 0000000..3ee631d --- /dev/null +++ b/build/CMakeFiles/ExperimentalMemCheck.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ExperimentalMemCheck. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalMemCheck.dir/progress.make + +CMakeFiles/ExperimentalMemCheck: + "C:\Program Files\CMake\bin\ctest.exe" -D ExperimentalMemCheck + +ExperimentalMemCheck: CMakeFiles/ExperimentalMemCheck +ExperimentalMemCheck: CMakeFiles/ExperimentalMemCheck.dir/build.make +.PHONY : ExperimentalMemCheck + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalMemCheck.dir/build: ExperimentalMemCheck +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/build + +CMakeFiles/ExperimentalMemCheck.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ExperimentalMemCheck.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/clean + +CMakeFiles/ExperimentalMemCheck.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ExperimentalMemCheck.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/depend + diff --git a/build/CMakeFiles/ExperimentalMemCheck.dir/cmake_clean.cmake b/build/CMakeFiles/ExperimentalMemCheck.dir/cmake_clean.cmake new file mode 100644 index 0000000..ed3f7bc --- /dev/null +++ b/build/CMakeFiles/ExperimentalMemCheck.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalMemCheck" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalMemCheck.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.make b/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.make new file mode 100644 index 0000000..ab194c2 --- /dev/null +++ b/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalMemCheck. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.ts b/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.ts new file mode 100644 index 0000000..5d0d9ac --- /dev/null +++ b/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalMemCheck. diff --git a/build/CMakeFiles/ExperimentalMemCheck.dir/progress.make b/build/CMakeFiles/ExperimentalMemCheck.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ExperimentalMemCheck.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ExperimentalStart.dir/DependInfo.cmake b/build/CMakeFiles/ExperimentalStart.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ExperimentalStart.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ExperimentalStart.dir/build.make b/build/CMakeFiles/ExperimentalStart.dir/build.make new file mode 100644 index 0000000..7ec6f88 --- /dev/null +++ b/build/CMakeFiles/ExperimentalStart.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ExperimentalStart. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalStart.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalStart.dir/progress.make + +CMakeFiles/ExperimentalStart: + "C:\Program Files\CMake\bin\ctest.exe" -D ExperimentalStart + +ExperimentalStart: CMakeFiles/ExperimentalStart +ExperimentalStart: CMakeFiles/ExperimentalStart.dir/build.make +.PHONY : ExperimentalStart + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalStart.dir/build: ExperimentalStart +.PHONY : CMakeFiles/ExperimentalStart.dir/build + +CMakeFiles/ExperimentalStart.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ExperimentalStart.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalStart.dir/clean + +CMakeFiles/ExperimentalStart.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ExperimentalStart.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ExperimentalStart.dir/depend + diff --git a/build/CMakeFiles/ExperimentalStart.dir/cmake_clean.cmake b/build/CMakeFiles/ExperimentalStart.dir/cmake_clean.cmake new file mode 100644 index 0000000..4e2736b --- /dev/null +++ b/build/CMakeFiles/ExperimentalStart.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalStart" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalStart.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.make b/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.make new file mode 100644 index 0000000..29aab51 --- /dev/null +++ b/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalStart. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.ts b/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.ts new file mode 100644 index 0000000..a636e5c --- /dev/null +++ b/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalStart. diff --git a/build/CMakeFiles/ExperimentalStart.dir/progress.make b/build/CMakeFiles/ExperimentalStart.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ExperimentalStart.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake b/build/CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ExperimentalSubmit.dir/build.make b/build/CMakeFiles/ExperimentalSubmit.dir/build.make new file mode 100644 index 0000000..463872d --- /dev/null +++ b/build/CMakeFiles/ExperimentalSubmit.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ExperimentalSubmit. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalSubmit.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalSubmit.dir/progress.make + +CMakeFiles/ExperimentalSubmit: + "C:\Program Files\CMake\bin\ctest.exe" -D ExperimentalSubmit + +ExperimentalSubmit: CMakeFiles/ExperimentalSubmit +ExperimentalSubmit: CMakeFiles/ExperimentalSubmit.dir/build.make +.PHONY : ExperimentalSubmit + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalSubmit.dir/build: ExperimentalSubmit +.PHONY : CMakeFiles/ExperimentalSubmit.dir/build + +CMakeFiles/ExperimentalSubmit.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ExperimentalSubmit.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalSubmit.dir/clean + +CMakeFiles/ExperimentalSubmit.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ExperimentalSubmit.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ExperimentalSubmit.dir/depend + diff --git a/build/CMakeFiles/ExperimentalSubmit.dir/cmake_clean.cmake b/build/CMakeFiles/ExperimentalSubmit.dir/cmake_clean.cmake new file mode 100644 index 0000000..d130e45 --- /dev/null +++ b/build/CMakeFiles/ExperimentalSubmit.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalSubmit" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalSubmit.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.make b/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.make new file mode 100644 index 0000000..4440172 --- /dev/null +++ b/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalSubmit. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.ts b/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.ts new file mode 100644 index 0000000..7fa97b1 --- /dev/null +++ b/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalSubmit. diff --git a/build/CMakeFiles/ExperimentalSubmit.dir/progress.make b/build/CMakeFiles/ExperimentalSubmit.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ExperimentalSubmit.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ExperimentalTest.dir/DependInfo.cmake b/build/CMakeFiles/ExperimentalTest.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ExperimentalTest.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ExperimentalTest.dir/build.make b/build/CMakeFiles/ExperimentalTest.dir/build.make new file mode 100644 index 0000000..cf8f44f --- /dev/null +++ b/build/CMakeFiles/ExperimentalTest.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ExperimentalTest. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalTest.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalTest.dir/progress.make + +CMakeFiles/ExperimentalTest: + "C:\Program Files\CMake\bin\ctest.exe" -D ExperimentalTest + +ExperimentalTest: CMakeFiles/ExperimentalTest +ExperimentalTest: CMakeFiles/ExperimentalTest.dir/build.make +.PHONY : ExperimentalTest + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalTest.dir/build: ExperimentalTest +.PHONY : CMakeFiles/ExperimentalTest.dir/build + +CMakeFiles/ExperimentalTest.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ExperimentalTest.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalTest.dir/clean + +CMakeFiles/ExperimentalTest.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ExperimentalTest.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ExperimentalTest.dir/depend + diff --git a/build/CMakeFiles/ExperimentalTest.dir/cmake_clean.cmake b/build/CMakeFiles/ExperimentalTest.dir/cmake_clean.cmake new file mode 100644 index 0000000..4348aa3 --- /dev/null +++ b/build/CMakeFiles/ExperimentalTest.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalTest" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalTest.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.make b/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.make new file mode 100644 index 0000000..fab28a9 --- /dev/null +++ b/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalTest. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.ts b/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.ts new file mode 100644 index 0000000..fbeb091 --- /dev/null +++ b/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalTest. diff --git a/build/CMakeFiles/ExperimentalTest.dir/progress.make b/build/CMakeFiles/ExperimentalTest.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ExperimentalTest.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake b/build/CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/ExperimentalUpdate.dir/build.make b/build/CMakeFiles/ExperimentalUpdate.dir/build.make new file mode 100644 index 0000000..89b2799 --- /dev/null +++ b/build/CMakeFiles/ExperimentalUpdate.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for ExperimentalUpdate. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalUpdate.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalUpdate.dir/progress.make + +CMakeFiles/ExperimentalUpdate: + "C:\Program Files\CMake\bin\ctest.exe" -D ExperimentalUpdate + +ExperimentalUpdate: CMakeFiles/ExperimentalUpdate +ExperimentalUpdate: CMakeFiles/ExperimentalUpdate.dir/build.make +.PHONY : ExperimentalUpdate + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalUpdate.dir/build: ExperimentalUpdate +.PHONY : CMakeFiles/ExperimentalUpdate.dir/build + +CMakeFiles/ExperimentalUpdate.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\ExperimentalUpdate.dir\cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalUpdate.dir/clean + +CMakeFiles/ExperimentalUpdate.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\ExperimentalUpdate.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/ExperimentalUpdate.dir/depend + diff --git a/build/CMakeFiles/ExperimentalUpdate.dir/cmake_clean.cmake b/build/CMakeFiles/ExperimentalUpdate.dir/cmake_clean.cmake new file mode 100644 index 0000000..2319049 --- /dev/null +++ b/build/CMakeFiles/ExperimentalUpdate.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalUpdate" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalUpdate.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.make b/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.make new file mode 100644 index 0000000..30e8f2c --- /dev/null +++ b/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalUpdate. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.ts b/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.ts new file mode 100644 index 0000000..aa7a97e --- /dev/null +++ b/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalUpdate. diff --git a/build/CMakeFiles/ExperimentalUpdate.dir/progress.make b/build/CMakeFiles/ExperimentalUpdate.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/ExperimentalUpdate.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj b/build/CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj new file mode 100644 index 0000000000000000000000000000000000000000..8234c4206bf54dc05cbf557c1307dbf809c98f53 GIT binary patch literal 168555 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%0A#At|Xe|HG-Og*;4Tjt}j- zYlM78B%N)}2x*%}^FM5JUPu~|xolG_WGj(*Y@?_H@W=kIG@Acm8($$wvuOT@Z32bt zAhLjMLWGA&Hu1XzK{or+{iWs zLTZWRvrVCp0dr~ohi!_4ln`0YHpN1|AaWDiln6 z$bKU0c{`03QcL76wuu$eJ%Z+c*d|U$8j*Y0CSJ(>M2grZK}aQ$d)X#Q$nQipuuY1P z*!DF4!!~I`(uv&9Hkm@QsazX*l*krRO5_0^6Y_;jpF;CLytgV4k~NOze|Ur}6cT|1c>R5=ovP<*~Oy z$SfiyOe%$(8BX&*T+%8bH(pQkKitQvg}hAUaqeR^LVhE%jcv{dxq2bZ|FF$@Axkxy z|6$LyLY^h^6i28iRQ}kf()ms)*O;%6i2gMH!x07wSv!d4f7nlmkmMAa|KZ#tggiQq z=6~2GTF5n2&(CtNixrad0?q&U&>2UZkWEu*{)hW&ypUgMG%jP$2|`|_-2cI?lO$v# z<-Utcnj+-GaWwzKHfcguQ|`ODM`a3`_!iCo@cunp$R_GzFLG_<3;B@9OKejhBr1~T zf7qr_$V?(HvrUnZXNl}#n_?kf6WPl)B|`djp!pxRDHW1UcR zHnBo_EvES&wuuvxN8|^#i5K!Rk@IYmAmk4sKeA1dkfGT$|HC9jNFkA*xHi&+93gU% zZ8C)f-$3&}Y?CcyI+0)4CSOPikzd)SKuE=VH2=e-P>638&Hw2AN65F7>JpEu#X@>g zultR+of09}(y0DB_rp>lEpDgzAGRqI@)I3q{HgaJA^cACzx4hiN>O%8Bc8c)4kP$>2oL8-oTZlAf z8x?5wpBISuvW>5h?}_-aO`wpDU1|P@Z9;@xN5r3PB7|%t;$)j>A@34#u}!QHtsBk% zuuYthtBEvan|L94L;~3+LCCX2nz2oikgtdYu}zAQHr;9dhi%e?OePY{Hkm^1BGQ6w zvW2`wq$S(r3;BacE4C>RazziC|6!X#A&ZEFvQ3eYCy2CWn_?j+h=j3CiI5gCH2=dk zr9#FLX~Q;ULT)3{mTk&~yh@}U+f)eonMefNR0`?QljeWerb_asFW2gRnUdR?AooLd=UMu7{k!(ZzKYn$PoyOjBAronTF_>$$LdZ@c@pe9b7Sfm^9KtqLLehy0Wt(atYbVnD58KoT z`JKpcCTE1Sm`?LQOwJ48*F%i7(=Sl9LJp6o`5!KqqEjmV*zFT&{)dUL5PqF-B9Cl= zLipXWquC}zNZDGN|6!X5A^fJ*v1}79grAQ*j!CQ#e#Gy1?(=a%j!<3`*iXEWOO#g< zr%Dj=73Fme+aw7&PkBvbn-n4Z{N!XNX+j>Mye4s8nL_wI#go}jwvb-rX9}mv7t)$? zpUO4`LOQRb`5(3^6vB^Ip2nm|$VZgdbk3_-$W4^jwd|)vNG9bqgHx3X;dlLB$2Mg` zW>Q`=*`{0wKX5sfNrjN6r8NJ;c~uH2DyR7$eg7qd-~2k8`(d?^%@5N2kDd0yHA1=; z)BF#UGeZ8LR2iJ=ypU6rYA)N<3Mr>l^Oz|5`Bm>f@psbv52x}Kas%1SXPZDFe-T;0 zBt*!g%W3|HOA#StJoSWyT+(PEtH|>ref$yPA4~H;ymiM38BAm`*I~Sn93t6llOW_N zA~l8{e{EMc1zAx(SH{14lt2^mHtmu)hI+(;ykZL)?Cp%+mr}7MdW6-DHYPH56%CuO_`7}L{_j(xsY3l z+{!i;LY^m5z&4daz9zDgZK{NX^`-eAwy72}fyipMsS&c8$QrgeBjhC_x3SH6A^d9H z+j$(T71Dh@&Hr$ls$jGKtRzy%HoijmjkI^LO`s5do$NZc2@%5Yg1wV%B82dZT-UQr zw2;}dMDunRM4NExYN+J0~ z9%Gv-A)gW1$~M(P!Z*_V58KoTxsJ#-CTE23+xnj1ROf}*9-#Rjwy6~|jL1`5F4e;9 zKerPpW#TL3Ad#n;1PZzC0L}mK2pJ-T-#haRd*(}a`C~u*7|s81s%RlEmeBkUlUN}? zZKe4iuAev|{HB?m>?dAG7qThiR0%@Fr7ezrLy|Wt&(b(T8aMhi&47R8OJ# zA3kP_7cw-6=6`rxO%TEl|9YQEl8_!tX#R)&qzIWu0FN#ql@DH8Grk>hMrEab{un*U*&5+OGb`HXE! zg*-##1lyDe`HIL%wka3VE|2Da*rr0rG$J)@Qz_&=BA>HOl}TFUn_Jux|3Zhl#$H43smi9pCxa zx`}%Rs?*#h85znI>Ju2lE6(Zu7G*4&lf6tidk69NYh;B@e_|lATu2i`&iEkyzCfI+ z7K>&rq$gV{S8JbUoOlhdF_Mg=oW{&PW-Q5}7r3djj%M7jKKG_I%U+T( zcYZ!SI`w-;Gj?gex9rxSN6g%Y7@4VNRKfG;C$L&aOX@Y0E``pX*~2H4q6;0AD!b~c z2Tb>dWzg-qi?eblY}*MVmbRw5Xw#i-a{%A9mO5&z+{2gJC$*0%alB<_I88GwZJUQV z&8jJJ#Gq>GC+@A*IldokB$B&7Y?})t@wx^R_fq+e8|c>t{@hH3;*V|ftCBds!Njqu zz2l93MxvdKjsLdImn3of1`_v9?WIB-EzHEv8fhu#D_v%pLmEsRtID+pdl;!!_)5;X zlDJ&Ee1-K&y+Uo(Uh8HgvMTH!l6Y%_iTkQ-ZBAz+@r*{2^EpYJ-C*KAYOvO}gOO+i z5_bzQ%RIQj#JyFV_IRX`_$K2YRamAZj%zS+FV#vr(#}Zrp^x$3w)qK3+^WIEvFZzZ z4>R1y!X)t*lK2ZdYP)6TtQ@{~QhlOth;pOI2=uINO>HVnH;A~KAZ_j8c5}0)V+{Q> zhfMseZAqPIVOVDR@rZWP{FdaGo3Vs8@>%pA3-wPECa9n%OmDZC-u!4Np(j0G)bEw| zxi>xNb<<#?7-XnlLya70%U0cZB-U^LRJJ3oo6V|PXd2r#e@D>;$!$E>hz}!^Dl-$Z zZaFU_*YL7KuZa}12BJ_Cw*-=-+svQrQU4L`x>8nlW0wMYfx6U`}NT{!puF+bZ*;RPC@z61G4$e z5*uZ3H42kWcj&5u#=JL?&6W1y`p34})r^`oiyqm(Tor_y4eLiY^U?zv)k^)*^gj1y zHV-oMG^MA1?jp&hjh6Hn!9z%1pGwVAz8u&Do*qqGhK6&2(?d?}- z{rwZ04-Op|N@ILqHLCf5_BLidAvBNQl5PAA6Pm!a=93F?# z-qks@nJuVse8|muo=x>UX$KM*V;dZ*2S~ZF*Ma)_W|FsFGIkc^Z(|2E6`w$N2Hi?| z2fK`t>EXpu{4L;%Qdz!QN*HDi?s2qgP9ggHQ~l6NE>K7d#VKhPz7ee%)V{HQ`$mb) zjr!yDttk{0Mn%;Nrf1F3g&WbaMVn@}j=s(P?d`(aaZZ7)Xx^PFo#Jc9zUk;dFPomD zG+O)SH_zdtpH6=6rcf%W8^b0^P28`am@6DBryFLSibbl;^t zHD^x>tZR%>lV-JvF^w^L)#-V8wqJK-;H6S~)K9fsZ`Bz06%y2PDz@rQf5r%A?jz|t ze>ROV{?}bzNBbsC`Kkh1VYAtO3vls2-fHQOL_3W)Hs1U{r@u?|*N-_|SqR}0!HuB<8UOdH%-Mn~}7jN<62roY7#c5t>&FPY6%0d6o?ZcXD zjpna>8rghfw17OVajw>Gy6-`))3ch>H%hZj(^|~e0#-Bko2E7O?Wx(G(>mDu8cd6D`x6^{gXnwx!HRrXO?P@K| z-gK@Ox<+d}S8F?63t)?nwBXk?zelwY-!YnVuGVRc)^3#+%xm`Cs5x`B;AvX($27lO ztxr#_wQru*>!Q|amDY5x)+bMEwn}U68>@x+25DDO3LkrZt`@;bM{9bNb2X>kS;VDk zlc@z#RJmI7>Fg__r{?ktpooX$mQ-&%ATV|kI_2jY9V7vv}X3D z6tTT&jOL%K+i^W=%^f{CrVc%|P>QMLQp#hl)`imAQgolT3zS%o)hAnGb=sTk;Bxh~ zf3D5dw7puRxmxGdS`eqYpmm{84b?8ssAYF%t?iMgwJ_{DQe_&dSDx0&P*lNs882ww zShqZ*l`d%BRQo&{%k@~SwLSB+mUWpGffbddtf)HVX@N#sOIdk%OVO}rYptcMNG;`U zZRfoD^=#Q$u~@8so)%_AZ>eF_i40~bE3FlQm77%?ma^7bX{~&%wU)AK&8kUn{{GX< ziolBW@3Q}NEZ+S6-B|vvU7I}3Rkz1l`FgASzsvq^1pkhm)rYLD_Wxz(ZL9cqn6>>{ zwf6s+`@W*#dii(y?*ENxtufKs*IN5-t0#J6e|OxlYW(kR(^gbg-}T0^Bc zEoFJJqOz2=)>2kEEM_UIjl3yqtMI0*s4Qh2X<1SIUFB_yvZD9q#VUulwN{U?>eNbM z^+Zcq5m?GfVW}|tkz42l$Ns!egw}VSc_PqlwH%sz3)-qctFkO*Rhy-(6qd4zX{EK8 zRZJ@aOI?+xg&T)PSLA7-bq|a!J8uzKDXdto&ePf$UM$a6Ra)K2N_%CV*4juBW}nUV z*Uqi_`j3&Lb*rAO%n;Oi&DPPX^Iog#pEeE7GfvkoXx`L_JgvPEgEuuK&p7YApjoB! z7XSZe7qq`y2i{u28w;~f>;XL(~*9#%)Sa{Es+%d@rl z{9R^sQ)}b5HsJr0m{sG}wj5@^h8sH8t)Z>4(=xNh63dA-s#wfh!&qxAe-`uR#j>;f zS)IhHQmf~pvFwYuIKghk8M0c25i23g-G&xxkg;0N>J3&%ma^=;F>CFpJT0>BFz2m* zTe(^BSzat=mBXqY%b(@NN^2?0i#KHr!&Y@$4P@nO`Li0*O7WjjmgoPBvg*p4vg*&; zng8Fzyp_ls^Va4T`|p>x;S}B?u$Z;Ih1nm!mABfH%5Af~YPB38SsnWCsxbR<^4Hlq zH1Rg1S=+2NxLJMO>T|;|OKA-^-pZYrXUu0`(8lFy9gXe1VK0_Ht6)~GSa~$8tQ!5# zD62m-ti0vsErnIjR(Y*bS~b+Lvc{fyC|d0G!64=X;)Uvi!nU3br8*;%<+DZE8xMIUD0p>L@l zx^Jmhuarlwr1z5~m=ddc!Dx9UPVp_cs&A`ZtU#>-SoCE}!}4b-D|#z}e}`EctySK?%dD8Kru=u9RU)en z{vGD699H{UYrQcm0;}%B>?3(Qxhg`7nx{2ht!X@7q!@Dpqv@wvA4e?z4o*L`w#%en zZ~azjZG5_fYQFq~_H&v>Kc4ds$O#&3mNG|lcz(OUTa zti=>*E$`K0i?nw4YJCP816YbNRu0q#lA}hWwLbihwdP1kp?{7T{ijo33aQ<^|7fa| z|EawG&rkKgvkw1v=Jmgz=9|*IAzeK{-AuavTx~FY^D*-Bq3a-~JxZ4?r0$_jr9*_) zB~uI9t99O@MLjAP7c|S$8s!?(S$su<=9s26Vt*f*-CN(3rcK*xeYD1}$kxUeOxSp9 z3!)1l+RoLwa^A)j96obN+a05M8)y`x*&Ne+9CQT@U%jh_4VW=GhptARku_`n+*vb* zFP@XPC?hL3X9m3lV?o9o62rQ6n=xw1tnAGBb8;qS@%-o_d}=^*nnb&z_QJPs+2Wd!9Wd&%cw9^X$oa_M|*Hvqd?}a{Be{nKx%i zF8!OIHD_U7ddB}u6zLh+y5q|_?Kvi4qT;Nnl;%Iaa-1@b$uvNw%E?Wq_b1W!>ob>R zFPxP-ckz-%^o=eby^*inoJ)H4telM8oODuzblW+L7crcbJ)dFjvh0i;66|WR{(lL* z$=(1|dJ?qc=FOmX(^JgP;^eeq)UaU#BBCc|EbZMrVkk9aZp7?m5#y4lCHIb?iz>Or zyF~Qr6Vp2;*0|UynEw4mAG(}AKf>AAw}dW-;!l+E4@^6saydBWtL(+jr_{3?buZ-?JNx#=9{%dyF95q6J>#o;Qv&Sjl%wvQ z53rl0dE{I7RtmA3V-y4Zx$gZUVrLJtd-$t+GYaftjdCcuhEwsCqm5JxTDGAJ#~Z1( zq__h&QuGucQ}u$1BW0u*N~*1%A{lGxZhJGutx$JDZ6wuBPeFIUnRff3K8894^(PeF za$)8+o0Jh>78KvuVX(DO8=xM7dJ?J(Y9A@S@um?yC|kT7hWZZ5m#)=puiJ%_GExjB z6{)jCQbq*nP-~$!L+vKjK~J#{>=4vZto;P+7bpj%GxF%oO81gXOCu_N2ZFJ7Kh!^= z8a3hvX>ch+Nf~xmL5(M6wCZ%Q46qx(ZU*Bg??+MVG*b70JqorR>_xEG!QKVqXW<+9 zehKyi*l%DCy5ifg3nCSz=i3IX3s_&Uc(5^GQ^96~Wq~aNyA6z=25;oM8SE*r=fU=Y z9Rm9h>~pZQVEpuTqa1dJ%o?Stpd9X>>;piVEp`X zBbL2jZ-X5LI|=p;*w0{!uDkD~x0aKX;ja}~2e25h0bnD*t^u0?mI;;vb}QIAum`{% z1A7*%9Be<>dtje}od&xA_6L}sc}UVo1(Pz$8v)i0>`JhqVB^82fn|VYgWU|a7VJK- zEnwThUI2R?>@XNVh1qD2Q(!-UT>^9XiCr^NM%mhcMT7MP8w@rEYzo+Huti|Yz}A2j zfo%eN3TzkHKCpveAA<3dfsL5Yg8d3+Zz5$2AZ6IK2I~mc3v3`*0$4IwD%b+BrC=+; z?gA?Y+Xl81Y%kaWu%lonz`g;y2*$g1qkZ`f5~FObz#_q7!1{xY080X!0X7dT2W$n{ zI^-pKV5h-;1p5Qb*C}NSCS{bj9auN8eqckv#(_-(O9#say9sP9 z*aomIU{8a+0LD)UHR}E_*vDX}z|MhP0;6k`&9u!(8D$Fxiw5fhHW+L)*c7l?V2i-= z!PbD?1GWk5Nw8gDuYw%}I|jzjq%>mw4(wMjei4UJF9DV6k8W!A5~4gUtk6 z0G0=~5^OzKG1%i^JHhsV9RPbD>;xD;C($U!MXacmIQV! z*gUW$U@O4x0NV)0PYN{h-2wIz*qdNSz>b4`1@py}?|^*__668Euz!Kk{WfOWKvG88!ofO& z^#L0MHX3X)*eo!9MTOxnA8a+)Jzx)mJqh*?uvfwOd1;2fV_^RT`wr|EFrOeP8^6BH zNE-?k1r`f-71$`SiC{Cq=7Z&d6@aY=dl2k#u;;+|1zbkEy#@9@*k@q;gf7GGC$PW3 zn$Z1}M%h}DGVJJHNt5*eivt@DHUaEfu(@DMz-|G%1MGe&1GX4!IoR!B_kukFRtmNo>@~1= zz&--|0_=ORe}OfkX$YfifuxMGg@JVj>kT#tED>xnSQ;3=bky*7BiL%NyTKj?djjkq zV6TAjlX?t)AAtQ6>|3y3z-;s+7Ncw~QbyVkuqd#eU{`^S1e*wU9oT%ZTrhrCjgiNl zU=M~pa1!D_)8(cRQW*_x6v$`%IJ39L8R)nJKW zlfcrzt_QmjY!%quU=M-uD{+lj%D`R$dmHQnu#;flg8d9;Yc2kqq>QqKfOP=t2{r(1 zB-k}z*MVh%<$~P`b|=^aU|YeS1$!B6KUfvmr(j=$T>$$N%#R-RV3e%|DWm=(z`BE7 z2{sIDJlJ%w46qx(ZU!p^yASM9uj!N!111)B|)1-1=4+8V4s7X1*-+Kw~?|nC1sSYH5k7l z*@l!s!OFq*gS`j#DcEVS3t)eM`O#yC zjIsrjGRhGF)(z}Ru%Te%!KQ&_fMtW-47L{RKCmrd+reG{dmZdEs2{NQH!w$pL?1-T zC{Y`*E?|AZ;=#s%O$D0`mIby9>^86>u+3mkfjtkl59|=whhU$Bodv4}v$vPBH6>+~ ztu}{~4U?;)80s9$DMM~M6q>Qq) z0_y-412zC`1lToTGr%&za=>l{TL<<4*gv2uu=X(6$6%+x&VgM5qbrup?Wh?kqeR`I z24n3Quqj}(!4`on16u=D1hxt6DX?8&`@jx@eF#>jI!4`lm1zQPr7g#aaHn5#wd%+HX9R)i9_6^uYF#dU%zR)j#{-lhuwE~L- zivjBoHUcaOYzEjoupF=zVC%p(f;|Sd1FRhEO|bXCj)R>B`w{F9FkdQ|QMO?EXOy=c zSU0eKU_-&iflUKT2g?S#32ZIc2Cyw)PlLSxRsnVx>|?M~VCTRtfzgF!X4#sNGRhVX z77f-1Y%thpuqj|SK&`>rBCt(hPl4?M+Xr?K>_e~`u(M#lg4v@b`T$Z?JnECJ!8(HV z0viaH0G14v3bp`jDcDM|yTFRUwt?*g+Y5F8>?qg?uy4RFf~hW2Hh)q^*;;``g2jOK z2jf?*7_FKFHUn%PSPs|nb*f_9hVCi7lU^juS1=|3&1?*|C7r-jO4ugFRb_(nq*d;K2!Hm&v%}AMB8CWz} zAF#n-qrs+t%>r8lmJhZD>>jX9U{8YW0(%##25ZlP{R(F9F3|^&GPg3Yj$pmO27)Dk zC4;4cEdW~zwi1kAkz>?aG1xY+onU*x4uBm6I|23$*hMhaL-Oz^Wo~6)kzg@k{lP|n zC4tQVn+KKywgPM&*b`9YSi2wWJ+M!~PJ>+l`vc4`MoJV+$|z9;SU0dM!G?m32b%_# z0hSGRGuT?N`@pt~*liVAWu!z^RtIuphzx0Q2oFWeX-{?#sZsf%O9$3N{XG8dy45 zHWm@;fISWN0$2suVX%+E_?0R~%;&%^fzcf)X1>ixnfo%ZXs|wDgTY3F zO#zz)wg@aAYz^2wV4J|61ltAnD%e4=V_-F4-+}!KMi0d`%N9V&C|f8PJw4TAv0wwi zMu8=R%>-KjmIt;HY&}>p*yCV3!S;Y10DB+o1lSp{i(r3&`ClRBXi3WGLy=%T!1{v? z2TKCG7Hl5a60j9ucYtjKD*@X9_7d2eU`N1?gM9_|BiQd?zWtM=0fJKA#1se=D25bu0Y_LUO z%fQxv6@hI6dkSn9*gmj>U>}0jfSm>V70ezdWeXr>l&v*bN3dRC1Hlr&lEG5J7Jw}U zTM2d-STWc(Fn)Qx5zAh%17JtNPJn#_b`ebVm$LbjGW@jyiv)`S>kl>pED3A|*gUWt zuoYnIz&3(C2DSsN9PCZ7_rQ*Wod)|6><=*C0aCVLQs%x4tQ%NAu%Te%z@~wvgJpx= z1hy7z1K1X@r@>wTs{lI;_A%HguybIS!05TeX1g^bW$w$sqQUxr4F($xHU(@J*dnle zur*-!fNcVM5^NXPt6&Ggj)B#HeFyd{n9o2dTL39@Uk26@EEa4a*eI}Mu$f>B!1BOW zf~^ND274TAC)gga17Poiod7!nb`k6^F#oHiY%NI{+h8PE53v4V!@-ikt_7P1wghYi z*d1US!Aih(fV~9vCfE_M<6vKb{Rs9unC~DdTXRxI+1i111?vYk1Z*5w3RpVWtxy}V zb_>|kU@w4GfE@<=80-|-Ij~D$bi1l-Wu(ll3@jR~57=O^(O^@+W`QjN%LiKnb`RJl zuqVNGfxQZL5bPLO4cKo`0r66z)})LQbp-1LHV`ZUEEy~nYysF(u$5qUffa*o1KSC< z7wiDoQLqzW-+)~NQ$wU2{-n%(8CWD(3|N1#5nxGRGr;D7<$$dKTL-og>@lz%VC7&R zK%K_g3t)eM`3;p41(PyL6am%^>`JhqVB^82fn|VYgWU|a7VJK-EnwThUI2R?>@Zk0 z*eS3dz%GF~hDq6)kuu8G1}qw^FW6wPFuyU|B!QKNq4t5&s zN3cJ@d`C*zf=NXw{w<~*SU0eKU_-&iflUKT2g?S#32ZIc2Cyw)PlLSxRsnVx>|?M~ zVCTRtfoY?pY|Tg+WxED!2Gl&L<*<8(lyRTtVP0$JdT}I(zW`F5b=HcM;W+}T3si5Y zYoXRaJqJ|{<&!A>xpe94*Lal(hi&Q7QZ#)E6 z0`(%)jbkL=l~9ySMbMv}YEYCfsc4-!!2+Rzu{H!O94Z29x!(DkUH4@u`ia2wOw*X= zTAEBT6`c;6Yw4iWWbshLv6h;{Tssyj32P^Tr9jQV+BC3qs7$O~2$l_%i?#V+H$xR* z?HaH`sP$M|1a?1EG1hJdD}maEwWVM?pvtgzH&{8;D_C0rwjZhzYY&4}K^?=|YOv3s zYOwZ8urp9+vGzRJMW|Y={T)o%q%9kfiY9KS7YfnayXenf(E+@o$sJNdplEQ^Ti>Q8 zlcLE~TKfeB9YxBfdVeTtIMiIILZ~fJd!UX&eF^molBsN zhT0DG3e*v(8mJ3UjXsuGT0%ub4S*U8H4`cuY8BM|P)|aYLmh(p4C)+|qHbc;eGpU> zR6nQ$sOeA(p;kZ@L2ZTF4Rrvj8tPl9-=P9Nk*Fe|dP5C|ngW#xwH#_a)E1~Rs5hXF zL7j%Gg=%tKVhM+efr^Kk2$c@C6si#FVW=HY`=F|zzJR(2<@i)$34!VgH4th%R2tM0 zs5MXzK$Sx6fjSIz66!pZ4-G3u&k2U=1QiE08fpeq7E}S$2B>XNFG5v99fvv#^(R!| z35hBasxQJ_LXP&H5&pc>UkEG?m;p$0&W zg_;SK4YdmDeyAs*%ApQHeFk+7N_{S|1VKeX^@B=)nhv!PY6Vmg)K;k7PzRu@p}vLs z9V*}pi7EoBH`H*bDNvbE%c0goZGkF-dIRbh)M=<%s3xZ*mT;&TsCcM}Q0Y)hp$efM zhS~wO52_043#f}w4mxZx#+(qSu22J^#zUn+ErD7C^#D{U)E=nAP$!|zL-~9qu>?bP zf{KG04K)KQ3#tHW1JpLC7ojSljzgV=`V%Vfv_usN)fZ|cR0`ArsGFhghAM&D1+^dQ zBd9Y_m!Ob{a;QU4pFy32 zQr}7}K~Pap{h$({rb8`+S^-rAwH0bN)B&h!sBfWuhYI*kqKbg(4K*BU3REW4a;WuC zTcFCI-hes=bsDM`stKJI89gT)Dh4VZY9drR)KaKIsE46;K<$I7g8BmLB9!BMi6sQ8 zE7U-!@la_{OQ6<3Jpfe-wFl}j)JdrGP(J4*mSCt(P;pSBp=Lm3K@~u4fZ7K2B2*>R zaj3IUe?kTRAW=m^^@SP)T@>Sn0Bp-P~3LG6e72L}EgP`^O={wT4uhUyMA2r3C`HdHRu?NG%~+o4{8Is#P#bpfi; z1&O64R5a88sIgEpp|YV?LER7aBvd)nA*j!w&Oxc4B$gnkD5!o=2~g9a7DBCnDuUVy zwHxXHR5jGMP`^V3(6o!ub0VO6Lk)+T0+k819BMt(7N|0)H=vF|orbD~YVxzh5)Ksu z6%RELDjjMmR3X&EP&=UZK~+J00d*0|@r%R~0@W32Ak=uMG^iy|YoH#0Duvnubr|X- z)OjeMUnQ1cs7_FEP@|z{KxIJ{Ky8592K6FTCDd`KvrvCR1=dPbkx+f1Mna`PEr7Zi z>TakKs9jL|p+15-19b_?`7ep3EmSPjP^d{zbD{E~)L}EgP`^O=UXoZ^ zLv@E51eF9e8!8v-cBo>g?NF~k9f7KWx&YPaH;JVsR5a88sIgEpp|YV?LER7aBvd)n zA*j!w&Oxc)C6*wlD5!o=2~g9a7DBCnDuUVywHxXHR5jGMP`^V3{2@_AK=pWl(QG9fLXzRSVVRPl+WQDh4VZY9drR)KaKIsE46;K<$I7g8BmLB9!AV zi6sQ8E7U-!@la_{OQ6<3Jpfe-wFl}j)JdrGP(E}nW$dGZp*lguL5+r*0hI++0JQ;X z8`O(Xl~Bi_&O-eO6=;*FBBA<1jf6^pS^#x3)ZI`eP`jY^Lwy8w2I>-&(??=y3l$4B z6lxOGT&R4gbx@n3o`b4@ItukA)GtuJc8R4mRClOBP)Sg;p>m;ahbo5J4)qGu5vUrd z3s8;d$0DQWw1kR=8UQsGY9>@R)GDa^p`L^)hdKoH8Pqu_rAaJ7P*G6*pc0^_LoI|_ z0Y&fWFw3?TYB$sYsA{Nhp?-%7aEO-(sNPV+p{77(LM?|{548oV4C)Q2V^F7|YN47m zmRQ1}VxZ!oCPJk{ErlwCdKhX4)IO*xs4t){LOFaTmJq0}Py?aHL#072fm#Fg08}Z| z9;m}mC!x+m`S?jJ!BCx`;-E%D&49{+DuCJm<>PNt5&B$JD5<`r{MD6UPe5ISYD13% zH&XN^Wu%x6b_3XhV9$Xa1N#oFnM?ddlQR5`2g?Av6KpG3CD=c~v;grJPRj5%6l@yU ztzZv;y#n?D*pFZ>n~LXjsN0}+K^=tp4Js&5()NKWf~tg4&BU%XR4=IUP_v-cKy83> zP&;Zh|#P+g&7pn5|Mgc<@h5^4-o64Yd<=}@Uq=}_~bvY>LH@}X{l zS_QQh>RwV2^k-Ayv>ZTx{`z-=4F^jgWw3={*a}cgZ&Psd?eo}Qbrv_gN+4C0?P%<2jl1D8)-|x_JdV| zodr7&7HpTaA*3RxZft5GSUgxdSSDD^-1!SLC@ldhyHG+ zYz>k*D~D~=84$MFPk;PM5-U|T5q|lIMa~j=Jkp)eO4YW5I|(MjuMV+NMHAtdgji%C z5q=$rMUsf{i$5%qPK00aVUc_y{4x)VtS7>+?XXA*k++7plifu4RUDSh0V4d;4T~Hl z!mrn0;-g}6xps^Xt)O<_M8i@L4}bW?q|eHoWq#xK^wu|GX6NWF$Yy#Uv-wgxd46J+ zSdOUj$3qpJV+}dQ68ilk!TMxmTzB5@vs>oMMgJVGSFgFHth$%7mulHx&55J~eOKN89GAb%3c z_8{T3(d2uO7$OB8WGsFfXkq5~qQtUzQCQ{--o*+`{L0%_P=0W()C*>Z5-+NNw zL7G!Huk;|Dh*Wuy{zR%hND`464>FU;84r?8B7F4-r zPdH43k3B4Mib#kD`I$(B2Wdjv1dsJrDt_}xtOw~vB+i2*5{dU9*AhwaAelsX4`F#; zPK5Vy7P*H=ng`+cpJaNFmx*M1koSo2e#P?hIgtVn@)MCl52DewUgSYSi4=Q~zC=nq z$Y>&^9^_ggWgcV!k#Y~RoJfTSxr0ch2YHA{l?N#$Qtd(b?I<-KTv=J)0X$MG zVW<+II8iJ{5s3<8HVNCPsM+0YHj(Ud-2fY3Fu6%iau0iR@8!Pi-d#|GttDE4Yi%{v z=@9UxQKlNi+AumbzTiYgG-cFgl&O)5Mj6{UzJ)2!exLL5{C?l(oXdZ8rqey2=Q+=L z&htFyc{?{8^A(jYk{qOuqz>sPxfL=*@)3xct4hkBf{c-T5i&vY03=89eMpJqr;s|y zZz1y}&&D9RKym@3L2?OXkz_AqiDVG6OmYmeLXv~5lAMODk=y}UCs~4QkeF|>Y?6E( zvPELP%(6}L3&;-1(~w;f^Gz005mFa>A+01wA#Ef#Ld;4)&T2q9NX)lZI!V?cT_it* z^pWg9`bnOH$;c4Niy;}3KFAo!n;{b*pThOrZzvp4n*Gh5`q>ZEt(oS*}q=V#oNGC}N(nVsvtkOqvH>98BE07_Q zpFuJtyO1%Gb1^NQAnAqVNCqG!lD9$3+(k+w51A)94Ot-h5Trr!dB`HkS0PIz--axc zm@lTRko*C%N^<5oXg?$uL)J<5LN-X=1lc6H9Rv>1MDCv9+QYZNiWS-E0cj^W z0qG#Q4bn;SNk|vTHz9o_k3srLo^?Lj56O!l8Irw_F%t8olnIh)h?#lIot}i0Nd68| zC%G3gPx2sSf#gw0gXH&+MH2HplqHf&Aj>4?t0*fZgOF8{cRRwJ^F~|Z*8PXv6AY_r`Gms^cuS1qe9)YZoY(rK_o`9^8 zJoklY8zdJ(Hb`Cx*(B+MY>^y-Y?E9I*&&&R?2?orEm&VkiQNKeC22s~NR}Y&B=_FN3U;^guR91|gdy z=F2BrBsV~|Nlrs{NN$JhlH3Jp!Rl8^^$U%doNEgW^ zkUo-bNI%INAwwh?NQPtvGDdO|GC{Hc$&r|^q?AZL1F4gkZ>7wWJOo)FF<(q+knBJf zNzS+k?T6$7$TCSMWQAk^vPv=mStB_KStn^gHc0M+Y?3?(*&=xqvQ6>?WQXKjyb0VT z>4f0rxN1NBkXDjokT#Mcq@CoiARQ#;3n-l==KCjIBo9H%E{wF^pF;Xco`ejMoZo@= zL-H!f7|DLf1j$<=Ig%S8C6f0+>Lg2$d6HGg0?BtF4U(Tj7D=9lERj6_C1^h+mqS)a z4nkH*-VRwKsY2FC{u;7D@^Q!}$(JEpBtL*`ll(Vihvcl6qWzG(6k=Y9Nex~JF<$`| zxfaq!QiQaVybIDnayz7x$(_B<33@{UjTZA(Ed!G9QWF4|f@*~I^$*&>nBxk-1 z?T4ftvPtr4$QH>V$TrD4AUh=H%P6}fw?bO5kM>9Se`nzTT3S8|X(cgVM`%dJKpG?ikVTR#WQn8(Sthv^ zvO;3Mld?+kS;!j6w;<~zk3cp^%r{duNm?&M`yqJ=WSgWLvO_We*(Es!F+Tv3_Txj$ zx7bB)hP08~4rwR33(`SyAEcASd_|>;WE0Xy@;IcQA7E4jCdj4#|+*1Q{cFKV*XBqmUfQry(Vh`yq9b zb;vx)CS-x+myia@laNJ{7j&Whkh}`AOk%#)vO;3M)v`)*60%0}0mwSZ-H;8Ee}Qb0 zJOtSyc@(lu@(0Kc$)D^&`ysg;(t@`~(l*`*X(f3xq>W?}(oRx^bdbCk(n<0WNEgYc zA$=rYhV+v>1Q{avF(gB>0~sSZqZ{pq#C*FYM{+5oMA8STle`HsPx3a%0?8btLGo_M zB8mBy%M!`QAH2v(nm4`=_h#$WQfFvWJpd! z#z@`|nIQQXBu8=&q(t&%NS)-{ka-gGU6%!tUqKoqPeT?-o_7V>56O!m%OtOctdR6W zR!PhkU)D&nkadz9AsZy`fozie4P=Yt%d-Anhc*kPecoAe|&xNEb;R(noSTq@U!IkRg&UK{6x{L&iw9ArmD33(1jO@aJeh zB$q+zB>N%rByWK%klYAqkh~AFNOBisiR6CBGReb`6_Upxt0d3vL;E4Q5VB5UzW%a7 zV!r*dN%9WJ7D)}VP4WTA4$0k+U6T7DEf?ta^KXz=67#i}Hj-z(2JMIBMUW1X9!Mw2 zRgf-{DM%m5&5(YQ4?%`V?tx@T%okn8NFISqko*RcBRTuEXg?$uL+T_~Lgq=Xfh>?5 zhcrn30NuGwRk-YGAXg?&~kPVWnAe$spkS&s%A=@N> z3)vz0C&(_z0}%5kDboM^2c(tc2}m2s*;k_dkX!`mATeKJ=_EM-=_0un(npem^pm_3 zGDLD4Bt!BKkTH@K$OOqZAUTqMhm=Sjhtx@)hRlm*-=Y><2(68|sUCEiZRQzUcQe7-mppVQHDMoXny&U*zd zbKcxk>6Dh4vggIeXb<68I5DYPNJMI@|it)d* zlapodggq)}3$tD&KFs?CFaEd5M0CF4@!&Z4yR(;_K7Be4nki@JycYA9l83x%27kb~ zZ+g1yRVo>rZFHoFkdcOO?z2W^pPGZUp;dNXGQ5D2l{=26t`B&SoNz(b}ZO0~nx2{EBT*@o^p;$% zIP#_adYnre;G{Ed?hH6liav&1c>s%ZCHxmGcrZ8sG}AF}8ok@_Tz1yOXR~bc zb;G)!A*?4o41LTqB^w7fNjVPIiI+}=-GkeE6-%cwe%;HfS}&bSyDL$B)j;Fx=|Z4@ zre~-emOa!drn{r3yi}tcSLspVp5}05lgE@RDBD47OEtuwVxf{Ils?7GZjFgF~9w;<)Lw_TY(Z{y?!K zW``{~Q-&^U-O1FtWdM|D$<(?zwZmQ|wgrW zrtM_FG+5x+85AJ8IP{tBaDb?8FAqxV;=!I-%^dbiYF&g4f^cRXE*InSwR~;CHw(;W zz8^bj$B)E2OW}q?m|k>Z5J4*3P4}5jt?+5V3fh|vhi+9Q)%1lfuC%{c#3H8PkK6Vp zNE9r>GFa=)VcakKdwZWLG$kzTZIc1c%m`OcEKQ6hrhcll2Z}X}r#k6_<+3bdarz+k z*{V7M+FYX&diRjJX$a2UJ2BSkxSn?%CND&;sB9j~6e!NUTWTc!@t#jd>8{1m>a;2gTH z?t#*qLev-8z+pN+5y}^IgQ+&$Ku$QA`z8x7>={OjwX#g*QKlht3fL?lKo@$jaDuWB zk{b)1C^byP0=XxG+!KSfmudnyal|{}h2UoIQ=p9H~kOm$wdbuVv5S%aonn z#p|-=Q@oX|J9)ReiNe7Cl&p79AyI(4eJCN6y(l*2EHb`9Jx%3Op^)Y$r98pj7`0<*KR@W?*m!J(aLg-0A{XInv_%4TfK}yXVHRC06$9w$_9svxudq za3)HydMn{So0@XE6Qq{4S^Ow&_iWkEg)mi z37HslnE+IbXtoizsd(>Dsx1~U-;}u6wFZZ4%dGATjdry7UVUw zM3X00ESWde=S#F?-c(y1>v2sWYzq7Xfph9Nf;E21eIXp%f>32H*#_V!J*A`xNbU7Jb_(f zNjX${eI6~aY+s}n--#gAo4R4nh08WQDLMBPTZ)MQTiByh*}U9ha3mL+@+%eDOC9y5 z@cS$5aX3F0ab42p6Kp{`CrG1k0wg1xkh)Da;_}R$_bF=e`;9txY5u$+j>XNh;Bjtv!)MN-`40k6MMPM85QT#zxdj8H;Kaqb-@DTD#bY`Uh1Od43Nz z8~E`<93AT95v&Wy9O_`Rv9HdieSV~7Hu*W2D!^>`b1)_D{O}6t1tPDdMN)?8IIw3x zT_Q-JXCOVg9Xi!ej8ufxFsxnQqK!;9YE|E^pf1tmPq=WY80pqyR5#e<)q}KN6Ctl> zFTp~}h`ovEErDzvTCmxS#ompDL=+k3;y9`hBa(d~3vN2y?xj>`7N3;3lzyb5NYYJN za4#iWH*pkcl(8f(rFRvgNYeXQa4#i40F9$0E~OsqI8L$vgI^1n-*cL?O-2=&3imN>9C6T1~xaTD_d(xp=oae#Wn@xIbOIE}Qr96{rLUKYf?+ zHeC9u(KZ76T*Sw=5+krJGd^}B*rzXwAhXC2WPFW}ofM?eMiHcMiNMK&8dakRP9D^V z8b*-uG(L9nAgwuy;O0Tvauh+Das*Bu)Cd|z2)7#K4F;=|pD40ZJF%umb}|q}cB>;~ zw_(JZnzD3YI?w8HAWqGOns@2QZrcd6p*A2Wa%yR)=anL-W+Txs!VC5uksrS6M0$_7 zwH(J!FV)^7vQpx7)EiSLpxG7FqKD3Cl2bcPp~$kxBu*_z)mc&GCK*gE-zJS-|8}3! zR((Btdif6cCw#Ru*QX5caXN{xrogF9dRT4Kb23e`G%Q0j#a9D0yNsc(r)NmUWs0BZ z>!SNoQ)iCfEdT0nJLm+rV~f&Ps|1doUNghZsu%(36{Dx`e1#@0f7n^L>yz}_#P!tT z)@u|xK~JhEph%h!Xip$%$LUzIU=z zEZg0E_fM*hVNO;&Njuz%Y%axY$D=4Enr$%>P3~FDc0r1gsmT~)qp1N#ESWbov`DmM u-qa&1(UN&HW6$`wKUW$zzlRv{C(GDWJQh*-E5G=!uOl49A5us0TK*5t&r3%D literal 0 HcmV?d00001 diff --git a/build/CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj.d b/build/CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj.d new file mode 100644 index 0000000..0a5c65b --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj.d @@ -0,0 +1,225 @@ +CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj: \ + C:\Users\naifa\Documents\Projects\C++\libs\glad\src\glad.c \ + C:/msys64/ucrt64/include/stdio.h \ + C:/msys64/ucrt64/include/corecrt_stdio_config.h \ + C:/msys64/ucrt64/include/corecrt.h C:/msys64/ucrt64/include/_mingw.h \ + C:/msys64/ucrt64/include/_mingw_mac.h \ + C:/msys64/ucrt64/include/_mingw_secapi.h \ + C:/msys64/ucrt64/include/vadefs.h \ + C:/msys64/ucrt64/include/sdks/_mingw_ddk.h \ + C:/msys64/ucrt64/include/_mingw_off_t.h \ + C:/msys64/ucrt64/include/swprintf.inl \ + C:/msys64/ucrt64/include/sec_api/stdio_s.h \ + C:/msys64/ucrt64/include/stdlib.h \ + C:/msys64/ucrt64/include/corecrt_wstdlib.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/limits.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/syslimits.h \ + C:/msys64/ucrt64/include/limits.h C:/msys64/ucrt64/include/crtdefs.h \ + C:/msys64/ucrt64/include/sec_api/stdlib_s.h \ + C:/msys64/ucrt64/include/malloc.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/mm_malloc.h \ + C:/msys64/ucrt64/include/errno.h C:/msys64/ucrt64/include/string.h \ + C:/msys64/ucrt64/include/sec_api/string_s.h \ + C:/Users/naifa/Documents/Projects/C++/GraphicsTest/dep/glad/glad.h \ + C:/msys64/ucrt64/include/KHR/khrplatform.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/stdint.h \ + C:/msys64/ucrt64/include/stdint.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/stddef.h \ + C:/msys64/ucrt64/include/stddef.h C:/msys64/ucrt64/include/windows.h \ + C:/msys64/ucrt64/include/sdkddkver.h C:/msys64/ucrt64/include/excpt.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/stdarg.h \ + C:/msys64/ucrt64/include/stdarg.h \ + C:/msys64/ucrt64/include/_mingw_stdarg.h \ + C:/msys64/ucrt64/include/windef.h \ + C:/msys64/ucrt64/include/winapifamily.h \ + C:/msys64/ucrt64/include/minwindef.h \ + C:/msys64/ucrt64/include/specstrings.h C:/msys64/ucrt64/include/sal.h \ + C:/msys64/ucrt64/include/concurrencysal.h \ + C:/msys64/ucrt64/include/driverspecs.h C:/msys64/ucrt64/include/winnt.h \ + C:/msys64/ucrt64/include/_mingw_unicode.h \ + C:/msys64/ucrt64/include/ctype.h C:/msys64/ucrt64/include/apiset.h \ + C:/msys64/ucrt64/include/psdk_inc/intrin-impl.h \ + C:/msys64/ucrt64/include/basetsd.h C:/msys64/ucrt64/include/guiddef.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/x86intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/x86gprintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/ia32intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/adxintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/bmiintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/bmi2intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/cetintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/cldemoteintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/clflushoptintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/clwbintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/clzerointrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/cmpccxaddintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/enqcmdintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/fxsrintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/lzcntintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/lwpintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/movdirintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/mwaitintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/mwaitxintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/pconfigintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/popcntintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/pkuintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/prfchiintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/raointintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/rdseedintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/rtmintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/serializeintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/sgxintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/tbmintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/tsxldtrkintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/uintrintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/waitpkgintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/wbnoinvdintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/xsaveintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/xsavecintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/xsaveoptintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/xsavesintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/xtestintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/hresetintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/immintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/mmintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/xmmintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/emmintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/pmmintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/tmmintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/smmintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/wmmintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avxintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avxvnniintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avxifmaintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avxvnniint8intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx2intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512fintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512erintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512pfintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512cdintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vlintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512bwintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512dqintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vlbwintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vldqintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512ifmaintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512ifmavlintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vbmiintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vbmivlintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx5124fmapsintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx5124vnniwintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vpopcntdqintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vbmi2intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vbmi2vlintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vnniintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vnnivlintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vpopcntdqvlintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512bitalgintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vp2intersectintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512vp2intersectvlintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512fp16intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512fp16vlintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/shaintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/fmaintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/f16cintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/gfniintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/vaesintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/vpclmulqdqintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512bf16vlintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avx512bf16intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/avxneconvertintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/amxtileintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/amxint8intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/amxbf16intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/amxcomplexintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/prfchwintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/keylockerintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/amxfp16intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/mm3dnow.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/fma4intrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/ammintrin.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/xopintrin.h \ + C:/msys64/ucrt64/include/pshpack4.h C:/msys64/ucrt64/include/poppack.h \ + C:/msys64/ucrt64/include/pshpack4.h C:/msys64/ucrt64/include/pshpack2.h \ + C:/msys64/ucrt64/include/poppack.h C:/msys64/ucrt64/include/pshpack2.h \ + C:/msys64/ucrt64/include/pshpack8.h C:/msys64/ucrt64/include/pshpack8.h \ + C:/msys64/ucrt64/include/ktmtypes.h C:/msys64/ucrt64/include/winbase.h \ + C:/msys64/ucrt64/include/apisetcconv.h \ + C:/msys64/ucrt64/include/minwinbase.h \ + C:/msys64/ucrt64/include/bemapiset.h C:/msys64/ucrt64/include/debugapi.h \ + C:/msys64/ucrt64/include/errhandlingapi.h \ + C:/msys64/ucrt64/include/fibersapi.h C:/msys64/ucrt64/include/fileapi.h \ + C:/msys64/ucrt64/include/handleapi.h C:/msys64/ucrt64/include/heapapi.h \ + C:/msys64/ucrt64/include/ioapiset.h \ + C:/msys64/ucrt64/include/interlockedapi.h \ + C:/msys64/ucrt64/include/jobapi.h \ + C:/msys64/ucrt64/include/libloaderapi.h \ + C:/msys64/ucrt64/include/memoryapi.h \ + C:/msys64/ucrt64/include/namedpipeapi.h \ + C:/msys64/ucrt64/include/namespaceapi.h \ + C:/msys64/ucrt64/include/processenv.h \ + C:/msys64/ucrt64/include/processthreadsapi.h \ + C:/msys64/ucrt64/include/processtopologyapi.h \ + C:/msys64/ucrt64/include/profileapi.h \ + C:/msys64/ucrt64/include/realtimeapiset.h \ + C:/msys64/ucrt64/include/securityappcontainer.h \ + C:/msys64/ucrt64/include/securitybaseapi.h \ + C:/msys64/ucrt64/include/synchapi.h \ + C:/msys64/ucrt64/include/sysinfoapi.h \ + C:/msys64/ucrt64/include/systemtopologyapi.h \ + C:/msys64/ucrt64/include/threadpoolapiset.h \ + C:/msys64/ucrt64/include/threadpoollegacyapiset.h \ + C:/msys64/ucrt64/include/utilapiset.h \ + C:/msys64/ucrt64/include/wow64apiset.h \ + C:/msys64/ucrt64/include/winerror.h \ + C:/msys64/ucrt64/include/fltwinerror.h \ + C:/msys64/ucrt64/include/timezoneapi.h C:/msys64/ucrt64/include/wingdi.h \ + C:/msys64/ucrt64/include/pshpack1.h C:/msys64/ucrt64/include/winuser.h \ + C:/msys64/ucrt64/include/tvout.h C:/msys64/ucrt64/include/winnls.h \ + C:/msys64/ucrt64/include/datetimeapi.h \ + C:/msys64/ucrt64/include/stringapiset.h \ + C:/msys64/ucrt64/include/wincon.h C:/msys64/ucrt64/include/winver.h \ + C:/msys64/ucrt64/include/winreg.h C:/msys64/ucrt64/include/reason.h \ + C:/msys64/ucrt64/include/winnetwk.h C:/msys64/ucrt64/include/wnnc.h \ + C:/msys64/ucrt64/include/virtdisk.h C:/msys64/ucrt64/include/cderr.h \ + C:/msys64/ucrt64/include/dde.h C:/msys64/ucrt64/include/ddeml.h \ + C:/msys64/ucrt64/include/dlgs.h C:/msys64/ucrt64/include/lzexpand.h \ + C:/msys64/ucrt64/include/mmsystem.h C:/msys64/ucrt64/include/mmsyscom.h \ + C:/msys64/ucrt64/include/mciapi.h C:/msys64/ucrt64/include/mmiscapi.h \ + C:/msys64/ucrt64/include/mmiscapi2.h \ + C:/msys64/ucrt64/include/playsoundapi.h \ + C:/msys64/ucrt64/include/mmeapi.h C:/msys64/ucrt64/include/timeapi.h \ + C:/msys64/ucrt64/include/joystickapi.h C:/msys64/ucrt64/include/nb30.h \ + C:/msys64/ucrt64/include/rpc.h C:/msys64/ucrt64/include/rpcdce.h \ + C:/msys64/ucrt64/include/rpcdcep.h C:/msys64/ucrt64/include/rpcnsi.h \ + C:/msys64/ucrt64/include/rpcnterr.h C:/msys64/ucrt64/include/rpcasync.h \ + C:/msys64/ucrt64/include/shellapi.h C:/msys64/ucrt64/include/winperf.h \ + C:/msys64/ucrt64/include/winsock.h C:/msys64/ucrt64/include/_timeval.h \ + C:/msys64/ucrt64/include/_bsd_types.h C:/msys64/ucrt64/include/inaddr.h \ + C:/msys64/ucrt64/include/psdk_inc/_socket_types.h \ + C:/msys64/ucrt64/include/psdk_inc/_fd_types.h \ + C:/msys64/ucrt64/include/psdk_inc/_ip_types.h \ + C:/msys64/ucrt64/include/psdk_inc/_ip_mreq1.h \ + C:/msys64/ucrt64/include/psdk_inc/_wsadata.h \ + C:/msys64/ucrt64/include/psdk_inc/_xmitfile.h \ + C:/msys64/ucrt64/include/psdk_inc/_wsa_errnos.h \ + C:/msys64/ucrt64/include/wincrypt.h C:/msys64/ucrt64/include/bcrypt.h \ + C:/msys64/ucrt64/include/ncrypt.h C:/msys64/ucrt64/include/dpapi.h \ + C:/msys64/ucrt64/include/winefs.h C:/msys64/ucrt64/include/winscard.h \ + C:/msys64/ucrt64/include/wtypes.h C:/msys64/ucrt64/include/rpcndr.h \ + C:/msys64/ucrt64/include/rpcnsip.h C:/msys64/ucrt64/include/rpcsal.h \ + C:/msys64/ucrt64/include/ole2.h C:/msys64/ucrt64/include/objbase.h \ + C:/msys64/ucrt64/include/combaseapi.h \ + C:/msys64/ucrt64/include/wtypesbase.h \ + C:/msys64/ucrt64/include/unknwnbase.h \ + C:/msys64/ucrt64/include/objidlbase.h C:/msys64/ucrt64/include/cguid.h \ + C:/msys64/ucrt64/include/objidl.h C:/msys64/ucrt64/include/unknwn.h \ + C:/msys64/ucrt64/include/urlmon.h C:/msys64/ucrt64/include/oleidl.h \ + C:/msys64/ucrt64/include/servprov.h C:/msys64/ucrt64/include/msxml.h \ + C:/msys64/ucrt64/include/oaidl.h C:/msys64/ucrt64/include/propidl.h \ + C:/msys64/ucrt64/include/oleauto.h C:/msys64/ucrt64/include/winioctl.h \ + C:/msys64/ucrt64/include/winsmcrd.h C:/msys64/ucrt64/include/winspool.h \ + C:/msys64/ucrt64/include/prsht.h C:/msys64/ucrt64/include/commdlg.h \ + C:/msys64/ucrt64/include/stralign.h \ + C:/msys64/ucrt64/include/sec_api/stralign_s.h \ + C:/msys64/ucrt64/include/winsvc.h C:/msys64/ucrt64/include/mcx.h \ + C:/msys64/ucrt64/include/imm.h diff --git a/build/CMakeFiles/GraphicsTest.dir/DependInfo.cmake b/build/CMakeFiles/GraphicsTest.dir/DependInfo.cmake new file mode 100644 index 0000000..bb7a3b2 --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/DependInfo.cmake @@ -0,0 +1,26 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "C:/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c" "CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj" "gcc" "CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj.d" + "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/funcs.cpp" "CMakeFiles/GraphicsTest.dir/funcs.cpp.obj" "gcc" "CMakeFiles/GraphicsTest.dir/funcs.cpp.obj.d" + "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/main.cpp" "CMakeFiles/GraphicsTest.dir/main.cpp.obj" "gcc" "CMakeFiles/GraphicsTest.dir/main.cpp.obj.d" + "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/shader.cpp" "CMakeFiles/GraphicsTest.dir/shader.cpp.obj" "gcc" "CMakeFiles/GraphicsTest.dir/shader.cpp.obj.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/GraphicsTest.dir/build.make b/build/CMakeFiles/GraphicsTest.dir/build.make new file mode 100644 index 0000000..f457c7c --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/build.make @@ -0,0 +1,163 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Include any dependencies generated for this target. +include CMakeFiles/GraphicsTest.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include CMakeFiles/GraphicsTest.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/GraphicsTest.dir/progress.make + +# Include the compile flags for this target's objects. +include CMakeFiles/GraphicsTest.dir/flags.make + +CMakeFiles/GraphicsTest.dir/main.cpp.obj: CMakeFiles/GraphicsTest.dir/flags.make +CMakeFiles/GraphicsTest.dir/main.cpp.obj: CMakeFiles/GraphicsTest.dir/includes_CXX.rsp +CMakeFiles/GraphicsTest.dir/main.cpp.obj: C:/Users/naifa/Documents/Projects/C++/GraphicsTest/main.cpp +CMakeFiles/GraphicsTest.dir/main.cpp.obj: CMakeFiles/GraphicsTest.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/GraphicsTest.dir/main.cpp.obj" + C:\msys64\ucrt64\bin\g++.exe $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/GraphicsTest.dir/main.cpp.obj -MF CMakeFiles\GraphicsTest.dir\main.cpp.obj.d -o CMakeFiles\GraphicsTest.dir\main.cpp.obj -c C:\Users\naifa\Documents\Projects\C++\GraphicsTest\main.cpp + +CMakeFiles/GraphicsTest.dir/main.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/GraphicsTest.dir/main.cpp.i" + C:\msys64\ucrt64\bin\g++.exe $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E C:\Users\naifa\Documents\Projects\C++\GraphicsTest\main.cpp > CMakeFiles\GraphicsTest.dir\main.cpp.i + +CMakeFiles/GraphicsTest.dir/main.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/GraphicsTest.dir/main.cpp.s" + C:\msys64\ucrt64\bin\g++.exe $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S C:\Users\naifa\Documents\Projects\C++\GraphicsTest\main.cpp -o CMakeFiles\GraphicsTest.dir\main.cpp.s + +CMakeFiles/GraphicsTest.dir/funcs.cpp.obj: CMakeFiles/GraphicsTest.dir/flags.make +CMakeFiles/GraphicsTest.dir/funcs.cpp.obj: CMakeFiles/GraphicsTest.dir/includes_CXX.rsp +CMakeFiles/GraphicsTest.dir/funcs.cpp.obj: C:/Users/naifa/Documents/Projects/C++/GraphicsTest/funcs.cpp +CMakeFiles/GraphicsTest.dir/funcs.cpp.obj: CMakeFiles/GraphicsTest.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/GraphicsTest.dir/funcs.cpp.obj" + C:\msys64\ucrt64\bin\g++.exe $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/GraphicsTest.dir/funcs.cpp.obj -MF CMakeFiles\GraphicsTest.dir\funcs.cpp.obj.d -o CMakeFiles\GraphicsTest.dir\funcs.cpp.obj -c C:\Users\naifa\Documents\Projects\C++\GraphicsTest\funcs.cpp + +CMakeFiles/GraphicsTest.dir/funcs.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/GraphicsTest.dir/funcs.cpp.i" + C:\msys64\ucrt64\bin\g++.exe $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E C:\Users\naifa\Documents\Projects\C++\GraphicsTest\funcs.cpp > CMakeFiles\GraphicsTest.dir\funcs.cpp.i + +CMakeFiles/GraphicsTest.dir/funcs.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/GraphicsTest.dir/funcs.cpp.s" + C:\msys64\ucrt64\bin\g++.exe $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S C:\Users\naifa\Documents\Projects\C++\GraphicsTest\funcs.cpp -o CMakeFiles\GraphicsTest.dir\funcs.cpp.s + +CMakeFiles/GraphicsTest.dir/shader.cpp.obj: CMakeFiles/GraphicsTest.dir/flags.make +CMakeFiles/GraphicsTest.dir/shader.cpp.obj: CMakeFiles/GraphicsTest.dir/includes_CXX.rsp +CMakeFiles/GraphicsTest.dir/shader.cpp.obj: C:/Users/naifa/Documents/Projects/C++/GraphicsTest/shader.cpp +CMakeFiles/GraphicsTest.dir/shader.cpp.obj: CMakeFiles/GraphicsTest.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/GraphicsTest.dir/shader.cpp.obj" + C:\msys64\ucrt64\bin\g++.exe $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/GraphicsTest.dir/shader.cpp.obj -MF CMakeFiles\GraphicsTest.dir\shader.cpp.obj.d -o CMakeFiles\GraphicsTest.dir\shader.cpp.obj -c C:\Users\naifa\Documents\Projects\C++\GraphicsTest\shader.cpp + +CMakeFiles/GraphicsTest.dir/shader.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/GraphicsTest.dir/shader.cpp.i" + C:\msys64\ucrt64\bin\g++.exe $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E C:\Users\naifa\Documents\Projects\C++\GraphicsTest\shader.cpp > CMakeFiles\GraphicsTest.dir\shader.cpp.i + +CMakeFiles/GraphicsTest.dir/shader.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/GraphicsTest.dir/shader.cpp.s" + C:\msys64\ucrt64\bin\g++.exe $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S C:\Users\naifa\Documents\Projects\C++\GraphicsTest\shader.cpp -o CMakeFiles\GraphicsTest.dir\shader.cpp.s + +CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj: CMakeFiles/GraphicsTest.dir/flags.make +CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj: CMakeFiles/GraphicsTest.dir/includes_C.rsp +CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj: C:/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c +CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj: CMakeFiles/GraphicsTest.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building C object CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj" + C:\msys64\ucrt64\bin\gcc.exe $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj -MF CMakeFiles\GraphicsTest.dir\C_\Users\naifa\Documents\Projects\C++\libs\glad\src\glad.c.obj.d -o CMakeFiles\GraphicsTest.dir\C_\Users\naifa\Documents\Projects\C++\libs\glad\src\glad.c.obj -c C:\Users\naifa\Documents\Projects\C++\libs\glad\src\glad.c + +CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.i" + C:\msys64\ucrt64\bin\gcc.exe $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E C:\Users\naifa\Documents\Projects\C++\libs\glad\src\glad.c > CMakeFiles\GraphicsTest.dir\C_\Users\naifa\Documents\Projects\C++\libs\glad\src\glad.c.i + +CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.s" + C:\msys64\ucrt64\bin\gcc.exe $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S C:\Users\naifa\Documents\Projects\C++\libs\glad\src\glad.c -o CMakeFiles\GraphicsTest.dir\C_\Users\naifa\Documents\Projects\C++\libs\glad\src\glad.c.s + +# Object files for target GraphicsTest +GraphicsTest_OBJECTS = \ +"CMakeFiles/GraphicsTest.dir/main.cpp.obj" \ +"CMakeFiles/GraphicsTest.dir/funcs.cpp.obj" \ +"CMakeFiles/GraphicsTest.dir/shader.cpp.obj" \ +"CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj" + +# External object files for target GraphicsTest +GraphicsTest_EXTERNAL_OBJECTS = + +GraphicsTest.exe: CMakeFiles/GraphicsTest.dir/main.cpp.obj +GraphicsTest.exe: CMakeFiles/GraphicsTest.dir/funcs.cpp.obj +GraphicsTest.exe: CMakeFiles/GraphicsTest.dir/shader.cpp.obj +GraphicsTest.exe: CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj +GraphicsTest.exe: CMakeFiles/GraphicsTest.dir/build.make +GraphicsTest.exe: CMakeFiles/GraphicsTest.dir/linkLibs.rsp +GraphicsTest.exe: CMakeFiles/GraphicsTest.dir/objects1.rsp +GraphicsTest.exe: CMakeFiles/GraphicsTest.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Linking CXX executable GraphicsTest.exe" + $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles\GraphicsTest.dir\link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +CMakeFiles/GraphicsTest.dir/build: GraphicsTest.exe +.PHONY : CMakeFiles/GraphicsTest.dir/build + +CMakeFiles/GraphicsTest.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\GraphicsTest.dir\cmake_clean.cmake +.PHONY : CMakeFiles/GraphicsTest.dir/clean + +CMakeFiles/GraphicsTest.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\GraphicsTest.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/GraphicsTest.dir/depend + diff --git a/build/CMakeFiles/GraphicsTest.dir/cmake_clean.cmake b/build/CMakeFiles/GraphicsTest.dir/cmake_clean.cmake new file mode 100644 index 0000000..5ebf2b1 --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/cmake_clean.cmake @@ -0,0 +1,19 @@ +file(REMOVE_RECURSE + "CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj" + "CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj.d" + "CMakeFiles/GraphicsTest.dir/funcs.cpp.obj" + "CMakeFiles/GraphicsTest.dir/funcs.cpp.obj.d" + "CMakeFiles/GraphicsTest.dir/main.cpp.obj" + "CMakeFiles/GraphicsTest.dir/main.cpp.obj.d" + "CMakeFiles/GraphicsTest.dir/shader.cpp.obj" + "CMakeFiles/GraphicsTest.dir/shader.cpp.obj.d" + "GraphicsTest.exe" + "GraphicsTest.exe.manifest" + "GraphicsTest.pdb" + "libGraphicsTest.dll.a" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C CXX) + include(CMakeFiles/GraphicsTest.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/GraphicsTest.dir/compiler_depend.make b/build/CMakeFiles/GraphicsTest.dir/compiler_depend.make new file mode 100644 index 0000000..a04a719 --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for GraphicsTest. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/GraphicsTest.dir/compiler_depend.ts b/build/CMakeFiles/GraphicsTest.dir/compiler_depend.ts new file mode 100644 index 0000000..3bcbe39 --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for GraphicsTest. diff --git a/build/CMakeFiles/GraphicsTest.dir/depend.make b/build/CMakeFiles/GraphicsTest.dir/depend.make new file mode 100644 index 0000000..a06610b --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for GraphicsTest. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/GraphicsTest.dir/flags.make b/build/CMakeFiles/GraphicsTest.dir/flags.make new file mode 100644 index 0000000..1e73d86 --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/flags.make @@ -0,0 +1,17 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# compile C with C:/msys64/ucrt64/bin/gcc.exe +# compile CXX with C:/msys64/ucrt64/bin/g++.exe +C_DEFINES = + +C_INCLUDES = @CMakeFiles/GraphicsTest.dir/includes_C.rsp + +C_FLAGS = -g + +CXX_DEFINES = + +CXX_INCLUDES = @CMakeFiles/GraphicsTest.dir/includes_CXX.rsp + +CXX_FLAGS = -g + diff --git a/build/CMakeFiles/GraphicsTest.dir/funcs.cpp.obj b/build/CMakeFiles/GraphicsTest.dir/funcs.cpp.obj new file mode 100644 index 0000000000000000000000000000000000000000..adeaf717c91798032f92d3a018d7de4a3fe70cd1 GIT binary patch literal 3915 zcmcInU2Gdg5Z=9?_)<5H)0C2^h+IkwZIjwb+VnT2Zk*JPnzp8C8c|XO|D5du_iUZd zNt+faQlm;y9%v;5LaGE3Jb-xMg$F1vMN~+g}uH8n1HzG9`8&-?g8dkXrXmn zkMI}?4@P_U`hfRg^o{IOaop}6pAtuRAz0D&2d+78Prna0kD~w~SC+=@-{-@@5s-Pn zd5NuW?|!d}yhI6kc_rL_|AujW>+PI44&Xdu(F6YVg~2!gxUcN>fqN1Q1FpBvmzW~x zM*;V}jgt^ZVuRz!g?q`Xzo^ND6XAvNwxNY#HMz+0ms})^C)CC9wxbK5A6>Y63nq|{ zkUhM6J$dzxdj3=I+~neL_!fca$%RjTM%2~cY4a<$=Wkmr%!KQ5O!oBaNK_GJrB4!R ziV&}iE(VYRVSgFgdT2kuLCJswku)Suj;rymuHJoW@9s!nq(|L#!KxYB;euvprk;gi z+RPRY8|7@-NUOUFq!XtdMrISbb%;u`ZdioUhHNoyLX1GEY!p<+YDQHr7+Owc2t}@2 zm_i6ti)GVN{V<8c7(xp8ZDEPI$dzlEl12hKEnBiKRkZC!tyHR5<_=tj9g?qxDy{>r z5M&;cyO;8%a@rzNVid=j=U`JHSM^y=Hp&PmK%viBpE9K&)a#bVZm+L~`0z!BP8Lp3n5S-Agq84 zzMy4l`MhRMValem=~5|^&b~;f2r>HlR|WV2>N<}D+_}2+rV~!=w!?uUXBCOKA2%r6 zP{g997m5}U<6Hq>G~G&q!KZ^F+;TxCBdxG#nTX24PI@SKAUM)0!0Re)Vj2N7olOXl zn@O-!L8+mIZc|!=V#nr=7P=u2eiUA?Lx6@;e}qy1G_twDLozypW8H(U?BS92fp$1h zK!h9>9BC^IQQs7yN7^0mKs!1Mc~v8=T-od@VZnxi%ZRmIVfgUMCP+p%CIlL+lW~V# zc7!GU9E@ea#-OK^J_t2o2UiB)ArLyGX^`KC_9L{%@h;I0p;5oBkL6uNkf^djma)&voyTRWY!m_z#B<%^2Pem?npvGR(t18U zIaJQpE@*~TolKeK7ql!0@K#MG%ygxwXRBwlsx_If8QE$iTd9yWOwQEwQVu3YS=1Ar4t z5E5glnM>-4v1iBnRCpjT{X6U*2{_*sXd~zz0#QOQs_O&Fn{X+Rw(`#9&WC+86uu_J zn;K?51F#3@*qt}W!OhyZO@Qr$CXsRATbNV<{sfbNVX;9(usafZZ(=%pSh*E{^|^%W z=2pbP=Ll~x#@@`NxGN<durJb%6aV4yNxD|hPxisiXxGJuD1|%LA1eSG59s{WZT9Bx~xpm0ZC0$)4ufuOB zr@tN&QlRx~VyjuVXb&j(6JW2fbs!{!(bvH7oS7eA#f?~zUPcbBPTp!8 zy@++EF34MHzu7~yh!pGVCFLgQ*<%Vl=3b=t zfiI_KdoOtZMA`$~$x|JRZ!Z!?5b3-vp{7ndZ44HuB4rgt-DpewHU_OC#aenf4cl7$ zT148l8~~b>jlusPZ2IZEjlrA1cZ5F_oZ$X2VQ!h`bytJ4-i1*l2c<<}N;mRl zM^0xlrZ(-4%(PL^s?M;a8=50mEz=QEJ;lZ*{)5^&J3C7vT#T4n9%{zO((25P%!(KC fpURkjas1C^*Z;X;o=d)?)wb=aBUi0Im!|4(=#Q1Y literal 0 HcmV?d00001 diff --git a/build/CMakeFiles/GraphicsTest.dir/funcs.cpp.obj.d b/build/CMakeFiles/GraphicsTest.dir/funcs.cpp.obj.d new file mode 100644 index 0000000..2567b61 --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/funcs.cpp.obj.d @@ -0,0 +1,15 @@ +CMakeFiles/GraphicsTest.dir/funcs.cpp.obj: \ + C:\Users\naifa\Documents\Projects\C++\GraphicsTest\funcs.cpp \ + C:/Users/naifa/Documents/Projects/C++/GraphicsTest/include/funcs.h \ + C:/Users/naifa/Documents/Projects/C++/GraphicsTest/dep/glad/glad.h \ + C:/msys64/ucrt64/include/KHR/khrplatform.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/stdint.h \ + C:/msys64/ucrt64/include/stdint.h C:/msys64/ucrt64/include/crtdefs.h \ + C:/msys64/ucrt64/include/corecrt.h C:/msys64/ucrt64/include/_mingw.h \ + C:/msys64/ucrt64/include/_mingw_mac.h \ + C:/msys64/ucrt64/include/_mingw_secapi.h \ + C:/msys64/ucrt64/include/vadefs.h \ + C:/msys64/ucrt64/include/sdks/_mingw_ddk.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/stddef.h \ + C:/msys64/ucrt64/include/stddef.h \ + C:/Users/naifa/Documents/Projects/C++/GraphicsTest/dep/GLFW/glfw3.h diff --git a/build/CMakeFiles/GraphicsTest.dir/includes_C.rsp b/build/CMakeFiles/GraphicsTest.dir/includes_C.rsp new file mode 100644 index 0000000..0d1cda3 --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/includes_C.rsp @@ -0,0 +1 @@ +-IC:/Users/naifa/Documents/Projects/C++/GraphicsTest/./dep -IC:/Users/naifa/Documents/Projects/C++/GraphicsTest/./include diff --git a/build/CMakeFiles/GraphicsTest.dir/includes_CXX.rsp b/build/CMakeFiles/GraphicsTest.dir/includes_CXX.rsp new file mode 100644 index 0000000..0d1cda3 --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/includes_CXX.rsp @@ -0,0 +1 @@ +-IC:/Users/naifa/Documents/Projects/C++/GraphicsTest/./dep -IC:/Users/naifa/Documents/Projects/C++/GraphicsTest/./include diff --git a/build/CMakeFiles/GraphicsTest.dir/link.txt b/build/CMakeFiles/GraphicsTest.dir/link.txt new file mode 100644 index 0000000..5c700b7 --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/link.txt @@ -0,0 +1,3 @@ +"C:\Program Files\CMake\bin\cmake.exe" -E rm -f CMakeFiles\GraphicsTest.dir/objects.a +C:\msys64\ucrt64\bin\ar.exe qc CMakeFiles\GraphicsTest.dir/objects.a @CMakeFiles\GraphicsTest.dir\objects1.rsp +C:\msys64\ucrt64\bin\g++.exe -g -Wl,--whole-archive CMakeFiles\GraphicsTest.dir/objects.a -Wl,--no-whole-archive -o GraphicsTest.exe -Wl,--out-implib,libGraphicsTest.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles\GraphicsTest.dir\linkLibs.rsp diff --git a/build/CMakeFiles/GraphicsTest.dir/linkLibs.rsp b/build/CMakeFiles/GraphicsTest.dir/linkLibs.rsp new file mode 100644 index 0000000..9bffd2b --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/linkLibs.rsp @@ -0,0 +1 @@ + -L"C:/Users/naifa/Documents/Projects/C++/GraphicsTest/../libs/glfw-3.3.9/build/src" -lglfw3 -lopengl32 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 diff --git a/build/CMakeFiles/GraphicsTest.dir/main.cpp.obj b/build/CMakeFiles/GraphicsTest.dir/main.cpp.obj new file mode 100644 index 0000000000000000000000000000000000000000..f4774e5a33e923255bbc7931df4b274dc9c29126 GIT binary patch literal 454890 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 z86

AzTDizQ_Eje74?Q&I@O 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�tD59WJMA03@Riw=spl$80cA$#^7zrKBH_{PSEUP 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

sk#;H^vuPkOd!=qTTG@{8LW>oecO5sV50GvO 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

HrJ80NJEUfEGIY=UL$ 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Ξ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 literal 0 HcmV?d00001 diff --git a/build/CMakeFiles/GraphicsTest.dir/objects1.rsp b/build/CMakeFiles/GraphicsTest.dir/objects1.rsp new file mode 100644 index 0000000..9bdf321 --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/objects1.rsp @@ -0,0 +1 @@ +CMakeFiles/GraphicsTest.dir/main.cpp.obj CMakeFiles/GraphicsTest.dir/funcs.cpp.obj CMakeFiles/GraphicsTest.dir/shader.cpp.obj CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj diff --git a/build/CMakeFiles/GraphicsTest.dir/progress.make b/build/CMakeFiles/GraphicsTest.dir/progress.make new file mode 100644 index 0000000..33e6bff --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/progress.make @@ -0,0 +1,6 @@ +CMAKE_PROGRESS_1 = 1 +CMAKE_PROGRESS_2 = 2 +CMAKE_PROGRESS_3 = 3 +CMAKE_PROGRESS_4 = 4 +CMAKE_PROGRESS_5 = 5 + diff --git a/build/CMakeFiles/GraphicsTest.dir/shader.cpp.obj b/build/CMakeFiles/GraphicsTest.dir/shader.cpp.obj new file mode 100644 index 0000000000000000000000000000000000000000..1daf6b851a60375d9187cdeaa2e01bf3f86ac475 GIT binary patch literal 77065 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 z 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 literal 0 HcmV?d00001 diff --git a/build/CMakeFiles/GraphicsTest.dir/shader.cpp.obj.d b/build/CMakeFiles/GraphicsTest.dir/shader.cpp.obj.d new file mode 100644 index 0000000..d797c39 --- /dev/null +++ b/build/CMakeFiles/GraphicsTest.dir/shader.cpp.obj.d @@ -0,0 +1,151 @@ +CMakeFiles/GraphicsTest.dir/shader.cpp.obj: \ + C:\Users\naifa\Documents\Projects\C++\GraphicsTest\shader.cpp \ + C:/Users/naifa/Documents/Projects/C++/GraphicsTest/include/shader.h \ + C:/Users/naifa/Documents/Projects/C++/GraphicsTest/dep/glad/glad.h \ + C:/msys64/ucrt64/include/KHR/khrplatform.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/stdint.h \ + C:/msys64/ucrt64/include/stdint.h C:/msys64/ucrt64/include/crtdefs.h \ + C:/msys64/ucrt64/include/corecrt.h C:/msys64/ucrt64/include/_mingw.h \ + C:/msys64/ucrt64/include/_mingw_mac.h \ + C:/msys64/ucrt64/include/_mingw_secapi.h \ + C:/msys64/ucrt64/include/vadefs.h \ + C:/msys64/ucrt64/include/sdks/_mingw_ddk.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/stddef.h \ + C:/msys64/ucrt64/include/stddef.h \ + C:/msys64/ucrt64/include/c++/13.2.0/string \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/requires_hosted.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/c++config.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/os_defines.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/cpu_defines.h \ + C:/msys64/ucrt64/include/c++/13.2.0/pstl/pstl_config.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/stringfwd.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/memoryfwd.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/char_traits.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/postypes.h \ + C:/msys64/ucrt64/include/c++/13.2.0/cwchar \ + C:/msys64/ucrt64/include/wchar.h \ + C:/msys64/ucrt64/include/corecrt_stdio_config.h \ + C:/msys64/ucrt64/include/corecrt_wstdlib.h \ + C:/msys64/ucrt64/include/_mingw_off_t.h \ + C:/msys64/ucrt64/include/_mingw_stat64.h \ + C:/msys64/ucrt64/include/swprintf.inl \ + C:/msys64/ucrt64/include/sec_api/wchar_s.h \ + C:/msys64/ucrt64/include/c++/13.2.0/type_traits \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/allocator.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/c++allocator.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/new_allocator.h \ + C:/msys64/ucrt64/include/c++/13.2.0/new \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/exception.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/functexcept.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/exception_defines.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/move.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/cpp_type_traits.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/localefwd.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/c++locale.h \ + C:/msys64/ucrt64/include/c++/13.2.0/clocale \ + C:/msys64/ucrt64/include/locale.h C:/msys64/ucrt64/include/stdio.h \ + C:/msys64/ucrt64/include/sec_api/stdio_s.h \ + C:/msys64/ucrt64/include/c++/13.2.0/iosfwd \ + C:/msys64/ucrt64/include/c++/13.2.0/cctype \ + C:/msys64/ucrt64/include/ctype.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/ostream_insert.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/cxxabi_forced.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/stl_iterator_base_funcs.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/concept_check.h \ + C:/msys64/ucrt64/include/c++/13.2.0/debug/assertions.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/stl_iterator_base_types.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/stl_iterator.h \ + C:/msys64/ucrt64/include/c++/13.2.0/ext/type_traits.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/ptr_traits.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/stl_function.h \ + C:/msys64/ucrt64/include/c++/13.2.0/backward/binders.h \ + C:/msys64/ucrt64/include/c++/13.2.0/ext/numeric_traits.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/stl_algobase.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/stl_pair.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/utility.h \ + C:/msys64/ucrt64/include/c++/13.2.0/debug/debug.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/predefined_ops.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bit \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/refwrap.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/invoke.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/range_access.h \ + C:/msys64/ucrt64/include/c++/13.2.0/initializer_list \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/basic_string.h \ + C:/msys64/ucrt64/include/c++/13.2.0/ext/alloc_traits.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/alloc_traits.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/stl_construct.h \ + C:/msys64/ucrt64/include/c++/13.2.0/string_view \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/functional_hash.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/hash_bytes.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/string_view.tcc \ + C:/msys64/ucrt64/include/c++/13.2.0/ext/string_conversions.h \ + C:/msys64/ucrt64/include/c++/13.2.0/cstdlib \ + C:/msys64/ucrt64/include/stdlib.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/limits.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/syslimits.h \ + C:/msys64/ucrt64/include/limits.h \ + C:/msys64/ucrt64/include/sec_api/stdlib_s.h \ + C:/msys64/ucrt64/include/c++/13.2.0/stdlib.h \ + C:/msys64/ucrt64/include/malloc.h \ + C:/msys64/ucrt64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/mm_malloc.h \ + C:/msys64/ucrt64/include/errno.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/std_abs.h \ + C:/msys64/ucrt64/include/c++/13.2.0/cstdio \ + C:/msys64/ucrt64/include/c++/13.2.0/cerrno \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/charconv.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/basic_string.tcc \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/memory_resource.h \ + C:/msys64/ucrt64/include/c++/13.2.0/cstddef \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/uses_allocator.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/uses_allocator_args.h \ + C:/msys64/ucrt64/include/c++/13.2.0/tuple \ + C:/msys64/ucrt64/include/c++/13.2.0/fstream \ + C:/msys64/ucrt64/include/c++/13.2.0/istream \ + C:/msys64/ucrt64/include/c++/13.2.0/ios \ + C:/msys64/ucrt64/include/c++/13.2.0/exception \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/exception_ptr.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/cxxabi_init_exception.h \ + C:/msys64/ucrt64/include/c++/13.2.0/typeinfo \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/nested_exception.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/ios_base.h \ + C:/msys64/ucrt64/include/c++/13.2.0/ext/atomicity.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/gthr.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/gthr-default.h \ + C:/msys64/ucrt64/include/pthread.h C:/msys64/ucrt64/include/sys/types.h \ + C:/msys64/ucrt64/include/process.h \ + C:/msys64/ucrt64/include/corecrt_startup.h \ + C:/msys64/ucrt64/include/signal.h \ + C:/msys64/ucrt64/include/pthread_signal.h \ + C:/msys64/ucrt64/include/time.h C:/msys64/ucrt64/include/sys/timeb.h \ + C:/msys64/ucrt64/include/sec_api/sys/timeb_s.h \ + C:/msys64/ucrt64/include/_timeval.h \ + C:/msys64/ucrt64/include/pthread_time.h \ + C:/msys64/ucrt64/include/pthread_compat.h \ + C:/msys64/ucrt64/include/pthread_unistd.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/atomic_word.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/locale_classes.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/locale_classes.tcc \ + C:/msys64/ucrt64/include/c++/13.2.0/system_error \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/error_constants.h \ + C:/msys64/ucrt64/include/c++/13.2.0/stdexcept \ + C:/msys64/ucrt64/include/c++/13.2.0/streambuf \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/streambuf.tcc \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/basic_ios.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/locale_facets.h \ + C:/msys64/ucrt64/include/c++/13.2.0/cwctype \ + C:/msys64/ucrt64/include/wctype.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/ctype_base.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/streambuf_iterator.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/ctype_inline.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/locale_facets.tcc \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/basic_ios.tcc \ + C:/msys64/ucrt64/include/c++/13.2.0/ostream \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/ostream.tcc \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/istream.tcc \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/codecvt.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/basic_file.h \ + C:/msys64/ucrt64/include/c++/13.2.0/x86_64-w64-mingw32/bits/c++io.h \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/fstream.tcc \ + C:/msys64/ucrt64/include/c++/13.2.0/sstream \ + C:/msys64/ucrt64/include/c++/13.2.0/bits/sstream.tcc \ + C:/msys64/ucrt64/include/c++/13.2.0/iostream diff --git a/build/CMakeFiles/Makefile.cmake b/build/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000..c1787c3 --- /dev/null +++ b/build/CMakeFiles/Makefile.cmake @@ -0,0 +1,94 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# The generator used is: +set(CMAKE_DEPENDS_GENERATOR "MinGW Makefiles") + +# The top level Makefile was generated from the following files: +set(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeCInformation.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeCXXInformation.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeCommonLanguageInclude.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeGenericSystem.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeInitializeConfigs.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeLanguageInformation.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeRCInformation.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeSystemSpecificInformation.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CMakeSystemSpecificInitialize.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CPack.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CPackComponent.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CTest.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CTestTargets.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/CTestUseLaunchers.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Compiler/GNU-C.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Compiler/GNU-CXX.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Compiler/GNU.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/DartConfiguration.tcl.in" + "C:/Program Files/CMake/share/cmake-3.28/Modules/FindOpenGL.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/FindPackageHandleStandardArgs.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/FindPackageMessage.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Platform/Windows-GNU-C-ABI.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Platform/Windows-GNU-C.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Platform/Windows-GNU-CXX-ABI.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Platform/Windows-GNU-CXX.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Platform/Windows-GNU.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Platform/Windows-Initialize.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Platform/Windows-windres.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Platform/Windows.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Modules/Platform/WindowsPaths.cmake" + "C:/Program Files/CMake/share/cmake-3.28/Templates/CPackConfig.cmake.in" + "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/CMakeLists.txt" + "CMakeFiles/3.28.1/CMakeCCompiler.cmake" + "CMakeFiles/3.28.1/CMakeCXXCompiler.cmake" + "CMakeFiles/3.28.1/CMakeRCCompiler.cmake" + "CMakeFiles/3.28.1/CMakeSystem.cmake" + ) + +# The corresponding makefile is: +set(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +set(CMAKE_MAKEFILE_PRODUCTS + "DartConfiguration.tcl" + "CPackConfig.cmake" + "CPackSourceConfig.cmake" + "CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +set(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/Experimental.dir/DependInfo.cmake" + "CMakeFiles/Nightly.dir/DependInfo.cmake" + "CMakeFiles/Continuous.dir/DependInfo.cmake" + "CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake" + "CMakeFiles/NightlyStart.dir/DependInfo.cmake" + "CMakeFiles/NightlyUpdate.dir/DependInfo.cmake" + "CMakeFiles/NightlyConfigure.dir/DependInfo.cmake" + "CMakeFiles/NightlyBuild.dir/DependInfo.cmake" + "CMakeFiles/NightlyTest.dir/DependInfo.cmake" + "CMakeFiles/NightlyCoverage.dir/DependInfo.cmake" + "CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake" + "CMakeFiles/NightlySubmit.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalStart.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalTest.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake" + "CMakeFiles/ContinuousStart.dir/DependInfo.cmake" + "CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake" + "CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake" + "CMakeFiles/ContinuousBuild.dir/DependInfo.cmake" + "CMakeFiles/ContinuousTest.dir/DependInfo.cmake" + "CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake" + "CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake" + "CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake" + "CMakeFiles/GraphicsTest.dir/DependInfo.cmake" + ) diff --git a/build/CMakeFiles/Makefile2 b/build/CMakeFiles/Makefile2 new file mode 100644 index 0000000..e7fc651 --- /dev/null +++ b/build/CMakeFiles/Makefile2 @@ -0,0 +1,867 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +#============================================================================= +# Directory level rules for the build root directory + +# The main recursive "all" target. +all: CMakeFiles/GraphicsTest.dir/all +.PHONY : all + +# The main recursive "preinstall" target. +preinstall: +.PHONY : preinstall + +# The main recursive "clean" target. +clean: CMakeFiles/Experimental.dir/clean +clean: CMakeFiles/Nightly.dir/clean +clean: CMakeFiles/Continuous.dir/clean +clean: CMakeFiles/NightlyMemoryCheck.dir/clean +clean: CMakeFiles/NightlyStart.dir/clean +clean: CMakeFiles/NightlyUpdate.dir/clean +clean: CMakeFiles/NightlyConfigure.dir/clean +clean: CMakeFiles/NightlyBuild.dir/clean +clean: CMakeFiles/NightlyTest.dir/clean +clean: CMakeFiles/NightlyCoverage.dir/clean +clean: CMakeFiles/NightlyMemCheck.dir/clean +clean: CMakeFiles/NightlySubmit.dir/clean +clean: CMakeFiles/ExperimentalStart.dir/clean +clean: CMakeFiles/ExperimentalUpdate.dir/clean +clean: CMakeFiles/ExperimentalConfigure.dir/clean +clean: CMakeFiles/ExperimentalBuild.dir/clean +clean: CMakeFiles/ExperimentalTest.dir/clean +clean: CMakeFiles/ExperimentalCoverage.dir/clean +clean: CMakeFiles/ExperimentalMemCheck.dir/clean +clean: CMakeFiles/ExperimentalSubmit.dir/clean +clean: CMakeFiles/ContinuousStart.dir/clean +clean: CMakeFiles/ContinuousUpdate.dir/clean +clean: CMakeFiles/ContinuousConfigure.dir/clean +clean: CMakeFiles/ContinuousBuild.dir/clean +clean: CMakeFiles/ContinuousTest.dir/clean +clean: CMakeFiles/ContinuousCoverage.dir/clean +clean: CMakeFiles/ContinuousMemCheck.dir/clean +clean: CMakeFiles/ContinuousSubmit.dir/clean +clean: CMakeFiles/GraphicsTest.dir/clean +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/Experimental.dir + +# All Build rule for target. +CMakeFiles/Experimental.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Experimental.dir\build.make CMakeFiles/Experimental.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\Experimental.dir\build.make CMakeFiles/Experimental.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target Experimental" +.PHONY : CMakeFiles/Experimental.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/Experimental.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/Experimental.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/Experimental.dir/rule + +# Convenience name for target. +Experimental: CMakeFiles/Experimental.dir/rule +.PHONY : Experimental + +# clean rule for target. +CMakeFiles/Experimental.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Experimental.dir\build.make CMakeFiles/Experimental.dir/clean +.PHONY : CMakeFiles/Experimental.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/Nightly.dir + +# All Build rule for target. +CMakeFiles/Nightly.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Nightly.dir\build.make CMakeFiles/Nightly.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\Nightly.dir\build.make CMakeFiles/Nightly.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target Nightly" +.PHONY : CMakeFiles/Nightly.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/Nightly.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/Nightly.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/Nightly.dir/rule + +# Convenience name for target. +Nightly: CMakeFiles/Nightly.dir/rule +.PHONY : Nightly + +# clean rule for target. +CMakeFiles/Nightly.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Nightly.dir\build.make CMakeFiles/Nightly.dir/clean +.PHONY : CMakeFiles/Nightly.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/Continuous.dir + +# All Build rule for target. +CMakeFiles/Continuous.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Continuous.dir\build.make CMakeFiles/Continuous.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\Continuous.dir\build.make CMakeFiles/Continuous.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target Continuous" +.PHONY : CMakeFiles/Continuous.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/Continuous.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/Continuous.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/Continuous.dir/rule + +# Convenience name for target. +Continuous: CMakeFiles/Continuous.dir/rule +.PHONY : Continuous + +# clean rule for target. +CMakeFiles/Continuous.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Continuous.dir\build.make CMakeFiles/Continuous.dir/clean +.PHONY : CMakeFiles/Continuous.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyMemoryCheck.dir + +# All Build rule for target. +CMakeFiles/NightlyMemoryCheck.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyMemoryCheck.dir\build.make CMakeFiles/NightlyMemoryCheck.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyMemoryCheck.dir\build.make CMakeFiles/NightlyMemoryCheck.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target NightlyMemoryCheck" +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyMemoryCheck.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/NightlyMemoryCheck.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/rule + +# Convenience name for target. +NightlyMemoryCheck: CMakeFiles/NightlyMemoryCheck.dir/rule +.PHONY : NightlyMemoryCheck + +# clean rule for target. +CMakeFiles/NightlyMemoryCheck.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyMemoryCheck.dir\build.make CMakeFiles/NightlyMemoryCheck.dir/clean +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyStart.dir + +# All Build rule for target. +CMakeFiles/NightlyStart.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyStart.dir\build.make CMakeFiles/NightlyStart.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyStart.dir\build.make CMakeFiles/NightlyStart.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target NightlyStart" +.PHONY : CMakeFiles/NightlyStart.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyStart.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/NightlyStart.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/NightlyStart.dir/rule + +# Convenience name for target. +NightlyStart: CMakeFiles/NightlyStart.dir/rule +.PHONY : NightlyStart + +# clean rule for target. +CMakeFiles/NightlyStart.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyStart.dir\build.make CMakeFiles/NightlyStart.dir/clean +.PHONY : CMakeFiles/NightlyStart.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyUpdate.dir + +# All Build rule for target. +CMakeFiles/NightlyUpdate.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyUpdate.dir\build.make CMakeFiles/NightlyUpdate.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyUpdate.dir\build.make CMakeFiles/NightlyUpdate.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target NightlyUpdate" +.PHONY : CMakeFiles/NightlyUpdate.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyUpdate.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/NightlyUpdate.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/NightlyUpdate.dir/rule + +# Convenience name for target. +NightlyUpdate: CMakeFiles/NightlyUpdate.dir/rule +.PHONY : NightlyUpdate + +# clean rule for target. +CMakeFiles/NightlyUpdate.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyUpdate.dir\build.make CMakeFiles/NightlyUpdate.dir/clean +.PHONY : CMakeFiles/NightlyUpdate.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyConfigure.dir + +# All Build rule for target. +CMakeFiles/NightlyConfigure.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyConfigure.dir\build.make CMakeFiles/NightlyConfigure.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyConfigure.dir\build.make CMakeFiles/NightlyConfigure.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target NightlyConfigure" +.PHONY : CMakeFiles/NightlyConfigure.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyConfigure.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/NightlyConfigure.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/NightlyConfigure.dir/rule + +# Convenience name for target. +NightlyConfigure: CMakeFiles/NightlyConfigure.dir/rule +.PHONY : NightlyConfigure + +# clean rule for target. +CMakeFiles/NightlyConfigure.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyConfigure.dir\build.make CMakeFiles/NightlyConfigure.dir/clean +.PHONY : CMakeFiles/NightlyConfigure.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyBuild.dir + +# All Build rule for target. +CMakeFiles/NightlyBuild.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyBuild.dir\build.make CMakeFiles/NightlyBuild.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyBuild.dir\build.make CMakeFiles/NightlyBuild.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target NightlyBuild" +.PHONY : CMakeFiles/NightlyBuild.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyBuild.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/NightlyBuild.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/NightlyBuild.dir/rule + +# Convenience name for target. +NightlyBuild: CMakeFiles/NightlyBuild.dir/rule +.PHONY : NightlyBuild + +# clean rule for target. +CMakeFiles/NightlyBuild.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyBuild.dir\build.make CMakeFiles/NightlyBuild.dir/clean +.PHONY : CMakeFiles/NightlyBuild.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyTest.dir + +# All Build rule for target. +CMakeFiles/NightlyTest.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyTest.dir\build.make CMakeFiles/NightlyTest.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyTest.dir\build.make CMakeFiles/NightlyTest.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target NightlyTest" +.PHONY : CMakeFiles/NightlyTest.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyTest.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/NightlyTest.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/NightlyTest.dir/rule + +# Convenience name for target. +NightlyTest: CMakeFiles/NightlyTest.dir/rule +.PHONY : NightlyTest + +# clean rule for target. +CMakeFiles/NightlyTest.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyTest.dir\build.make CMakeFiles/NightlyTest.dir/clean +.PHONY : CMakeFiles/NightlyTest.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyCoverage.dir + +# All Build rule for target. +CMakeFiles/NightlyCoverage.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyCoverage.dir\build.make CMakeFiles/NightlyCoverage.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyCoverage.dir\build.make CMakeFiles/NightlyCoverage.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target NightlyCoverage" +.PHONY : CMakeFiles/NightlyCoverage.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyCoverage.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/NightlyCoverage.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/NightlyCoverage.dir/rule + +# Convenience name for target. +NightlyCoverage: CMakeFiles/NightlyCoverage.dir/rule +.PHONY : NightlyCoverage + +# clean rule for target. +CMakeFiles/NightlyCoverage.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyCoverage.dir\build.make CMakeFiles/NightlyCoverage.dir/clean +.PHONY : CMakeFiles/NightlyCoverage.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyMemCheck.dir + +# All Build rule for target. +CMakeFiles/NightlyMemCheck.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyMemCheck.dir\build.make CMakeFiles/NightlyMemCheck.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyMemCheck.dir\build.make CMakeFiles/NightlyMemCheck.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target NightlyMemCheck" +.PHONY : CMakeFiles/NightlyMemCheck.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyMemCheck.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/NightlyMemCheck.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/NightlyMemCheck.dir/rule + +# Convenience name for target. +NightlyMemCheck: CMakeFiles/NightlyMemCheck.dir/rule +.PHONY : NightlyMemCheck + +# clean rule for target. +CMakeFiles/NightlyMemCheck.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyMemCheck.dir\build.make CMakeFiles/NightlyMemCheck.dir/clean +.PHONY : CMakeFiles/NightlyMemCheck.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlySubmit.dir + +# All Build rule for target. +CMakeFiles/NightlySubmit.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlySubmit.dir\build.make CMakeFiles/NightlySubmit.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlySubmit.dir\build.make CMakeFiles/NightlySubmit.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target NightlySubmit" +.PHONY : CMakeFiles/NightlySubmit.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlySubmit.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/NightlySubmit.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/NightlySubmit.dir/rule + +# Convenience name for target. +NightlySubmit: CMakeFiles/NightlySubmit.dir/rule +.PHONY : NightlySubmit + +# clean rule for target. +CMakeFiles/NightlySubmit.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlySubmit.dir\build.make CMakeFiles/NightlySubmit.dir/clean +.PHONY : CMakeFiles/NightlySubmit.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalStart.dir + +# All Build rule for target. +CMakeFiles/ExperimentalStart.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalStart.dir\build.make CMakeFiles/ExperimentalStart.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalStart.dir\build.make CMakeFiles/ExperimentalStart.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ExperimentalStart" +.PHONY : CMakeFiles/ExperimentalStart.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalStart.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ExperimentalStart.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalStart.dir/rule + +# Convenience name for target. +ExperimentalStart: CMakeFiles/ExperimentalStart.dir/rule +.PHONY : ExperimentalStart + +# clean rule for target. +CMakeFiles/ExperimentalStart.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalStart.dir\build.make CMakeFiles/ExperimentalStart.dir/clean +.PHONY : CMakeFiles/ExperimentalStart.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalUpdate.dir + +# All Build rule for target. +CMakeFiles/ExperimentalUpdate.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalUpdate.dir\build.make CMakeFiles/ExperimentalUpdate.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalUpdate.dir\build.make CMakeFiles/ExperimentalUpdate.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ExperimentalUpdate" +.PHONY : CMakeFiles/ExperimentalUpdate.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalUpdate.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ExperimentalUpdate.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalUpdate.dir/rule + +# Convenience name for target. +ExperimentalUpdate: CMakeFiles/ExperimentalUpdate.dir/rule +.PHONY : ExperimentalUpdate + +# clean rule for target. +CMakeFiles/ExperimentalUpdate.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalUpdate.dir\build.make CMakeFiles/ExperimentalUpdate.dir/clean +.PHONY : CMakeFiles/ExperimentalUpdate.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalConfigure.dir + +# All Build rule for target. +CMakeFiles/ExperimentalConfigure.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalConfigure.dir\build.make CMakeFiles/ExperimentalConfigure.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalConfigure.dir\build.make CMakeFiles/ExperimentalConfigure.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ExperimentalConfigure" +.PHONY : CMakeFiles/ExperimentalConfigure.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalConfigure.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ExperimentalConfigure.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalConfigure.dir/rule + +# Convenience name for target. +ExperimentalConfigure: CMakeFiles/ExperimentalConfigure.dir/rule +.PHONY : ExperimentalConfigure + +# clean rule for target. +CMakeFiles/ExperimentalConfigure.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalConfigure.dir\build.make CMakeFiles/ExperimentalConfigure.dir/clean +.PHONY : CMakeFiles/ExperimentalConfigure.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalBuild.dir + +# All Build rule for target. +CMakeFiles/ExperimentalBuild.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalBuild.dir\build.make CMakeFiles/ExperimentalBuild.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalBuild.dir\build.make CMakeFiles/ExperimentalBuild.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ExperimentalBuild" +.PHONY : CMakeFiles/ExperimentalBuild.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalBuild.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ExperimentalBuild.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalBuild.dir/rule + +# Convenience name for target. +ExperimentalBuild: CMakeFiles/ExperimentalBuild.dir/rule +.PHONY : ExperimentalBuild + +# clean rule for target. +CMakeFiles/ExperimentalBuild.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalBuild.dir\build.make CMakeFiles/ExperimentalBuild.dir/clean +.PHONY : CMakeFiles/ExperimentalBuild.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalTest.dir + +# All Build rule for target. +CMakeFiles/ExperimentalTest.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalTest.dir\build.make CMakeFiles/ExperimentalTest.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalTest.dir\build.make CMakeFiles/ExperimentalTest.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ExperimentalTest" +.PHONY : CMakeFiles/ExperimentalTest.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalTest.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ExperimentalTest.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalTest.dir/rule + +# Convenience name for target. +ExperimentalTest: CMakeFiles/ExperimentalTest.dir/rule +.PHONY : ExperimentalTest + +# clean rule for target. +CMakeFiles/ExperimentalTest.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalTest.dir\build.make CMakeFiles/ExperimentalTest.dir/clean +.PHONY : CMakeFiles/ExperimentalTest.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalCoverage.dir + +# All Build rule for target. +CMakeFiles/ExperimentalCoverage.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalCoverage.dir\build.make CMakeFiles/ExperimentalCoverage.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalCoverage.dir\build.make CMakeFiles/ExperimentalCoverage.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ExperimentalCoverage" +.PHONY : CMakeFiles/ExperimentalCoverage.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalCoverage.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ExperimentalCoverage.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalCoverage.dir/rule + +# Convenience name for target. +ExperimentalCoverage: CMakeFiles/ExperimentalCoverage.dir/rule +.PHONY : ExperimentalCoverage + +# clean rule for target. +CMakeFiles/ExperimentalCoverage.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalCoverage.dir\build.make CMakeFiles/ExperimentalCoverage.dir/clean +.PHONY : CMakeFiles/ExperimentalCoverage.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalMemCheck.dir + +# All Build rule for target. +CMakeFiles/ExperimentalMemCheck.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalMemCheck.dir\build.make CMakeFiles/ExperimentalMemCheck.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalMemCheck.dir\build.make CMakeFiles/ExperimentalMemCheck.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ExperimentalMemCheck" +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalMemCheck.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ExperimentalMemCheck.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/rule + +# Convenience name for target. +ExperimentalMemCheck: CMakeFiles/ExperimentalMemCheck.dir/rule +.PHONY : ExperimentalMemCheck + +# clean rule for target. +CMakeFiles/ExperimentalMemCheck.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalMemCheck.dir\build.make CMakeFiles/ExperimentalMemCheck.dir/clean +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalSubmit.dir + +# All Build rule for target. +CMakeFiles/ExperimentalSubmit.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalSubmit.dir\build.make CMakeFiles/ExperimentalSubmit.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalSubmit.dir\build.make CMakeFiles/ExperimentalSubmit.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ExperimentalSubmit" +.PHONY : CMakeFiles/ExperimentalSubmit.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalSubmit.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ExperimentalSubmit.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalSubmit.dir/rule + +# Convenience name for target. +ExperimentalSubmit: CMakeFiles/ExperimentalSubmit.dir/rule +.PHONY : ExperimentalSubmit + +# clean rule for target. +CMakeFiles/ExperimentalSubmit.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalSubmit.dir\build.make CMakeFiles/ExperimentalSubmit.dir/clean +.PHONY : CMakeFiles/ExperimentalSubmit.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousStart.dir + +# All Build rule for target. +CMakeFiles/ContinuousStart.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousStart.dir\build.make CMakeFiles/ContinuousStart.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousStart.dir\build.make CMakeFiles/ContinuousStart.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ContinuousStart" +.PHONY : CMakeFiles/ContinuousStart.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousStart.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ContinuousStart.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousStart.dir/rule + +# Convenience name for target. +ContinuousStart: CMakeFiles/ContinuousStart.dir/rule +.PHONY : ContinuousStart + +# clean rule for target. +CMakeFiles/ContinuousStart.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousStart.dir\build.make CMakeFiles/ContinuousStart.dir/clean +.PHONY : CMakeFiles/ContinuousStart.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousUpdate.dir + +# All Build rule for target. +CMakeFiles/ContinuousUpdate.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousUpdate.dir\build.make CMakeFiles/ContinuousUpdate.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousUpdate.dir\build.make CMakeFiles/ContinuousUpdate.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ContinuousUpdate" +.PHONY : CMakeFiles/ContinuousUpdate.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousUpdate.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ContinuousUpdate.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousUpdate.dir/rule + +# Convenience name for target. +ContinuousUpdate: CMakeFiles/ContinuousUpdate.dir/rule +.PHONY : ContinuousUpdate + +# clean rule for target. +CMakeFiles/ContinuousUpdate.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousUpdate.dir\build.make CMakeFiles/ContinuousUpdate.dir/clean +.PHONY : CMakeFiles/ContinuousUpdate.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousConfigure.dir + +# All Build rule for target. +CMakeFiles/ContinuousConfigure.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousConfigure.dir\build.make CMakeFiles/ContinuousConfigure.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousConfigure.dir\build.make CMakeFiles/ContinuousConfigure.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ContinuousConfigure" +.PHONY : CMakeFiles/ContinuousConfigure.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousConfigure.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ContinuousConfigure.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousConfigure.dir/rule + +# Convenience name for target. +ContinuousConfigure: CMakeFiles/ContinuousConfigure.dir/rule +.PHONY : ContinuousConfigure + +# clean rule for target. +CMakeFiles/ContinuousConfigure.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousConfigure.dir\build.make CMakeFiles/ContinuousConfigure.dir/clean +.PHONY : CMakeFiles/ContinuousConfigure.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousBuild.dir + +# All Build rule for target. +CMakeFiles/ContinuousBuild.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousBuild.dir\build.make CMakeFiles/ContinuousBuild.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousBuild.dir\build.make CMakeFiles/ContinuousBuild.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ContinuousBuild" +.PHONY : CMakeFiles/ContinuousBuild.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousBuild.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ContinuousBuild.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousBuild.dir/rule + +# Convenience name for target. +ContinuousBuild: CMakeFiles/ContinuousBuild.dir/rule +.PHONY : ContinuousBuild + +# clean rule for target. +CMakeFiles/ContinuousBuild.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousBuild.dir\build.make CMakeFiles/ContinuousBuild.dir/clean +.PHONY : CMakeFiles/ContinuousBuild.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousTest.dir + +# All Build rule for target. +CMakeFiles/ContinuousTest.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousTest.dir\build.make CMakeFiles/ContinuousTest.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousTest.dir\build.make CMakeFiles/ContinuousTest.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ContinuousTest" +.PHONY : CMakeFiles/ContinuousTest.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousTest.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ContinuousTest.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousTest.dir/rule + +# Convenience name for target. +ContinuousTest: CMakeFiles/ContinuousTest.dir/rule +.PHONY : ContinuousTest + +# clean rule for target. +CMakeFiles/ContinuousTest.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousTest.dir\build.make CMakeFiles/ContinuousTest.dir/clean +.PHONY : CMakeFiles/ContinuousTest.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousCoverage.dir + +# All Build rule for target. +CMakeFiles/ContinuousCoverage.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousCoverage.dir\build.make CMakeFiles/ContinuousCoverage.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousCoverage.dir\build.make CMakeFiles/ContinuousCoverage.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ContinuousCoverage" +.PHONY : CMakeFiles/ContinuousCoverage.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousCoverage.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ContinuousCoverage.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousCoverage.dir/rule + +# Convenience name for target. +ContinuousCoverage: CMakeFiles/ContinuousCoverage.dir/rule +.PHONY : ContinuousCoverage + +# clean rule for target. +CMakeFiles/ContinuousCoverage.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousCoverage.dir\build.make CMakeFiles/ContinuousCoverage.dir/clean +.PHONY : CMakeFiles/ContinuousCoverage.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousMemCheck.dir + +# All Build rule for target. +CMakeFiles/ContinuousMemCheck.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousMemCheck.dir\build.make CMakeFiles/ContinuousMemCheck.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousMemCheck.dir\build.make CMakeFiles/ContinuousMemCheck.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ContinuousMemCheck" +.PHONY : CMakeFiles/ContinuousMemCheck.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousMemCheck.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ContinuousMemCheck.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousMemCheck.dir/rule + +# Convenience name for target. +ContinuousMemCheck: CMakeFiles/ContinuousMemCheck.dir/rule +.PHONY : ContinuousMemCheck + +# clean rule for target. +CMakeFiles/ContinuousMemCheck.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousMemCheck.dir\build.make CMakeFiles/ContinuousMemCheck.dir/clean +.PHONY : CMakeFiles/ContinuousMemCheck.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousSubmit.dir + +# All Build rule for target. +CMakeFiles/ContinuousSubmit.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousSubmit.dir\build.make CMakeFiles/ContinuousSubmit.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousSubmit.dir\build.make CMakeFiles/ContinuousSubmit.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num= "Built target ContinuousSubmit" +.PHONY : CMakeFiles/ContinuousSubmit.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousSubmit.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/ContinuousSubmit.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousSubmit.dir/rule + +# Convenience name for target. +ContinuousSubmit: CMakeFiles/ContinuousSubmit.dir/rule +.PHONY : ContinuousSubmit + +# clean rule for target. +CMakeFiles/ContinuousSubmit.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousSubmit.dir\build.make CMakeFiles/ContinuousSubmit.dir/clean +.PHONY : CMakeFiles/ContinuousSubmit.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/GraphicsTest.dir + +# All Build rule for target. +CMakeFiles/GraphicsTest.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles --progress-num=1,2,3,4,5 "Built target GraphicsTest" +.PHONY : CMakeFiles/GraphicsTest.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/GraphicsTest.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 5 + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 CMakeFiles/GraphicsTest.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : CMakeFiles/GraphicsTest.dir/rule + +# Convenience name for target. +GraphicsTest: CMakeFiles/GraphicsTest.dir/rule +.PHONY : GraphicsTest + +# clean rule for target. +CMakeFiles/GraphicsTest.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/clean +.PHONY : CMakeFiles/GraphicsTest.dir/clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/CMakeFiles/Nightly.dir/DependInfo.cmake b/build/CMakeFiles/Nightly.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/Nightly.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/Nightly.dir/build.make b/build/CMakeFiles/Nightly.dir/build.make new file mode 100644 index 0000000..7c9e379 --- /dev/null +++ b/build/CMakeFiles/Nightly.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for Nightly. + +# Include any custom commands dependencies for this target. +include CMakeFiles/Nightly.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/Nightly.dir/progress.make + +CMakeFiles/Nightly: + "C:\Program Files\CMake\bin\ctest.exe" -D Nightly + +Nightly: CMakeFiles/Nightly +Nightly: CMakeFiles/Nightly.dir/build.make +.PHONY : Nightly + +# Rule to build all files generated by this target. +CMakeFiles/Nightly.dir/build: Nightly +.PHONY : CMakeFiles/Nightly.dir/build + +CMakeFiles/Nightly.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\Nightly.dir\cmake_clean.cmake +.PHONY : CMakeFiles/Nightly.dir/clean + +CMakeFiles/Nightly.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\Nightly.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/Nightly.dir/depend + diff --git a/build/CMakeFiles/Nightly.dir/cmake_clean.cmake b/build/CMakeFiles/Nightly.dir/cmake_clean.cmake new file mode 100644 index 0000000..99a4ac1 --- /dev/null +++ b/build/CMakeFiles/Nightly.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/Nightly" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/Nightly.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/Nightly.dir/compiler_depend.make b/build/CMakeFiles/Nightly.dir/compiler_depend.make new file mode 100644 index 0000000..b53ef7a --- /dev/null +++ b/build/CMakeFiles/Nightly.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for Nightly. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/Nightly.dir/compiler_depend.ts b/build/CMakeFiles/Nightly.dir/compiler_depend.ts new file mode 100644 index 0000000..a85d2c8 --- /dev/null +++ b/build/CMakeFiles/Nightly.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for Nightly. diff --git a/build/CMakeFiles/Nightly.dir/progress.make b/build/CMakeFiles/Nightly.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/Nightly.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/NightlyBuild.dir/DependInfo.cmake b/build/CMakeFiles/NightlyBuild.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/NightlyBuild.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/NightlyBuild.dir/build.make b/build/CMakeFiles/NightlyBuild.dir/build.make new file mode 100644 index 0000000..6615a95 --- /dev/null +++ b/build/CMakeFiles/NightlyBuild.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for NightlyBuild. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyBuild.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyBuild.dir/progress.make + +CMakeFiles/NightlyBuild: + "C:\Program Files\CMake\bin\ctest.exe" -D NightlyBuild + +NightlyBuild: CMakeFiles/NightlyBuild +NightlyBuild: CMakeFiles/NightlyBuild.dir/build.make +.PHONY : NightlyBuild + +# Rule to build all files generated by this target. +CMakeFiles/NightlyBuild.dir/build: NightlyBuild +.PHONY : CMakeFiles/NightlyBuild.dir/build + +CMakeFiles/NightlyBuild.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\NightlyBuild.dir\cmake_clean.cmake +.PHONY : CMakeFiles/NightlyBuild.dir/clean + +CMakeFiles/NightlyBuild.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\NightlyBuild.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/NightlyBuild.dir/depend + diff --git a/build/CMakeFiles/NightlyBuild.dir/cmake_clean.cmake b/build/CMakeFiles/NightlyBuild.dir/cmake_clean.cmake new file mode 100644 index 0000000..7aa38a7 --- /dev/null +++ b/build/CMakeFiles/NightlyBuild.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyBuild" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyBuild.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/NightlyBuild.dir/compiler_depend.make b/build/CMakeFiles/NightlyBuild.dir/compiler_depend.make new file mode 100644 index 0000000..da2f347 --- /dev/null +++ b/build/CMakeFiles/NightlyBuild.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyBuild. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/NightlyBuild.dir/compiler_depend.ts b/build/CMakeFiles/NightlyBuild.dir/compiler_depend.ts new file mode 100644 index 0000000..89e6960 --- /dev/null +++ b/build/CMakeFiles/NightlyBuild.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyBuild. diff --git a/build/CMakeFiles/NightlyBuild.dir/progress.make b/build/CMakeFiles/NightlyBuild.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/NightlyBuild.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/NightlyConfigure.dir/DependInfo.cmake b/build/CMakeFiles/NightlyConfigure.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/NightlyConfigure.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/NightlyConfigure.dir/build.make b/build/CMakeFiles/NightlyConfigure.dir/build.make new file mode 100644 index 0000000..6e5a23c --- /dev/null +++ b/build/CMakeFiles/NightlyConfigure.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for NightlyConfigure. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyConfigure.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyConfigure.dir/progress.make + +CMakeFiles/NightlyConfigure: + "C:\Program Files\CMake\bin\ctest.exe" -D NightlyConfigure + +NightlyConfigure: CMakeFiles/NightlyConfigure +NightlyConfigure: CMakeFiles/NightlyConfigure.dir/build.make +.PHONY : NightlyConfigure + +# Rule to build all files generated by this target. +CMakeFiles/NightlyConfigure.dir/build: NightlyConfigure +.PHONY : CMakeFiles/NightlyConfigure.dir/build + +CMakeFiles/NightlyConfigure.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\NightlyConfigure.dir\cmake_clean.cmake +.PHONY : CMakeFiles/NightlyConfigure.dir/clean + +CMakeFiles/NightlyConfigure.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\NightlyConfigure.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/NightlyConfigure.dir/depend + diff --git a/build/CMakeFiles/NightlyConfigure.dir/cmake_clean.cmake b/build/CMakeFiles/NightlyConfigure.dir/cmake_clean.cmake new file mode 100644 index 0000000..080c729 --- /dev/null +++ b/build/CMakeFiles/NightlyConfigure.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyConfigure" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyConfigure.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.make b/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.make new file mode 100644 index 0000000..973bd2a --- /dev/null +++ b/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyConfigure. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.ts b/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.ts new file mode 100644 index 0000000..3e550da --- /dev/null +++ b/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyConfigure. diff --git a/build/CMakeFiles/NightlyConfigure.dir/progress.make b/build/CMakeFiles/NightlyConfigure.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/NightlyConfigure.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/NightlyCoverage.dir/DependInfo.cmake b/build/CMakeFiles/NightlyCoverage.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/NightlyCoverage.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/NightlyCoverage.dir/build.make b/build/CMakeFiles/NightlyCoverage.dir/build.make new file mode 100644 index 0000000..6082442 --- /dev/null +++ b/build/CMakeFiles/NightlyCoverage.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for NightlyCoverage. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyCoverage.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyCoverage.dir/progress.make + +CMakeFiles/NightlyCoverage: + "C:\Program Files\CMake\bin\ctest.exe" -D NightlyCoverage + +NightlyCoverage: CMakeFiles/NightlyCoverage +NightlyCoverage: CMakeFiles/NightlyCoverage.dir/build.make +.PHONY : NightlyCoverage + +# Rule to build all files generated by this target. +CMakeFiles/NightlyCoverage.dir/build: NightlyCoverage +.PHONY : CMakeFiles/NightlyCoverage.dir/build + +CMakeFiles/NightlyCoverage.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\NightlyCoverage.dir\cmake_clean.cmake +.PHONY : CMakeFiles/NightlyCoverage.dir/clean + +CMakeFiles/NightlyCoverage.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\NightlyCoverage.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/NightlyCoverage.dir/depend + diff --git a/build/CMakeFiles/NightlyCoverage.dir/cmake_clean.cmake b/build/CMakeFiles/NightlyCoverage.dir/cmake_clean.cmake new file mode 100644 index 0000000..d6cba89 --- /dev/null +++ b/build/CMakeFiles/NightlyCoverage.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyCoverage" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyCoverage.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.make b/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.make new file mode 100644 index 0000000..9f188a1 --- /dev/null +++ b/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyCoverage. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.ts b/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.ts new file mode 100644 index 0000000..3092ba3 --- /dev/null +++ b/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyCoverage. diff --git a/build/CMakeFiles/NightlyCoverage.dir/progress.make b/build/CMakeFiles/NightlyCoverage.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/NightlyCoverage.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake b/build/CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/NightlyMemCheck.dir/build.make b/build/CMakeFiles/NightlyMemCheck.dir/build.make new file mode 100644 index 0000000..9339b05 --- /dev/null +++ b/build/CMakeFiles/NightlyMemCheck.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for NightlyMemCheck. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyMemCheck.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyMemCheck.dir/progress.make + +CMakeFiles/NightlyMemCheck: + "C:\Program Files\CMake\bin\ctest.exe" -D NightlyMemCheck + +NightlyMemCheck: CMakeFiles/NightlyMemCheck +NightlyMemCheck: CMakeFiles/NightlyMemCheck.dir/build.make +.PHONY : NightlyMemCheck + +# Rule to build all files generated by this target. +CMakeFiles/NightlyMemCheck.dir/build: NightlyMemCheck +.PHONY : CMakeFiles/NightlyMemCheck.dir/build + +CMakeFiles/NightlyMemCheck.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\NightlyMemCheck.dir\cmake_clean.cmake +.PHONY : CMakeFiles/NightlyMemCheck.dir/clean + +CMakeFiles/NightlyMemCheck.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\NightlyMemCheck.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/NightlyMemCheck.dir/depend + diff --git a/build/CMakeFiles/NightlyMemCheck.dir/cmake_clean.cmake b/build/CMakeFiles/NightlyMemCheck.dir/cmake_clean.cmake new file mode 100644 index 0000000..3c0e881 --- /dev/null +++ b/build/CMakeFiles/NightlyMemCheck.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyMemCheck" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyMemCheck.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.make b/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.make new file mode 100644 index 0000000..6c54911 --- /dev/null +++ b/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyMemCheck. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.ts b/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.ts new file mode 100644 index 0000000..c176eda --- /dev/null +++ b/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyMemCheck. diff --git a/build/CMakeFiles/NightlyMemCheck.dir/progress.make b/build/CMakeFiles/NightlyMemCheck.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/NightlyMemCheck.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake b/build/CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/NightlyMemoryCheck.dir/build.make b/build/CMakeFiles/NightlyMemoryCheck.dir/build.make new file mode 100644 index 0000000..be6f869 --- /dev/null +++ b/build/CMakeFiles/NightlyMemoryCheck.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for NightlyMemoryCheck. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyMemoryCheck.dir/progress.make + +CMakeFiles/NightlyMemoryCheck: + "C:\Program Files\CMake\bin\ctest.exe" -D NightlyMemoryCheck + +NightlyMemoryCheck: CMakeFiles/NightlyMemoryCheck +NightlyMemoryCheck: CMakeFiles/NightlyMemoryCheck.dir/build.make +.PHONY : NightlyMemoryCheck + +# Rule to build all files generated by this target. +CMakeFiles/NightlyMemoryCheck.dir/build: NightlyMemoryCheck +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/build + +CMakeFiles/NightlyMemoryCheck.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\NightlyMemoryCheck.dir\cmake_clean.cmake +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/clean + +CMakeFiles/NightlyMemoryCheck.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\NightlyMemoryCheck.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/depend + diff --git a/build/CMakeFiles/NightlyMemoryCheck.dir/cmake_clean.cmake b/build/CMakeFiles/NightlyMemoryCheck.dir/cmake_clean.cmake new file mode 100644 index 0000000..8846611 --- /dev/null +++ b/build/CMakeFiles/NightlyMemoryCheck.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyMemoryCheck" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyMemoryCheck.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.make b/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.make new file mode 100644 index 0000000..3aa41e7 --- /dev/null +++ b/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyMemoryCheck. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.ts b/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.ts new file mode 100644 index 0000000..38e1ae0 --- /dev/null +++ b/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyMemoryCheck. diff --git a/build/CMakeFiles/NightlyMemoryCheck.dir/progress.make b/build/CMakeFiles/NightlyMemoryCheck.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/NightlyMemoryCheck.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/NightlyStart.dir/DependInfo.cmake b/build/CMakeFiles/NightlyStart.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/NightlyStart.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/NightlyStart.dir/build.make b/build/CMakeFiles/NightlyStart.dir/build.make new file mode 100644 index 0000000..2449e33 --- /dev/null +++ b/build/CMakeFiles/NightlyStart.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for NightlyStart. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyStart.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyStart.dir/progress.make + +CMakeFiles/NightlyStart: + "C:\Program Files\CMake\bin\ctest.exe" -D NightlyStart + +NightlyStart: CMakeFiles/NightlyStart +NightlyStart: CMakeFiles/NightlyStart.dir/build.make +.PHONY : NightlyStart + +# Rule to build all files generated by this target. +CMakeFiles/NightlyStart.dir/build: NightlyStart +.PHONY : CMakeFiles/NightlyStart.dir/build + +CMakeFiles/NightlyStart.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\NightlyStart.dir\cmake_clean.cmake +.PHONY : CMakeFiles/NightlyStart.dir/clean + +CMakeFiles/NightlyStart.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\NightlyStart.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/NightlyStart.dir/depend + diff --git a/build/CMakeFiles/NightlyStart.dir/cmake_clean.cmake b/build/CMakeFiles/NightlyStart.dir/cmake_clean.cmake new file mode 100644 index 0000000..6a2c6c6 --- /dev/null +++ b/build/CMakeFiles/NightlyStart.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyStart" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyStart.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/NightlyStart.dir/compiler_depend.make b/build/CMakeFiles/NightlyStart.dir/compiler_depend.make new file mode 100644 index 0000000..b72de2d --- /dev/null +++ b/build/CMakeFiles/NightlyStart.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyStart. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/NightlyStart.dir/compiler_depend.ts b/build/CMakeFiles/NightlyStart.dir/compiler_depend.ts new file mode 100644 index 0000000..2f7f077 --- /dev/null +++ b/build/CMakeFiles/NightlyStart.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyStart. diff --git a/build/CMakeFiles/NightlyStart.dir/progress.make b/build/CMakeFiles/NightlyStart.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/NightlyStart.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/NightlySubmit.dir/DependInfo.cmake b/build/CMakeFiles/NightlySubmit.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/NightlySubmit.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/NightlySubmit.dir/build.make b/build/CMakeFiles/NightlySubmit.dir/build.make new file mode 100644 index 0000000..458a49b --- /dev/null +++ b/build/CMakeFiles/NightlySubmit.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for NightlySubmit. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlySubmit.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlySubmit.dir/progress.make + +CMakeFiles/NightlySubmit: + "C:\Program Files\CMake\bin\ctest.exe" -D NightlySubmit + +NightlySubmit: CMakeFiles/NightlySubmit +NightlySubmit: CMakeFiles/NightlySubmit.dir/build.make +.PHONY : NightlySubmit + +# Rule to build all files generated by this target. +CMakeFiles/NightlySubmit.dir/build: NightlySubmit +.PHONY : CMakeFiles/NightlySubmit.dir/build + +CMakeFiles/NightlySubmit.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\NightlySubmit.dir\cmake_clean.cmake +.PHONY : CMakeFiles/NightlySubmit.dir/clean + +CMakeFiles/NightlySubmit.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\NightlySubmit.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/NightlySubmit.dir/depend + diff --git a/build/CMakeFiles/NightlySubmit.dir/cmake_clean.cmake b/build/CMakeFiles/NightlySubmit.dir/cmake_clean.cmake new file mode 100644 index 0000000..6f88ccc --- /dev/null +++ b/build/CMakeFiles/NightlySubmit.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlySubmit" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlySubmit.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/NightlySubmit.dir/compiler_depend.make b/build/CMakeFiles/NightlySubmit.dir/compiler_depend.make new file mode 100644 index 0000000..d2f6748 --- /dev/null +++ b/build/CMakeFiles/NightlySubmit.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlySubmit. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/NightlySubmit.dir/compiler_depend.ts b/build/CMakeFiles/NightlySubmit.dir/compiler_depend.ts new file mode 100644 index 0000000..773bf4b --- /dev/null +++ b/build/CMakeFiles/NightlySubmit.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlySubmit. diff --git a/build/CMakeFiles/NightlySubmit.dir/progress.make b/build/CMakeFiles/NightlySubmit.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/NightlySubmit.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/NightlyTest.dir/DependInfo.cmake b/build/CMakeFiles/NightlyTest.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/NightlyTest.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/NightlyTest.dir/build.make b/build/CMakeFiles/NightlyTest.dir/build.make new file mode 100644 index 0000000..8c21d58 --- /dev/null +++ b/build/CMakeFiles/NightlyTest.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for NightlyTest. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyTest.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyTest.dir/progress.make + +CMakeFiles/NightlyTest: + "C:\Program Files\CMake\bin\ctest.exe" -D NightlyTest + +NightlyTest: CMakeFiles/NightlyTest +NightlyTest: CMakeFiles/NightlyTest.dir/build.make +.PHONY : NightlyTest + +# Rule to build all files generated by this target. +CMakeFiles/NightlyTest.dir/build: NightlyTest +.PHONY : CMakeFiles/NightlyTest.dir/build + +CMakeFiles/NightlyTest.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\NightlyTest.dir\cmake_clean.cmake +.PHONY : CMakeFiles/NightlyTest.dir/clean + +CMakeFiles/NightlyTest.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\NightlyTest.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/NightlyTest.dir/depend + diff --git a/build/CMakeFiles/NightlyTest.dir/cmake_clean.cmake b/build/CMakeFiles/NightlyTest.dir/cmake_clean.cmake new file mode 100644 index 0000000..8f40bb8 --- /dev/null +++ b/build/CMakeFiles/NightlyTest.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyTest" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyTest.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/NightlyTest.dir/compiler_depend.make b/build/CMakeFiles/NightlyTest.dir/compiler_depend.make new file mode 100644 index 0000000..03d9c29 --- /dev/null +++ b/build/CMakeFiles/NightlyTest.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyTest. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/NightlyTest.dir/compiler_depend.ts b/build/CMakeFiles/NightlyTest.dir/compiler_depend.ts new file mode 100644 index 0000000..8bb891c --- /dev/null +++ b/build/CMakeFiles/NightlyTest.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyTest. diff --git a/build/CMakeFiles/NightlyTest.dir/progress.make b/build/CMakeFiles/NightlyTest.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/NightlyTest.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/NightlyUpdate.dir/DependInfo.cmake b/build/CMakeFiles/NightlyUpdate.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/NightlyUpdate.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/NightlyUpdate.dir/build.make b/build/CMakeFiles/NightlyUpdate.dir/build.make new file mode 100644 index 0000000..fc412ac --- /dev/null +++ b/build/CMakeFiles/NightlyUpdate.dir/build.make @@ -0,0 +1,86 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +# Utility rule file for NightlyUpdate. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyUpdate.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyUpdate.dir/progress.make + +CMakeFiles/NightlyUpdate: + "C:\Program Files\CMake\bin\ctest.exe" -D NightlyUpdate + +NightlyUpdate: CMakeFiles/NightlyUpdate +NightlyUpdate: CMakeFiles/NightlyUpdate.dir/build.make +.PHONY : NightlyUpdate + +# Rule to build all files generated by this target. +CMakeFiles/NightlyUpdate.dir/build: NightlyUpdate +.PHONY : CMakeFiles/NightlyUpdate.dir/build + +CMakeFiles/NightlyUpdate.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles\NightlyUpdate.dir\cmake_clean.cmake +.PHONY : CMakeFiles/NightlyUpdate.dir/clean + +CMakeFiles/NightlyUpdate.dir/depend: + $(CMAKE_COMMAND) -E cmake_depends "MinGW Makefiles" C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles\NightlyUpdate.dir\DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/NightlyUpdate.dir/depend + diff --git a/build/CMakeFiles/NightlyUpdate.dir/cmake_clean.cmake b/build/CMakeFiles/NightlyUpdate.dir/cmake_clean.cmake new file mode 100644 index 0000000..0f10e82 --- /dev/null +++ b/build/CMakeFiles/NightlyUpdate.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyUpdate" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyUpdate.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.make b/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.make new file mode 100644 index 0000000..924c826 --- /dev/null +++ b/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyUpdate. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.ts b/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.ts new file mode 100644 index 0000000..7cf66de --- /dev/null +++ b/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyUpdate. diff --git a/build/CMakeFiles/NightlyUpdate.dir/progress.make b/build/CMakeFiles/NightlyUpdate.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/NightlyUpdate.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/CMakeFiles/TargetDirectories.txt b/build/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..b95b05e --- /dev/null +++ b/build/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,34 @@ +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/Experimental.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/Nightly.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/Continuous.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/NightlyMemoryCheck.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/NightlyStart.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/NightlyUpdate.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/NightlyConfigure.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/NightlyBuild.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/NightlyTest.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/NightlyCoverage.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/NightlyMemCheck.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/NightlySubmit.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ExperimentalStart.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ExperimentalUpdate.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ExperimentalConfigure.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ExperimentalBuild.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ExperimentalTest.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ExperimentalCoverage.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ExperimentalMemCheck.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ExperimentalSubmit.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ContinuousStart.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ContinuousUpdate.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ContinuousConfigure.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ContinuousBuild.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ContinuousTest.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ContinuousCoverage.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ContinuousMemCheck.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/ContinuousSubmit.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/GraphicsTest.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/package.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/package_source.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/test.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/edit_cache.dir +C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CMakeFiles/rebuild_cache.dir diff --git a/build/CMakeFiles/cmake.check_cache b/build/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/build/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/build/CMakeFiles/progress.marks b/build/CMakeFiles/progress.marks new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/build/CMakeFiles/progress.marks @@ -0,0 +1 @@ +5 diff --git a/build/CPackConfig.cmake b/build/CPackConfig.cmake new file mode 100644 index 0000000..9382301 --- /dev/null +++ b/build/CPackConfig.cmake @@ -0,0 +1,76 @@ +# This file will be configured to contain variables for CPack. These variables +# should be set in the CMake list file of the project before CPack module is +# included. The list of available CPACK_xxx variables and their associated +# documentation may be obtained using +# cpack --help-variable-list +# +# Some variables are common to all generators (e.g. CPACK_PACKAGE_NAME) +# and some are specific to a generator +# (e.g. CPACK_NSIS_EXTRA_INSTALL_COMMANDS). The generator specific variables +# usually begin with CPACK__xxxx. + + +set(CPACK_BINARY_7Z "OFF") +set(CPACK_BINARY_IFW "OFF") +set(CPACK_BINARY_INNOSETUP "OFF") +set(CPACK_BINARY_NSIS "ON") +set(CPACK_BINARY_NUGET "OFF") +set(CPACK_BINARY_WIX "OFF") +set(CPACK_BINARY_ZIP "OFF") +set(CPACK_BUILD_SOURCE_DIRS "C:/Users/naifa/Documents/Projects/C++/GraphicsTest;C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build") +set(CPACK_CMAKE_GENERATOR "MinGW Makefiles") +set(CPACK_COMPONENTS_ALL "") +set(CPACK_COMPONENT_UNSPECIFIED_HIDDEN "TRUE") +set(CPACK_COMPONENT_UNSPECIFIED_REQUIRED "TRUE") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_FILE "C:/Program Files/CMake/share/cmake-3.28/Templates/CPack.GenericDescription.txt") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_SUMMARY "GraphicsTest built using CMake") +set(CPACK_GENERATOR "NSIS") +set(CPACK_INNOSETUP_ARCHITECTURE "x64") +set(CPACK_INSTALL_CMAKE_PROJECTS "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build;GraphicsTest;ALL;/") +set(CPACK_INSTALL_PREFIX "C:/Program Files (x86)/GraphicsTest") +set(CPACK_MODULE_PATH "") +set(CPACK_NSIS_DISPLAY_NAME "GraphicsTest 0.1.0") +set(CPACK_NSIS_INSTALLER_ICON_CODE "") +set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "") +set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") +set(CPACK_NSIS_PACKAGE_NAME "GraphicsTest 0.1.0") +set(CPACK_NSIS_UNINSTALL_NAME "Uninstall") +set(CPACK_OBJCOPY_EXECUTABLE "C:/msys64/ucrt64/bin/objcopy.exe") +set(CPACK_OBJDUMP_EXECUTABLE "C:/msys64/ucrt64/bin/objdump.exe") +set(CPACK_OUTPUT_CONFIG_FILE "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CPackConfig.cmake") +set(CPACK_PACKAGE_DEFAULT_LOCATION "/") +set(CPACK_PACKAGE_DESCRIPTION_FILE "C:/Program Files/CMake/share/cmake-3.28/Templates/CPack.GenericDescription.txt") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GraphicsTest built using CMake") +set(CPACK_PACKAGE_FILE_NAME "GraphicsTest-0.1.0-win64") +set(CPACK_PACKAGE_INSTALL_DIRECTORY "GraphicsTest 0.1.0") +set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "GraphicsTest 0.1.0") +set(CPACK_PACKAGE_NAME "GraphicsTest") +set(CPACK_PACKAGE_RELOCATABLE "true") +set(CPACK_PACKAGE_VENDOR "Humanity") +set(CPACK_PACKAGE_VERSION "0.1.0") +set(CPACK_PACKAGE_VERSION_MAJOR "0") +set(CPACK_PACKAGE_VERSION_MINOR "1") +set(CPACK_PACKAGE_VERSION_PATCH "0") +set(CPACK_PROJECT_NAME "GraphicsTest") +set(CPACK_PROJECT_VERSION "0.1.0") +set(CPACK_READELF_EXECUTABLE "C:/msys64/ucrt64/bin/readelf.exe") +set(CPACK_RESOURCE_FILE_LICENSE "C:/Program Files/CMake/share/cmake-3.28/Templates/CPack.GenericLicense.txt") +set(CPACK_RESOURCE_FILE_README "C:/Program Files/CMake/share/cmake-3.28/Templates/CPack.GenericDescription.txt") +set(CPACK_RESOURCE_FILE_WELCOME "C:/Program Files/CMake/share/cmake-3.28/Templates/CPack.GenericWelcome.txt") +set(CPACK_SET_DESTDIR "OFF") +set(CPACK_SOURCE_7Z "ON") +set(CPACK_SOURCE_GENERATOR "7Z;ZIP") +set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CPackSourceConfig.cmake") +set(CPACK_SOURCE_ZIP "ON") +set(CPACK_SYSTEM_NAME "win64") +set(CPACK_THREADS "1") +set(CPACK_TOPLEVEL_TAG "win64") +set(CPACK_WIX_SIZEOF_VOID_P "8") + +if(NOT CPACK_PROPERTIES_FILE) + set(CPACK_PROPERTIES_FILE "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CPackProperties.cmake") +endif() + +if(EXISTS ${CPACK_PROPERTIES_FILE}) + include(${CPACK_PROPERTIES_FILE}) +endif() diff --git a/build/CPackSourceConfig.cmake b/build/CPackSourceConfig.cmake new file mode 100644 index 0000000..e130c42 --- /dev/null +++ b/build/CPackSourceConfig.cmake @@ -0,0 +1,84 @@ +# This file will be configured to contain variables for CPack. These variables +# should be set in the CMake list file of the project before CPack module is +# included. The list of available CPACK_xxx variables and their associated +# documentation may be obtained using +# cpack --help-variable-list +# +# Some variables are common to all generators (e.g. CPACK_PACKAGE_NAME) +# and some are specific to a generator +# (e.g. CPACK_NSIS_EXTRA_INSTALL_COMMANDS). The generator specific variables +# usually begin with CPACK__xxxx. + + +set(CPACK_BINARY_7Z "OFF") +set(CPACK_BINARY_IFW "OFF") +set(CPACK_BINARY_INNOSETUP "OFF") +set(CPACK_BINARY_NSIS "ON") +set(CPACK_BINARY_NUGET "OFF") +set(CPACK_BINARY_WIX "OFF") +set(CPACK_BINARY_ZIP "OFF") +set(CPACK_BUILD_SOURCE_DIRS "C:/Users/naifa/Documents/Projects/C++/GraphicsTest;C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build") +set(CPACK_CMAKE_GENERATOR "MinGW Makefiles") +set(CPACK_COMPONENTS_ALL "") +set(CPACK_COMPONENT_UNSPECIFIED_HIDDEN "TRUE") +set(CPACK_COMPONENT_UNSPECIFIED_REQUIRED "TRUE") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_FILE "C:/Program Files/CMake/share/cmake-3.28/Templates/CPack.GenericDescription.txt") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_SUMMARY "GraphicsTest built using CMake") +set(CPACK_GENERATOR "7Z;ZIP") +set(CPACK_IGNORE_FILES "/CVS/;/\\.svn/;/\\.bzr/;/\\.hg/;/\\.git/;\\.swp\$;\\.#;/#") +set(CPACK_INNOSETUP_ARCHITECTURE "x64") +set(CPACK_INSTALLED_DIRECTORIES "C:/Users/naifa/Documents/Projects/C++/GraphicsTest;/") +set(CPACK_INSTALL_CMAKE_PROJECTS "") +set(CPACK_INSTALL_PREFIX "C:/Program Files (x86)/GraphicsTest") +set(CPACK_MODULE_PATH "") +set(CPACK_NSIS_DISPLAY_NAME "GraphicsTest 0.1.0") +set(CPACK_NSIS_INSTALLER_ICON_CODE "") +set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "") +set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") +set(CPACK_NSIS_PACKAGE_NAME "GraphicsTest 0.1.0") +set(CPACK_NSIS_UNINSTALL_NAME "Uninstall") +set(CPACK_OBJCOPY_EXECUTABLE "C:/msys64/ucrt64/bin/objcopy.exe") +set(CPACK_OBJDUMP_EXECUTABLE "C:/msys64/ucrt64/bin/objdump.exe") +set(CPACK_OUTPUT_CONFIG_FILE "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CPackConfig.cmake") +set(CPACK_PACKAGE_DEFAULT_LOCATION "/") +set(CPACK_PACKAGE_DESCRIPTION_FILE "C:/Program Files/CMake/share/cmake-3.28/Templates/CPack.GenericDescription.txt") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GraphicsTest built using CMake") +set(CPACK_PACKAGE_FILE_NAME "GraphicsTest-0.1.0-Source") +set(CPACK_PACKAGE_INSTALL_DIRECTORY "GraphicsTest 0.1.0") +set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "GraphicsTest 0.1.0") +set(CPACK_PACKAGE_NAME "GraphicsTest") +set(CPACK_PACKAGE_RELOCATABLE "true") +set(CPACK_PACKAGE_VENDOR "Humanity") +set(CPACK_PACKAGE_VERSION "0.1.0") +set(CPACK_PACKAGE_VERSION_MAJOR "0") +set(CPACK_PACKAGE_VERSION_MINOR "1") +set(CPACK_PACKAGE_VERSION_PATCH "0") +set(CPACK_PROJECT_NAME "GraphicsTest") +set(CPACK_PROJECT_VERSION "0.1.0") +set(CPACK_READELF_EXECUTABLE "C:/msys64/ucrt64/bin/readelf.exe") +set(CPACK_RESOURCE_FILE_LICENSE "C:/Program Files/CMake/share/cmake-3.28/Templates/CPack.GenericLicense.txt") +set(CPACK_RESOURCE_FILE_README "C:/Program Files/CMake/share/cmake-3.28/Templates/CPack.GenericDescription.txt") +set(CPACK_RESOURCE_FILE_WELCOME "C:/Program Files/CMake/share/cmake-3.28/Templates/CPack.GenericWelcome.txt") +set(CPACK_RPM_PACKAGE_SOURCES "ON") +set(CPACK_SET_DESTDIR "OFF") +set(CPACK_SOURCE_7Z "ON") +set(CPACK_SOURCE_GENERATOR "7Z;ZIP") +set(CPACK_SOURCE_IGNORE_FILES "/CVS/;/\\.svn/;/\\.bzr/;/\\.hg/;/\\.git/;\\.swp\$;\\.#;/#") +set(CPACK_SOURCE_INSTALLED_DIRECTORIES "C:/Users/naifa/Documents/Projects/C++/GraphicsTest;/") +set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CPackSourceConfig.cmake") +set(CPACK_SOURCE_PACKAGE_FILE_NAME "GraphicsTest-0.1.0-Source") +set(CPACK_SOURCE_TOPLEVEL_TAG "win64-Source") +set(CPACK_SOURCE_ZIP "ON") +set(CPACK_STRIP_FILES "") +set(CPACK_SYSTEM_NAME "win64") +set(CPACK_THREADS "1") +set(CPACK_TOPLEVEL_TAG "win64-Source") +set(CPACK_WIX_SIZEOF_VOID_P "8") + +if(NOT CPACK_PROPERTIES_FILE) + set(CPACK_PROPERTIES_FILE "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CPackProperties.cmake") +endif() + +if(EXISTS ${CPACK_PROPERTIES_FILE}) + include(${CPACK_PROPERTIES_FILE}) +endif() diff --git a/build/CTestTestfile.cmake b/build/CTestTestfile.cmake new file mode 100644 index 0000000..93c5afd --- /dev/null +++ b/build/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: C:/Users/naifa/Documents/Projects/C++/GraphicsTest +# Build directory: C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/build/DartConfiguration.tcl b/build/DartConfiguration.tcl new file mode 100644 index 0000000..3f621b2 --- /dev/null +++ b/build/DartConfiguration.tcl @@ -0,0 +1,106 @@ +# This file is configured by CMake automatically as DartConfiguration.tcl +# If you choose not to use CMake, this file may be hand configured, by +# filling in the required variables. + + +# Configuration directories and files +SourceDirectory: C:/Users/naifa/Documents/Projects/C++/GraphicsTest +BuildDirectory: C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build + +# Where to place the cost data store +CostDataFile: + +# Site is something like machine.domain, i.e. pragmatic.crd +Site: NaifLenovo + +# Build name is osname-revision-compiler, i.e. Linux-2.4.2-2smp-c++ +BuildName: Win32-mingw32-make + +# Subprojects +LabelsForSubprojects: + +# Submission information +SubmitURL: http:// +SubmitInactivityTimeout: + +# Dashboard start time +NightlyStartTime: 00:00:00 EDT + +# Commands for the build/test/submit cycle +ConfigureCommand: "C:/Program Files/CMake/bin/cmake.exe" "C:/Users/naifa/Documents/Projects/C++/GraphicsTest" +MakeCommand: C:/Program\ Files/CMake/bin/cmake.exe --build . --config "${CTEST_CONFIGURATION_TYPE}" +DefaultCTestConfigurationType: Release + +# version control +UpdateVersionOnly: + +# CVS options +# Default is "-d -P -A" +CVSCommand: +CVSUpdateOptions: + +# Subversion options +SVNCommand: +SVNOptions: +SVNUpdateOptions: + +# Git options +GITCommand: +GITInitSubmodules: +GITUpdateOptions: +GITUpdateCustom: + +# Perforce options +P4Command: +P4Client: +P4Options: +P4UpdateOptions: +P4UpdateCustom: + +# Generic update command +UpdateCommand: +UpdateOptions: +UpdateType: + +# Compiler info +Compiler: C:/msys64/ucrt64/bin/g++.exe +CompilerVersion: 13.2.0 + +# Dynamic analysis (MemCheck) +PurifyCommand: +ValgrindCommand: +ValgrindCommandOptions: +DrMemoryCommand: +DrMemoryCommandOptions: +CudaSanitizerCommand: +CudaSanitizerCommandOptions: +MemoryCheckType: +MemoryCheckSanitizerOptions: +MemoryCheckCommand: MEMORYCHECK_COMMAND-NOTFOUND +MemoryCheckCommandOptions: +MemoryCheckSuppressionFile: + +# Coverage +CoverageCommand: C:/msys64/ucrt64/bin/gcov.exe +CoverageExtraFlags: -l + +# Testing options +# TimeOut is the amount of time in seconds to wait for processes +# to complete during testing. After TimeOut seconds, the +# process will be summarily terminated. +# Currently set to 25 minutes +TimeOut: 1500 + +# During parallel testing CTest will not start a new test if doing +# so would cause the system load to exceed this value. +TestLoad: + +UseLaunchers: +CurlOptions: +# warning, if you add new options here that have to do with submit, +# you have to update cmCTestSubmitCommand.cxx + +# For CTest submissions that timeout, these options +# specify behavior for retrying the submission +CTestSubmitRetryDelay: 5 +CTestSubmitRetryCount: 3 diff --git a/build/GraphicsTest.exe b/build/GraphicsTest.exe new file mode 100644 index 0000000000000000000000000000000000000000..ae00bab791c2167aa923f1faaba31b32adc489a5 GIT binary patch literal 1081315 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 z zb^(-OZshX2k2J?-{b#N1P+lpZiTu?(oWZV3L}E0YoM^Cpdd5$&D5#~A6JhRPn+X;qG^W0>f&F1;2dERZFi_LR^ zdCoS^i_G&3^PFIwW6g7fc@8ztZ1da(+d}?7Fwafq*=(MVn&;i-x!61xnCEQsyvRJy zFwY6*Io3Q!nCDRQ%r?($sG&mNJU5wVvw1#ho_Cw)V)I;Jp0myKBJ(`MJSUjvSo0iV zo+dLPW=K}MbZJrmI=NaZX!92&B=Lqv0YM$BVxy{xS z^W0>f&F1;2dERZFi_LR^4L?TtUu>QW%yYJRUSytUnCArZ9BZB<%yX!DW}D}>5+fIR zruDtq)PvsY&s(Pcyzygl=?b%4MlM|PRW-w{|O}q zUynf(k)3;f+lLqJ=nU-RI}F!vkbZfhG%Mb8O7ys9tW9XFX-_?*;n<(KZ$BTpZ~fN@ zT#J7fGXy5>jtn-drkE-DQSnOjs<9vD(yG&Ne%Kd|s+ zu<1bH`43)%qL`MmK(=iJ_K6@I4DMBbABVQbbsEJXne2CUCI0vDZC(KZylv{@(sDvwTG!<3jNl zLy7XD$&wZJ$|qOgNbac>@Kw&>ncT(6VaQ(Dian82JrFlB_->#+87|b>hzU92qGFXp zst}*?wH~i}bgjJzwNA}+bDRdk(Cqqpi;y6D*%_(d_44B#v>s6ey29>R#TOgDegrf9cBhVO=phH|x(3!vc zQAkZ}^8n+N7nLWfc0@n;E}WaFYK(sHY|YT9|K~^oF4k7zq9)WRYzV@lkqTgNCKZh< zTTzOHD{}Bt9w=`N_1i0-6ym?gJvqK56rY&ang8ICtc^8KcIN-<2(mhO4MrjH=H$iL zo*?@BRolKSO2_}!Uj4u@4xAf210WSnc|k$)ctBCuiNQx8EO{tC>!*7wfUmmjtg>#+;6rjDak(?H4%mXRk8p=_;*wnOUN)udyt4DlE;!HFr56ABfIzwUk|o@SjtQTf z2>w48Ku{>!+MZkt0aiE%f5*z=?3FVu+t=bh1Znse8nu@Cg#M|2KLl08lc7=AQ_(Tt z`g#WjtYhcEZ+R7)(+|Rpp)c=qPRQZw`Fx$23p){rEyg?Q{-BDIR3LgLWKiK8c|C}g zJ&X6w)Fo=qqTl2O>fQv&=r?(RSQXL)o;tergGPi*hib)NqH5Lt0|vP>H0t?^tbfEd zVKZ#)557oe=iE#1(%Fgo8m5He-y|=@W|Hagqg|RCfy3zscAV>SDze%GPrgv$nd;!X7 z;SLsV1Yo|{rhuL|cS26QdFP3_f!KDIDe~R+9!oRuq{&Tb9daXUL6I8>z|Bp7nED{yK^nt@QS(qYLQvUnI^QUZu7$R*DK0;DAyP@qFNDX@L7&c>HT^m06 zY37WjR59>9m(Sr9B|ijy`#GuNMvcz-j1QGOAGjHJsY8jsNxuIb4rMsHZ7x33D$Iy= zhzKF(A_AI14AdQsueNghDBmVLd`Idrv5PL;yM+7H!ihHJf@f&c7}Oc(svPH7GFHzaDL~s3n-9wCAxCSN^hOF@1P-kme{^R|i6R5in zIIf;H9;mQ_F2%bGFGvuGQ#TA&NnVNMZD~r9&k}}>cHu;bzu-*zxp_!c^A1pnu+G2Wys{~w&XGQ#P_tg>_`ln|pD+GODEvjiT;6; zRkAtcl;zc=Lg-xXjcaA{l6wh{V5bOaJ($6he+clT-py#p$j^B&ue* z<8Qzl4^wywMOlY;7G;6$m!a~YoRU-E#AIQ84nq+kOpCu75B|0ICz`j;{C7vA&d-F( zBrk_w(Zg8sY1pRJ?_Bj8678W9p@{Ivx;XXA261eL-zlmVuadqupdqNI6tZod#Z;xEkJnVqhRl65s7qH}HZFBJbr@{!%7isoK(9fmWnos*4b zWqR!~;O*?tv`a3t2t$Q?Hq7aGa>L)6*fCg$t%E1|LG{X35f~dAP4=7xoe73 zgN0u-HldR5!UvSCV1*0Cx3Q;pDo8>1J_wkFU{}U8DXem`6rVVh=Hu+Re%+A zBFmJQw4A1wDN~=91)eG$78(4QPKqY zV5C>FarT2=`JioBe>Ui^pI$poi>WFtitxbrI@8}WGWk64RH(lOs(wP5<4oTO1_i;% z)2fcE$ZD=VCbOKU*ZzhwZ4W#(fdxB(1)Hq}JKC}yN=({-f)zP^ReC^Scp$6g>JW#S zDAEuXOe9gHo*IVs3G>sWzsco4MEx;pHZT<5p!Ht0EEFi;z@W5zApiC7wEuMZL-de( zs6Wb~YS_t%NqNk~`tX}&i89d*$iF#5{u7{|jVk{Mkbl$cL7`|f^z#MLPiI2W*BhFW z``G$W;p|lcelW~{K#!$HR8BkLxXP@}RwH()p!nS}q}7YIGVD-+0-~b4C#-?Vs{WS0 zP2u%H=|$w<^3k)R+KbiFaripF4l}5IgQCEEao=6pnes5U`+gafq52< zbr%@+hh%g;J#c+vptwEWT>Alx*8D)-zaYK)(YVhK=hmY0G=Kgz$HGJ}T8QAlAxGv^ zXZwER4-`Ki-VOJGhKr8dQjY)MZkbYa94-RIy9}AZ%w*NK+HVC_X>#JOa;5Vo+`Wfh zZ2p~-Fb?tU3#8!i4Qcq$<-(9Ic?JwE@OQz(dq?LWO|0?SyOIMG7x7F&n50%@s0QaC z1VlCwuiR6W^Z_H&AAy)OTA1!~xxLh1Ab10@G6+E8c|V|JAzgm1yeDGt+C`S8JjP8A z1+H%j;S#o{WFbyLDXVRzM9T)Q3*6c?(&uZRUk2-5p4(Itz+H{&#xq2BWr5!M>48I< ze$$^3;Tp0p9nive%ZmzehatbvGsRc&mi1e{e|O8fQ_xw((6tb?nB+_kbpF7Nfm@q} z7HH(VN&J<8ZwBiA4LBsu)pX%YA(nwQM{)Fj#K^ zu<@iAsJk2i<9&X-#v1U7vF@S{0Iq^+pm$sRe6krG30VB18OcTH)5P8m#HRudMb+6R zbxzv>j0Ed8lSvR0b_EZx<8(w7X2=)*RwLhHNSgA+CTLP0KLhmI_G6{r2X=T$(F~Rc+%(BfB*FVS zQ(x8vZhRS84aDe@Lc;Q*8TcK1y0Clby4kyc5C1Rl6^K41TusWa#20!;MOEU*3B~_~ z@v({s)oI+@bBjuoZw>JI-ku2v8yPMd_fCb09B(2~p~ivM+@f)Gl3WAE(~1+9;r3g} z)4Om>@l^tHdf=?_OHM-;OaCAC-ULprTJ>8vNq#2Wk6%vDmaWD@8VR^wXEMLMSU_Lg7Rd#sTSs>0r zun7<)fxPj{gD5M0!HM4goKscz*6rIpn>I@t{aWW%-MY1$I(6!tQ>Uspu=$%$lPVs< z(}$VPwss#uBKqh-4o_YE0K$Y1R37F}5#=J4|9(?>lJoE~T=^rXQfBMgXdZshV zlJQIgj;xn{7Og<1Keq8FUx4B_-b41LppCzQ8HiHNBNe*tUg`%*P1W6j)=)S8%mmta z8yB#PUS9o9MBH^HI`El|ZyP{75OMWSQKFAWl9S))q4#lD-Ga zef`>m92sKx^wCeCN|*0NEudPCJn}RwZg49RZi^XH_%*QdMBmYmZ~WzBeH#ZKx#!cE zI3F2!!Q+E3cy#02s!XMuPq5Le?=8;=11H}$y0YLO0FV9ys{WywjZ-gt9*TME=Qa@K zd_X??@>~BCww2#RszJ!Q5PTrDT?Y8&kA3mzlg!6%{rGz})Gx#3$6xu_QiDtRk(tqr zKl)|Jb82FjxtwPAjm{uyb@T&$FZcje@wHr+cO2`x;*pK_ko^XA+;~qnm%Q!qjX%Cc z>OgbV2@t}^Q1X{$k@xiavm$AE;kJ)F48RAeH_m`ZZk`N2iq`4+@}#eMdSMFKjU|=`n1iPX;Sz&jtpxq zhjDrWxFjSuK;VSapFqLL^&3_x+SWp}U9_b@XE|cmx!84+eZ}Z@L4HfQNM7CV#@8mR`#GykKgTWP>BC*R75QnxyMuEIA?VYudg|n7j=z@#l={_A zeeua-kb}RjA{t-+r>CC6H1YVzV|`?Na6Y}`14#d`zxCWR;mEfyuiy9-1o~w} z*nfN)d7gM`>7O4V3ER%@y$&Y!`epz0qEAE^wL zc}~#F-QfLg=;h&Ii(VG7wWl?`q$7EC{}{eD^fJ#`+4OQf@@q#g-`3>uA{(V~)bnjS z3FEhymQ^?Nwlx?_J~X0lZGJyU!CCqQjD;Xlr7lr_^sPX0m@^;;X5tGxB8 zlS?pwI7|PDeD8CPK7Z+(Q~({I_q?V5MRldeOUJR~`GUUtuDW*V*AQpSYh=*yk!;1C+poYxUWPiJU=o05h zFSrExGCZ9{x{!sAzd!n6p`9|O@;-Jx_>BRUgO=to9lW1b2ba?L?g8Xy_jk}gykui{ z(Jo}iT@)%0-;=+~;NT_B$xTadr`jI9e0CcOxJ#b1^gJWaH{ux?z+J@H)71Bu%l8wK z?v?b-PI>-LdVYmGpWLdx4@l(Xb>GAy$^&pGcpK7SmGQbqIUI$-``zmOsf9uQlUSA@ zJKWiYL4Cd#%LP=Qa}`crt?<*V z*eN);X=Y>T*wSNIUVvfmg`z*{3e(Sy!E4@(vjTsZ*az+t z7@|tiK9HTmTs^Rlw|}SXQMd+vC664xj9wECapGwNeVqTpC=rhKj8ZNSUeBoDIFR<@ zz0`BJgCz|jYSSP^anmV4uXfRar2GnI?HBL50=o@$*97^|k~{K5{mH$3;mV~S4_fhC zgj1Z;IjCE43AcxQ&mVsYwE~}Ps9%NuFR7zz1~+~2CES*`9=i;Fdekbq(%v*HmL7C_ zbXBcZP#|aphd5u|++A0N+q7Q%=qeJW+9S8yH|q>c{yHLP zf^MM@k$&G?{b>G#9i6&O_Bu(>1YKaX9~eJP^!l4H3aL@|85wo|(y!@tlAnlPui2#N z_0oC===IXOiE3@yeHoPtioMKG@fC)Ov94zGHlm2VB!Gxl8HNzya~wF@G`Jb35u8xW z>l)N<=etCfIwYHgVrhwY?9~_u*)VqnE-b?g|85lr(}J^Ue8>9NkMe!jHUa z!B+-PAnKVGxtD3|w#(h{uYe!lKlrr~b+6NTZyH1aO}tx8#n(0UcirllV^x?QSy-5q;0I_~t(TpNqZiMWlNE z=&_^szyKJ2@w4UynFK+~Ad`3Sb(*Nu7hse?rk6jui{NeiEs`u@gVoodwW)Eii5w{r zYo^k>alaEjOHghm@=l3FKDYigj8y34KcuQ4&4VV*j{`X-@H8-tmQXH1*4Ku!M$3Va zN0v4QS)brCG4u0_Zy-NZgvz{!nukIuK~Uh;RG`jgA+EsRmn@_$I^TB%`AUI0i+h3> zs=(Xq0)HJ_^8Q3;^ZamuI*Z-m0#RpfNN13*6sWU!Y4E}>P-mB>0(CY&53{^MsZQ}R zq%gguBmYbyV|z=dc@pcy26?ZJ%lc3_Yh7h8$XeQ>Yc~?SuzO1vI7^=B^%@@*PhI?bynYaO^h$T}DdSAL<;h%lRJ0Kho5{N5hM;1 zS)$zl7<+Fex#Ux6py12I}Y;lTAfs z^U`QGS;|HuHhHyFm{K+ z<2UFVg)v>nk7I3`F(x0}_l|d>j4<9bPTq@zhK{bXYpT;UsA$65Jr5!mRZ~}L`k?vv z0Oh31e-u<3gSssyr(;1*pF%m@m%6;GDJQ%~p^q#r*g5Iw&r66+1(U}q{eACPBA_TxjYHIh>pI4j zqTxy6z@O;oL7l~=BXICn-$Jb5R2w&m2mwz7d?RwG7VyIIx5zIdo)BJK(0E8R;ZLme z5M>M!KY$}zV+3j|y;g!S%1D6R1qty9Fz3Clj(}tcVf0pvVM#%(TNE$Ik{dUFObH&3 zQCT7rTE>Y$UUjuSVhl==$_(C~N?t{|Pa)?g^$RVT?n3z=!;2@>3;h9Ag9SHL{_x7m z$Ba9EjjDhfZZBz09HHB*Be=a3*krZ$@9EN@w(T|YeyBK55}kQsD;9wk^Aa!+Xa<{1 z3gLKCjL`yG$=l{Dt+1dIkvEae_pB&mMSz??^jA%L8~+Fu8pOTzPVb{wv5QzYBKnBB zcIJzhkIdy=RYuhmwpk(kGGz{f-H7b(JM>G3DYOYbLnNc z-brbmufkw~rQ{ME+rez$@|*YxgmC%0Hmt_p1C5gDaf$p3-*&8yUofUu|%6kIUr4^sBj;PY#5gl*PWFN5wzx^w;5G+_>=rIc3CyD6wXAu4(ESdlQNPd=cL>~&%;U%a?mkv?vV}r!!iG;Wol+_Hyt6W}!T&VGPSTwnp zHykF&eJMc(1N6~mjKKtJ@ZA1KmNru^_mNQY1T_Z!-Y=&ZI$8pL?l^BUDZKr`4^TQ7 z15ol`v5f)70oV}vFa*BZXER>IW%A2vGQnvK*o(rGAYu9uwSSHUt3UmuP*dU!Zwyzs z9X&n3WnTXNEfzi5bVJ|sqK?W`=LcRF*qi_3@2GifT(RCWLj)tlu{Xrw9%l{pE>tw2 zdMiCragsm&N0TJ>{VhQj)_V+S3>BTrmp@^0QOrlp7h*m`vhNtYCX6de#rcK!6Z#Qj z&kPrB9|88&$rUi-z^9td_SwV+oky1X9u1A_r?kuDOu>6^lkj_P7g%|tK<9wK&36dQcmfxu1->&U@Zr3`|-nR>UQo&6RsQ8}|nE9^)7k*aYJAY2#!|xFI!}QxbW)&AN~!2Cw^1l=JyD6-z#wB zw**%HhYJ6;z|8vuF8q$b2Yy%Jv4;d6|2=`u?+bMQKw#nz1@``tzVceL$uAD;57g1uiM*JSO359v9gAL4k80 z5}5h0ivNfT|Bb+fzZLl4M+H9qgutbb3B2MH0u!GUxc~129{H5Ok-ryMc~anmPpR-f z2)yId0+0Noz<2(Wz=!@>;NzbW`0#OoPkvUQ^Lc^pzX;s)uL7_5g22T85|~*MxbU>V z2miOg$G<4>#Qza^?B4_)`FDZu`I5jVP6&M9%K{g^BCzsRf%kq*;CsF!S?kGxpm!!Hqd;yVRyzFOe^?-E$~Zh`k+ zBk(=nBk=L>6?pvn1Ula@(0#eU#19BOq2Q9M-v5xm-X9it$F&0Qy-whfR|tIPD+NBe zS-rnr;KQ#Hczlb%D>?-xwhG+8P2jx=fe$4GKA93&Nh{bTa96j$Opm}#+XasF3aso9 z_~1@~?|iku$6q7Rxk2FO8wF-|37qRw;oSmv^$WaXK;X!rz|BJfGs6Opj0k*aRN(QO z1Uh2^H;)S(nGiU)N8r5~f$w>pz+;mFm$Cw{*eh`JK7pBA1TO3s_~5MqAAh~Tr8fwC z@-~6a8wGAYATV=>z$2c(UDE=4a{@Q#1zzI|d_uv;XC!>ZoWPNSz|5Tjj~o>EP*LC$ z^8!zl1a7Vf?0u7hRe^WZ1m0U0_)tUOlZONzKP>RXg1~F;61eL}1UhdPcwE7I|BHkZ zKPvE!y9K`Uh``6+BJi0X6S(8QZ>{G`Aq?i2XTPYHD2 zE^yaR3!HmE-~&G+@ZtX|@X4PQnE5$@SG+^uF$L#-Uc#GyLEx@;3f%vT0vCQs;5&a= z;IUs3_|Sh-@$XXczbbI)L4nS@1wNzTHNP(5k>3zl`Ava${C@%$-Xrjx?-h9Lw*;Q} z9|AYOPv9NDBk+OW6?p6+fhT@X;5EN5aMvFQTvE{aBMG~IEU@=sfp@%L;E_KO_~4%k zJoaY-pZs%y&-{hJO~(ZGJ|b}cqXKt*K*j%+g8x&!|7(Fq9uxS`;{u=fpulH7B+&hc zz|7wWT=-jo4}MhO6Hf>{@iBp$J|VF8lLGJfJAp?&CGf$&7pUd$DBN@+cz@~1lSf!M zM79*6p6n>#lJKXUs3Vbw1~%9C|0>gRC*Wjo2dTk zPsd-|B7Sp=_>M@t%FapP0ls%fbXY@}%3|Z`DCxNLbP{u1d{>Kjn0RB;_q2$o^N{26 z?`;vkqecAA7V)oc5&xPN@z`1wTOSw|V&h4Xj;sH!7V&*8;&-=*?{5)5&?0`YMf^~U zc(`E3)_RV61+TeOolJe5c%~muKevd2U7j&TV^Z zezmr(-Yuhr_@|}JT5B*!VY#Xk6mAOK$Hs#mq+wy*8Tdh8QfV12> zC&;K4woVu7wF4EudLTFFl}dimeeG-AUiZy!c3Zql_BhpPC+C%3S$Aj36`yU4RsT%~ za^?Aod&6tpr2C3jxF+H?uXVeaO*^C4K6~;W{GPxsz1jY~;yMZ60{CwA98Plp=J5C9 zM{y@(-oN~n&z@Ys@3Z*LUjOXL-^A~0_|-b?-=0@V_$`1RRnOrx@7VI}$rJcdTtdO{ z`~4lyp8S3MUXJ(EUf!)0?(*GYp;mV&lq=^E@=LSzx!Ur?Mzl;eM>x?r8}a)A{D{xq zjUNr(lSpt92~Hvbw#GUqk>Df}oJ0aWx;Jm$d}rqkRPKT4#>|Xgz23dy26uBh<#xJr zoi|YR-jKWf`s>|Sxaj-BfdkX?UhUu;f>*a+PyLNB<$+pL4xZ-t}_MO+%wYPG7z}?K}QL z1p~s*yYpW4pkL)r2PQ|UpXB*D)kO2yK(?wrijZC?7zL!^D_3s%sU-e}&{HzCR zDD&)|EGju)DVH!J@zf{@bx^!1w4d9?iu3bFmQetzb*KY+(xobKYm&Ka`@5EdnQT?~+#V>KL zc>W8Xcje{ZaoJUuzVMP4ZP<8Mu`rF%RIN5Db*G9^=~ld&rZdigQ>gI@0*NT2e}LcR&->QNNAP?5^S^b{6qO>$#)P^YRi9AI ze4|(|REoYkIx;ZHbVU!$8`YtD+ z8gL?-X87T70m$--l{t@iJtv}1wcJ9y8BH(GHl@rr)E?mP8aPsCf0T6Svp=z;3& zG&ebu9dHg;%NPNNAdM4ek&u?9W%h5BYK=;zTqP-l2#0A{rz{uCRb8fLZ`mW?=yEcn z{Zotp5RuQN4MV7*Udk1HuL@erqh^@-Ar&oh2!o|q^k=;yhulKRt%5}=>1C8vi2=Ws zs}?Hta@CnHfES|XIj(_7J-XXC?;pN#vTtCtZ=!$jN(axwy9KH^6~z^!kutPra=dTq zwdoX%jRV!9Pe}4X2tnHwW;<_nt!N@Xh%bwvL}$x>7hSFC0GOhhK-7S~Q7n|Sbj@hV zOpGI4-JivHsCdW7rmzi02*fIG2g z${pL&H{ebU?w{H_IaovS^{Q8@5z^4!S|N9!ReAAUJoXTAp`HjbhO) z)VLYUE(wYFTce&hTb$pP_v>i=HeziD4*9wC))f8_3dJlqH+YuIsi?fRu({KXso<|AWd7PJ0>K7&$_866vR z_YF>>=iKZ_-@xGHl`O>Ki{^AglYPVEgA-FGCFdKY8ylUtS-o>JlY53I`^K*fWivSl z5|KjOA(V^r6RGZHr{aJ|II~U>GI7e;>g4fMMBayIi^F~$W`SH^K2PG0Gh6HjwG4qE z@i+wLRaeg=7)^*8!#KNz)r#3-ri{2Os2=f|a&d9CTpA~~Gh58&z&^l5W{Xq)LdL6l znBy?|qTxf4h(a{15-@j44#-;$q$n^@^$zc5#TJ2nVtX3)6W7v#Y~3&A3Pl|pAQ=Gx z6+Mm#gkI4X>X}pM=R%D&zS-hnNj(fy(*LJ(5Yj|6vnHOhInKU)CV7k3xx z^B(mH_i}nVc%r6ABvng21(DPz5;+q@QrAc%w@V&*`%;DKIn6jfOsOcWKzQ9?EJAyt>7xS$CV!HV3A`jI|X z&s2zh3`J8xDw>g_o~bbX7)nhAs%S29k|m`~xt5~rLm~Pm2vQ-Tko}U13SM&Kf*=(b z3Rz#KtuoWx;U;a`Dl^S(3tn1frtLD*R+&P!=1V59P{^tf6I$@nE|Uo^cxji(gcrON z+`<6IEhNb0;DK93P)Be}5Fz>Dfoo5YQh+`6m&?_Bk}?Vc)+@@=yyARKh%yfX)>l-F zd1aNwq@Z7=xaKAlE-Ph~l?s=Y;?|h2!eynbvX}&PI-vj)3YR7QZ(fDVlHND3!evR{ z>sQ?MK_H9`?s)UcY8Q9Ad1bYWJKenEcI|^8>@P3|^&^#|o~cFpF%(U$QPG^gdZw1> z#~?LhOrix}>N&_;aHXPyyai7xI>=jaB+-l^{TLL<*iq4p8}%IIEi70?2YD+dTr5;F zMXy8?7tbl<9%Lq{6$lTNXQ|=@s60T*lmG?C$lOcs<-tTz8jcE5k$hG(NhM^`bI^Pw zA$eKyvoL$W?tvV2wI~xv0iL=LV5sCuod8+%)gg+}ET2Ip zCNS<*n41w4R9ASsAe>U+;c7uR9^&{p6tB}#Jf|Oo<`?kDP>4_y1SyM9$a=|nnwP@z zf}r)KFg zfCwxm#Js1!Tv_B8>RM7EOaSt7e`pXQ7z`*KU`j#&B{BKQBNr-``Q!7B;t_qtO0 zy$(y2k(Y_!T2q9mSivwtTxiIckS+o5^dOOUdUTi&ryQ**>3XQzsMVQjiQq@`SfDD@ z7l9-SVnA053)II!h(@Bst3fjk>u8WL2vNd4RoFcNLGY40KK8E?5kG2McuE1MW2_w@eVC!+ViVK&BA9;z{`Fe*&7MhAsLqga~PNx5OFK}g8+ zgK80FBuXlX7k!o`G$K;V<3TdfzwA`ZlY%6qBf>i89rE)Amm&xUX;3R>BteYKXhFEI z>g#q)`n3X45-OCb7Rpr^%I-2R5y|DV=AoXXgDO%>!wrd2B2m=etU`wR8KrUur3a8T z0vh=oj&vf&^^ruW>w|By-aKZxezFz9w*nFUSgR$&h)?|%q&$-qh-sZ;0! z{iZo9{f2V`F8*5W?*!8cmUy=0rTpTX{1#vA-jtj>I(O z#IuT(NM;s0s;N#g!`O+M>LdcTov5i!B5GTS(!_HjF-;X`)yq!A%-oJ@s*?zqcA};_ ziMVMcVyQC{(^MyxLG47%bz)iFPSo6YEVbK-cp@V9&wRI1uK5A8kBQbej7d%TMxrUT zF{EXE*zARkaTP4yZel_MpLtJUh(cbG7{Zht#Xqd$0Ql_{g1M*&j~>cfG-H#Iz3&OsO=!s{AP3t2G{0U`*G z*65i;Hnx1~0BouH5pxGWa?5pK&op@j#zcuMNEvO6R*q2{ zHqv7fQ(+VwjeTCf_tmT>5` zRiYC2MCy{FSy)59BI3op0lq{uFfx^i*;^{`IwH%-(mFpcg-aLLo7#tORc$rdsNiU6 zri?WZR0T;S51m3nF$uEeMwQo_@QJER2$eykR+Us5oo~3cS|CeJ(ao;LVL&JWw z7WBnv&GZ8nzYYd3B-&ISF1NuuRYlg^)iZ11>X}6c^~_VYPEWi-rw=`+L(e>W>-5|< z{XsY&Oh~`y=v>*`~!%294up^=cai?2JnhIi@yp^P> zMO_oT3=~e(HNkylN5y=|lenEq7J4FaF}caiY^7_i1_>}$5+03KOte!Kv9LK34tZ|dkRcaO&9qzx;ptpb$>kX4^G_sij zMw5gc>q}mcv0|9nS~1LWt(YXsxmHxFIV#;8CCjPShsmb#HY$3nl`6b0A>(4Sd8mw{ zUQxC)ii$PGp=M2Ss9JMe(Aup^$2P@EN^>iNpw)ql^eEMrx1NSh1Wg8YxNH@-IRsrwWCe z67W0_N-#rIifqM4Lq@j@lxgkmLU@csiO?91l(AWgMuo%VdLouClox(skioSdt)YA7 zeXDpoMoJIGslp>M{d0cqU?`5PmF!9oiUW$-3vK{dXpUy)sRG^5U61$6qdgwcq9bSYBQJ7@wM2*devDF{*7Mb4}g-3H- z_9jAX#aG&venDNWh8CH(k*nZ36sK?Z{pjXPVX`N!VB_$k>UJ&xd zmoVMJ8yJ>Sm~-o171I&CG7wKDRY_zicWPuIRUyZUDrifT5A~*|2aXl17SNDbCEHyr z=ML(!qIvMk*nIen$}F4{Ardo|!h~)!&2NGy^};eLhu%iMGq?&RQAWcsO0Bn05Dt|O zq7J6OA^4{G*+uppgQg)5O8t|7n00UQ3U&21^az|N$)Kl;m>9y8NMpskGjfD`+2xX<|($^_hhdpdTe!te-oV$q=9GmqCx0B!?=| zw?Yb!ERF!WB!HLHwLwTd1!hDu|nAI5yKP+)xyu!AjOF z@MK~{jZCu;L{Uw-H48==OCX`VO%3dVtRn2pDUaYQl_4lt7Op7sL;lew9dbG=8h)X?O~huqx`#!&}C* zOXp+K`B+J=`9R*BcL;00I-x12eNQu6Q&Sj`7;!^!T2|dZSgKbS-3r-%u?-ckeE6GC z`=_hrgV^L0!60@;VCIcYDH)o2nfAB&gy~R7aiVNKm;p=9V?Ri=_aq}#?>6ZNvnH$H zlS%(g4ai-fi%5%@+B)1>Y)`QXPzq}LE|h!APeXVvIKyKH`X+ZD$V2d-J%AlJ*t@Ia zETYqq0cB7O_NpAPV{RUq#8xRDr3Yrnd!9qpvT@GmiudEF0W@jeJLtQ)Mzsn79b1{} z*sBIWYe3jr;?>?ELhA(q~ zIed?8cF17?|8GSYyDji-341TfcygT|bY6@9Cs403{G&hB?%H9mqIO7QD9^0E)jA*S zZ{@r&KCnK5p+QJQFCs^cR)w;7aYJ2=>-4Hc&R);Bqgl>???|!?j69+p^lJQ$@iWG|{!ej|&a_Jit-P(0BKG=sU3^Ohy?03Qzs%#Cd|KH8FxHJtca&WAQXD z;|*+*80IQjB=Jzg*}N``7lNC&;PmDT@KWZyhWTx`2_a34t}C9=McW51*As4_rUSIk z9mY&t@$zwFrY)l|^;$VwH=pdVo6?eJN86D|#`9}x2YB_(!mCwxMW?ncm^jtU)`N-e2$qR3>|4arFwg| z$I0h3$^sjNt%j^*nzhH42)u@auHFhyX>-r_NzSv@(5pQ>I zh1Ux}b&8$0y5h!38~VFY@zj%w*E5%)r?Wl|66tvR57j#)khZY*tzI%!rtY;4<0k%- zNXF|OT>taKV6-LyOHUh`-vLj}@|7CLr%3)hFXXF4GSwDObbznhSISq*1zt#Lu>!GD zgTBJqIjGjQUMh&4Claal<8VuyZ2Fv?ELJYSH;uzo`*C;?Ps(p5VK1a4m6`qLj zR_x1r6}UnXS*>#n#)-^l(=6F`dcT!%JFdB>P9coeFP%th12flC z_hak&t&%CMp*d^}LzCAsvFi4Di3B?mq*F2NgC5E43#pMUX!O(zP;IFvu)BEaM29ak!(ee{%1BcW-t#kTX8$ zX8Hz8rJL6*C^ai}+dzzVbaX43qh8OC#*) zE6`0_7nwa-*2ErN zP!^3@>3GJf5!#N|3RBwNAvljyo6SbG9%JxmwUbZF5B`kUlXO_qR7c-Jp{86B*bb9k z^G3cl)`W<^*sAqFMNKQSCCKhQW=hFcW*{S1X};ulNBGii96D9Sty34K8ffsN?Jdc4 zw=G8jKXshjIODrFl^2=H2~#~}%G<6;DC$cov~RPEh~r>V8-&tk2WEF{A8I<*dIW44 z_PQF?4-{GOaVKNf#py*&FQ#8L-KV_mmVv)x_dp-8)#VP+X5sK|t~09F$4)H~T3OGG zvWyiim`|p2LiRloOKit(zh17msbs2W=t8og>2as=f@KP8!=u8>?xFGUc0fxsS@Rb0 z=h7;66i+>A+mf&FWZTbp0){xUHfwd8`4=dsw`Tra^#qJLl}De+ArMPi*{ItaVw>?3 z@r&3!IJGC^_V1aPn%pxshVu-X7mChjLv<5=x-QZW9p|DCsL=S)@(I{b93Q&i$Ctqm z?yJ@^Kf#OqN3da}AImCX@Dtk7{v2n{MrUllNUq0KZ=zS$F|5^$i+JgoPAYp$bUYPs zNqs3s(XeEn^JfXVy*b9{83tcTO<6MTI(A=R_+oLWm6ayYH!#bK-%L{cKLlGe?yBYT zL3iA%)-Fhkgr=UJo*CiP)@;W3X}}&a=Fj4g_$i!#w|*?0C3(7)cT77gdq6+=-lUuh zW}W&(_}M!&)Hk-r-JKoIz^6UwX8C3ym+;h0RvTmZqq9xc;YOq^$gvjVl^iLeEypT@ zRVg0Hz--iFsA)R#d$nHQZTmO$<215^Ww-C<$~-MoMIp8YO7XIz}R>Z*hFt|#1CvcRgBXxcC& z+rUmGF25k7=}F_u!v;=0ml5o+@HJgtV0;q$T7 z;|TdGZ-=-LF&M=ky!e*E-yWPY7^XM36Qo!5n|G01P;}>eYs4FE0=R&Ntfn_?v*GoC zUi{hPb#WTQaoEex;;2|si~AcmZ8aFhAzZCNe9(5qHJoM_yL6oXQN56~46D-ZhQB&* zFiNFntc^w;{fpD(>a4qOYucS`%unNJ?(oL#H7|;^;pGuy?Uwbgg>-5jZY{4HZoZoN z565|lML?McG>vo&_%nPx6Vrw}>E%Ez`?rUv;{32`FQfJvy?1+F`EB%C?i&f+)Zl{Uw?cisQPZCO%qpccftKa0ST@1`=yWOb&J4@L>4YIx4@y5%ZfQ_p~8Hk#2#xT znC*7$ZDX{Cs_`(LSN8Z6Z`07j0R2mNplt~I3J{q2YJuv1qfzqw%Eou_Sg_%kzS#>>Tdwkt5PBG`twU1#Iy##Dj;9 z!9F*e*)utnjWH!&!2b2qy~=;7%R(3MRm26_^Wnv2CM9jnShc~`9%ARlPM_9pOaVXA z__4SDUc`@DztDEonVuxuSM`_!{S@kcXiiqe zgPx}###)TGV+ay{d1l7NRcnm}e~a7K$QR0DaR_OJY`>YHOGU7F?`Cm1MsDux47Qb+ zo^6xZ8hl<_OVCaDjL!QSpKPkOlkT+YFVD|=bdjn(uX@1KXyPD|2n*E`l zt*o6pR=bAUegv6jth}AQ?JYXdb~c^UF*G_nGBr9e>}ID%`)_vlopvs8Ey{N|Q@FHRp^l`ZlI0A_K#}jQ@y*CC~xmY2WB> zYdec&N?5($dK($SUa(y~iX!W^*mJ}BfVEs3vDUTS5vA!!um7ZaQkDe4_{p8BB_B0N zY-=u*Swa|^AY&)Ev(Ai~z$O{vb>4oUFck!JpvOyBPtxM>+|J0-R`@J1+wu-)Krni$ zHEijjLL8T=_!SU~87wz!2{;4R7Mxo%l+ zZvfMy$Lybo;|E#74{w%iltMCA3~yMaON168pF7rMjjtWka!$2?Q6SyVE<5bQvjq~q0k z+wMEo?X;XlFoK%f8CZs&i|vG)hsc3D_&6}bBRYotQlZi8A$5Lpg+PAPcu6O1M{9)_ zIO;FV!28bKUG(nqT~?kiAnqC9$@mM|YAMDE(~rT^FwR=Y7jR2EBxcPQ&X=9A?PeOy zH@kD{yuGx&;VOiuA)==cp7xz;L|OhM5ic|-m@SmEz=WZ_iduN?2g+NFLkTM~Z4jmL z1nh{sGHnx7$MEprj>HZZj>F|bQTymUCruo!u+!GWq45JZVdmGll%+=gWRum~H`cKDwkrIjk~zx)r12Bub+bNn#c73SQ3-B~q>vtL=qMdeNAAA;sffsX zVdJUmBA&`s`)olnOlZDj{9(K8g|-e%Xom_l7j8IMGVMVqE8Oh#gdPWtw|G=kw#cSrVh4)?SwDBeyhks*t%}}z(js?Z{ls238M$eobAOYhzWTMKR?V}8_S1M< zb|97-V@b#hyermP67YY`5A^LTns;`Ll&b|fY|M5}Nn5u@opP$Mmt$AK0}LSrD{e7s zQOnYf9w!WIdQ^!i&AV0`qJOdSSeDoiV(u z!gp8WWnIp?QM}kv6wRv^Ub5_jLl>-w?dkN8%4uY+(e_5fM%7*t6HmKiiWZh^+w&?| zhR)zrN?TF<$gWMzRW&^@e%z@>b-ElQN}u<_RY?EPd=~3})}M?U!c*S`iJ>SR?Xa{O zLr3L<2XVO3RJlD zzWy^Ic4>xabJSH#sXBuQM_tzpOVrUUui92Zg{R7?pn6RKt6Aec%acwFetMeZGmIbd zCptrNs-^^+l+HmsMHY&g&lo(Nez`RsPiKF~Mdu&;RJ~xlfu4pk?4EmiMA>!@tY;rf z&3wskHSWmq{t|>UXi9{M}HA6Pnhh-4Uc-GQ!HTa^Xm5KfITbk3%ysiB=lhO6zkw)RB0xZuH zgV~5F)oOw9%UHdou*o!NOI)q%9-dFlxpYxGN5MLnE|us~2h%n6foZ`?FXphtO508r znJ!k|ftvCok_V2^(@sULtU;^8lVt>k#?sM*r_2S3C_P_j|C=6r8HVuGn3?f#qfpF< z;Hd*{IBZ}x$6&2~L^Rou4U1wQbnfY8&L5oaPB34BmE3ap=op=^c)2?H4TTo#gVPLb zqHZ^9fg~w$j5~e6mGsbV;js}I@&eA>Z0;Yy&kAmU@$o$db6VWfY&K~;b=M|q*rQRHv>8ikOHfzxvWuS`0T+-u}8gPeqR*IpZP ztU2rSZG(#u!-S05Zi8#aOT>|#@Ul1ElT44hn+HZql}4S7fh=pU9YZU!1)Wp4((|05 zpY6@#?Up$5S*I8u8B8mf+M;78n9E{Fq`goR8aLZDpRwH=FmB3=ojAF}-8^=^oaVPc zr}?e;WItOfkcldg*Q~JvKHem@D2B;OWgBnWVEi|=Ln$85*>*J1q3(~#Q_vsnZM8}# z47$sx1x!|}>kr+Irv7+tw8NZ_n3jbGG=p10bVbINzG7t#Rtq`+kYtxztlA5E=B*||HlMe&tPs*6+A#1^6_jW1m5FpHDO2wRra zyG{*3t<}gp74cA8!R&9OYRN$92u6MgX8*9_jp?n018fssdRpOy50383kyrHk3Fxdd zBKt_~*4(-YKfSH+Gt`|-ge^7~hRE22pB*jnv;87|pk#Qh@MGBX@x;U%&j^N&yo?*=b{FYF!x+M_w)@<5zvf?x&n1SDx$_w(n@vNI6A^T z>TU4?x8}m^T%AY8nZnB|{FyZ>*S)hMI=*_lo8{9SiScUJO@I{~%k1)HNM{N?t8io1 z=m{Oa8!({NkWCZ+Nk{Kr#C+EVKc{)xJNL#_G6p}a24;sw_eER^iE!4Z2)7akBId;v zETcs|$CT?~n;F0DvT+mLfZwPUV^L%}#`^~P`=(y+W{37!V@o7WS%$?Cmd~}pwbI#L z^PQ9@_j}?R;wV4HAjS=1r;kX^y49c^1!?^3P=5Jde%dh-!Ph`nbtU4360^)F zf#RbCvQ-^&9+KZpyVI*^ci5l6T2@%KtD~AIq`SlF3lq9%FE%Z#0$WObid@tg63y0t zJ54Xz?_#^P8v*-H484qdvxS^H5$wS`ubl`qUNk-BQ?2MJjFk-Q$?W6P5rMr~%`0?wa9`f5)Nw=C435LYxh}If z8Lx=#Uf3X!_3Ai-!OfLRxJ9~H^uq`GuYqR=EGn|PqgYAsUbR_s?8vbTOd)X#IJ%j7 zKJ{TJ&~qulfWO>QD7gKYS!>`jF(L*8czZENF4-Wy%GYcJhlSIX9DMgivO|xkcz$f! za;gQ5!1<=dF0jCUqWKF}F710r%(www_VOVVG+~D@V~8Z|hi=VY>vW_z>ujgZa58$2 z#$T#Q&Y{sVP%Rwd%UzZFx6Tm~S=2TDjX{6M4FOB8)aw8}>F9dX*f1|l^U7Q{9qQ(`O7%QD^w)6rPeT=?MoLomzT& zZsVyXJzc~TF(Q9vnor{J^E1|o93A83l8=4d@kWy~uP0zZk@!|yMx|xG_(eACD&_eP zS+sIbS%IFQ<-nev-iW-D>Fn+8>2b4-3ItzvhQv9sH1}D^TBn7{=25mLzKYA)G%t_t z4GB;bqav)t{AA>s9$YQQ6J0W4oz&Ga(bvCc!X57K#Os**DpxJ@X%RWfrOvwa*UoAg z$j>`cNnWSzn(nerSn8njP*R{W;{eqj-*l=dz|{ef&qmnp4a$50Et zfN`$KnQd`lsYf#aEd{{@#X@e#4u?eueV(;_9x~cL6?Zm=HOdVYuf-EHf)CXQT~}C5 z4d%4xVIszmsv4yGGpXGHk`cLmVt9Z}V)6A~sf1404Rq}@HuhG}$TdFn{&Wh{1Ubu>hGMh?6T>YqJasAKyJ z9sg*XBTmm!;u-7nn3-w$?Wty7!ugRhp3`c4^CSg3&P2I}{+=(p6J2~y`YFLu^xQ2Q zNit=bfh~GlTO!d1y~Im6p;i1~U>GGIvjzA?`&lWNmvD|9>#NBwy^&WC)iJSebYQeE zL{jddL~?6F7GT+YgMviQ=UZe~z`z53-)b_q+}7+x>y>z4*=UO>uzHrTU?U=ar<~?rT=;Y8C-%Wc;$O;&?_={SD5vfkyK5WQJH{RF-)P$l^ zx3`P7Bp1zxjNLpPv71k1Z*dRf#;<(X*4t7rNSPBq^dS_z#`tL{*xDHd9LPjz#)5?s z2*XYDXh3J{lq&y0aYZ^o?XfmF1nNY-7Ql^PABJzu- zvz~mny*{%ilZn{|yFNQ|D>h`a?}+xbawB{z?Q1>0dwM(udY4UL9eZ#=;cVFcPU^&I z;YLaiRjm}X7?Ke4W7|p2;!k=`GZ`$u(%zD15lLx0rF)cLggp!~4)@;L$A;|C6lYLH z*P_c!ucXJ*&;jw%B0KXMJd?^oYc~P+QZ!?@uSG)<erih3_)Y>G^ z97XrPKGzRYjzs|-nSqSE&#%@Rwcu74wHfVnGL=wkn&vILxwa$CGR-yps@H9G`<2+6 z=*Sen7;u!y0(QvH^IB6xlUZe_+OzN(vsVQZOh{ZVDUeVrybo9 zd5RHK#L*cSrK<3_G5DHEN9GGAD3^{czlgCwzS8*0ZI7d`g^T!t7+HgMsQH$;e=jY5 z-ogAFJr>=P*;)8pm5HU@{CpaH1Hvk^;_A!#2873-pBB5_j_Cb_nXEqe9zJDRd0GzM-ff9Lkb`afz}nIz_^fm>%5^`VloknO4Hu1=(KMEjFrMShQo?FxTJ`5!s#4{$h;K6xL!5R*x%V zmrLsy!H8y%o^cURF?jNO zqU(Lx?sIe8%@=C9Bv#qfN@o)zY9U*%a|G(~H>1wi$W2Gr%d;8d9sv%;ONHiY!j-aP zTiIBFK4Ao2zOb;3@}%nzbCzmBQcp2FFgjl6m3DjjFbtd&k|kd#m&~Z^pJn2jW#$V# zwZ;Tr*FkQn;~@|E%Nh5*@GWo7mmw4ovQu7)`QGVTw zuM79k=Qw<+d$KjJ>JWTQdWAb1U`W#iaaFK}+v?>ldw#Y}(5KO(3&utiX&3ru(v405O zvVQfDSCorQ>89yaM<l<*6h))CjUUrw?u=`4A>+`ON8Ez!=bfJbb6d& zHI?;Vn~GphogC~N(~1yo(%5<$51qGK9}$coS++$2_zAz)(?8_Mu&&WkCychg$GRPk z+VA5?G9_ih=XL98KSB1~96U{UvaHbO4xY}o1`@?n(|wf}>51G~4IkEgr}rW~#qMp4 z(v!8R5yDUtf9`VkjqN|(ma2Fjb-H+Tc;43ZlCsTq5j=oT?>p@im6>YRWTDk_cCg&F zrgQW)KDw71Kl{$o#C4h&vN7y0vo;tVKi$?TLoxH#d4{Kz5|zf2KF_CF4m8J{$l)f| z!L0Ev;#**+RvuEF5dO7;)E0h*|5zv9+Zt)iX8f=e*Txk`*WaAil8&6$5;>-25T`1t zGiKFctRb;}&0F&#TT+{3RyEiS=P*KQ;Exrn4Tt7Sy*y=E<(Q6fED6rk-HJ2*Cl;!MsA_SGOQw!|#03k|E$V3TX;se|d%1z+=}cAg-~=l(ZJqw= zYI-sLwn=c(&>!k~s9bFDcFyLban8JD{cJ1GP54T!6kl#?b8=hidegUObi2gaMw^jy zHJxEM?F#A4J?#QaycBnKQD*2&`w99HKZ40JmfickQhxE`Hp-A5rOzqAX%!a7?YM|9 z>+HfPeWhkD;;Ws5h{jjfj9Pz>%2m}y>6N8d=Jf&Or(|YS$9QRf5XF(=+0_cx;y`X|Atyv$*Bw3TgcKc$LS z%nD9>#Y@wT#!D)VlVU=DHeTF)Ta$8_&iUroY!)3o;(GedQ+=pv2 z%CoK#@LBl^jze3g%T61DI+gpI0)n#7VPX9u8EXn7^}^su(-l?)WAT)Mfrv(%Le82s zI7Jgwj||f^Oq*7vG5JxJcx*$D|AnJuWiXz?E=^%GI2&Zn}@{ZY+D8y8f00 zC)1Rbo3#{Ujd)8Vlc#yhpyg4J3oiV?McXz`@)+@Pc<=}W-Kk| zK^(;s+-YOw8XOY=hTg=Oo_mxOtWT^|l!=|EQ;B%_58Jh|q;(NbM(#_-^Y6*VJWi{L z$N;OH`W07N)f{)WdAA;KxUW%`KC$y4q(&sbmr92{xUGAObTV$qZ{;i}tk|Bc)!IVb z^s386S**{cdUseWY$%s5s5_u;use|28YW^}ON+>mG6~o5$ zR>us7^$)41b;~m0m+oU5HH zoA}lOXWq`$f1V7yKI0 zkiyU^CBRVov7d=TngO@57Axy=)Y7HeAKzRcLr+8T&H}o<>0TKw$yDq1xgLYviBuQQ!WJJrpSKGcxqN0uJlE2ZgW)=| z`vxc6{hgV<0W$^bH4`F^b)SuE80pH#lKCVUJOQ6EGe`Rs1x*k79OYy(a=(sT??r94 zOmt?LtW@mKL*=ZQGy~Mw0&F{NIN&Q?-8jJvf2ox1+1QbN{rIh&nLW1*PP&=?mX}ss zDCjcd$gKBox7?Ky9aEyw-hwNeihhk{kqeQq^tdy4@^HaR=&xgHYmyAZ%(+Y5#7azUc1n=}hS zTSMF`Za_DBoFu!aBlwxCHfr^GuU6OBA*+QY-mky{3<&D9tIDSmO|51sKJ+8b*c`Ik zYCNUV%i?JY0_`l2mhLQ+I(b*>`WW#li0V`>!Ufn0*v5J-0p!SzsWO%ufv!^hqThRHzU-b6J5jDXvMxMDVntY=Tc23E7GA#+6QjMR zrESQDDBChEmc81nO^|@9>1w)HorfAd|Lr242u%i0dS2|^K5Y%bj;UMvv+mSfwOp^` zC>~`n!u_54dQW0Y%ECyu?vjB~q$I^HWCGJ2+lkwxTgc@)$rdDOUWV5Fnct!O*P{EN zrw$iN**V%I1Ey*;4G21?LWH(jbUGPmD@~&%wQIce_(JE&w2hdKy^l|*+UL>}o@N8;u~r^dZQnR&XWNz*GEGO_-TFMKX?vYJ zf*&wXx~N_AWm=Px3!}+@i3SgCT`)6>zSAgSF1uHLBW9^mDN}K4+iI76Tf?AQflzam zk~;KEgo%h}HslbaI?1)sj2JN3<{68pS3^H~A1rQNvGvXfelAq{(d&AN=s8po{5;3G zvsvA0&z%FgY$hQdfmrTrOE+iUqH{*1{FW9SJ&N?YXIFIH^EA@U8IuOra2cP*i@v`I z^OfaM+Cg~PSD1#wMFA7KIX`*x?r}b<;5k0NRw(@h<4g0Mq!;lg*yoqZ^B3i2gP-X* z{OAJ$H5r|5eCe4PyoYDzz{gEZ)h2;i;R_aOVkc=cUevh@2wMtN$G$=inJ)0f=zN|i z{5|Oggqd;`n&xRgT*@@)l(je_m*{rGcSh?(1kZN6wXHE?tUP5{(ESd%p4;u^r+usa zhd|TrfPbivi*dmV#8z?*7qOMBAIcCyaz7bDx{cVXrVJytD#t73R2K0{Qw!d01y{(? zG6GuorNK*3%dUaaW26t3U0cfZVY^Vbuk0;e1o)8z%RRTmEVk>w>zh&_GI^K?9I z3u96fV^H)Iah~tgf<15@gQjJ@=Yx4f;|b^7*!yJ|PvXCNO0lF>#kS7Aq8(`-vTk&R z6r#0ZE5Mi5r?HFB)~EOT816lr10MqljeR{MbxUAEl6e{j!!ZHIAX(@IZg z%$}81qwE~BT(#v+0Udcck#BJhq%G&}FL>oU3yi5+q1ri|K1@`#KJiwMxpU4Ju%&s} z&{J|d?Ke#%x}x__5}w8dPwn^<=9^VIiz;N{I0~DxZ0#vB^{w2AR0{|Z_k1sI<;XZ# zU}kOao^SBAy|-rvt*rI<_Q|sy`$tQaM!g-XRz2ZqvWjBL+9P$2v2raxY5kyUCZZp_ zexP&8?JMQ0W!d~=@$)rPliIElOz)?cnx+E}<(LU?d1?yy6r@a9e@G;4IrH^{lY25_ zd$Vq)%O&U1yk_pFTbI%U$d<6rwx14-I~sG_ySGPnJd1R$$Ddk>a5oQ+4c&5mv-vfU zATZ$7Tw?Pf#W(^|(uZ&M=o9qSaaa8h@y04t=QOj8Y&iM=jzJl zaiQbMk}z#N4R|G-ScQ|xF0e6Y@gvJ~#KzBXqfqy%7Z`G)B)2qo? zzR&@ByTGp(<;8-4MW@5LrBFg1HKm?A{mxG3HfOI>b9|?Y|8H|jsC&Vg!T+~815Vk= zISpqXZ%a;{-)E4n?A(c%oQmmpw&34wP7&WtbDCK^&p3yjPABbb<=+mxui?uaU;%km zkZT?9a;V5*j>#j}!;b6xpz~V%KY==p;h*D-mT-epA@3GgPnpM^m~LX>x$paz*%$qq$h$Doz4xw zP65>81BbBUw}ht4GUm3w&P1BIAfg-Bv{IO)x4`Js8EQ0EI4_TaRXz0 z7#JUNZgCDcH#vKpTb-;k<&1(xZbnR!^V8{Hvuye?r;oo6dhkwtIqm2Gp%Q&x1{Dxp zHDjfQ*ecV-Y|PsiUg-ccb>Orfi&Nd|I`BgHH-EcM^52&Pocz+=j&tNM@w?G+u3h?$ ztuNj!DUbK-FV4pJmVn=Tv1)^Z<_Hr2V8-1fTH4Pa29XpnMR2cTql82 z1#96q(&s~r{*_|VhSN<03k@zanxoy8syAP8YlXYe9#E^}oIH6q(aVj_$-9RU z1kE_kp+@nbhiyAs^TndGj{`g1v9g!Ph92T8Gv!7p?;JWf?AJ$2GzfD(t|7?vwX58OO5d7##) z&UiWBQ9<~^rc)*|+sNgxWtHpI=g#;fse;!_h2}g#;G$ngP3AFEf~h-BpL-YwIJ<-x z@f6VMOd2!=jNf-_6+c&)DG;*2J)FLh3uM7tpQePuEKcl2cHzhd7_W*(jrs_`@bGuN zYSmjrp*7&V?AGSJVv%_>6@kq-jbdHZf36Jw_IZE43~VA%ITzG#hC5BA%k$dZaw$hk zn0GK=-X*z|XIxw^U7o(v&k;Hr#XM8xv>)JxYgHgb(WV6ctW)72hnjjd%qosEg=*uh z;zAC$=mFQ2xy2ekt6C8@r+vSKG&OG6xL2tZO0zCiK-XDSgVLIo5x&rIm}>Jb&VIwF zQ4?|nNFubOFst508e8ar(02jpMJIFV51s#vPiMXPx&$-j6N0IIK}`<%Rhmty_Cml- z-?-C@Of7t1dX;L4vdie)>fr)}i$aO$3dqD^f82jlAcA?Xw5a+5X=nKR`eMa*=R6EY zuLxx0HUvgv4$q2igIZyUe%@n3jF(uXFSt11M-3sVIr^nUdknopASq8*3Q3U;Tk3Li z9;m-m*2z#zZVsG?h*jrPF>-OJUBiybcHA2$aAgY6CE4XT1*g~2BI$`D55YA*6e z@g&0`yWAW|;xGnBeU4hA8l;O3@a7&a)aRrMx{A_I`9ckH_97QX{osY#U>GQgcwBwj znxu${8t#h3gzw7@P^#VU;4=`831zxBa^+G9V@Fu0=k7b0m1coSbx^N^q1MVMfx8|U zEOjb^>C21?9$0#n(I^DYQvwZ3zgjI1`pTp{X}>1)xQ1L69RKdiLb6;P-p@9r(RxPyRLF zr}6s_{H{m%)%b0~?u9fKoi71=zZw5r;9qOCt+dpjUcz-*G-QE8^+Eys zm8x&$^#+7)hX%5|797n#q6bF{X~xq$4j`R}r7A=xT%9OB=e>n!x)Me%ai}UVA$kPS zCGnRMIM}=u8`M)($s-A??y@Wj?P8}W82G-7R(s%1r2Q=-55c(|+nh@Gm}qTwYS$6H zEva<62&I%OUXG5mP+D^2tw*apnB|SlTcqfAq!o ze%N{Oi?KX<3u!7l-9X(j>J|)lWR7Y;1c5Y^hg=8|rJ7E$=168a`#X|zNy5=7vVNTu zN9a8RnbE$(Ue$N{S*pU9kXgp@0+yhmLJ{Y03@$i>B@%Wf%B6mu00t_BEJSy(11FSG zrN9~CEZ!Pz*v1^@Ku<+l+*cvlI(_*&vHw;AlOWl_1-wHFN|w&}bqiEy2w#x~6@($vMijCSFJxJW{Vxzj-2mj0~4B!ow zQ!e7zPtmIQ*{RLt%2l6pk4I^M%keU_GKhMmI$FYCOxBD0a0cYeBK{{$W3)6=W`fcd zIG3rt2KhkS4a5A~adf&gY&GzOa|iL;lLd9+Fy%sN_!h~v_5aBui+{Ou z(uf&hueJ6gS!w0xo zt>{YYnoaLX%2Y;yyjS;VvWGU=Oh;m^Q7LobQ5;`xC|}IQHMZ;{WmEaSHjC+6h}A)? zMKS3ifH3_V<1`)4KytE>b!K#6-{?T#_i|k#g~f-|0~YhzAm8wtS4kKa%gqnRzztM6rDTz1qp5$0E)Ny*KFm8nz3p$KJbuM|G8Jz-!MX2}z(62qA&cPASk(2+a)$Ev2~)Bqf*WWPtSMWRgrS?IbhK zBoJC^Q!N!0HPTj5spgQ7gb*;&R;gBvS}V1+=Cm9|MUAyp)V9W+s@RtDzu&sd>=_b@ z)$@D)|Bxr&yzjTxx9)4Nz4zK{@5S%u#giJE#TQq!>ip%x^QJ=dhH80#eop<$DN&Er zSze9#qXthWPw>5`=VT5%TNJYa^xTB5Cp~!D_Rr^?GWO5K7nwJT@0|LO3#C#&KatvWYMny&z6x-r{%uC?kB z6l#+4gs!7?A#r{o+m@E4{>g4v+6~d4BRFa4AJy)MOn*f_9P=3P2DBCs& z@yVn==giq6gwy+d4Q_h<-T1(YGiN_#4Tq`B3iEdh`@hBi7Sw_2mG5?)y;WXdD|;7z zZeE4CNAWlHaU()vqRx#+TI%c-#H@NfEp<>61LuU7;{ZK<(>>QecN_?fpG{t09Uk6@ zdrv+GgSkO}oezrwki~Q2$AhRltPx>&LC&$m6SX#)Wt1_UlD494?;M z7W4a6orb<`=ko!6yrpKklLMY(QSe z`&&A(2v%HCTfbs${#0+_i@ea;WAZ8tM%y=dg7ujA!jmIi zl~bGWcUdn_tPyya;g%usbOpj9sRj$muO)Yx}V$%nVEVdfw6h4KHBJzo-v_d|; z8kAo2anmxo&%-0ba6ESEftX#xU9>Q7*+TZns0-+7#Y%#fAXchiLQ%Oj(ydQjM`NQW z;0oeOk$WIU*Q6d4ix|aRvWJQO%A=3;aN!|vBNmeIc5qRQQU0D_PS}PjUS%oDF5s)f z9S%)A^46KsuFdBXcZL)XrAJSzc{T$+Z>U)HG&vW~gc}BN2=K?n`d%sOK_5T$+o?>$`N85AUjS3RShW{g zO(2IA)xC9#7U*I8BL!JDI}Yp6aELz8zlj}10Jx3#&$WopsF5ze09j8mgVa5jJo1A)^`bq zdO0WPdBf2I+|bEgr5-v2!~KL$o6sN`>J?~kS|g(CHlf87;RwS=`#IyPI9yedIzyh{ z@Od@T4h2-EQFb2wIKmo4Ch78vXC}PRO7=q)mKRL^sI^`+k1Puny&?#Y@WhfQT6#iu zxOS$(yZI_HoMpo$#>FB&zlvdk+li?lx*iQ(Br5~4jyAIXarzT$$0%!90oKum#~Z$; zHY^atxjgis4A~1SVmTzO0`ueYUaWwjSi=@xoYzEr$a=9n!@C1bSlovP)S)iOXC?Xa zN-Tw@LgESlYYeF}BdQJg67e*)G+_%Q3qMj6TM)GI-^*v zG-KNI!VB?K?Zhj`a-sd-!QRz>5y|2IfZT4{Byv9n}1F2Y5#w%v+mrS5Mbk zd=aNOj`^k9zvKSWgLOVr-CydTimG)O;nh>#mO4}bf8we`EYPM8hGD%e^)Inh3zp0y zZcli-h)eAVC%huV4dfstH5*^V2cOW&TP#6u@;W^MtSzCZ&`^qSu+nlX&|-e$fwt%O zOmHX>$DACo$V9s6Y(yY&$mKAwzco{P^RsB4aLeZMtl&ce%0Z9=9AGU815PqV5PNQo7lY%SK&T zBZJ2`V$7hGbo}ZfawRQ-=&$eV=>9%5=7g(5#1S5+bauk%-*w#^m4A6%CkKtG^Dphh ziAAl7Vf4oc;oVqJ&y*&^4$MCF6`LrfjgwGb@npj9KLK(V$! zU-gp>oeW`xCC|+{bg~ga7>Pqq9*elyXOlRKu_7qFq7GkSuRm0U3r&PjhZRSx3=78+ zkH5V++R-jw842Gni%9h4KK~)B>_dH0T}_AX3hBi+VMR6j?-=KOnE#_SUbN`MPXUxlF-#S7HqaPb$D?%iKUAf)n)79$N#Euhu!GK8vX#iaiD@%ZL&Gm zl~-+E!t8jSkN0D6`w`^tV9>iec-w~_w|J}>_VTLgY95o**FL3{Gi0USAE4KH=zt2p z>Vu1T%pM0k@)UwQi;RtxB`OzcLSM{nQN~@E-owiyfs7?IdeVy$i-H-8nwD7?H7&7P zGtfx5Be)I<-h52`!kM$rK78hE1LPIR+mJ-KodjZ$RnykYtt<1a0lbApuRqdVF5Y^% z1_AL$FP>o(u`crS7c=n62Va?+8I<=>R(wn~(2ivn{Bl9Qr^D}x7B%2qi*_u^z%86S zks=lzDSkrXFjTc8E)|mB>GLO9ScZ%XZ)^BrM$psIKo|R=SDtWiwENIo!?Pp}%SEow z9}bVf?e8{&NyR?ooEU`$4y{ypt@mVvz@~6X;%ck$;(WTZ_kwWsG!VioosRlNk?A842FpLXF{58S&#YeyM7P5Sl9me9{v=_wcT zr@sk>(stq=>HaN&tV^PVaoCMwo$9X&g~Rx_l|Ns;iWeD`?s6f;7Nx25POJD45B-JG zzb87p@DHb7?^9QZy^0!Cnme(Tf5l=+?BN>tL+oSZJS&{z7qVxM|r2m*4A4B<#(jSe| zN1}Ar9T}hHg-E?S%6?Cj&Z5R;OO&1(rDsIxqfzk{M3*-zKeYpq`I|TzS>N^}k$O*5 z{9RGy?TOOIqIAorBGXHa(rcphol*MHC_U?e$oP7q^uZ{7B1-o^7#V&nN>BZCqFHNiRyS#{-e^}KZXCebnlMx4~-Y|Mf{c3?fEUfpsUUu^sJJn z)}j^lot@d)d`Ve#dv=ak!6+YGsfOM0z$i8VWSdCqdV^7Nwp#rnC}A1)p*7sm%N;9eXLFOG*7 z$HR-`;l=Ur|K@n8F26Mp%nh)DR0wzhcvgCtV=e+)SePPj0Iv2k!h59Aea!cRj^ zgA@J`VsgiDd=)$qoN(?O%-w<$=0g^O6V^epzzKUG`QU`FLJGhMH{+$#a&W?5LTbPX zbJ9>oaKeWmesIEfAltzSH_T;hCph7wkZy3o7a)7U34aUe11G$E9%IAcgbA0Te!vMI zgFFdNc;{tk18~CR%NaWfPPhYd3Y_rC1&qA`PB?8L+O#f);}^ga!3m#*q=FOPxCnIu zPH0$+Isqqq1hNL4F#k%%O2G*qfjG$>n3aJp15S7l;sqznz-)deIAPvZjNJ!LxMV5n z0i3W8vKO52a=g$x2u|1!c@&&5Et9cPaKa|Yv*3hJKu&-Yu3FC6OW=ebhD?AH_CVeS zCwv@Ys*mCLGw?)k!nYvF;Do=qnz3|n!rO6Qp8-zzD@YzV;XpR}1~}obbI>=y2^Zv| zZ-5it25A5%{2as&PB;eH4o>(sWG6VGeKqO?oNzm2FF4`pwWuR-!XFecHUdugP7%rv zPUykx$1!li(RDapzzH8)kK+ZL@P-?3ynqv4vjOpf6TSg4HNH(ba z`5RFW;DnW%Q4ipR_d*K52`k*_8{mYS{sZ*@PWYdYW^lsY`|u42aKbA`P)=~d-H@H+ z4(va|*n{ANJC36LzzJiYK-s|w-}(m14o-OFX_OtDaP~7OJ2+u4WE`CE4?jfN!3j;z zq3qy_HfD>LBqcPTqItP9ck_b-tM6AYA!3n<@r?G|P4t#Q&#nx4cf)nmY)|eNZ@b{2TaKaO_HFh63;q(-Zb%PVW z4cQA$_{BM>2XMjyHTDuX;jVcan*b-=vIuE_ z6E-hF*_&cGK6Dkz4o>*=Qj{H>@N=0cJ2>GX$Qp3MQAi0m;aiY$aKe?#Q7_58Ie<$hzoG|S!N*m_|LdbD&!qbp(aKh)dqaMHsPkaD=;Dn#O zM`Naz7>>`~i#h@)OxvNcba297@6uQXIAQz8HI@fXc>GfuD*z|F;sNvla6%WP2AuGx zkOpwV{0GqozzGu`(%5!z!asakV>`hKulb_J9t0<>{tu1yfD7e+M}UPPprU#!i6~{s8g@IN^aI91GxtKZ3;F9>a0hLDT~{;gyF_ z58#AeNCr4z*_Tic;DnDt3cv}oM^F#ogeM_2;DpzH8T9~8_!WpBoG|kU>H(avAF>mi z@D0d=;DjZQpdP>pPk$Zt0FGylYz<`88^iG~@MpohfX{yicHo46huB+V*qgvj-$kDU zCp-l4f*%IXe-e2Bw*nu8bb}NA5V9AXu;6#{L5kkO9vG4i=Jy#o;mu!Gvgmi)v=42Vzec*(hkZy3ok3sf;6VA&fD<<5piaOE7vvh)7&zgNuQjlf;DoKc_vJ&(S zaKf7*UEqXIL3V)?9=4$#zzNrtq8`8rw?jt23A4*k58#Afgd77Wyz>T>4V=)i0eu6U zu%I0E08Y5K0`&k+_>)T1!~1bA06txXdH^RJw4)xt33G2mJ%AG)gXDn|-sV8O;DoP3 z%E1XgT#fz!PMGdAum*6#FGKv`gzGkshwKC=Jh{oh9t0=MuQ9M5aKh1>3~U&j zF#Q$-I|@#id#iyx2~Jpk8~Ok^Ve0!37dYX|kW=7Ehv^zLqCZrFX@Z*qSaKh7&qu_+i?I=4q;kO}U;Dle=g0h1X{uksFIAL%r z$_`F=2Eu|d95;6wSRy##TaZ+6!XIrju!Z1+AGs6d2Pe$F%fQxv6YhnSf)gffNB;*W z{1BuTobVLH3r_g>-6%geVc`cb4uBIL>%uqyPS|=c;sqzX{6pxA;90=j`wi?-a6%ts z6r3=7r-3~SPUwXk2Pd5O5%hm>j^M9=j{|@3QL0CbSHLB^(Er;JKQQIv=mX${?}Ma+ z6ZS(gzzJW1oK zFF4`vA+LZ>0C&8C@`4lkCXiky#tq=izo5L}gzNu?@`4lgLzaOPX8j%KA#lQLAtm61 zzl4;76V7=PWd|pG1kwOb_@OiC^WcPzchKj-2{)ZZIl&3N%*Y-DCwv6b15WrRWEh-j zMwS6N3Ql+f^;DqaKcOSksdhV%GD?@IAIIq zR&c^q*P^`Ogmr6BUU0(4Azk2v2iBsz;Dpn!M;hRS%L8Cuko&+1KMLsvCwv657o6}vA%ozA-Q_4R zIN=e_#~tNobdW;lpUP#VJFHCPPlp_$_`F=E5r{@_!USeIN_m9s0VPu zUqiaV36nP?PvC?P)Sw=~2_Lx$^#D$2xEb{TP8fh311D^_1!V>&9EOa8j{uk7YGki~ z6aM%PBRdUFc+`tNaCZ#Hu2$3oIN_Ey)B`x-Y#-_YoUjd&2Tu4+NC7xuc?SfXa3`b& zoG`5mc>*Wg3Gst>18=+6$hLzM4npn&C(PP`dH^Tfct7d^obV~gAUNR}$fMwd?hm6L zzzL`AM1KG$`~&0!IN=+gM1KG$+}Vx(08aSKUi1fW!uW^L-XFmH9&j5Z6`b%CWFhzj zaKRUmKXAegkTu|hKZBHl6TS>_f)oA;aw|CDJCFu&!o&NF%nMHVHl!1raNi*60i5vU z0n`IHVah?&132Lh$RK#n2-1Z-3O)|J;ma8J!0kXE3?gr9`efOi9voHW z-^7>+UH}}0>;fnJ8>AbYeG6rWJP6(e{0d|b*#OH%QJ>&;V9K`{7@=a4XOSSq5GU+y}`69|67ySpz-+{BKAJ zID6j6ZikeD`++}$)PRoz-+?rf%?miLA%1WxuoBV^ZU^pwYzOZKJ_WfCd<+f1mr%CNdc*D?F>2kOsKd0{b9?;3L56e}R4iUI6?NWDWQj(E3Z%EjZzh-=aPd zPdD)EkT<|bfxm%l2cG~|{|;%vz83fbrx$!j1x;fwb4c2KXn)cJK*c`l~pmz^%aRAwA#)Ko?{fycW0vvJ<=;xDRpy zagG3g02!uqf$u;b1!u3}Isx)v7x=}$Pz~V85YtR}E>a}14j7N~Q%+2lxz^-2+6|-A zq<=Tg31okK7GuAI(3ndY?f(YcVzH)!{0T$xQ(8PdgV|)%>{^`B9G623?*Aw^$v70A zFTCSj(zuW~R6doh!tP#Cg+!eQ&c36yYTB0WFI-s*Z zG6h#*_3;o_VP%{P8RFFQNo*GAY%YW^CVPr!x6GT2|D3Szl9pA)qslT#Jlsar>r_bT zs5pq{=;}<*^)`wpm{uehW9kf9D3hK?$Eoa99`t3K%#Hka>+%tpg6HVmRT@*JeLi=6 zTKag7$oN$rlgvAkjMKDLj7p5-d5(F<9OEV0ZDy(K(@Lk#>+__z zY|9cg);M%|or>p3n-tTI6yppn&VW4X^P_ja5PrTqtF-hsN#^fS-%3;U&Fkt?QCDOa z(3L^YcT0Cwp9=MPkLD_jY~#@FP>W2c)~cJ#!{; zn<`#q8(lWNy9z7w&ClKXGV9$X=jY-J;AyF`J5rmkV06ru$-deBB_p=P(5{$&WEx{{ zPBXt?VGqQczhz-B#^Z#<-ikN>*}@)6c+E`LozeMLdDZ7n$I}wcD-w;d4r7*~md0?I zR{VyQAHt#~jo(P{I8{97t5=@)RG#--nfHkNsIUnp8?GBZXrSu`5s(4f$rtnXj8M9-iFWHshpiR=SQPbaWZE%R^j#=mLi@p$8B4G(Bf#~Z(3nlQuX+X?1h;WtrqgS*kc zl6Rar8&MC_V-`&}#ub^ejI{mHX^(V~|yU5avXG^+1#>4CDH)o1tS#J}V z!e+P5T_4Z?Hh$y+^68K^(c^zW7gpIsx4GV3&v#D|HlTB#spFH`t9~{W%5g0;e&^`o zn~bY?&Q}I~o*XhheK_SN&*PzMa*8wXF6l?7n{xs7Dm|44g%sCJU3h)kDok{GdiSY# zjxNrr_*7y4QTKo@t$#G^{}=4#I5@;GD$y84?J-rpkLcJ$-+2Op@;T;@&-l{md!cb9Cuvs3{Ky5QrO!`} zwAa^@a*M7Thc0ftjov*lg^k|+U%^#=XT|QAWlYfSVd_jd$+g;4={ac^ana1bO*0Z>**xDGsdDJ)- znn!Zz%Ahze=ge?9mAgzUbRVYT*W1sD*)gYiHlw*>o+laRB;`-?43$?EFXdZtRYqyc z@8_l}mp(qdz2r~n(&Sv9PBhP%q#jgWqSM#g{;T**UHW>i;+JLOb)R6`h;!k-Nza82 zT|6pmbXlje(c1@PJc(ux?kSFh?lUN^=cQltT(okZs=oC7M2^#|_2aZW9u_ewnH;xY zpQ1cDQ@A@qc?;kB>dQYpW+U#S_NlWKxfegR!Ndalx+ER4#-RQ2%BxX+4xjLvU! z^!4^$u8maw^>uT;eC^iNgT8!vuHsb34R3GV+??`1Uz+;(^jsfSag|PVz5}|vD%)tA z-8vhGM)S$y(&tZ=D;mjWvar0*>E?`g>+-7S4(YC*SI1zj z2;E)OV%(wmJ(8*XQl_z#omlJ8X=Vw{CKmIeE*!;EC-qnpi`~sfPQNxg-ZtB4`C#sLG^p8rGYj3?|BhawDW?_k;_8 zsqrkeGmcrBV_AYWD>U+i?Bh)=z8PyG0?0d$4{M%ZL^wUy$Eo7}piD!Ll;5Z|1Lx@a zaw|^pt9XiJyo8AF;@|%}HBj^G@Oqe&=2({Xd#vTsxh;%|WuV>D;>DmI1d;o!c95v%}5$QaHX_ z<6_xqxQ*!C2I02z6{P!e*zP3UPQfi-=f>C93?CO5Gvx zR*8)g{Sxn#c%Q^iNZccFpTuE_D*mrX{Yi<>OZ;V&-Ki*jLh6RoqMR0q3nZ%e^Q7*T zI3n>4iEI8Y!rLX@C$UfBD-svJDeP(_?vi+1V)|Rc-z)K`MAO^C-6?U8#Bqt~XJot* z_eeY`(fW??FOj%Y;-JJwCB7js>#U4V;(ZbaC5}owF7cE^Ts^5O<7k!oN{Kf}Y?Rn3 z@qUSWBp#MHD)D)V;}Rz%nlzDKio|6SizMDEv0dT^B|a!|P~uUE&q_Qg@g<3`OSBk7 zdJ81xNi2})km!|opTs>9ha`?l9Furb;%gG$lo)4}<&&5pagD?qBsNNHmw2DV2PO7N z9Fh2>#1|#LEpdiPq&HV$hQwOIA7e~^73tgm;swz?hIqaNRI zHCEFecVwk={TR9Gv(NgC`t2+i$s818zc1|7lPPEUOY^_1#%+SBww^4Zwd%#+>+$&6Q)Z_(D5`~hpE$3SW5iI2n`mb(_B3gTOlYr|H+cfku-{?>TH4oE z;SS!x{$`eYlF7Zr82h_&;l;vNf@4%soxV`{S#^xdRqT@6jMuwFZUbl)hHZ}9eO`QB zRj>{(=6JCa77nkrEiD1sN*Z4%B7LiJNM)`dwi0dgY<0Ez8aynGp&L?zd}dY`T6 zA=3R)xCgLVYP$=&zSiI267gK7T)BD$qfKkte2gsuql8v6S9niXm5{77+QA%O?2WMC z2}by@7XIist;{BB8QTuK+Ob78+aUCoHf+Pz(%|yD1MXG~N`Y`&Rx=lNSLcOiHOyV- zLoM9IMBbYi?e6DBJ5%ersdO#AI#**yTfJ&uY~#qAli^KHs^3PTnV<#R8(Ms*L>RQW zwlw;&*Lr&+i#yk6tMp+j!d%RwDfHiK#z=$}WU>(@?5J6ZELytn& z!&hjjkMsVvpEK%j1Dpl@ZHNQDUPR6g5^E#FVZmVdC1Pa8Mu@fhFlv2`ZLJUT_@3a5 z;+ux@HMqBVTbi1YVgfYUdhkwP8}gJ$+MTq2J-*`1KzXj_v-bz7t*oph;BG3cr!9{# zd|+$d%el)s^r~Pp^)vG4hdFs;gj*bTvD1#k_(rhNb#vtg?5vcBU71?yT`i5stH<41 zRu8xAdJKTB_JF&kJy=$6v#kg;)O9r4a1gQUOd{MWmy2)Ul$|5OBQ&=En=Ev-n@3TP z&Jo~Iu(J0U$0}C^YOLK&vFweGBVV77smmgAlN-v*wpf&>+UE`0?CTuWzG{~Z-vSQ1 zp)yv4B1ZL~8YU~FjeRG9;)&jlIAU1iugi*`a4 zN7-}#Ks+n>Q6lR6zy5)6#n~dvFaCirB{Ga7iPytF+C8$fsBN(kHV$i^_{R4bPd4JI zcl+J-*yPlPqpapV#*^dXCt+7J2KxXi#9ohv%yqH4_ZVL;@`Y2M+Z*b^jMe`WanXqt zLr_zDGnEpbhknm-Rb#yNZ*$QhkAt9|y4@-l``mkrFLa37F`hpD-r`tIO~|)=w>h>^ z;ePPm;^EzR{Jn+c-TB4$7S>&DtE$e!LBD!dwSEc|EUkO$@6$vhuZ?ZL;b zUKTd1<=Mc8aetB%L3Wl$UAG2p@Xz6+6GkY0h1);dbu%1SEx{Zx>PzqkV_A`6w!FnW_yozER; zVAz*j+)tO`s=5p}CjovZ+%8>3!W8v>R^n+CD%~aGdgU-&(CWTz6qJ2gX~G6qQ*9u=-OS>-+Wbf!*BT9XCG9Tn{rnU~< zrCH`^j)t4FLQD&6@kp1YJJAh#GZ^1wwDn_7Y`bzTo!374CF zzE%%4=>_rdUj87nwR@N$JFIPQ<@|Arui#V^YN@5Ycs4DED>qT~* zD;+r-!@ASc*^V}F8>^drTV=zu_Zvlb#qRdv2018>j83D|w-J4hW-RVBIs@+dJ1Tsb zjj(N@D!Z3l+Jaup=*Vhg>|@4_Z768CMUmDno!hxBiv3TF)Xh{BM~xy^)G_4^+BoLi zA>Nj{rh42v(O{mLy}SXpt}Geu|ER1lDa*|f!C3~v|GQ*^%~5G94`qd|L0(AQ{+7(v zVCL4AwoJ@9Wa8-Gg2|aoZ+2#OW|qvi9d;y9wz`>-Nc#rZMoU!KW{=w+5vcRr_-Pg@ z!e$q2^b!>(<}bFOdqf0bJqYu!l&Cc2_Q;WGK8iH|S&2%APw?ndIfgVYRL+Tuu0QmV z;acS+;?ql17@8u92r&WsC>zYV(&bNt88cz+qh6{@ZRM&Pro!)kqu|&_eb+Btnz@o6 z0n3oji}K#HCeIjlP1!{-Q$G4<2d;P&FN#dQm|d4dbBUmL%M9xk=kdAC^+zAbp&f{sAj zHNpC3Ppdna+1gSc@CAL1bdA?~jXT)7d`tEME1s{mG~$*Yk21rFt&O)@*R%&Pb3s?; z7Z_RY0t$wJK|FoM6P|5Cg#&*^i@UA{J1)@hT%^epRDOEj&|}+j&lZo@>ZRZ77PxVD zu*G+WC$QjZ6===XQ^vUFYJKW!t_~G~!mdHVF?-Qc$1hXfy;u?ER9hkgYw*O+iwFC3 zhZxGz<(ZkzW{ zl183}s%mRl!*vVp^5kS?XXmY0m6^RFZ)Ij)ZvBc(_libOW>!{ygU92^ZOCoRx?5L0 z?>#T8&YO?i71_D@b*tT(D;icKAB}YlnfacahD>)(US3vC&Wgs>x$b{WKJw3-k34ry zV@|#&H*-a9-RjJ|yu9qpI```O%!ZY#8}i(F?v+gC)tfFSFNmHwK6k5 z%afg%my^3XbM=b4y3G9ChOEYw4OtEDRXitFeq^8rzW1id&N^>S@;zCNtK8W+nRShI zxo8_tekNLKMP^=pW5bFpclHYRYTh;?Cu^?O^-6wdTpiKbF_c`b#*(%1YFN66(KRrR z?`6X+^)P-W@ZD!4uqUp^(o?&yYv0a&-TU_J>)AKBZ)D%meWUx1?Hk*7V&C|_Q~M_N zo!-ZK<9aQb>)bFaU*v$v~vXK#1!p5C6`!QPSHqrIcO z$9l(lPxOxWp6Z?GJ>ARt;`%IoseRVIjJ~YC{Jw&|(ms1%OU zp1z*G!M>5cqkW@&$NI+lPV|lUo$8zDJKe|j$L+W5Pu*|bpRqq{fByc0{iXZu`)l^s z?r+}j-`}~vYyZyu-TU|K@7X`Ne`NpB{iFMj?H}8JV*mL5Q~M|OpWe^<oEn%II6c4y;|48*se{(RjKQqI{K103(n0%R&0y_d^PqpQbFgc0=V15X zp242M!NHNiql2S^#|Fm+PYjL^o*JAOJUz$`#2v64NIhUZkZ~aEK>mS(1EmM-2Wk$~ z9%w$`KhSxg>%h(f-3Rs@=s7TWVC2Bj1EU9y9T+=s;=uTUQwJsvoIb#Y;)X0ksYBMG zjG?Td{Go!O(jog$%~0)7^N@e2bEs=*=TP_1o}r$h!J(0%qeG)Z$A-p+P7I9?of?`L zIz7Y=#vQaAOg(5lm~k-cVE(~^gQW-U2Wt-29&A47KiGM&>)_6V-3Rv^>^V4iaOB|8 zgQEwJ9UMD&;^6qfQwJvwo<7Ki&2a5-^RR!obGU1G z=WzG%p5dP1!QqkNqr;=a$A-s-PYjO_pBkPRK0VA1#T~L7N(I_a-G}xZ>NzxcXynk*L!*a|9U41y;?VdZb~yEL*5T5_wTC+o zcOM=+JbL)V;fcd>U!sG<#PaZK-RDRD??&GrnWEoY(d+Zk=V3fy=Eu;{9&iixPy+OX zdbaOMWRg#GFgMoc!F?tPmwkM1E zfx!VWdw_5H^Z9@T83^C?=lW$*$9Ma=zDVl$)<4%NAM|IH{>r`}O2<9~+?^@_RX*&^ zz;%zTKJ3ZB^(&-3_LboJdZ}Yi2(I5Ib?m*s^~{S>&a;>UglT%Rlbv8Msomn&V` z|3!uWsqnu=>e#b_+pGG)z7-KV_O9UiO)9+1|5B-A{|N41FLms(!S#(&$9@-F$7}rj z4|_&L_+y_5u2)Nc>~X>MPf8v8TyWhk^-^a{ka59g);Ud>^e> z_R(e{zT^hwujV7a8*La7-_P$*_R(e{J&$)Pf05pJtMbQQM!bGcM@J-eVW0B;ko_aV z{`}=V6ta(wR>XIGK*fhWlX&{qnWHU*F6=-05oM44lem5PHou^(6d z*yDr8_l?OWj}chdpW3VJu{RU9uM;Po=;&qoUmsBR(FUS@N(QI$7wIJ*Q2yB4iKqA1 zDJopp|MnZo9{V$K`;_Q}r7rB>`lhnS9!}g|jnC1+g#Ce0WsiNHxc%ZO>PwW5J*n&` zkM9d1f9w@?0r_42R4Bgh3j1fGBaSGa>1kz;J*Rm5bMQ!cvOiHid|gbAAJ~iP0`jxx z1!a%@s<{2a^R~~QPbhorX~pelPf>p&KOa4*>}#JB_L#ez^iS9y3E6i``{qflRe%0j z$e#U3#P2Lk+BdzV;>Z49-2T$@ z+M7-(d+ZU$?XN$t{k?xw_Si>^+vBr7lm5y6^CxAGy~enG&ZO2@dk%L48+u*YN1KWG z%1{rI)OPON4i4OmNO@9CvN@jdLp31#?edR`L@#@vq?A+x!%Q0Ekx-t(xm}kGv z-QEt?-hr9=CQq9OYqZECP~UuAn-A+PF!|eL&8*6?X5yjqbxmy@t5>r`dX&KbCb^}E z(_(1RFuP(aEaHPLcY0jy%yh-F2cX8q#p01bla>E;w9z{yo(9ZDx5LLA_92J(4*X&f zBL&{T1IKR_?;qe}Sg9`~vMa_YMni0{nI^3xV>6j~q$Uw5aWiGd{1yc<#YP#6Ohr0s zaUq=-$6SqJX@<*IQ*5(4%c?3}4qI`RqlE3bB_a6?ytL4(Tg9|Q=+=bkNp#*0J7ZyB zQ;^*z+)airAk6y`F0TZ{g^kp!aIS>uA3<=7R@u>7=Lv)tBe7Z$L25V*Jq4k6qA=ml z+zCn9m=U$IYvM8~SLSIrIF`GLt16wg8Ydew;k)#I!~LIT&o0GUIhGVVeH+iFJ%{Tv zg&wEbbGbfC=oZbM$Ms~Pr)u^UT%Rp;t7c!x^%S9JXvIFf6W7@;3Oy$_fhr?QtLQ8a z23V?4^R#MDQ*n@`#m1Z9n@?&^aC(97ZPR&u*$(9JETXO{c>?)z`fsdap6-p0$TG%q73?hOS zmMN4G&5_TR3w~5{tY%jWKB_sgvsji;jzP(0*+LnElEZR@aso;&%N5EvlsuLvlv7Yv zuoXg?&>Ss(wo)jkuRV#qHY`j_+=P{=zJOYg$f{x!E}@xr<80wU%^SdLe|8bB$27ad zQ`ga?oNpA)gQnT^W@r(X#??1FeUy+x_>Aa%Xn7m?RSUnP!Y_0@iGWVwIU41u!fq7a z$MEU9qMMvHX8u^(b?E=`o9P%e@0$BEG9OXYseCuGx(69#mKRWj|FiCvlw*vK((>Fs&c){?sTx2?Bz7diF8)xv6%00 zJ;uJNs;q<=60{^bCS%B+8J1|t2Bis?H?&2E5IlxQD4hPHi5PUlPSr+dS*48`eq>nk zTV#A8<#eCK@$NCLHvfu^9U#A)hx`tq5R#2DaC^DzbC(3z@}Y_@+6d8qQj| zZ!7zjIq4{TnO2JT(AcQi(hn_;T`i2iZH`?8%gf39{g6wj)UiUpSLv6q6dGwhrF0jI zcj0j`-gLx}9-EWa3lH-ke%A6Djx#m*I%pwpoW;b?1X49W1C#6HvG#td7Z+n6ockw= zi$2GdH48V}rl_A(s+eygi_APuKl5Q@o&m==gUPjy`at$d&RunlV9Q-K6&0@P!c8_; zp~F^~i|ZA`TQM^~gA*wq*3j=a`>>Gx?HE38F^v{qcLcfH8R2HoobD#>@J>uT)q+XG zyXT(37EePqJ1d;b8h>ND%FmaSGBI++NJqY;m}z48!uf&TVywoBUOFh5LD(jS;>=-2 z;WR^|<+x%&GBb(L7VZ`bY!;Tup}@H;MmVL&;W<`>OBJe%zc(Bw+|sA>>Qci(5TDsg zaHHC-(`#B=!>;kM3DhlmW~)Nyv4q%o>KQ#6yE?jd6JyQ!Xpw>*&0@GFHsx82K+{X{ zawcAXzBV?FR5rcb)8xi$)N5knLdj*Z>tf@m2li0n*=()QMo7zH*9&cwv|Lsov@z21 zSfS9yNn62+gf@`~Z6zxf8b&~9Ca)KIfzY#AsnD@I z3?jqGTqg8dq35z2gzgu59@`-FE}^er%w%!>ZV18kDowdE2Y; zf;-EPr9KK3J(@eL<_<+)f~!SDaT)A+6loY5)K!6DQ|t^HGE$mwkQXY887xLOc8H4| zLtR2FT?a)BE7GeW;j%3VYo-YF*GcxOGF*H(s+nb5Lh?7@$uE8GOh~&0TpUrjP{5jQ zI;QSQuuvA`^l678FlI*Dhg{{ zMTM0mo6Aa^rOa?%+mh;HyUSU)9uK+Cm+q#*^0E?{*;sUtvWmj>HdjeiwX4)tSYmUq zg1^s8-ZBI2;Bn!75xi;g=Db9@I3 zJtoFJnOE8~2x}&P)m-b!%5AE>lAF_$AHD?5Q{k>}Zoxb9Eh48(-Z)h?%I}*5+3msy zr)De`$HD5safLVZ??~r2Y9>t{DR_@vYq_h*$W=g`?x1LDnif618gF;8rzO z@t5x0UU}YX6KPqrV%!P4>+wntmQm5mPd?!>Q&oe$ECzpi>=+8G%2`tAEOeEW;Xcz@ z<+zE(?N3jBhl(m+UQ)M;{URqAI*=1KAd90Ch>FB8m>zo+k*GAP_`PglxvJ0c;q>I6 zCh_{D-hWuurr~}Z0$)l`q)Qot;bkZzLNOZdg7RgVsNo=#BSMKYSTGtqB9ue}U2#7u z6pMkL06r#^WQ_*9szyF~enq&Y8r~0suL>pIa21rJLa`dQBc8{Fvd~ZqMEu#LGP;v}!!Dm!NooAQ@pKl8#-{64H zcZ9OWKqrgu3Z($4F!rQ~pu}((X5SOaI>Wc&^OP_vHMpRBUnu2<&q6sS6uaR#l&6K_ zH2et>{6Hu*hL1vdMku!$=o!(o>FLxowJe3Y!S6x&A$CdVz=>*1T(}y3m~KtL^CojT z76VMt=D1Ip_*HuH*HK~|Mbzr!q700;`mgn^{-VCseUqxqJ>`(ifG|ig(6z`HKB+W{*zEd3r`3| zwD6xr)S`u77m8@%{}zg9;WvaLTKF#_0@1>M6^dx#zlkD<7CtQ$J8$8?3#Ep)@S8%Z zHGR~DzaN+~U(Q$2r$OW>HfMesjjbjvYIIATe;M_b)KD%WqBo?? zpLY);HyiPz@)@>ZhK%`_Q{u|YSzhfbE-WuEDlFc>3^!TlejA=we34>!3O`vt$B($J zr7J0MTWcPN<3c*&{E2*jO2=fp-C1RKmD@Ji%5}4J7+`Vn$>NgcP(1PF=QWzSh@vZL zcQ+N|qP5IfR9J0eu_n5#nfA~O|7={oSh=CHYI7xn@4J~;OWHa?VA$YI!tMlu=(UrZl`iyD(Gh7ml2oKtqX}G z2R!aYq-<2$V$$e@>MX0Uu>#VH%BzZ4Au+^bE39Bef>$|k-N%Z<9<~yBY0FBKMcBzk zP85~0Sw{}V>)3jZ<<*$nDJ8lIw>g*^Mo5`l*-Q!vMdak{C8TfSCv@DBks@k>S-Ig& z4%<512opy&+8mpxUv-gMR$gvfk48ItR;N`IR&RiXh}C(M-9`>jS*!~$^tX5$>gj#^ z#9BUu6-yu7;vb7ibV~O-Z3zy{@XrkexN{m!(ctjG z$9mj>_6~mwT@)tXWnKldb@Y5(93+YNVa*;oy35tk7XFk~19u7OcuN3BfJn9lUnIB_ zZ)_XbdWt3SesdGTXHq1XkHgS}H|JHFg!nL1;?AXyPwI^e>pNKDN7CMcuNfchVx{pe z`=)i9*!1Mor*QWMt&FtUbNI{?wgzWq;qN7|j2XT0_rPr~|610JK2hYk{9{Wq_9u~7 z++2JkESt^fPdtS9ETrYI83SBPog479V}^>&805N@neRb~Vq7>(3mxo|=ZqG50D)5R z7t#40p0+rRE{tR4r?RxnM5^Xk@u4g{L(rCUhm=c@_6v|)3f|e`ax-nk!eej{>YYqm z$<-7p)7v4#dNN$K@Xyk)-UY*ar8aD9bKyG~yz%iR39q*fHx(83nrx~r%)qEdR^L3;)4q0Vq8ETV38x8QZ@cD7E&Zc(x0B@n#2-+;WZ_0lg<`8B(Pu6jNxRw}*Xlo#)+ zyrY)QrtUn=Xp&x`;`zJ{p3ZuId*~Zz+6{|lVU*8P<@eW9w`C4$0hG)V%gd|t_Tx~1 zK{eIzzRj%KRajM#hGaH87qK)fa6@|`HjMYrr$g_H-N`zwYwg(#mzIGR$ zhg?IRuGfiBj;)?@QeyK5TRvvYodngDIWYX_x$<1Hsk}qN7W}6-@&;+hlK7Bqv^7xnf zwCwp`qfqlvY5a%Hcez`GP2#J7iLI$GkT0*9`QmGkGw+%EJ96VwOR0Ep;lYyvrUv(f< zul~D>GY-Wyk|q5x^Bwr*4;c7rp|+KYb@L_JDQ?IauWSR18@BPusfyH;%S935{)zBf{mGZd!esp7ud6;@xt4-HFf|zEx>q%KmY0YwP zA)ZI>7WWn$MFm;{jdzw7^g=C$=La3KNVwW9uvo9f^WKg#0Ss@%i*EQ7q#Vqsh)kQS z@dH(3Rz&2-G?cvX*3z}vBRDfy{C1miny<~i4<)tuE1kj#w|Cm5S~}eah8=NvuU)34 zpQPK@75Ly1b&Fz$6H^^@+GfWopI!2OU^~Bi#a+POcNQ>q8J#~}{QH|fPM|}aZoA>m zE^DOOP0S1ZggckRsg#`C@Qe(n?i2h(>4D2FkgNQQ82hM9z<^@2pIr8&l`%*0;;_33 zHq5Z_%CdR4!S&-%J_cDz>v)n|;qqCK&p_~Z)lXqND&y0xh09M<-?pNAUk$rnsQ&?( zHy_GjkYUKmI4G=|y27TJ@&)I0aKY|a=BF-)aXEax28XXe<`qEs70AyaOUW#`1}?9I zyhe%#$~4r421)iqSqYK_aoz=mZpue4htGB>^z^M9lJF6kDvgy%4@rea#m~bOUC+?Y z*rkW0`(4QFG_8i**rm-nV>0Z3BipzOHPAXsltfd6+L!*czfOM#(aw7kMm0!%6J+J1 zRKH28)@byYgNCGDAAicoHeDf;$rFxR)->%#EeE;KvRFcf^rUetX@yj7gt7_N={RVT zHb}?UQKSwL1x_XEUGfCG^nMxM3CE;DgLuMgQlWu9sZf@PM!rX6MygnnOFBOc=VwHU z>DrAfVTW|5b4b$TI-?1l(U^4K4SU4KGaAa?$z?Y-d&bY;5i_-ZT}cu;?C zNJ5MpFPIgstME2tMdXq6X|h%chNJteif#{&?oLFtg`)edOqfTPk24l#kNx}9X_)F~UQ0XNmlEB4m^{COpHCss#~{i71?2$9ep3Db<(nW+ zK+rZ@Wi*dq*!~#eK+ZMH7jKu&J#bFgC6$knvR5i}_DK4gF7(qfbT+%xB&(tjHq-}M zzB)6>bA4!ijCx{oo9d7}SIC&Q_jVi=R!=8gEzrBf?6w?wOsqMqbi&|^XWo~>U2e2C zVh)74gjQqq(!6qQ3e5s&H(CAanI>~vzKMtppR%$Vm(y0nZmOg&AO-L_Ag8B}#~W2}ch^2|S{rk>5b5EDxS?s3@7a^kd!-e`OwCYS4*_@|wr7LW-u zpT%!PWX1H>Z~$M~j*Rn|h?9ohS@h8~TpjQ-8jrz^MaCaou zd?nYwEoFUqVF@0CHu&-3I5ub1%x!Q?_yB&Kbh;tYy79vv(BcyI0h39~l`GehKL;fR zmsM>Y^{y>$mlu=wEH!mLHTQ#BT)0rmkJ~FH^|HAG6ke`;OS@v(Un%Y>SH9&&uY60v zsuHpAEp6=;G>M)PUJ94Cfyb7D4CH#!r*oXS4=Sy_YhX(bnPhqR>kil|COy&%0vwaW5zhnI% zA1UO@uVm6NR(SA5NH*u@6rQ#9<#j$E8ncbfxkXd~Tw2;2TRh$dHs@AlgeGTm>ZZ%l zhPn)!Q?EQJA1#>oP~JQPY))g^?MN{B&yp3;NL?C~DO^kk6f(D=Y_H~u( zF(qEZpS9+c*d0~HY|f|5X`hE@LJvjo0!2U(P8N%BIg$K4VTZ#~>x_Da)>zjUVmHls6SaF)BX5_Lx&%jSO5|RbC}y z_?$UyJ;hK?F*H&PRG(2lkr5XAytwQBym{VL6mSOx?52QtwLxWZQ<-hEy~^PfxqQ={ zM%AivwW-CkmA;I@-ZH0Az=UHI#R-anS1&P^K(UGPmN*JG+sbVfwn}HUh%kOy8tuZD zKwHFJGmox2c>)4tW_<)6XC62xiqe}SMP=AyF75?aZ-(P0x2FPfIN5z!^w zOcCE6ikO#7WxoiY`=D~5#3@$3{XnflJ@J#p^ey-V%AJGyE zk#~(cvpAGOnc*4X52qiGpVtzKRV-k^d_U@-(CKuP74eCDk;Gf^X6B+PG)0Smy-_IB_O;{YO9cuP#ZZnR+g=+a#WO874!8=B9XL& zxfa;}KfGNBd{kA|zi(#J=1mGo2mvGsQUi$Tg$^N&4vC5d$CR05AdM6tSXV`{t=QWt zR%|G?RrIs2y6W0p*Shvyb=9@(+IQ9Of6l$H%w!Uh0hb>)ciwyF{?EDRmUH_x1jUi6 zIGvIff-j*#CTif0(#H{^-h)3g&L(WG6*$jrry|2EzonKG3k*@Ns$N}Caj@jkrH|~e z@lXsf4$~RfRN&try7jSyDo--Am334dmc#W|}K@G4t=?+MM8w(woz2T#^x1W>u8;*h2mZk~?W z;z}w*f>-ROyuRJF-$bm*I#Hviid*Q_&92d<{ED9Rh4?w+Q2f#O4;dhh{s?^U$%n~U!{HFWin^oz{b0dF=Y0_HL0mJC5T! zw$s-tGUxDvOQcEC%(+n{!!&P;5p;g?xmM5xZt9W?8MKTa5LD4-E{yVlRKFd6(4;oD zo22f*b7fNI>yG5&7Df6IUL{CrUU%e>8bkt%^SYymo?^uqgB0Or-%YS2bQ3nw2rW;` zzZP>tStscftLUtgbrLZ;>vUbdKTBWA-?!;)?4P5b!v4AX73`m<-_8C7`p@iNtdF{m z!e6S-VgGXdaQ3gzd)eQvU(5bg`jhNmtAED+^?J+>3U{MEoc){hDeT{@FJphF-pT$g z`cC$D>3?MZHvKd9zfL1PL}&ewcF^_Y|Clx(eWd8D|E77_|0(TJ_J2;>#Qra7m&2c& zCA75n@guXY9(R_FY ztflYN4N>10o8SF{+Iy$dclx2eSDN1&MRXL7vZn9!Lw%oZe&2-sI9Q-V-#Nvl{3Yi1 z7D1Wo6Z+1%EE8E!Wc^-#$8YqVD4mmN5f>3is>zN+WAxFFKrfENVstltj8V;4tw0+^ z-HVgZ1MAv|5o59=C|KQfftD_Dn>+aZ#z1$o`7v6*R146#-CoS?q5^EkKB_v*yAE69 zo(3a<%Z?gDzcje7gv(2jsczup_veA_Sw!{TxxAz?3v#(B6tGff_Kb5=yzw z{XJ0l$ztvttdbrhpz~+D%M?R#e(C#i163OuZ_iP^s4yXcLYO zMS%yE{x%GzXt5|H2F9OE3>;G@949FXJV=aNZ5T{(yhR}~UI@m(VvY-$q!8=x+wy!8 z=0^j@h!cGij&p64ehD`oqxc*x6*rE&$~mTX77~%v4u8L$aq{t7f;1W+B9SA0KBn2J zXql?nVgg8lZ5Dw<*kK`Xw4YT3c#tuA!a`tzrz`@A@Ue-I3Avhu<4KkQw>xw-O9(gC zC0Vfm#bXwQ#F$1DoW>+3D6W@W3g}6KEH^RemVPK&n#2ZfzM|zv^gb!09Bsm~#Y|MB2ii&f5_N}(sz}?L zgrh)%KrU#BOxA6Ysq*@=iKg=Ddh`w*_bI+zc#`scXTYIIGRfUG5-HdyOcooZ-WO;Q zj;mF9z=H&tMHH&sGsP7ag~T}0!tj$(b$l)<=s{wfU|~p#Pb>kN%RxrNE!+BsSOC}AsneH&OFsCaZ=M%lvFmLPuS98BUFl>O@y4;S<&ff zPK^H6xR_~fj=zI%X9@UweYmm?%}@hYNWx`(2^*R4Y$9YMFA1yr68f2Nx4~beuZ{-m zwUV$T(B-Ff8^|?3JuJlA7GI|Fhfp;#l?&?u6;r0F525li)fA$Vxe8ZX;9@(+7D-pg zkCNeXB9b{&5uIQslKi?&eu;``lbuMiyTs0}jjZ97CJ`Pby9e#;nCLP)k!1IQogEXM zXD5>EV$+S-r5}&}hvRNZ0)4j8CT8S#(&u!d;^;}LJ3^==!&;(}iO5*DhEPe4n=OvN z5XWaFRWS`KV_Z)%+-@;sqNjq1B)`WjeoXXuFp*^U4~yMA^zI!WNTSj}7rH&@iP8m^ z6vZ^GPT(l2crx)jp~Q`na~Tm+OjUH5_{~sa6d6M9AYxmQNv3@JlO)b9u;f_Z19eMb zt_cx_gZvOah!W|Q5Ro{@H{pXQ!Qw^*3wADSm}5i~m*t{B7j7)XU5p%se4?cESIS|^ zlpsna#u}ouX@)5igD4gEQ$x5vO_?EAQs(9=_BNf|6CwlC9}tFKN%B#MBut+jhF-}t zVsx-JzDDQXu~^aPOL>B`Of`kDX@x^nh7F-)I+{Y*w8J6F!iG>%-4Y^I7c!m0XT_oi z#S}vWJ{;}KDfL!}OiW)FhF(b&kGXlfL`=UX484+PHql#|Ig$DbXv_U8Mw%UdlqRK~ zC}owXh(5OyN!xU)0Vfi1za_N_U9k$uYFzHLAxR=EyQY?OA%~GjFWQh~<1x)3vKpA* z+K?nsvYkjGjm8AOs_+}?sTna@(iG5>jN2R{k#UnG<834orOrf2UqU%)hNLK=Tl{zi zO(LCTAgPkYv_&Db&^@XAUIS7|hbxbTW1*zY$Ad(C!$1^?Ofb(PkTCx-V3+{+#U3mv z3P6sOe25*&xA_L}|34FiE40M53G;go0hej?I#$ z5N+tzT#2(Y2#1I^*oh?4ix!fsTlfO zF*J6eq|3(x&e3MT6+}nK)*tj0i1=KK*snm34Fa{0H^IakB48d(LGK8HW>gUV&PJ$U zpAUj1Lh6R!WD=quE`|NR4a z3&&T%gc7lY2xV)Sx{B!M#>B~t!H+VoYiwwe$Z02%F+DK|2^GjFNmBqIRe@X=gaeW^ z8;L}DG6)69IL#udm(qM1gaVSuHWG=FfMsGvtfbQCNSZ>Wa~dAZCnA{}l*(t=iTpg; zxY~{+6~01J6&d;_tmExil59y3nMB)RqNV?XT8;IRrnC*Svh}^l9WsW`nrM>j$WSsF z%dai8$xfhkn`E21>u}#THH9gDW5=tA%GjneaYrbzDox9X*lG}@|Api{P7>$l;Czwp z?sgj9RM^LcU^DsVzT_}w1iI5iXT_)A=K%UPB?<=ku?Ub_KT_`3L$I0n%ur$_cl3lH zxf20~`2*p&RMHp8XP+@3G=s=V2Kh&h3K?N83<~2n28P;#Sg6q-EAUE;%-&fex``!v()8V2Czsp$UY7tlUi_1GWCg@KibgD`B_pG@}tDcCL+#! ziHhh)JCQ_MW+Fw8pP_$^WQd-SuV*5&Mo%cv8`v+@&tbnvzk~e}eG3X<^n_CVR`zG; zud_c>cOm0PPnfO$nd#=}KeInqpUU6o>8sgapdZL|W%^j=SFX=yx(fXS_AB+P*ss$6 z!2Tlr5)QXmf0X?t`seH~)kiYUa{XhbTcM}&`<429_E+g`?APk^nC>7wkN8cj)qC?b z_=o5hv%f~all>$07s;PAPyfDv{Im3hL_g_lJ*kkMx9QpJpQBf?f3Dub{(1Tt?4PgS z#Qp{Plk8upf5QGnx?V)#FV@Gie~Dhi{-wH?{mb;z*#Dh=Bm0-@e_{U${om|gsV5dw z_$&2n_OI5f*uO>(uz#(78v8r++t|NRe?|FUv%gaxQ9|Kw)n~JRn|>twcj(8lf2V#8 z`*-P&u>X7g9ro|me`fz4eZNu)zgwTl{=ND-_V3eAX8-^68`!^Je}?@B^e@?eP#-&k z!abzVW&aVqf&EAI6WM=EzmEOK^{3eXqy9PjPw2@rDcqC#RQ8|JSFryly@&m$^~>0Q zMt_+7XZ63b|D66E`_Jpcu{S?@(hGV4`!DJ>?7yV1hd+6euBBbbKRjC6-TWh7OM8=l zjMfrJ#>ta1v;JAz@O@>RI@y+OP_1>v;W8k(2*BP!^i z-l#R&*h^8lq|(Pk-+B?%t;K}J%JZ!+2TDzzmpjrErvi*{Bv>M*&Z9Q<7qq3@9<(kv zX!>tSjuZL`TZ~;eykHoYUW0cpk8<8X2s$z6Kl{^sUHVF>CF;C>V2ac&^FR?q{;q)_ z(u+}Sqb~0!Tmgnn8_N-@cU4WUR}i}i(+uVWq@qvP(~77Y`$M76@>Y86O#?=NFzAOZ z0*Tc16;Z$M4}(72F>VQike+rEa`U>| zy)u(w87xvYz}f1+0}!9#h>xh~B6S|AjU_XbO7GKss2`*L+#g^r0Ac0%#&XIfg2Eh6 zc$`bqaelandbQuszV-Id0V8`pZU`i$+M@Z|{UYkG{lMhoYxxG|oY;nKjZFM*Kg7j~ zf+J7DPD3%2Y;qSN4^nXwW3UvmG2r)OHHcQI?ML(PM_`Ar4|`PUNFAEto<(Y$gG1Bi z>S?(+*)A1&k6En>A2ve;5u-4d6+pxb!RvQ$u6$Cq40FVQVOA}!$?=Nk5ax9woHm;R zuQ@J+hlpwHA88?RPdyN;4B(i%iyIm_uVM5ireajVbwVttYiy+L3L>TnRmfso5g#TR z#fk`(5@R(3uZu7jP;sDNBIicbX)#r!D)A=g15!)nsBL&};jbGEKJwD>fO`t=Ws?E@ z5;>nBlg3n!S^@@T&r<|8%Q`QNyd^5ZeC53>7H<#~&(S&9Yy!t>(C8O0#S=MWk^C`b znN*l&dx^!x{VOy#r_pCZqeP1J!1;}dN_-evl#L_-@900qCA7Mj)?groNSOQJ9ws2t zs95h^%Io2YK*YRH0`-$Jxw$q{g%ypQ>4B42N#5EHnZHx3k(rL@lb2&p)IS3CWg2}J z+H7j7#a_cos57$gp&;-Qn_mV7fgSucAP1oh}~_n;H>D_=8w_Kj5;U>Yx88d8VSQhiFIU*^0t)5ba%tyH- z``CESC0hZNeKL#Iom<=ov$_F=D8#7CieP&lHZ;Mx4xl~Wztb3K>oA#(2M+}O!Juo} z=YaabfYb5_b2dYsIb_+$#Lmvgu1h$UPHtV1aOXw>*DKBf*5yHX+Db^PvPAYhLqnDM z2JtRNJU<5PzfEY4dCpIiLcQ^`@HxkU`X{?Po*PNOfUfLtdhviNMuXIJVLdKZZ$p_P zPKOoXR3tdpd{XlQTwO1+|1dPXd<0TxHvs8Y3$1}UiR>qa23RD+Da`)@&rxVf*uWw_ zGc?2k3Z?Lt0Be2LqBlq}-yIreAqP{4R{`yM6S0iWam@Z` zXn0tm#8!jK(wBhx)`FwfboOUMgEJc08w3H)FUB%dI2mKMV%c8}4bX1c2=aWuU1~xu z@U?by_loQvh6Y;5!Jx#S9v0$5pnYZ{a=RdVQ+x#qrh7AK0L`((1KZk zksoA^!RL(v3WY-Zg44at19m?!^LrqE5(d_NzVjMdYy%{)}kGWY&MN#GG zuAX`{fkgJwAu=hF0n5Q;1khT+;8>H1h3}@Zf$W2anqSO81JcZDv=g2M_G>0SaTF4| zE@J53UITo}ES&faXO(nTj%H)y-#a$Y62;;?Fu9{2Mv^6IPQ|P(VwTi^BX*A2ILR7L z#%mkiDCn+;p?lGXlHgtdcbnj5ip#d5OdC0zG=!?sOm=1?b@l{!yw?vOnTOpp0F?dE zP~#*=hL8tjF*$G!G69@a7A3tM{jtc<(JLg)oB`a+OzcaM4tDG(Bg3XKEeZb#pnoyp zDV^<^iM8`g5Ox|M|gC;dApz|6YHf zv#Z;Sp))ff3g_cMKDa)mfcbp9w|rEJTm}v|n_O%u!d(8jw_L2GaVB~^K^PEVtaYN=+WRVaAiZWWtHF1Va&x>jbUG=|AF4L=+d#K9 zZxS%%O{YO-S2~huKo+NtFQq|UkzM5&PW4HwIj7Tk3-Zi1nj%Z3)NRJy9oVmob1K!2 zMIPwQYG`lk>Yg%3L{F*LX@_$3lm?x497j*_>5I`Ti=N`w8`y8sk7d7EzkvOKzKi{} z`cv$$)8A*mMURNIXEXI@|O%YA~y%tZM$8?%*nfe}^8Kh*98P1rs=8^q!Yu05IrmuR%f@+)~0;i>v zp<8}4e&IG7q{q}VsN5odR$;P4`T7I%M~~zgPv$`B21Y-lxZ8MT}+K(rM0T>I@^l_lIYV zkI7j+(#w4Wmkupq!4TiTgws+{2->g<7iSCLS4S^BB9HgTW5lK|+7p}n;z1$NWDKSn zDJAA2*`*K_G=4ty4vh!UD`+xr>TWHbO4gW8Up=)VIR}WTf7W6tA;sm`J>0Nq6K;vq z4$|iTbYaL;%Yd^iYWBs29KbR=Owg{tLW`Pwub90A?H@STB+9PDOip1*ZV&G>Zp(?; zO<;6iFtc1r|FNjbI)wW%H}Mx&Xvf)w6`WJ|F2X#KHXh&{O*N6m6Tc$omM)GJ$T83imP8#H{Haas+d2C>UAGN8Ll}8@>!lSV4)&eAB#T zw9tmx@yZ3^J}iCgE^L#+)^{8Mfwd9BeO4aX2@(rS9BdPX!hK1E!WH+yD(}x4=6TD- zbO`+v2~IymcNuJ``?knfBX2LODexl0Q~Wk|Vt2oE2ZEPXSK(W3T+#VxwjwNw8>QoZCHVF519)9GKK|{(NEx0q$ z{Y2`ssIK^>N+r2iNVuO&rqqtDrp%iZ4-g6@+%HF_!(s)1T0$JT0+kV*)EO60!Z#Sd z9vO#H69S{mj{yD|lLcp6S_>ef@HR2P(ArSThZ%`5Nv=;>OXT1TiZr_YV<9 zixyQFC`gq11xcl|iBaH&KvdKsFs?iGI()# z%qUMzIT%`mlQH9rPiLnKw>g0^)Qn$3iANZ;=Bznm{!wx z3YFkxfhQikdici3dDxd1Kh_TqxfER785x&SNU0W+^XlO#hZ-^AtiUzN;ct-ne=;%# zFvwC@yt=pxZKP$Te55gV2BCO)-hw&WQe9K%MT4}wyr#q}cAL`hFZv^L4xt8TU}42B z^v+qbXa7f%A*rQg^Sxr#VTPXg7yS{uyv)5W_TIY<$^N{rBqOC1dc~6_SI%toN9o|T zeZ`3)S?m>gha2(Z9L=SM2kYE&&T8l_%y5Ht=MfjqX!J)=ou{(1`?CnEb81@{yCW7O zxx|;?@gF$ZvS>ps%Y0gU_!=j-F_1LWDuDP%3|X7@ibIdUr~{m2WX6iCQ>zVtQ_!d> z^G$@&qbijls7ier+}`ZVQOw~UA-1SS)Kx||Y=fA%2J7G9r0v_lfbo%a@_;A%lbeCJ z#lVzZNh#^b$R!0b()eYdzGEVD8cXCUdx_jDB`-Ji~z2Z`E z*cFBgmkr5f>0Wb@5sLEC07l;kajvz+sxESVWEds0PB1#vWM*1Odk(lPaz4u`1N;T> z@0u*SsE|vA-4i)5jbhW;O7e2JPCkAgi_>MCDvm;{7f$8~8qKsv=l;mK0=~d2dE5m2 z`%E5`tL;16Xbm!$Zr_v8W(+uJ~eW5WL?IdT91Q`;iPuh21@MW$gw5z7NBl3 zk-3#6k*gy|=7K;fc^|<4G{LzrNbs{F2k)mau$r*pN34Of%7U2CPFHwfGnCvmp@!dQ z%&_MwIfy@FhHYf^TFPb-bQ>Es3@~sAYeu7k-$TNmNlNZPx@on)dsl=CF_-;Qi*#ip zZl{6c=nDzFn}H*UiHS@t%A0|DJ0Y{k6KDav`;o{>qS{!%&1fIC9l=R?CF-9dRJ?*E zVOIn4NP=ZyH-^rl3U_PH?=D6)>870l?w2FfytPGucs&F667iIyh_wH}-BLL55_rtz z?MRcsVnguxej!TXR66hye_UY|QI%-yNFedg0OmP_%i>Rvxc`bUDGXo|_-_FH#1dHT z9dZ9RLTGCf2_^LWCanL5Q`+E7B+yt=IW&a|4bH3_mYLkT8pU!ylcjY>4{erWr$%MaQ zFX18T8d>@N@S7f+_92_e7FAyCqN@y`b?lW@lj!@Y_8;%YE>>7e*P4k8$ zx4-xoOla|jBlnY$7A@X*M9BBTJ!Wu_0}8yM+U?8xx5?%WW;666##{(JvlRp1aJF=% z?M?14BUF;y=0x)M0`+7;)A7ez(Zjq6xKeQDK=yAYsP5ir;5vKzn*MN7YBoetCoPd957g7TAH1G0`O&C@aR1AJKPN}XuZY%rV27-g5Si;y z{^9Hi!7MJ^7c4MnNj=n)!Qhf0CUQKDOqPn#HG9d9hM$<%m*68hjR;zk ztJy1SmH6n0YVT4LqP#(z2ly*Y7P1)8fj90k(UDax#(_9iw*D6ITDK7kS-&ug#e2!Z z9CcX@bj)5VJ;_lQ=FqU095@oH;5+~ZFPThuNRab_EI7=rdoS6U1t+@)y1et6ENLLuk0?ONbD)(GY|B*|M&c#f$}-6BA)E8=64gwbe!panq_Sa~*?lZ_J>==9r*neB)vxGL(hpY%etf9st8< zP4=t_`h%{loK_yQS4;+}39eQuk4FC=&QgRaMDG7Wh?-KlJmh)E@J^5%8l{Su)zRLe znkeOw$x~t=VBnze7&L<5IJUx_Mgx4_*vM*445D3K+w(`sQDYQ|+ytnN=Z?ls64VYdQhOw=tVxBkc6P{dGeGPVT$Mub? ztgx8dqkGRyRatdlbaWVIwt9;>zOuI*2U%QEQY`cLGXzUH-p~ZsU;IbfK$h#%|D9Y| z<0U(37eJ(4VZ;i}6OOpOEOUd`8LdB~DmUi@Y<-8bDmt!U)PWYPvGo6)R4R`>4uReY zBUES}tNGtawxXd1>*7db^}oS{KU}EB3a*2-q(4Rl`o9wniD{&#I1yW4;X&gCg!{b+RhnB6j06L( zifcD`|JLNsh1B|UDYV5)5)C05aO<&f|2D|3#qf%%S7;H6}*iwj& zTXKI9DU;A6t87X23Ap`eagqzm|O5cP_{(e1!fPK3~hKGfZ1-7p_QT&)X}`|<(|lz2E?Z1alwIVxv+l?Cnu#%#z8aa}J+S!JWMf81 z4W)Ce{;{tZqSHq#YtP5lKe!MbGE3H`U8S+{5ta*6r6>)|_Gz$u#birmK`C_VUbCzsR4yTzTJK-(&5r)a3b4f{)=!r7|y$2;JBwH{*z;X$R;R zU92`)Pb=WtdFYUxy3WqJUNNmCdCWx!%{QG)%TK3+_2?^3C=k<1Q)c2@Y}X<*1gFhX z7nX$EK!^RHRGo{{Kz<3F>qOK98vW7;L2jd-R>-_(Gupg?(Kd*e5$+8GO7N8l)5>M- z7t`w2M5Qe+o(V^LIto7O+Y#s3S(Ge`r3GvE%y*n zbpQ*1D0&B6hTTtau5+kx%w~;slKI+mEO{GwE5deBcv6@O-#zH?sOfO-;Oz*1zk#7$ zXaQ{;G|<8}@f{ExzcZ4~m50d5=o~$0l;tGNTwp9RaV{fi%4j$1^sR%^irl*joGTIX z4B%X7VsXqQ)|rFFVvz{y6~Me_La|tDjtk1cV)}W5iz#o~op?Dc8yqK`+_bxf2d}4J zI5-qzuo_YA1kSMrmPXQwt2J|jXnlKoiCnjJi&6_ zyoQgLtg{tjKCEv#Um-OJ;Jh5FIYYyP*L9Fr%SB}(`H0k4F2Sj<(+^6z2=A`dq*6YV zYxes{ue7kN#v4+fl+&$~tP80SATAh1$fs$YzV7DE_Kj9d#PpR|!2;c2RxISxAj)C6 z_!@$0ge{s$C%9M9-!4+=ZS?eik1B_sCeOzc2QD2;&4X0Wc3eWHc@NGLN37DKb5`lQ zpoHk08a;rti_WQ)SKH*#8_F}s6@*eivA#cA~6 zu+=Jm=GP3#AC+J%S3qP!ErG7? zy0!*ia8o?F5oH1pC|3pnx2rkJnlh^^ZEL;dxrKDECN4DxlDsq&&0PB5ombRZ*VfqH z>aA;Nz%7))&G7f3&5t2X?sC-(mvbiE0w*QlmMPyC649bB;F789G zj)!;>Qf;^zjZ1GeohHoEEU1FIGYwq?i;#Rii%?>G9hhxDni8aoFTgc77j1CnY5u_- zz-^5!dn$vu?>JbF0wNA~JT6X7?as{)D%aJu-r5{*IhHVpB9!{BYitEC*Em{Rqfa8y zD#lszbm?&SDdt`%g=p!j2D8vh62l14fZT)Aktkmho3BWMAjUGMZb44R(T2QCvkn*2 z`Zmw5wX>riVG z!OfDO%}#)eYBP6f$RZ2XG&C=>6dhrSAYPNQqKpz9^BN3`4kheOG%YRDQ3P^cj67rAQ4} zYPdnOC(fx_R?H3%QH;frRJVxCS0sbQUGniYEolmo&>_cSEeu$9JBa?KWl`!?(-)SM zehHoR!8Ay*SO=$AXAq6jE7SCV$n6+;5eUdxK$0lm71Pq*)|A!LMmK!>8nbX7xk%~i z?dtZmip&HDXS_ce0YwV**xe3|ip&%TEAun@#z}S+G{~ADDk2h@!(@2(@u`0m{fke2^kRZ8V`chLm-Lm#$&Idf=4ra~XT9ps@E7+;rfoeBW967|K8@ zz4p>w>^t^=+UG`g3ONjAMC#s4H?rTfCyd~G*;{ESlJfT&f+5+YfJgC7>$?U9Q@68| z6q)Aj>~{_v#&$`2D=XwhgR!jwnC3N3aPO=Oba#cl$YNR+wLMUk6d&NGqa>r@@2-~q za^+84B%kRfhlWJFq%+^`S0;4yisHI4!DX-@n0YndD9})zOJ{}#ho!b6dVw@7d(lp) zkH>E}gA7Aj+^sD3O&lCH-G`zAp@oK{?vW~A5G388&40vEAnE9A@2G1+BSu~wfeRzl zX^X{y(Su@?N0I0cMfJ=3Frvb0GHQ*KkqxCkMp9?%2g!kS78Df=bp1wgVIf_}k^11Rs1m3bSzJ^| zca4mr>o|&w3zy*IIJ!HfxTKJ-5aEtr@yx<8=&g_Y1eJF2tit{Adz!ql!!WMJ$0n4b zM5IAp^j(UNn|~;9tSjP^?9&OSqf!088jcos-HkJow8s!pYTwLhLM%&iT%&@sZkQuw zapvsMR~MF-^9bgFw+T@Q=UPeKw++m*fX>3OH752cOIa!G0L$AAw%WnOyN<>NvR!!> zT#0GEgJAtj7Rxh5eica?eaLAfLC)F%IG!o)R5@N-#C`1QcWlYR} z5BGnj5bjyXyCnxP<6kB69aIq

zD2gbkQWa>-4YkpO}0YTR2I`F*B;43=@?hMj) z!>`A@wN*uW|2u`445uQ^eAoS|d}X9B1<&gYzADmmS$D~LX1@4WNopK?vx)P0`dz3X z;W(db^h?yyDBWaN$+48#>BNwd4Zofma2(1e&U06R^-dCmY8)wu+e>MG^slIfjuvpI zoR|4~ly5kj8r<2${e)jH>aEo(>c0cy>xsE7>H%WD1m)kA9W>htqYssH&wZ{xUGX$`C;0UVt1&hA#I${NQQ(R7#=#Ozy8Y?)72YUkHT(imW4Bqla&J(5=ebceKG4u|{d^H}mHB9f1R1plp^hPKO z+g=i3C)^z*N+qeFPTAhiNs1xZ-Uy{&<4fH0?nMcNlTr-9_(sZ@tnU)U_+~J@ofvZt z7=rbUoN++V>HXvH6XHNPnFUrO&x;|L-w3(0{iSGM4bC?h+!f}OKOrW< z*`qxK0~{fHw!oCzF9qxCh&|UDT?5v)5_?M#L$JXSa%UqOVMp+St;i3>3P;G^ zFvC>c?+i75~{2lA$40*!3b@VIScnF*H2@leqB=+a4^{A)49RXR0+rm~_-rzg-9N_1(Fho*(1ON%`;yOW>f@_PL( z?RDL`c_nyT>TxH~+bGPIwVCgx;2nKir2MtYKVA7ZDgRIG&+yRPSaj)356y)|m(KFg z+*fqzY!A(KMVHR?9CW?(KVka09-6?4E}ie8$*SnmGS3|LD?Bv!6kS^Bp;@Nr(kjoj z>@V`rTv2rCVh>IAM3*l03}=6thvs#nOP70=vA@DYGd0nrD?K~eukp~_N_1(hhvren zbamGUygd!Vd7?IADZ1aO;~zHPb_wT6T6zuiTAA*=Ow)3UnL5ypYvEd2=ybF$aUsYP zu==4Q6+>Y3uD4GupL8%12`w z+j}sBM{hc`B%1QdPl_=T+nkva`HmzSL(MG$VZMuh=jY)!R!TIr^P1J+s(zit=w^zr^#h^1oxh)H7;0(Up2;u|LCer1DQ-f2QYZ9G>*RWsZIaT@h zDE}k&t34w|6MeO(TKPw_zsPfo^50T^{C-5Y%rjg0_3SVAoT~ht?62^=sQho)U+Eb= zhQh7%%wd0(r%w52v0vl4SNU(SU+ejg@-s3h+(DlC%5P-Bm1j8 z<1#7SYR?Mx5A__Y{2lBc=6PQE-?M+XXKWVHAMRP9{Nt5>tMXrE{|Jv5OLRwgCa}N8 zvq<^t*+0^AvGN~c-|P8M`HA~exT8EJ%3s5No##a5U&nsE=Sk&%%6@|GW%oCuc)=3I}fL4C$5w0ow?N6V+1Bc;y@W}H%ljj3TLh} zz6OCFw!QSyl?V7RiatDP|IpqUXbQAprpuWpgS`;$s|=s#97o|_6C=kX#`JSP$|=VS zot{-LH#F?bcRIg-{+&|sUEPgAtrDMe6saxFDZX^hLlzKz%09X1UcdC5tN>H!7?VY&!T{ySO_pwH_>>Qk@Ih`ctDjBsVuOF*JdpdoT zC|&JH&8M94+Yluc^$j??Ge8O0i^g=IgXUn-rf&2$wY1km@rSxRl*8hjIoqOH6AHG! zVDhS8XM-z)g6)AA*9QxbmJz8ErzNl1+f>)uS|`RwCs6Yu&Y7;#z(&ypfqkGDFDdp5 zrfAM{9m|~!0^`&7HrkN^n#@kc7C|di|(?;TYYs%&?W5oo&;nm!l%n_2N8Cf4m zFU@2~4Zyw8h?rzero(B9}17sL#!r6)%Qt^f0(jUE%< zNH1Kz)1ojF9~0kAPf;1Ib(=WA#WBOS;EgLfqtVxbYr-#y(J#RBl4zO#32ZLq|6epQ zvJ({sfpLNOMG_F4{h7cx0J85$%I$>41jEEgN}%hE=OiQ78If{c8sj8YHEylCJSI0s z=DW2Wz9w%hfalQX6)nO>-J7aW$6A8`2d5iq*O4vZZ9ax9Z{-X=e%C!n^xL;l_`0X5|v5-=-aBP`M#FiOt|Qbq(T5`J!r+?>Z;O-(!Yt!so388I*ajdUzL*p;P+3)+vAtB+iT{&<##bTxcCJJ5xIZR^I zLB5-%-nF!E6pzYR^Qtm@?e*Tyo;LBAe6z4BW34~n7mv%ws;Uee^@M}7aOPEeCoPt5 z>%wl!R`EyqeMwbDXH&g+LO!hkhlaW~*xsk4zG|y7WIg>wUybZOl8Q5BDK6qpSw~QY zlF$5it{Ax$DM@K7-3q*mj%G9mS? zbzSSk0kNa$dz|y#VJd3Su?>Ek;W+1m0{IhSEPnI%(}3 zNyF$#WcUM}UEOTKoJqqL(JPl}(_BfhWOcG!lB%n>wH~{$q9k3Tw1m+~@rNPQ$u8e^ z)Qd4m!`9*H+9;WU3D3-=Wc7%YGeDxWdPK|wnaV64V|$^pktx12HpzJpMJ_gJWs+gn zHj@ST&C7@w{X%P4I9DaH;>|a*J-RAs1gSrkn{-?YI%|?R5s)H*ZtrFcv7xoq;1kYT z`95_e)t?6?af3fSVKeRVaUPQ7rs1|Mel%L%tL4kd@+CK)50$TS5;kM8e+O2N*I}$o zI1fv5Q#mQYYjtD0^N6GriuJ6F&E^&uaYWJ>dY5IkC^?$WHA&9%@tO<9b%-;oGDDT2X>qeiR-HR;M>;k6 z=rW3#8NlgCc0LE>%E`{OWUW-z3-~II0}?eTMkK2SMSxD96VCKxRTs#-K+UA|AVv0j6%6`&FfCmvHh2HfH`n3+-2$ zl$=CT#5pIccKXOd1et9Fi4~~_;I~TJM(o0F_R1!HHv`L`A&J6+!p<$GBQ)UoK<#^|W;bzvXZ|#sn1N!U8Q1u-!0TYLF zrVt73em@7CIGh{kF4&XJ^m#bJ#3o?pyK~a;Vbo>tB(x&6Ck;=fhol5-?ZCqbdPq$` zj}8x`=pj7;-Ayk)XVCM030!v7sKI2(*UXHjXwK~6&cJIzR63onrE9rGsuW;%UGgCEWhRjzi`DDt!{||4S&Aa}dU_f?ILy3mg?GM@?i>e;RG zQ^46Ih>}>_8uBExk|nyi-HX| z*ktLvTE0n7pnQp%;Tj2;l~9k7ltv#!yJn>73gIeT8Y8-9WICnfu;5By^zp>b!PjJc(S8(L#^cjr8!7i`)ENV#mnjyXb2yp1B3h1@L+) zTFKT7FoCtWL5enSYX&zuZjf><+?vrMS>7nWSJ8KBJZ};=$u~=kH@$c>jHFtzl^PMC zxLH!v%I97@b7WU<&1mT9#P^-@`w{ZF7tj3tC@@9u&dXbHZ;>>OTd8Y}14eF@&&^w9 z9Yrx?bMOoQMcbLO#^ZR)Cgzt+TbiT4I@0+uJ~uVBw2IkF9Sia`F?sfKM?CGlXi{5u zXLmbhzk?Ckw1fm6d4^9T&(o-P)q{2M8+;7~Uer*tcuH(q)?|Rqm_bXx1O9-oGdpKm zmcOp0%ZGgfaiin@@>i^vqY)huH>Lzjg7ZOLBst|4g+f;QmtY%ssfksdQ@*4=r@Xv? z0I(GRAM?S!dP$(5+`j}1k?^g&rr0aW|BkI6;H0%9M*K%4)e0I%8MRVSY{a_FXrTS{ zFn*a4k!!L8n|-tLAu`R~4j7q~RdLt9Wke>Wc1lQOcq0+%$ApEL`4DrEF(OhGBe8gj zCQbn_EwvIg(x@eTl96-IG2*1bNgIPnnz*=*w~g4u=>sPXAonV14gsgZB+X9jE0>w9 zvAug1=PN{MpyZijrks)IQgY&CeoM*A3`wF~8+x^sm%=4dIa0%(^KkAs> zVPxtg9n8t4635DB;udVERAoZMxX82|85?s40#9cP(Z~Y>9oA#3uQAYr0SwLfjzI!y zywLaoky+o>2ML2Ojk4VcB9z*Sc%Ju!&-0#X%i?*)6+X|nrX3v5Gpg`;Mm6ooB%U{e z&+}$!$HntJDSVzMoiing=Xc=q{LY->B%ZHSbr`nM~lbrm6W;yu>O><73)8R;U z_&ggu_rQ3bt%lFD)pJYYd3G8;&rZ*sAJ4Pj@Ok!o?xJ{}9f!}e<8$lcc{UtA&xX%k z8_%=X@Ok!nZdW|dZo}u6 zr#a3ss&mpUX4l9)rqd{Q=b2f!Pfa>U#LgQQHxHFtm22L7_Z{zHl4X;aH$R^8;iOLd zO5$H#_?1Gxh;D)V4WjE6^A z0|~%5OAz!{VBAYMD@~l4P^_4DQ%=tAh@OaxBLct)5oZjcauaSy^j5rm;J(9y@E89MLm>4N~0XYXKz@8O6; z%-_%_gtNtJG;J%HAEV_B0*iNu5YBR79Aw~#(X?4&e&V1Yc)cehVj`b>Nptx6qyVA?P-W;R_{Q9ezo=_4p;}s@s7js!2juHSv$FCUg&1 zAj1!_Dv;ra1t$!()whCktSdXR(BsZV=*d6_WoEZi0kkQDhY|ynb+jWfjtmz{eW^vI)yo zNZe(EL-C8d5&97m!Ky;yt_-O{!s-IC@Z+EOFA&l`HgrlTT!~nJ1Xm}+e>h+ea+%dh zH}rZiQ0q)&YN-pZPU1QoA=OD(0l7LMoGXBFt$`z}leo=;g5c_eAl^gpk1PnPPU22> zgj6T}NfF@g#`u3={WF}*dt420brN^xpm4Z4p>9hHFg6C`EHuu5nL1mx_J7a zV@b8Y9NU}oaGljM9L2^xrCRS2?02TFlAyT%4a~lPOFD>~vr>Le4Kg^hFex;R4%AS8 zxL*YRw+}84RR;nANWkaa)aH6?VMzj?2yqe|<{(K+Nry`BFzFp)6M{a=IU4?D=3tvl zs+$J+h9r|e5G>PAkY~iFVPqnnNr$j#R>De|xF~QsTY9p@VRa2fCVwDArgI?A%|SA; zFs7b}wM`~d9BIl}rVw$4DicHsk!b>~(p)&C9Sakhc9u-R;z*gyd_2X<$K`{{$E{{Q zuJv-Jy#zvBOM=)lE%7vLud9#krNT9>wXS;>Z0~^PcV23I-24B=&c-`pF*cZ(P61Ot z2eaigsgs&^Oa-=rQyV#Tv}NK__cN+Lu;5}Q2PFnDbMAjC^Q4c}W(+bko4PY0z~JZJ>$;TMK3i7T_-H-A(FmJTTb z)?fq~9aUT7xG?!&Y=f{jnF3P^YQcXL(_KSk$_65@d`WnrpQQgRIvfO+Y*X8?z1&8w?m}Hn|z8?;JE1Hzf({9^m{T7;99SY|D&VCH+2D zlESf-#4yx=BT-2U;^WT!QCZ0aiRsj}O-=n;S;+-yuR7OBYafCCZiIal&h;4{G(u8PAB5V-fw8_qaMw3Dj1kWDt%=1pazRLO z=@*G@FZ#-sx;mwbz(^x>{|797hLf7H z>{Z!JYk*6(ko&DZ*j@?D|D6S#^9(F$ugb~>4a4?|U|t5q8x{-=d6X>Rx#3)3>76Sh|iZT4zmh`lmungQ(9yMSbSRsK~-r>@_?Y_Fz+ zfAfEE^go;{9}gNKDX8y5?bX0oB?x{Oa2_J8*(Mg-tA!!?xnCrQY&H2<{jc)#BS8BOa6PcFX@i*b zYqN4)nwSMA^<>$s%2S4rUM9LxZViigHjpnh(XIYnWw;*L9%T=;i2nrg_a?e!5i7&> z!1jn9YE>3TVd4``YR0lEmEn3|dqgMA*e&9XK)%aFw=801xE|P`(Ct5 zs#J#Sf$b4J)FS$T++m_y7O^s14{T8AL}cWdM}hpDiEi1f$^$};O}|B#ZPq%Jl*AZK z42NSqNSjqzIA|EQSp;)1AdawL$Y$XVn~>J^K+*(+50&cWfVjbcvDvK3@#?Dz;h20O3SJA&I2Tst&OO0|EHO0|@-20buKaRp$%^Ms~mA+&JGC zPO69Jc>DV!%}I6W@aRCY+HIDtR#W}0E#P~p$(t0cnST_sEklTrX>+g2(qJ zAIo-Chgz3CMJ4RmUSeWx7)7cfqc4&ZrQHt%FtoIezPRouJci5o(9f~29~s4)hh-K!?ufHl2MPR!*PV= z+*|dbq4s7VX#!#-D%V2+(P+TfY*%&Npt0C?5!Q9Uxh)tgq`%d7^pL_C{jCAlgk&vB zh}$+?*{(%Na!rUMQQ59VBQAkXxWBc?X1f-J*e)thlqdU`49j+90FrIj;BOV?t_+fwbGN{kjG4yG<6B{aU;=5_BrV_PR(<#+g@e zG6I(US{ynWIVjmf?N|@iT3k73EVf^SUVi{L?t3j6@dxOH?bi~U{aO-Yzl>Znfc<(Kki2w%sUzH)#{N4@FF}B&G);8E zxn9MCMo0I*rGrTHNxYd{#of}IAWdxFp`L)GsuX01l_qnK_RB2%;8ws955gVE_GGs~ha4IPmiNQb7q47F%)0r_JS-Lhy)L#@J~(22-i zZ_gZw^oNs*vMk!t`y$nhy=J`x$k&?amPK0{I!84q*+VVbcR+TGGGwj!v-_p9! zVZeSB&lc@N6r44{X)v&)MO(UV&@gP#2pluIA?AMYF{6U(W<>f<&kKNAM%C{PE{0>ria2A)0DPX%-Z|G?m?60Xl1xQUjG6jUDbgaL}QIoD)aX(1WTG|2uCTT1^-b@ z!}ak7Vj9*4Hh@u^$;`5WE5r5i_J~gPfGtkq5gZS+HGLwBuz|# zlc{Lgz?I?pczZ+-wSmV1d8>(T*}#?I`gnUpC(YPx;G01H&_uUv;L31)ygj0a+Q8Du znpg-YHDlSpmErn$dqgL_+hxB9$XA=_mJM7Pu8+4zbi;NS7WNw;i)=%7tB`#q=bHsce9;q@(Vz?E9tqx+@&}`K(?}U zFw*f;(e#0HMOC5>CKLs;JM>hOuxZ6OWLus9#!G~gXyWjxCh;K$lY~WK;~F;&tDoRl z5_zgge8V7gz=jp4P>4kce2@Vk4@~1zO*|n7BlRbOUz~~17numM14;)Yc|s3H>K6is zn!E^r4}(CguBANBB>uJo1`#jwJd=^o=)?mwkqal2iI3{zK_Snfp=TR~6^$zk!f69W zw}B%o3s3!^Ah@C+h}#kT9t(mh3eURGV~zTgBESdOeU0G17!bBf!qYV<9IhZ}kIgI; z;Yv8E6YCEP+vbka}*yKw#c?b5xhO=g7pbeLibosj0cXk_Rx1?<~TIspDw$F4@ORX2y zhmY1ckzkvAZMD4}K7PR&RAkaYhyzxeDc6rMGA?NQtCY&2Fl+E*b*;A?rE@h-XrTi% zp+FKoH3!T5!zYzZk%{KvH2t13iDOV^IgP_~I`)*F1<*ohdeRXbmqDD+^t6uml<9d} zMCnX=tQW&6E9pnQhhJyVFFMO{IRBw{Iv+Jd zhnMMe{@ZZ=L+`S2Eh!EwZV@$Ad?N70Ad$D0ZUZQP_H}l)cZ!--!{|W%JLx;uwG^_u zeVwSO;}0*=2fiWG47kaUyF+T4lX1?M_$KJHMz6$Ht-Do>uWgNTUt6Hz)aq7m7tC#K zTT~n~pck!yHc{IyU%2Q+b9+yxsO^w%aA^)m8gW)}?Rxpf!*6iiQ*Ebwkwh9+w1qk%6EHR0OM~bmNWB;z<5L z+Rj)czooR+cjBm1QF~hyXR^bHma-q`FO43B&gulAROs!J@-(7ky@ZgjMS=v{0!WTW zqV}gKT}zboN9a1D0+wA2)g@~0kXU~)v5rFu*jT41JujBh{+sA*dgiYjoh6bWu~-p^ zmVziD<`DaAddGrF?eG^CtjhdCg^5!L+U+v5`@Ga{fT%e2ly-aClzx{=rl%1B|%6WfI>;6r9A2^D4NB6p*Q8{F^I=1brn8Rm;oR5uHz8zoxHdG_(f^gTIcZuOmu~ zuVz#vNy-K@KA%c9vx(GAW*`7B~gwG`M$9MX^M0EYwwgvdJTQ& z%8b*CGg9`(27q*nnv=O?JwhaAj0AthnaVY%aISyHWI(dYuUyMs&!2w|^SPr})SSxD z`<3>E?&@e0HCs8C&!o?$3PcLz@^=SXQ6_&QrT3fREp^hn|0nLv!=oy)_wnk!L=uv8 zI-R8xLLwk2i%Jqe7ExIh1tbVU5F|87Adze)Asb8Ljw5P<;(}2#?h9&ETtUq^<0uX~ zamGhP1i0s2Dn3i~!)saR5nimb)woe!Vt)eG|T z!!cBV9?q`Tb#Ob~wX4^o*)Ruu1^g7RzX@#jgmK_ekumE4I@Oy_Bf=Ml08v>yINq+c z2^=3*n6@Gq)mFkIA7PIkO%Q6P(4)M#ybx8e=t;hnN4IQS@X*R2)WM=%JP@oqWD($0 zUWpHmEqaPkH~bokzJ#&paRznSAl*1bTGQ=&Sg8F*DD+9Dr+9bvLKcQr8^2t_Y? zB1+%C#=h^?ihP2;**?P?{0PQ>)CRd7qD(D%F6t;8|5a~=-4FK&p#B(@jhDwL&k06N z?WfcOs+2cI;pb!g#OfcNoN^5EM%{&<%mv4wCefvYlAn zf}hw7B$F4=-B0KSC66w{cR=gZb&HP~@YP8kHKeGxu(Ui>R!~)m5nC-jHkNukHKZ1E ztQvetsRq-rDz$iw&W;{J-`=Py#m9FRXX_mQ5KtB1^Ah+lDu1zRagM%`HiR;ZD+(L! z8@c+%;34Js%uJtB$Ld=n^sPQ6kJGoZ^)09L@j7?n5PYGlv=(2>!^bPuRH((r>FlXP zDvH!JIDCrEUWDv$_z61yOkx9(VfGrxeWK1>OkgMT zB%QfrNWqf6=9=cChLTTr`dDkazO$0MbynqeXok{9in<>>AMZ)Zl5ww z)^}UzZlCHnMc>&>cly-GY<;H{ON-)K{q-Ig@+`fCNS=yzL9Id0;ne*ezO9{h@v3= z>kht2rm`A2f15jBFMYC__|5~aJFCmq)s(2L^?YZK>kg(@m|Jh)8}EnTfRR+zCcfpJ zCX#vRO2z)pOy2=%@oIyNB8Z-bXsd`C2#ZvxtV_I!l%7oxJ%`oHuB6ra8^l>#yn0}% zqPv%qMfGs1e}qeQG4r{c`D_d0V=PuvT)b9gwX(pE6NIQeH26v9M&C%%T3x}QeKv@$ zRBX4_sB4or(}%ZCLYV%`S zU0hqI@AWXlJz@9RY4t$3qPDyW-|a%tmZd8w2^o+@W%aXkoqkP}x}#0fQ*ro86o0xp zX$I~%6`gYZsc`T+=;!JC@$({nVqcnrUi~NlH&BP3PF>i^Na-)~B&d{>(}6jkFmsR_ z``tCTIulnZH_iixo<;aMKtFV21L0EWCwB6D{QQKx*lVxD&uiD?XW~t`OFtVZnWFQ4 zp}dTn5qiMnguV`nW$Tj8BpNW2N^6iuA;m?0kDeO7k8*ioQ3^*;BWeAmiPVw@^`h3o zbcO*B07}ET+VDOstNxZ={4E%kqUK`qRVx@?-kPAQba}2cO%` zj}2T*rFuF&ayvgR3PGylIE7tUm zku|GMJp%MDqDTXUIvc(*y%Ha6%=fvm6C_)|%Aj@vzH;8skdu>>iw_3k(_5IBU?@Gc zaA9pu4tY9#Y!$=OsfDu^hVV0M)+&`T%cDl)pDx974_Wi4E~rH1or>`~Kfztxah&@< zmR71RMM>9(mqxCrF7bfz$@Ix0g|9EVY%$T~|BpqkR^Nvgr=!{``FI#MmVT0{K4Pgx z)9KbRxX^BXxVqfKpW(*P?CGD0e0&9x(t^b+F~dNpOrN)N8+H7P0d+<6K; zz?VW#L8Q>Z(G)selR^yA>9v*gzDUg)nUs#DH;bhVrYp^hSf@~4tbTJCZN7|qoy3!V;WICNmqO(ATBc)?$i#Mf(uC$dY8T-Veu*5c0 zf9&yyETm8}_T&d}H3@U2*qwBjk{hRW;O8{@S%{ycHD#;om%u+N>lb3mTUInf&kr)6 z9-u$?cOy#nER6-%IRso-AF7(JzkFJwGIyrh3bGWX;qGz#GZ&C#ctqE-;AQ;KUB(Rw~JI>k?`*@a8d z99*4Oj_JHk1YH&W4I6hD)Pb7~rG`=5kQc(|CiCOcs52Xi3GSM5$R(NCx=U?BZaIC` z8((tOUwATURtXDY=q~rOZOVuv} z3|;}#9(I~2?x7Ud2(-_G^`;dS;d8sNb#7{M6mA|(P#zA}l!c1sR)&gBnM=R;LS}G@ z{;=96IUfhkmN zF*}CJynH|kIl(hTr3YvIqlbwLkni#krkG7@smzyReD8-*U`~UYJ(VJhnF;)bb_$?Z z&_aIUVm)A{%@GZG5Yp2L9iAu1Ng8ro7(^vO(lShv)!`Z5M4IL;ru+7MPd(@<2-VcU zCDgL?W9!3cJr`4VnM9!kiW0mSrRi_5>8HT&IFv9F81(gO;rIY?e%gj;Lue`IVAffz z4o~;`|6=ZfwTL#5MLR%uG%^;VoNxIqG=Df_hT-)(5Cv~P&%l%n`{-L;}H=>dLa#I z-Zn6zUEYpm z(r0S*o$2Tm)x>rv@)quRKf{mioF-Dp;{^Pug+zkR3^Skc1y~!_7id2T;WM6?_{_+q zt@i8!m3}%X@oy6Gne-uk)WqMxeR7fKEuov#=M|%FhT`*OBa%k}?*)nfYQif29)5GPw^^BII(`Od@=qmH*tMb*()SPI1PRQcGC zmFnKdLQpqJf1dX8)PE?|B|hL}k4uI>cfZZ(JO%?@gQ9ZlRMMgurrMidI7_KJkeygi zP^AX!^JLPh1c|jdl+xn_rE)1XlWJE@+qDcfnGZKqwJ>a*oay%3HWoG$f2 zy%3VCO;@m(K9=z&$Xfr-%wQw^=V|vYz-){v_I8ZTRI#NBU(vXdzNrC^8M9XisMl7D z*P@n(fWZG2vpL^pbE;uO?#^uR{i;>;6)IwLh7d5DGr+tA1RbyUm8R9OxyF%Zh-ZV5 zX1@?$rt{)Q|{3^y;G=tK^!=5T&Fjmy$t;uoqA}Mj&iiEQu-PH zv8Q@^s`1i^^Z}t6KzkeU^Pj%#6W$>_IDv*I-61@90$-v-cyI<^qCVU z@xh@3pzVBKElcjz|C9EEH$q~eG#dz?yN8d z!C&)v)}18%?{ts+P*V?RTSa$gB#T+Bb^ldCy;>dUK9$sh?sN42e(z%af0{R>|Ho+g zB-U{`;MV;ax2tb#-`aE*2AIt;vsV&1mdrK9`fJcs|&nCF*z)WaT16`V!WlmFL{O-^pX zyaL3kF{@u!SbHksOS5Lx;n>|ooB+wqUR_yTAF3`YD8*EX<~jwnp*6EkKd#`Eb;#vI ztkViq!V>Jy;$OdH{KPiF44y1pr5u5uWJ;=?T0;Nl@&A7anMX(2c0v~Ki}=ybSCFqq z?Hc9(d?>{n)gzuwtd#P9(eM9U$eH61pIZ!>ycPJdB}^uJ4*LotaRIs05Y*HfGJG+d zq&J}D&Lg}3pUaDRrZ(z8IA7;K*y9J<9zPnnUTtr*oTtd{ZPDsc4;laeT+*32uuTX75e7@V4c9uh9Rm z1PM)YmkCL{koZ4J@zPAz+m@%)(p6_Dbs5U|E&gezp`Hbk(F!%-=fkO^P)q-f>Hqz> z{ii;V!VvZXOKTg|fFCj$83T^{fcl~j5|iv#gV~zd9hh+bh}%)iT;-{W@6N%J99iB8 zCjV%bqX^;G0lPJ^o+1y}eKb#zi2-`@|Eaf{Mxg_I8ypc7%&zka`P|`FaJ&WoCXpbM z2GP$b{HUd)VSop4^#uOeHc}JcfFC@MEbp5ppVoR#TgxN77V%K)y_vc2s^D@ADdHiq zQa_&d!N~P$&hV^>B`D@t%9)5CT|5<|782@LxkIfwRR}~W{!JoswRA6Prw&&w_^0`t zMZMNzp5yPrY)U5NLu?_Q0t%x^VUCL0oN+ixWTmS-asq02#!5~KtQA4kW4yJU`jgpGX!xBE=?bIVo2ys>m17j{tN=&!GGAaeYwyRp)E6k^8GqWSkn$zR(h*i~+uTuw z%9kRE*`sQdFI5sVM}-u3G+8OP%51y5j$B=t19VtQ<(8_ry9(*y z87MdA7QyRf)I@roPrResr@fO--Z^D{iJlJASn1(fV*`4L-3rO`kJv z@em^;3=SRtr;kuVAbQaCGf;HD#-8z#Ezpltj4lfTwNZjxfAuwR@s&uNgdZ&c^}Yx_ z)TjaV-k~&wLn1_p@zm=*;W>lncLO$g{d8BU77wx3{lNe0v~5PtsW@&ui$dz$0p1QN zx@EMuLvyES%Rfm#EhR(`Py)6*T>tNX(sMK}UdF#&o@4Q=cI%7*2Uvg8`kvA^F*IR2 z;%aO@#r^>7B4QjJ@+c2osHHn_BL&H$@lV^Lo+<+on$;?&V%XP&Y5pgoEsJqK=QK=c zwnN06`)F2-vqP{GP8j68>m5a#q^h~*R;4Z?q#J-8iJWV^#}Yyt8Hs7yj1x0M*a`*Q zdxt5VYQpKu7ZR`k$;!H){|BhQ!oNvWhI-ob!d#^WJmQO5g%Z>7qxGc`&ndCRLj?a* zk(iIWMmRlvX+a?!GSG~$tM(o$UklNuR#9T7K+IeLGI}2;P+JK`q9=2d(y2coON&gA zD@Wvo#DXNIu$9*PBV>Gzf0KwzO`HM-Kj6x16}lLxg#c;gCOXbF$*hIQ7#B=$)M3*Fxy8=RMdl!8w|OH3D5@<1Ziar0z-qg2opAESwZbEd5ehsSiHG(^UCO0>OIeckR9Gnn5LrrxDdn%i z!*5DilJ>4s3dwQpF4n~*hX)SBa_EM)r!Qhj8sAmp?i!5l>Z=)s63X1dGtZHZoMtcv=XE8 z*sRurf1ghWxR zm336s(KE*D`nIao$gF5;%INB$?X+jh5ww3j*c9qGc?C)f~3+z&2 zOQClMRdr_82pVQl)fP^nXT@@%B{4(bWP`JGXGI&5eJffk5n%Q?!v0>H{ViZmN(8cw z5+%rpfvhoXrf90uK-L5?Dc5Nr>m)HM6i#+4oYF_()Ch&)e=3@V+4%tLy3rQqh;xjt z(OE}`t|U%$R<28&=&Z?M;zVanH{z^T1H$bR>)0huH#BM2dK~&LGmh%&RFPw?Ek_7) zMAazkyUe2tyS2rYp{DkuiC<#kvin$xx20?Iw7)3CFJ+DvVp8Fy%&{&NUdlW^Oof*+ zXNU@>psEUbfGp=Y^&FRTl$0~e7V@yQEaY>UqxuM`Y01#rGxcz_I7s8j8k#?xcYhX=N2`q=S{tU`5TW(>_My={e7 z6%uirsI+R4NZ>?;TT`6l#Ic9sHP{B;!ZQE)9+vqjTi>KI)^|(hcq23VrY)H#(zYWS zf6UF0;tC^FnL38+n+>T?ZL3R|_uaz#NSpT=#2ef$$sEDb;UifNdCl6=s)G6wgkJgF zc4KDZi+8hl@7gSG74aG~C%eRJ%$yuNQU|B$iq!l} zA9cc?+`)p}E+f3By`h}#G~ae!^1u0+<6QnXKXXc$|IN>wDRmn?0|9KHPv^=U993OP z$+g7Q+cv_g#O!}TX8b~oVKkkM9rGg2BRHmliE8m;LG5;zi)d%rYW-D2n_;^h++&vU z6>^VR##bEoz-h-)a^{1BbZcF48!J4)MfVXWW4%(gb1~%W3(r43RR4k>99cvKgr>6fdYkcXg%ZQgUV@atr%Xc5MlY`L2`C*Q)H*Et=7aNccmCR^?fv*qqSw%qO5 zlB9Urk%Ib#rw54?MKL7Q(}Obm2(_xbiYxdw7HZ*dS*YLH>Q1U+b#Dt3>b5YUZtEk| zZMINwu{#D0;0a5KrCsUHK}oT&H=@hNG9^XTEJPg(G5KZ|BHi|~4@HQ&Fd^!~gsAHy zM4c@}3{BP=2E`B;tF5Qr!lPoCt~CxCK;47Ywy)m8qwhF)+!SuT^_;ZYUajZT+TVb| zN#DXWzgTYBb(io}Mglzo|JgMxd!D_n%B*1newA^I>6=iiUuBGUbqQZ(oDkL}e3daP ztV{SRV?I|LcL`r*lu4IxrC!w0b0(EV#ps(Vt5oiwxEb472(9=x8KQWHQT*EsQT#fi z_;(q06MPPC^Swzx-x;xF09qtjG#mbr znOJQ*nqz)I1su!>%)@_H+nvpNv^bcN&gnavty1-qDRQ}W4ifrEAfheSS|ns_TVx@U z`%{K20(UlB2;}~hkxYi6c5gKymBwbugWPnuaFMR)pEGo%39H%Qbg_(?ZoE-ZCBT;VBrmHz;mS;d~d_18(3?-3f$7puot8WTNP!+t83NLK_Vlq;?jq8 z;ruf=%RyKf+Q{eW*%&(Cw=W|;b{lhg*X|58CZ2q|H0H<8D<~PWytJft-CBeG(DQ32az|f;&Pm6c8JQsl<(0D zGl*br`?$@uFC!SPx>)UCZUw@v$(H&#;kF~go?p?^Ss{u*C~HT?i9ETDhS%L6QO26m z)!Y}|!t9R__ET*3$DqR|VQ;a8rC$1$4EKn4OGfyJcT0vD@r*81j_x-u%Ft7ZSKHVq z*wxa1p7w4j=b{WV52kW1%5YC5F3Jd>N?eo?K9#sABWx;hQHDL0Sf?&A&9}r_qc&&w zo_h;#JZS6vVxtj}#48{<^^`lC<*dD&*;Novp?SlJnq>6WYv zvomA@s~4)-8S|xoBlpVASi-5nJlW08DB$!6cJJ(rQg-j`z_U{PH|VA4&ngQw;zc@Y ztm!eztaWN!hM$|qNKl#rGhRtp6XsB$${>uNYx$9r3t=~Ysyr@f1+V~w(gXB2@MOHl$hjRj>3KBy(G1sb8PYq0E`KPMDC6{rrV@=1a$H0Ly5@1Xu zdmc3D-BizJ%E^x#=%!YUle$=k4Q9K)d>-?hBcgiRFGdK1I-kJ8o2$-~u*<2O}c=X=&8S15+736^-T<%qnGcrFKi6tVQ`T zJ^uP;rXDZUo_5cAZYDpbk2cLjgRLLakFVB7h=v3|rJE@ZMz){Qbz>k8DJ^PHKc^c{ zH5ExE(iFF#I#jO?r0cquOCQ1j+=^J{vSv`(KH+# z$UBgJGN;qfXMK^Lz#^Bp3+4%rdWnmDc>@X|)!;w5${_==pQHxL2jIIO$#$!Yj>S^Rmk7+R!TO5`d5X@Fv&=tPPb^hs90ByGhpbAi(#i{(-+F*CQ8TNt0=3;NK~r+VCrGH zilrHxt0U91j$Le#7etV3Taed9kX`AnS;td`TUlR5x>g@#X6eH00h`(IjjYv!cCA`9 zP3qwYZdF)OYq5UAoc`X#_Ho3j5Kg~wi?!vDjPwK|l&&Wbe`sJv!|fVBc@v8ia%#K^ zo)${CgJF1h1j+DdSSZ~@!?@25ncC;2M<~5imL59vS!fyv7I&)12w8;wv?yJA+?D80 zi_&%2-rKeu{SP|03cR?Wuo44gQ94cq>t5HGn+&AKJUz+#DowY!iM6cU7JJrlO$#gc zRhk)qqG{z~eU&zu8AeCR(gj&F#esNK`YO#1OH=d~_X}hc(&312(oDP7;fQb2>~KV* z`X)^R5$GW$Ht|i`5yYLAId(MS+cb$rv@{1-is*kASDD_7M;<96@nf2fNa!&?uznpY zc(nBN!m5Be8ozDHz$F6n3rsUgN*_eQ46Ci9Ic6tjUdic6tWSRMYr!v&!gr%^)J;aZ zUNw2!7OCK@IxhJy0vQa$V$8rYW_Ws#?UskS9iFb$#IcS*o=}+RpkCdLNY5J9r3W0n zxEql^j8{_!Hz^euRL^Cg3(|kgf3lHcX5c6RV9!baX_iw=`BPE;l=NfS%)6Td=L#C{ z(O@(MAE%~gaf#ofMEaY{fw98Msz$8t)n{q1*RT{JzK^ar_B^byCc$LZXK9DCt}2>L zh;%mFFgmKH8nMaG(q{6uhu_je-~ro7Alreo02A9CGCjvnh3;qfoh>Ch&o^9vl4%gw zpJoODmSca~cxDyNa_mn#h2@ZP-!bK)A*pwaYv#Kf5A`l+Tv+QopQeYPz16Ju23zk} zr1a<0%nAwI_88W7&qqzMv}T-oiuqIvA19EHWR?M$$}6txe0M`HaO@S=}`-iZyLhACgREl0$ZC`J)szd4ulkDAuv81jbq^>kM z2dJ;Psfr6qGkr~!F67#@LA0ljt>5OrK7qXB6mq@cv89;`*=~}X5u4J5++cDpq?vmx znbb_*;ms0%!~5*ib3xtcEb-}sQiiAf&WqTmp9`8`N))Ct&jqJQM-xqMh_q}W`*k1q zyyIRRTY5eyfw&?)v45W35gr%VDkYv~w4&O7BbdzHa$%UfdIs_|OZq|y8|-*n(q57D z>7Z+3)MZOz6t7(q;%0mxRX1Z_h#5U;uM&GNWt9)4x|{KVRChBzkQ&~M52S`S;{&N- z&GTbpC5Ffsa))6`mt8dKae=FU?8 zGPxx>7qd}B#_(#Q+7NsP9eg_na%!njcK|*PCLlL5KBklkVLVvl6QQ$Z2d!YhH+P zVpHSCR6SBzZQaaEzh}4>hB|1d5AY2-2%~;UP2zJf`EKp-#y`oXd4b2c#azT~JwciC z&5oIdzR?>DkOx?8dpB9IGX^DEs#}I)rp~M`uEG=B^lGYp=EhWu#!nrADB#u`#kZ`s z-Oa&27P6Zy6MwyPGm5CjgZM`WecYRV$~sWqF+ts5BI>_M1%F?}lx70ZLzJjbz1C<{ z(}Q|7PrdP&uLY_Pf(Ex1GvNd&asX+iH7YMsOM()D-iIQ-6r>6Aj3Xo!K@+)i3~~oL z#52|~PctXDijdlGbJP|dN9Y(3XXUEPP1bGAfeVEc=g{?^rBBbc2D3Px{w}(~V5+q0 z#e#XC*lQov-Qg|4RPGM1YYrSG(D7mHZV#q0yVt>P%nhqqT5S&R`QX6^KmK6;Cg%okwwp z{U*B%;o*0Te^dDKU6UxXR;eD7Sn2MmbeH!;s_vZcT)}do{`H@y{fNt0t|wAWmv^N{ zzqM!<9!2_Vs%M~R0?({byG#LPw8qA)+$61KqhWo!Y{3_R`Ek_D&-Ex>!Dr2ShZsj~dQ9!O2Wn(AV#TuV~*W1?EBcKKF$wYniC@nU!$4l*`d~H|9pschU zui1FY+(2KBz-e`;fJP*_`LwzDA$r`or*lc$F$U6K@|7s5Nxf|_7%`Ia7;>&O_g*aw z!k{vH_##D5+x5<6o%$k0w+5?iXLH4G!7yeEhO%C^6b)rcRqRBzh1qVZ^!(U-#B=2; zbr_on-Mb2YypRhm61mQVlUda@C8bzdC#QD_u-l2{>=btD(j zj%g|nr^%^uto1tZGFft>6|wXf}%{#Wn?=mD~1yOI41_OO?^S3r?G>7MSGY z#8A3m>JB(iDG}3I+%0@Ii;LT9hnP-l<8EPAiU~1c{}q02%}P0i?xEwcO3(|QVwzh? z;FVLD$(z!j#|*_>cm=y6W@3Tgoyzx3FbM6lB}LC#=vX4w6?8H}&Q6h_nA>9at!6D2 z7^_2g_ywmJQ}hVt7ir%F5&e1E?VID>&9E%bzlu`x}hh+I^9eORhsbub%26LqDdEW2jd7x-vW-OVQszN*b|< zu~zo-vlNylm%Bl8w?poZX%h)(jxpvXSAt&*b}o47J#zKnc#2(;kHSE?FCNrO;N{wBHgfb|=3}HndiS`XSi_2i^Xp=N4ZuqikX1 z1awcj3XCx4`6AiOEiirQ{Z&Rf&ipPjJ9j#3^o%Xlc478zvI!i4*?WeW9+lrWDJPIq zv4#&dz07O}2-`I_+Yf~8%Z`jysyo@Y32}R`b5f^@7*QK|o*Dgd8p}7+W|V(5EBn07 zh~_WPC%fk_&nJh^U!G64=Py-i $4YP|29xeq_2TgyT_CHX;SWxdu9z~b5?}>tU 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%0A9{hu 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 z zKM~lRqWz?=&-1XMI%liTm#_(HKk4hU>rqafv-vp1u^!+>)HfwYE3BzVx4nNPsraOn9A7QgTho3`_ceJwg&tlkop2N@6 zu<6ZFpZ~z-TkU5=+If2P364#+`YeYH-R3?B|4ZGss66(*Ym?2-_9wzk4nN1cHrf1y zVN;yL&%>@wHa{Q3W_%7m+u*c=Y_j<|3O4>6ey(yi>B&<8yPx|@Q>e^)U6NAmn9DcrqO)y8hO0XrGrTyT6b*MO80Goy!ex89% zNc&0Ot}kKJlEaVh6vrmpyf_awOLF*G?b>AX^C#Fua`^etwaMmZDo*rQ%&r)uHXLPqb-6KCLX|wQo z+!-Nk=x%wsM}F(1&D)~BRDkZ5e+f(RHc6W{9?)cfgYN4NWx21LY%WG0;_c<+CsGOv z0w8KunMe1-CX&PES=e;vuz4RgUby!{C6m@yRG%C+gR4-V95(bRfNpI=?+LF)?f9`1 z{CM`vUY{AT3FNT31vcRvHgCWtmcwS(GfqK7~zp z4x4ef$m-oo)hE5yX|SRDDxEQ<4n?QChk6u)O}n-U;8pdCd9)2Kr1j>oIT|)4dn>K< z{j&r%^qyt57+V9I&Kx%DVbhnx<~&UH@_n*veF2-695&~kjr!!Uc>p$jIcz?MP5FfE z_1XU%)F+3{g|O+&Ve<-X`f}K8Q;quUo4r2A!KNjLO&B(vIc%PSOJ$YFC6Y+7^J`~aJ-95!dvqCWd)u8;c6(J!#3I-fb3y|A$szw#Cep%2V)5Bzvm zxpz<$7;Zm$3pP`fjsBFDQ;JriU%(hL)}gNM1_wC3T$skQy1E-cIa;FA+PI%Fq+N=$ zlPR`ToQLXDTCc+fix&Klja>9;C)0QF0Cy*|0W}*ce9=y3*KO5K=3nA<0<@C};2-3m zg<-O?F}+R)?NT0kQSDNefJiOcrF>nab}7S?C9F6EqIYL|kWsnQ&@ONr*#rO;|# zp`)c9UI45^MGJlY)QOg+`kGnvO!1o9$*}lyhiJhD~J-n=@e( z$YFB@Y`SyQ=RVl*(OCoX_M`T_VXuKCa%g=HoByy<<#V8(qf`}aPJ7JOx)Jh%1;|?LfR(1 zpT}Vn*ET#SC_it*CZcV;5K^<;wD2?7cyu1y%2WoAl%F*Lk7ojk({qP?4ze#J^j_pd zP1JjlPHdo5!5u?zhbhXNL#|duc#$XD{;XEyall;MPpele@?#Fw=3Qa4UawZkbwnE} zn4fF9^hjSX1D;v+8y5{Q8g88*?XhN%2A2oDo4p&NChZIJ&68sa#TXJoopyac}A-H)%PJJ4$2$t2ddoC zirVw8R(azX*g1Klc77wp0#6;D9z;v*CpTKs*2d%c1~!We2PE@`(=&q`5WPcevI|H& z$M^P3f=wOTMfu0^b27+(7&#B*jZwBu7-U*J^9$VWsogm+DqllUXPD?53 z*5fP`&9aV7nFW<9N2Td8H4D6lLI?f}3$A0cjU?49Xv6aA%z_rHCeA}O3ueHE0-~^h zY!J#R2StlNOSGs+pl?5MB7uJJHzf?<^ELEX@GzB)NhA&uI>ILZB!Z!%(WAEE(LAh` z+dBQ6E^m;{2-qCIof-=w<3PR}W0Q#>PZrzc5Rkz?v&oSlJ2G-2NGT&{fn3JO9FSKv znbRMUd(lC*ECCFWj+yHWb&$hW6q=k_uK(1xvMUWkKQKeKIIz2{X zde>HX|B$*wA2JS+E>aG)TMp_tEEZ`(#h4cxKqtmlrFb!Sg00mt7K06CKy#>gj!tvN z9N&3mUbG%j90vOlhij}j3@wy_*n=LcbbBmQM6HL-pOj6q4nKm-+12T1Co)Gh(swo3 zWE{wQ`>3&?Vta#pGQlPXfn2_?O^yY5myv3+nP}TIflS!XCRc-;$4DE2@+HWMLv8XC$oq%cq&P(16k(IS zLD~a0DF-=ls!fgq>0+cBjuv+!ltI0&;QTec2=floc zeDkyOqWf3n-e*Rs+`E>ROm?XCeFaQed4$=}6UwWRe&p5lIFmf-*TXSuj=RmGL&nABY z+5dc-d=9dLk-^P418A^qd?3GMWHLxEBgcTOnP-`+Liiv+d1$T|z$^SJOfD#A;}Tu~8T0UIa6>H5YAygu%I z=8@OwM?|PT9)jBrY z2)aGr@uuqe=iKXSMoi_g)!V93ru&EZp+-3j8)uY*FraJM{Gbs`^kW2%LMnC6Qx?r_ zoHc(@>Ij~N9`i4Ddo05UUI3dhxWZ{>%9SAJFmfBn{fs;cvYwIGKz6;<_Ok)xJVpjw z=1DQ`6F^R6q#9(_FKwF(L3X{;CRc*=U2T)wK!#pxlT{!a82LTO z$xCgU4?%v<$d@3s%WNCZB4mi`Y_c`T{fz7iQW~*sNusBJK(@QlCW}B$ zSZ0smx@^iawGZ*9zMlJ#Q;tt#9dXVs4Hn|_f$_GDDS0lJh`*^^nu^&Tg;;WaYy)X$5)yNt@gba?u(!UgYRGkW-(s$tNIH zPut{skeSceWE5_DdGmRj90>AN%qFLUeExz>=7JQzXp=C=51Od>ar%eir)zs$TmGNM z&+0KMellNy3B$%&Jt=nfPWHe0qvA)8SHb?ya3}-!{}ex!{fM7mr^L^B^Dk;@o?ELg zhu(=Eqp$8t#%j{{lOSG3x8t{O4o0|_y507#gTsUUg> zo2+3KNR-*sgLv0Ek&tN?TmqZlDVwC9$()a>o#M?F*c8SN+#>l=z-nDH`2Ek9odrZ!p2NM2J5f#r)ODUfJG#0ZqS#$MA z=0hJMWrTV;`Tu_H`PFAaRX-QtL-(ogSGqZqu1q4#P@guYLr+xBq<0LRn2&&t7j_iS z;eN#P!zuBs&VQA|rRcGQ+hds`VFhfiT<7$vGr4{PGC!{RnS8wfvdspY^ne`wsZIU~ zaz7)ZFU7q0yKS>C$RUhWfPBnI1IXCV>{3fX9%JMIkY9db+q?jB(w8>*5ahJ4Z1NpQ zL&7FQFN0@IR75#FMk6?EJM0=%XD0uzBFcv|JBsdfz1pvca-*eBM@x+9&=VCcojO{` z#!oNlLuJVLU)2gbg=KVQNDceIx-q>uTKQ6soQk09CLNykwiGruD;olyBSGF|pBOM^4Hrh5XfrJ=&7vu*xS2G};ogUlmc^}(m;1&3dg9$eAfvjQV5ReBa+BTK(?M_`}rCqz{s#A7#&7RKn5LRmzoAr&PWiXhLK-@T*F8k$YYE= z2J%Nn-Uo?Hv99%0+;0&)~1hk&eQlN8rKJR zw=f%eLTgi?A8XU8gZ0`pr=eQj+tiC5>u`H4)7n(niZyeF)2mLSwgY+ZESu~D(mB&6 z2ZMyqw#l&|7oKC2Ajo#rHdz4D$jB0q=Ug%%*$>x)%&2opIpkiDRz}u<{0ukUIuWiS z!D%UtPS1GkbpAJy;Ob zh=heY66(@M!fWWUh}&bCBH<(0oPB{kUI~zPMm$$zx3kc;83S_ag*Mq8o|f zaUeB|>{4fg3~jN=e2~vv;zYt?kZ&(@Y#j1ykk+tGR)V~?)Fw}W3|nTCE|7~fQSsyS z4~<3Dj(E@Ee;YsFtN7V=m~%g+8F&>xi%|%tJ))Y6B_&w?zq)M(S?z-d0DVGxoOITg#iHd}EIubHxlJ0Dg;NBx0N%jWX?h!53 z-<7A|6ZcGg?hVCPYCsnywoE?y+x=;h5BEFdS_nh zONDw!sN+pe)z403PU;crvAonPv)rP^h;G^|eC1J1_OHP_Gi| zVWED%Q18i0eX&rl6zVNPeW_57=cV2v)GLH~NT`Q|dT(Cp%|bmO)NxB!O3a@o)DwBB zhlDzPYbML;r9q({5bAw-sW%99zfi9d>VBc_!KoQ-?>23Xs~74eLcLO``-FN?Uh1=i zx=*NA2=yYN?#)X*DAbFEdO)auj(0}*8dsc``b?qj73$?eeVtJE<)vOF)Qg0=U#Pz+ z)JyVGKSii}gnEfkj|p{uUh0)Xy>F-NA9TLZ}xD^{7w}J@pZPZ#QOpiF0Zt6DH?R-)thUtDS)J!vb#~kSAbKoQ+tn3@E!eKo9yL!3itHvOAFEb$s5K?C z&E!=oHVSZ2B;^q8+N7%omOO3-xzu#TkxY5$8qGglReL_7U)Qg4s zYM~yRzGV zE!6ukWmx}AI#Z~3Lo(GD=&4AQ11}xJwknqQ18x5edFFKqg>W5)VqcHV4>cVmpXl0CX2DMs8H_`>WT5X zl$&Yed8vOZ)Z2u5OsIb>)O+(%PYCshP^aG@X8kkiU7?=HOZ{`9-YV2PgnE}y@5@WQ zSEz@Ddb?2njZpX8k>AOl~4~0^(vuWl9zh7P_Go~EkgZRq3+L1{dJ*U zA=E=c{a~S9o|k%;P!9<8dZAt-)B|~`uNCU$LOm$dw-@Rad8x;Qx?iYQ3H6aey)rNL zXM}o*P_Go~8+X(B$6aBo@>1^<>OP@fA=LjO)Ps4c({Bv3ELv79)B{3&tx&JeOT9y= zdxd(rQ11}xp}f>r3H2hO?icDSg?dX~>g__^Bh*WT`f{Nj&P#ozQ18R{Ij~45^$GPQ zLcKLF^{7x!2=!v2-YnE3d8w}u>b*kUE7WHT^|rj!+k|>ts22(KV}*J&FZJa@y+^2f zg!&Yr-kz6wM5uQQ^*#h4i^EAJLcJp|^`%0+OQ%`qUZGwj)MI(6 zFA?gULOm|j|Ff$e3wMp{%1b>g)H{TFk5KL-9kN{mwK~MZxiY>J37@Rj79e^){j2 zmzR3IP!9|BcA>sRsC(|r=lp$^P;U|HQK8--)Qj>`4+`~=P;V3JCkb_LUg|T2dc9DO z2=#zaFV0K7N~i~gdaF<`73#jc)K3xWRYE;1)OQu?C3&e=3iV2%-Xhe!LfxO2`V667 zA=E=c{hM8MHg?yz^1Re5gnB@z*9-OaLOqa|`gEaQF4TiUeVtIR$V)vS)cr!eN~pgs z)GPB+pCZ&tgnFe=?-c4)d8wBRb)QhL5bEthJ(!nzsZcK#>H(p?T&UOQrS2E%UZGwt z)UOcgp}f>52=yYN?icFKLcJv~^%9}(5$YvEeWp+k=cPVgsQ2NU@gQgIDt$uz2%+AZ zm%2}=Cxm*jP@f>wBYCNh6Y9M}-7D0`2=%tS)Qg3BT&Ncb^?^b?nwR=$q243ZDGczR ziG)cBpC;}a*PfTUSEzRj^}fMc%e{L)F4Q~nQXe7IyM%f|sJ|`LJM&U666!Ib-Ye8& zLOqt3`aq%HDb(Xa{UM>=m6y6lsCNkU9--bQ)VuRi-?&#wM3uD*^=_ell~C`=OTAC1 zM}>NqP;U|H@x0W(73yt5Jtov=3-#W-)DuEIBGfyD`msVik(c`CLcLX}cL?=KLcK39 zb^6s*mPO0LLcLw6`;5AKZ{d?eGv8aN?yEF@)P0qfmYcCXce&RA3OwT2-1k*ZfJU$kbzkKcY*%Rs#=>bAE^((EsulE8O*w2Pm#F)Z3Wle6!KXV@ z$7|E>Y}_L?>e^ME)#o%z>Gz;nWKJqFck{aHMJif0NqwA9j|%lJq5i$b|_xy+XZJsCNkUr-XV*Ug{%+dRVBp3-y&k z-Jh3wkx*|D>QSM-T&S1lr9M!ohlF~YP;V9LfxOf`LcLz7M}&HdP_M{KeWSTY(b=n) z1%-O6P@g5#EAvwC6Y5n$JuK9#gnCt8>fZ|WN}=8&)GLH~Ffa9lP_Gc`A)#Js)ZG?}V{`8==(8HRb{D43YF)PK?6#dgznp7#u?5>z+M~uR z^CvROI@BmFy&CY3*D|wTHpP9rL13N<@jI-+e?%N2c?inyW;ziTpKr9 zT2!=blKKRp?icD+LftFW!+EKf2=x-7UMbWE2=&&y)W-{TpHQz5>WQ(s=iQi}oh9bg zd^dj7e7CgR5sau-Y=QYcP|u6ZpVBgQR`cDev)lFqu-VQv-?w19O6%2lWuD7r0X52* zZ6=qh*eKxNZA?>N&3D}{brvxBT~$hvvXD4GZ5yoP$GsLe(5HzT32iD8l%L7n!gIaw z91)&-cTV*j6`o%go`b@3tML4;@Z2sucL~o`!gE-7jtS2l!t+|;xl(v;5uV%o;W;Ke zR|wA`;dx0vJU=5m2ZZN(;kl|Go;!u-a^X2BJp23MdA0ED7oMwx=Wp>nOMGqW6eHLn zJeLU1mBRCC;W;KeuM(bp!gGc2+};n*?ZR`h@Ej1HTZQK?QRkJyvsZX77oMjJ&)vdv zRCq2Dp8dkJPk8PTo>vIZ9^tt}c&6{y;;|7Ip4)`yK9#XmJ}mVK&uzkUukgHFcuok< z#lkavj~%abLU@h{&%MI4S9l&LJogFDONHmS@LVK3$MKDbyw0AezGulRi&oSY-S9tE+ zLASzPyM4lQi}2hjJjaFS2I09xcy1P+JA~&R;dz|!>=&Lx!gIUu+$}u6i{C%tu~9BO zHwe#B;kiqAUMf5Xgy(wUxlMSE3C~r+bA|9cOL&e5&z-{ac;UHHcn%8Bt-^DM@ccQx zL6`S)mGC@Mcn%BC?ZWd);W;QgR|(H8!gEx3ULri#3(uzr&mrNtO?a*po4H6BkisqXU(NOQg%n&?knrP04Cl6>|J zO2t*FBpG-uzJVEE091%)g~{_l<7@y}bv23Omxk`9)e~CDQoB&8Bh;^%tMfspKIG>u zSke46hrC`#?{*n2vXsAaGSE11AE|G(rJXRk5nAZFltX=&X#;G?L#AKfSc69Y?9_oC z3=nK;u+rmFX3Fsg*w9@%*xJG7a9&~8_8r*JJ5czNG}x4-cyONnl{y%ep|k120va2q zC!JTFzXS04>Hl!P$G5OxPk2NSq#Qqk&8>K64gbMUZ_2CAQ~I`E&(>;8_epD03LF1q z{B{LiEi7ooUo_u3)bFD;pbF0QjmDbhrskRj){l&^A}Y-_2P#41b@5qhyau4c@>(Q~*QvXz@p^&_xzA`U{Aj;37Cul}aT<$DKUZUM z8f>K2NZ5Rb{-LNz7l*(e8n4R{7|wW<Qqf@$zRGFEtinJr;}RHq5H6Suo4|j?Six zML>@Qgi{VR7EwJGDF*IS8jHm>YAlw4(rn}hjm7ZY)L2a9FS^fYEGkirTx0RB9*cuf zQr4UL`8r(6bNczNv|7~9!G84f3f<4M8X9UA%(>8Xv!}YL4wGQcg-*<;&%JUi(8!cS z&5KGs7AXdJ+Mlsd`S5j}4`tt|d>GOBFxlHekj8ZAxoS)=N38OkKm}+_586$QDUF3Z zXiP(>hBKy_bKS@tub@{OZu-Ufo!? zXx{u;*6&oQF%9=4*KOLEqH<{t8jEXc)mUKJ&M?24^jKt`Ur|WpnqRZ@SY)1Guj;YL zJilUD#zOUTukPpOhNh;4A!~Xidt%>fJszi@eQDPeGMWOL4z?#b4#b;vC(|;kx(3+> zrD^X`h`kNS#rXA1P4K{TF8l=UQM(;E?k~cI$Lglc6GzRGo}YXlPyiz*O9SnGp#(Ejr-m5(L%MCsDO1!+ml+;&(wXG?mY#^ zW~%P_j5agQBn4AvJh2Y9&QoayXS6{`jX(3uGwF5em9+Z}*eJJ|Z0L2GgQI7uIruU* zw3AdZ{eQ}bck4NbA7n{$(Ejkhc*WTtj>RKsMmaO4=P9*tfbc|nk~{T09RnxBg$?aV zw!&n0_9VE(o#vptIv2l@>g3fg(^xopHIZd5Qz6Q$y*jV9gYfl2&G(I{rn84^X{?<; z4~f;xcs0K&lQWLSOIBx7=2uM5FH|ngL1X&i`D#ov=hfET)f$&MuO=XoE3d9b_u?ZM zXjkUEdOF@w&9!gwZKLMkKB85spNml$r=M%-XN>Dw(yU*btDn1dKa1+Pxnjp_lH4{^DN|n4*|_A{zImM<(YTM@L(TU=sE<4- zhmXcTCx>4P1HKMY35pHBj*ZMYyyPpD6P`mU8HbdgZ$dyjIpJAyEe_iEhO@*56`=ea zDOczCRUmv#QF-H39Y2_q)w4tU`%Mht>4G|(^HkpJ?ugR#j%(u4Hu??$hfwxI*Q6Yq zEu!3L@nEr|F)1uSvr`Ur21I8`^lD-93WKZ@Ma!5ARJ7azOTMC!TZ)!(d#Y&JmykFp z5`z7Rgum%XpwW>LMUik4uEFM79Xk3E3B5WJWMryHn5!dU-rUAHi>mAE8bWmonvzSP zTB(D{NT5Cx&DM8b_2&%8WC=N5x`ngm@4KL`VScTdb&W_cPCxt7_A@D8 z0-J7kR-zkl+z7H>t;-&yeO#=lZR*v8Z0>?h;68PBLu3s|oY|}eiDo&IqEg?%rX!1u zjFv+&21v5ju_+lq*RX(g75q@YhZq>7)|9iv5UX>mfjUdjEZ~RA5S>iaX;`eb!ct(-ANJnOmGe9X;w5H(gZg)+&0{tVeF;XV!(9tVrF1h>$HbwZC zypyfq^b{56DMfgTj_@!%k~Kf*++hMD(>ZsL?Ivr=NOx_oGSZ2npUH-1fp=Rq7W)tq z2dz!T2dT9wj@NmnRWs!YJyRAo)h%#0GiIWAc3p~CZO^@?{WZNrG7_kNEC=qxO&NF3G-s63?Lf#K zjn`#M)p)gnphHs*8n2oOYP>S9Xml?PMNVOX4}WFFX)NylUX4ZO6|EC@hUD5^gtCl< z>gUgOKi4j3uCA|XoYhcgpNgEl6mw9`I9Xji2hCVK3#;L1n>jXREWCOw3!#7;SA+^^H)ekta%JZPTYsOM>Q znqG9zL3C`SUoR*&;yN~#!OvDgjMjoOjH$C0c*W}kXfB_QJGh+q**a}~Xf8*y#1HwQ zwV(naN-Bi~G?#hvRg7(eYC3Zn7x0?v?YFEl4+)$!0lh0xC8Lc0YS+1F)UHWI^=DJ!S=X?jLKWBlSMgk- zU`Ff6m?pTdgz)#q+#AmFrrdg(;SDP^{Kt+Bvbhd&XGp?nkV)=~yj+AD%l@ ztnOjQ>OAB`YtN!$!}mLi7K)9O%HpYv4KyI-Q11_hr>S)(#lU?^WBT+1YD}*NO~39m z?ytr)^STq!`k_3-#+ix}VdAb8_xXZ&&@?4R7eIl!NBZ3f<3go|1WT&)<)J-uZ{z{k)e? z_489HHF2I&e)jjHpBL+X4&ic8tsTxuMAYn$Hq*9E$3sTvkO3B#x9wWogdDI;2Pi#bVY$O}T{;2%i zqVw|v_BuUL`MFZ(=LS%0lv56x%cCDuG4?jn;%g}u&bjC7I>xR^8?2O{pWRC3=RQ1> z2gPBxjzfx7>5B3*ev;kI&$2G$m2$!vI#!QE^5OeBvZ4LPkywtL{l+PT#6dayuRaye z8^r4bD4v5^;+bq{zY#k`?KdcgQzkNpj*Um${H*S}pWL&%zVFoiY;rk5hR$;IFIJZZ z;g69?RLjxttHpv5ZsrNtaJJtrN-T~3vZI9tZ|#thaJ;0ugfYY ztkgMy?<1%qR8DwC=LFiXVX~zhloS5;tjY=7Axh-@qIKuAQnkK^Q#?3NDJMLRh;sI9 zGJeR4asmZ&vL;#XV_b=Tqg_~G!7Tj6lutQmE_dys=JM?+uR2d@++$hBovdgs_fAoB z8JDRX7h>cHmY`{3pL9s#KZI~-IiV9S0G{6gGMt)Fi)b6Tc<4OLa`;1~E(T~{h9hy5f z*6G-2x?n*w4~`^(W=B6_!?B^**hBR5W{VB?xWd|&?PHy=!#e?&d;wP9R zerUfj6%`(hBF=r?(iQDDnstoLMSWy$rTxaOXfi??eyCRRpg7!qHx-9}kOm+WhraDH zpQlhE%28E14y!=;K1$`NgpNb!-8Xf$n|!FXDgLOtCrQ)GGR7dBa;S60Y-g-D zRpWjqp2!?dl*VMP-(;Q2jg- zf$H8TGrx&XcTX({d3O3a`#!;pMdp1%2r*Bio$b6b+gPZ%OrHv;5lDMKTWD5Ia}Da; zkGXuO9#i@TAAY_=?WQr^YO)&BO9_dC=JHTX8D}p0#OnlTE_dj0Pk-(}<31K0*^db=3JR73ZPaUG(XwE5-|` zl69ze?L9-(>KU?LH4kYe8u*He%z;Q*4dzAn5oN8fF{#n9XnTM!udWS6=DRvFU!e&j z4vI|rm8IlfD8tzeMP`eR%%g=50?Ek4SIjt>Z7j6XN9ObWh)nthLMJl2(rQumi}xck zeTS)?a69~?tWpvMyLOQop zG97xNc2<<5C>c0sK-^5l&p2Q1_-T7b#m^aVC-Va3sE2j@e3NnYd{)O#CrZeJa#Scs z{7{a19^>k)o)e@K5Q?#Z!&Hp@h!S%C&{@*k{m4;w?WuCqi)pne4g>v&L(kzVM^#Y` znJ<;2p4M@Qy*dv=+Px>s1fIFxrne{0A!R#3Ahg zlk%WG95PDv;h8W1 zunu+gz^M<#kKcOLdAPY^p1jeOlfCy+V?phb2gOf!QTBC^#=TFEd#P}ua>A#2EO6cb zfQE@DTb4V^ps}Ef z0qANsHh9dF4UNSFT%mHVm`xzW4mB1(>9J^-KPP1@<~PJ`-FJ{3hiTT+(Z5CxkL6xZZ;z|-qIHK~bD&1hdb<16-0SHfxS`S6 zlbnN6>2rcpA8Hp)pi+*_ofFR7JNJ4T$q_%4!*9{!o_RezU5~{=x}EpJrpC|$Y;cn2 z|J2O!7>n*KW1(__V?+Ie%ICZaip@Z(jeF-+$24ao(_IZy`)4{wbLKnw;fFep3;1%+ z_ZM~itVE>9{W`_ZK{|f0aHKitTGK6hzF&~W!dY`;ImRn_9YDt+o!g*5%0ct=3LP8& zNO{$HO7pb4AM>04@&{B7&m0>!^4Mr< zs;$wN5uGOhvARsfuMr1R^#spvP*rW)N<3JVU( z7#l$y8%M!X9uynCVcGY7ls7Kbv2iV&q>qhLv5j|P<1bPOgkrG>|(s-r}*LmXu^{s3oPNAF<)sP(L4l z3iBzZ_G2BJDK@6~a>qspHo0P>=qnW)_hgKXZ;n*4aV~EZT1f}(H|QN++Q}CdWX>Dm ze#FLd9UIrcTl%~)4y(PBH!{aYq#v=-6UZGK8+2?`<02cr)}+z?J~r$Fuou<)L(~|b zg&b8DLFs_}(Bp&BK2JbK>g=gik_g0S)Y-rXN23pRp;G^xf#q83~eifckf zmr$t}?NZl*_=l=}3qN;IBi8{NA1n1VNTnvt7vrlf;5ecQX}toQc$Uw$SG&c!S*Z;u zRg4Kp+88<<--C=}WXN@>4Tbwq+{|cLKJ)8XSpkl;0quF$ko=ssG$a>Qm^lRu^R2G?JtSM|g zq8YanB&c*@K`?E7XvQV7%s6sK@639qstif*O7r@t*zm5Uc|lR9@>r#bA2)01ao3+^ z*jVD+Z>2xEQ07IuhB$tlPdAj7BYQD2sTWOliTh2(`|6x9yXO2ls<%1Rum2c7>eqiP zE%m+esugMaOSCJUO=?Ti**NVwAb~0-Tao3rL`|L5um4zecH4e>mbRIdu1$)%*G1Iz;vzPSu~M&Ug^JZlPnf7vpP*5_ zx=HHYLOmhWi-r1Hq3+L1{av9>?``q6`-J-2LcKgM^&X*4O9WRh5$YcsbvNegvc$Za z?`8zme78o~9l?NVMY?(FUjNZ~ES=3J%=dNunD3^}YQ9@_cH17y(sng3wqUzT{c5~2 z&*icrHOiT7Ca+VmQGk<(ltZ*@lV;pvL&^H%DmK<2=z9h9uw*_g?d$9>a9XOD%87#`fQ;d%u9W#P;VFN-9kMi)a&z7 zj|lY+p^n>RQljo+p&rUheYsHY6zXxIzC@_Eg=}tWSm$zR~Y2kgj$KVV7p3-)OclHJJu@48g9&XZCv$s6)l^jK2E69 zO(|TxM5xyb^^UyMeL}rRsQZO_i%{>(OMSdh_X_oLp?;N6kL9IaBGik8dO)a0g?d+B z>Jx;zPpDT2^=E{7cV6m#pU#e6zcyG z>b-fXPZ8wi}O-HMW}~_dYe!$ z73#jc)T@Mgi%^dW^}~$1yR)jvva?dVN}u+lc9qs%!kxK()ru{!t6bfWU8SkB+ErS0 zcH90#mbRs$;uCfL1 zsj!{iq+#1>;zmokik3}MZx`xSLOm?hi-me1FZESIJt)*$h58;sy&^C54xwHz)FVQ@ zRH#?xrM_CIhlF~YP(MtlSLLPNDb!npdQ_-a2=!oI>dy%Euu#WW*rvq%xk9}@FZGyE zZx!nJ`nnYLi-me9FZH!TJtEZU^N2%`Wb`|RlOjUBB`@_Zq24CcV?zB-p&rgl{dJ)p z73y6=yXE$E-xccgD|kcfQ7-Kf>Te76w!GAPgnFk?j|=s0 zgnBeD^>so$Ce(X{`j0}rJumgRQ124z386kxoX2(KrM_OMcMJ7Cq3##zoq4JE3iTeL z?ooRrbzN)H6rmo=OZ{`99vA9GLVdbW@5)O(A=Gu;rFzW7}b|`KJ$#kVu?dMzc z2&(;jrO|SCXx*w6TVOvQMP3;~xh2be7pBf?KX299ZTo>)+OGD!Td-ZF#cI4V@72o^ zs^>G?O#W8IMnUHLE_Ay#X-6GWp4DtBD^c}Pq_k2;i`(;){(=vhCC5u&qwZ1BvPtUA zLftRatAzUJLOq_BdW%pm7wSQw{=HD|%}af;P!9<8dZF$ytBf1-Q?tapn(t-=)qJ-` zSzUQkt=IzdeQ7`DyQ#C9?^d1Nwx5=z?P|U!wp_bPLu$M-&*icTHOiT7CWlpQWSQ@} zU7IxHW+=~Uc9#{a`Y2KwP_0m8(wipc-JYM7rRP=D89yrOEG;+cJTJM|Jhwp9(cP~@ za;!3@&MNAxI=gMZDNEZ`)NR3bl~$+ENxfWW(&5fv|No>=1fxNRim8QX7U6T8(FfAZr3Kw_uf5H z=R4iuKZG*Bj`=>^#m~s3787-Dw3Mr8*(CMPg?f)rM@3T9TaCIq?r&rncNO!d6)NVf zmb$G7s8(!&n6KR8#zoA}GEwJ7ONEM-O;V2u^_Woa73z&f-5vLTWf^xB^QILl z=B<{xt*BJ3*a9&>r5`bG>a1eksc( zv61CmMz?E|qAsdDs|YV^Q}t1#G^Sdi$fP|?)Va}8rJ`k%)K>`gh*0ko>Z6UiJML5T zxYu4ZhrZx_UwnkJu93D6$zw7;_viW8`GjNIbs2&z{64`ZGxbeygaU9ZD!kjZ;i z=oNFE0h{GM^=Uy|1WR+&!=@KD^lGN>)>s6a;$+*&rU;g@arB8fU$OeU=RQJ7ed^Go zKDn8+SOU+Ls+1=6f;0;f7G$X)ZGx=S#LWN)kSN=Ml=b76eGVu_2k=rA>T?__!b?Ny z-c(KMMX3Njz|H(jUblM+DUA+JA!RKiQ^@2V^@%Xg#05q@suj|~@yr4F85h62rADYi?`-QM6#>!|)Ed{A!t+<0cDeH3FP16Q2ohu?_#{Yz)$k>d z0K(FgdJm-MF1uI9+=%)xKWBq*w1+dUZ~qnmr2QWuv?nq)X2oviTS!#A^5j z2wih9T7z%KD5K7Xi~;enem)SS95H5Wrh{}aKQlqpb!?}9t_5jj>bHY*qF%<&??8G+ z+vE=*y^MSe5@0p#1LS9A+T@OJ0gsiQs~#5+Po%fiMvb4-{;`eXS+7^81j$NngBv`*^p@m2omKthZ>0}^9#_#Q|RBHYyHQ;uHu>Ma~eoDQ?DmKdMxJE&6_v>!a9%hZlH?!U%;jhn-NpP zWgvcCiabX_=s>4=oKb!lq=fZz3?$6R@Y_*m7MXj46y0gh%BdjEeITknL69~Uy%&L$ zuu`oct!&(H0qNPssoek%_DBuYHE0FuYxYR@k`1fj7a$cZw-l~G9J1Kh7KFZ6#PrWT zAiek^J4_9?Hx2{oVB~m^PH34@L69Ogf=wWmD{MbuA}rJ14nkMnjGsry1_5u#3m}wx z%`8|CLf5g4%?}{-NeV+o-GR|z>N|mSu~^*)#EX75rH%sWWo!2@LHHi&7LXXL^Ftu* zEXIBh(#LYk+hoIPxB(={M)^A`#WL-nJDq)tsi6-f%x3OEAT$=Hf35;4VKuxNguVvK z@l#!!{3;z!C0iZZVbj6t{2T~4(Rn)K|c!oXzgXKswpHSPPP1qw@hskmZ(tlMVXE)NuGc$N)N%R5v#? zRpUwvwHr-ybDbYH?QFcJf`r|x2LoW|@th7qU-e@=&jqQ#Q$rSmB-ohVL^cDIO*OtQ zsN?wiWGi+BsnWec z=s=Jdi{9xVLADCd0_kLH!F-T%*7je4^s)Nf3Q`OO6Jx&xiD90ai0T7r(KGjgruhq+ zQNqjmXSaT$Gun}AjQpsk@cOY%7=Lg&e!g_2ph@W}h6QrBP;o%^3mTmg*IFKkC_p?Ae zY~5J|Qo>q#1=-**vtStr-B)1R^&m*G9v!ldfzWUH8JixEFrGRD`?2KJ4Cmf3pF6+4 zg-s>PqCbN8SdWdkAHBgc+b$p_Y`&L*6f<%(NSHCtt~l?&#FPA_J;_ckiUa>6Q*F8DBhUIM9NIpIT)9@d8m5FZ2(Dk8y zo(w{3oY6W7q?`5FY>+B83l@QNve>v1q>YW>9UvhV8xMncSQd?eBv_r_0qI3$Onv?e z(#QJeClG&>_I_&Ir?=BgvG?=mfrJ?O6-bcv#{D2Mru96Ccbcu<1L9{pz4ago*3v$Z zcGila4(6=G8Pb%&*1VNxom8 z>a#Cws@SYN7^IT5{REH-HY;mDXvU$jm`&BwPCBLf_)|QUEIQ)<9(k^NY->;TfrdSg$J=rFs-%0W8Vm6Pcpv4OVDNgx5# z%k=Y15cQrNT3XZ8REO26!o9c9$s}`O(}Nw*D~<;#Vx`UkX&r9+SpY)s7Z}f1fJ8>vJ%1h9=y8XH z=U$LXR_ZB`Vm%AU<}HvoYkM!*pp+TYA3?_NVUw}HLyxf>wKoVIriSGp2TkZa-w(i!|=n}HGv3X!}RLGAnmMIj|b^s{WA-sZ-iZ{351`cT?<0j&`ck;fp}S| zCqP>DnF963n;>zPpL;=iSRDQU5@Y+iQ5~o=YegwY=MlF02_P+O7Sw@+7`X(5);QA} ztsw0zlPm}Evr?--T3F9N1L9?){0d0LNZWG)q;-@{20em|#Cl^#5D&|BdxNyHnQ|~l zjFmbGB*Aj#Y!G_)&9v)s5PD~g;=+lIn?QQl%zX$X#Nzoy5OoKsQ|fDwFl*_LAbz&) z41W}B0c*PtB*yx%93;W^2|ow%v6!y`={Uk3(~Ch$*xdOwNEeIn`#}<{hL3~zSkJ!# z(y@*0`2!HTBgjPWKS1cy_l9f)iFj=?@-eJLTiL`15@zF71`>q2@pA%58=qew>W&4c zpPN7`F;->-?+5Wg-H^2)VHOD=g0!*`{1T*StgT+K8d1mka1@9KtuUU)fsi`F!;O}S zWW)OTc#t+0tLK0O*tjnPsbH(#9U%3NE7$WQAVEg{0ODh_G7b`AdG%|MPS*Bek0Yxm z+okgS1Q6OInRZox6pglfqY9**Wt;OrsPNoA}pfb z18HRu^(hFNWqIBR(#JfHegf@c@jM=+f@RuL5PC1$)bLD@R@SaYvSGb(B}jzzd=$jT zBH;-TKbxoj04Zm69`Yo{o#pTyKq4%Q`aybGWF8L^V)dB`5@T&|0HJT?GVQty#KZO^ zw}8;M0T`R#f%uu$^B~=9OuIpP*_i$nB+BOLe?da5f41&KOZ7@rbFOnW!}(mKin;?} z6J34!#m{%Hm2WZCZ)kZv}=R)PdsE1m@DVv*2Agq3<9q>5#~FFfe*CTo36gpI{6Pa*TOh&m9Yi?#G9kQnQY(?J5PpU(qn zVSZXb5^Qv?2B~D(?{<(FyNccc648FDt7kPdR9B-7_VwPEVMAXBZhCAT5gg_U`PU#l zY}^MvjnQH61&jjeW7)3+q>as#sYKZ5{2Zi`owdyasn;_lxyNom|FAv4m9U9x8>;KA zAW=QaL>>caV>YjY^r4xirRzb|_vtxNH~Ja$JTjZH*#jiZ`e!moIg5=WK>X|)$T=Vh zR%$*-CCh%RLF!qrz5)_tv*2$aKGv>(Q7PtU&Ytw6c77 z0!Wdpr~I^o_*uK21PQYkdj*8{BxaP~1BtN_ zOn^}4H*Fsf!%_}FQBEY4|f9bu~LVE&|EfcKLMnVt$H;earB|FX(k)C>OBNf z#pdZtAaq`7TJa7@gsn1v2kBs$AU-y~wt5j-tW+^bP_JVhAokh#3Aap&-w5tw; zdfupC0n*Cy#tk50rgayHpV_Pep-qDE{31w*)#n3{Zr0MjgG6*cpWIMa7lNBE)~khU zk)m`Q((mQWn?I{Ac7&}p8a8ydhH1r~AVJn+2Z1CQsQ~F6VEZ`(q>Akr=YW(vVqc%X z5QOf)FPHKw6mRsUU4E!sYdrGszFjY;!>RplQbaQjjX9 zbq5H&D`a}?w;+BtUNI2w$M!uiZ-R8OUflpv#rmfYgw|7|KIkR*VPiTP#K(GUcaUP{ zXA(#PeoPJP$cFXdVvt_eiU>%E&4Rm#u(j!NkQQhe&u@XuVp>0d(7V7UT1LH$sAD#J zfv9`P$}NGT8L7n2&g0Myc#6H^2W^|e%50TfzSvJ*6sQu zNKEGqV9ysI#rS`bw)rne35(UOUjbn)-3P?S_I@)!x)Hrbs~RNAR@e{`Hoq=_(M4G2{7p5WikMXV)!QFnX=AR!h%1+O8C4z+7I3M2+% z)b|D{Vi9!&h?mX5Q$bo-uQq}_bA0~Xv1|-Jnyb>hJ+P)g3 zg!S{wAZ=QU`sZU1x@u&4{&SF!9#gUz@;X+BLAK3~AUy+ZG6AH7oi|Mei7`KwAQk8? zqZI_9!^HdoBCN+Q1)(ccrqs=@CdWYNfxgVqt!ED<8BuE8o*WWK#=OKcJ14Z@q!cMrvjvc zMP@BX37feWfY7@YrhhI2Y2C^uogg9Is|)I!(@`J0F3|-Wy5?Z~6#WsUM%wim2ZC<4 zYz_pe(6az9d5!`pMk(WGE=UZXO}j1uDH>*zr67IiRbz862;J#z$de!)2vS2{0-3_< z^Bstn<@qshBSWI+O?`F;39#rr62!~uybL4=&*myb6r=}EjQVp_ig|t)gsvYNt#631 z7#sMG#}j8cYCH&iH=Xf(7)X^Ki<9e`kD6b*u&IdUpDSV0i6W-d-QM}4 zn&+R7nZjnlyRd0v{k#Dr%3ARgNQAXw+jp@#usZJn64N!L`^S(DJo5?yGHE>j9HfMeMGc6DsW*bqnWh=9t3WFBD8t?p0|{+s+w_1Wk}IR?!)@Nf zD6=>`6ePi7ekPG^?A`kXAoQM{QNI$Tm1V7VkQm!zcY=i3I`}4tUq=+x`74khYy05$ zq0U;dGe`jSG3xshVWp;nlx%C;oCDI%a@~B8zA?7V6(9-LtG9vlvN8QFNJ#hdY^1+g zRB^V~`YUYwtj_-iX^Glr0aJQt7TD@lAQajrOPmi9)mkL;IEbIM^ktA@-K&+&$26W) zSKA!YbB9Xxz$U=*>fed52>&}@2<_*M)_ow(ceAK?ehehSBJ%|hukIh}jdws= zbz~wRQipkZS^s=WHf&4>e}HIVHoJiM*=k+}LhpZ>8XgN$#Aa?4NImm>K8Tljz7nK@ z?N09mi8DVBf|Tp^V)pz{T_f7&{BDKnjmOCks2Q(UKzyvuAA!)l@utpSffVUjMea@h z1ag4odH;tf1$EWv3czvAk&{Zx=XJTzlE2PBC47_x{;v1qvl#Lq_gUXWrIV^2^i)X=nIBS<%kpRpgq zF>A#>AT2EW9S_pW$TEx|a93-G;6Z*k32c(Mi&qZXzGWL}ql#Pw&n?XwVvitB6kZ#tB zZje59ZTTaRF4ps3frL>D<9T2l=W(p(i$OYBB$R-JSpF#^8(qWX=XWl4vW+tfJUEVm zO+@>trjOXT?^DyOZq&i1n8kcENEOTTH&7OcUIgi4u`%`&?DX_mn+HcJ zNQ{*_hHTi1b~Z>WvuOtLv0cGZkZ!iVuLNl?uzPh4ND1@vACMN-(jkArSTGwONPx|z zgFyIMc0EXJfUVU+rLdj?CjWUnSAo!&n*O<)2%EW&g0v$HOeFjPq>DvV9HbtljLknm zLWpq3GtL5%JM#)QxY|`sH_53a%tt{pb2Z^#?Jsl)5z}Bh0oQY8juiE z{{WTMvjIGO$PBOqOcb}QCWDW>%vNSy61Hh@G} z-uMZmUB^7BZ1*?hIvpECCW1i9QlA1spYbts@Jx_68=dn&yaQDYX*M;58a-94rN4lU zpY>rYNLXjB>e=*uA*81%KUAN4NQ=#ar>GR0%ddmbm4U&qN40Q#1QKO+{s#!{&`c}- z3sTN@R@;1vwNl$$hz~@}t*vW{!ykEdJnsP;df&nLITR$yM({+C0GrF_f;iuA>~sAz z5n(l40@BS!@J5ghb`HCe2((On9tA03z40PQADby}gVeJct_KOSS@3TV51Xgk_98Y| zeS9G0Y;7t7DQ5HQM35r5qJK`01wlNlrA;6aJumR8=SmRuU4l-jr^tq>zezT1cK-#0 z-rpIbwY~*u*KtUm2mT!yiDj+PAQ2QX(XuZH^_cNp{8)*;;pk)U*0@fOuI;V<15`rf-Az*?4^ff?FZ1R(t^x8fv#w|`y$sb_V58>E=cl)r++SdaY+7DRm`qB9m1AaPdb zvq7p@&o_aTVEByZt3c{mo?ijd%jWxPkT%4I8H<-eI)~fjeUJ(k^Iw6qv-Q2;ORS#E z&(0tnY*zX~yo?+N;vZpaRe`KN!fwR{AaqTSdcx_AOF*J5#%=)dv6kKoLUCw%;}MVq zn}aU(vTGs;5&jpFX z#!^WVAIC(^QR!iY%G2PpI^Q`bmiY)EZ@78?K0vyT$NnWC@3__U6M%fwNt;hm zJ7_kx{J#MCm|H2o4#;QRT>PQ`gE9`E_W|-z5GS_tEr9sA`gZ~HwzG&10QsDg0Dl7z z`d_r4e*ln|ouvI&fV}Q#_!EG<`p44Ve;N?tsEE%yfPBJH?AHM4I;-F-e;t%}Yxz$B z(slG%2IT9UH2x4E9_I}}-tSh^BdX;vd<;n3N5k2HJJUR0ddtbo??#!4LC=QqGnj(fizkhdJ2x2cSy#y%kXj>oGuG6$IDkFw}9*|cZWEqgpy4m?QKtABgJOt#UP8tsYdE1Tj zZvpbAKu@dInMkCfV_rcvCNx* zyzaE{zXjyIkYlmT&jE77@$;_&@+!CmB+_wx<>$b4j-&oGAhdR3JKqAxt4`8>2$1(X zsdXO^@*-o)eL%3d6Dj)F0ipjzx%y84c^Nz(YyB7?6kCqH{|7+2j#qyMkoP#qF9Py8 zH;Uf?|+Bjk4h`GnI=@BJOjsawk}K;Cc^dk&D}uT9(8 z0;KCWY6!@CTsz+j$m?M)GUOkQ#%Ra!>JOmI$K1UCC?Ho|JD&jLIalTv0D04`!CwaC zlTJqc4j^5}yQHMI4d z8~d-J%xi9zzvA;EGX>{N1;?vyF1`_EC1_T-fOH+@_W*h1s8Is)S;s#g z0c7G<%IkpKb5i|>0J#z70`WQu*DW2pmGW_v`Lv_zPXh8;$KgLu5J!z)1>`v=pTF|= z0C80PGl0D5B-<(=j{<#w&yco(Uv~IBk1`}zBPYBB$Y-2wa{$QO4#STC@&UKH{~;i6 zI{N$&AfIz<`Qw1R<|zN40ht60iKE^I~Q<=l=-E(pROr@@D}d z9*dm$KM3MR@p(XQxHHte*%yjZU%n}kcn&ge**G)nA2=;xO)U*y!`1N+`WVyDByE8*?>HX& z2q2$u()jxTA#D|L{vkm29nXIpkdHcw{WKuN2@%7e2jtjM>{kGJ!*R>+0_AwN;rjwAr z3CMGfVqb-aG2V1Gz&8N$88@eY8IZsE=Td6)sf?2euLAO#-;pfQ-bP+Ip|c$Noi>x#y(T=K;CuR>3#_VQ`e2 zi*E(w*ztT9kgkLD0Qt0=(-S~G;4u7qfV_RnDE5Q+b!Cw6%=fb1w1?~IOZ!=jcE|R2 zZ)azkAKI^BG0N@l-6<|hwI48f>`y9_rN77hVNuRP>(kMm{LV6ZUFRq(Mu)v&G3Ww| z17sjh@AXE5VLn}&O!KUduf+^+nGAZf-Zx#D=DU;G^h&H*%!adaFdfgb-SM;!bWSgL zGCEheaz0*Eu5-}a%Ww6N-n5{r-ei)^PA2)%L2rbj1N^QPm7U^h1A5}LR(hjz|L()A zbAN05=K6YeyM61y-E8CL_PzGzX07Z&Z?+HLNoWU58mXrt;H7fb!xk}5c7<$%@li1x z^n23*t~Q??^okL#65OKV^ZIDAQEyfp(wy`64EKLLt|3+}gu)07@At~A-=E>AS(O;s z0CPq60n-RFI%~hvYiM?FG>3oE&nL5DJj(W!b83wVqm73Hl%32Lmn#k?S;k%FBQSl1 zDwHJgq!HR{fYK4jdJB{+@~{|fR7g4$>K%b=Jgq_ZZ+f(L^XAeO{;NZO$)Y`Fl~z_< zWqF4Ms12oyI$gJ69Sa$rJi&ORYgzhPw%6}x(|ixBJD+ALaFAEP{9xKQWiM^bmRCSv z%=&l)78uR49E*PrUKkuMo$)!gvCw{uqA5?<(XLjNKa+1I zNGh%JU-8Ro`QhnIK7~Kmm#>zyog&L{^W<{YJM0z1-p&xBGJ9#gbxl9fipY?<+ik4~ z1jDB1!Me}y6N>B0t+b$Vd08vodWOpt8W`XsWx;n3yM1oE#b$MX__A)PEjohsROF*f?RXR zcVJwOM-Vdk!JJn6;T58aHn3MK_R{*Z(l%sV_xXO>n_Q!M!c^6n=?w;D@gzs9q+be0 z@q_trdGW{Iz<=~rdxI5MwbF8Luv+;nWS2S21X28Fuv|z@o!#Wi3cf6;v`U}ko6-Wq zEJiawN~Iu=avwKc#ji}ig0vV`ENm3edqt;LGKL^(PqN)%G07lNhvVJ=j^%gjtoxYSwJx}MF(*^TZ@C&5;YeZN7UTi3h$l}R#8nRr-;$}<(p z3u((C1^2iRDP{|Y#j~rt&{(^5{jBQCO6pzIpQSx_ zcR{_Y8U7J&R3!Nb1lA_t!VuJN{0mGsK41~j1Ow#~aOHAdF%mGB z1(@5QCeiZHx12y@%PQ$${uj7o4SEI_6jYg>$DooQsj4>`zw256CzIZ*Xyvp8)|Zv< z!soGzx;PQ7ZqlneayPoFP-JEK%p$Gpb&XqVWkC@Yfp9J+^I4vqnB>u6nB0Q< z1mA(g)+?`Y(>HjI=o%cUhoxy%m59D7WFBOqR<=bGxFpI${S>FUyIT>JJ9GFR**+#2 zE>xH!`z@283?W5#d*v+a^}Eq-(!w;5vK{i;ToZM2Zmo!}WZh~?sn$pa&9s*d z`e!u8<2a)c%xOCG28>!+O78x!cQ6qGDVr68K4{2e+b_C26=oFhr?NO0fH(DvRwB9| z^rnwV#w3*Ip0o&$8nyyXBUFp5Xq8ECTIM)wGsE*0Cs;>=e2`HTqgKI82&LqQ=WvT) zwqmqm#Hjq_&%1Dk%l&E-;BxC!t%3&hi}uQl=l=qwv#Tldn#s}BIG0mdW91;f;giEB zX&~gX5|V7tjE6>&W;_DDD*R6K36!{zId>HO+{;J#wCFdX_8n_GYpnJ+@7|(8cK6{6s}U}= zRs38*>9tbQOfxLPxlBWypr*x!d2h6^kh1L#0wJU9#_^5)ePW2#H8vrcH|x_CJO?Q% zI)=+qt)LU2BiY|S&CjT{Fw4uDNza8+fleMuHtij`F&kF3CaLryq`0sW3hD;o-W-w( z>YhI+tK$Q-7JpHGR4#u~QP;YRo|wMYNQW(oCv11cx)L!^#rp)37j|3qtIm(ueyKi0 z-%{T?t?E@Oz{4=1Y-p(>&&uKWXo8rj>$Kal_EI~-a8y{;6ripeE1EU<1c50yZ@woD z)hP9!AZ=i8wx8`#e3@8KC*0t$9;RZe>#BP)KB3QvZ`PE`l!NJ41s z$sphDkxMVgQm@uX_(W9fjj(+{G&ilm)S@2TjLD)<88sMZwE~E~VS%tbVDwb#Yt(0N zj?qzcXi%xm3XUf>$l;iIwWGL12vQb1cEGO5NPbEv;h3eNPQ4qt^E zs1^(N_w)YaY%+qqtcu?kZa+ica5oxHg!XV&C7GAqVhUy_#Ry4&h%-ZVRZe>O%t9_U zy#wqDs4JVzC^kzKjN|%*WO~ENeh<3{v^sB)&U!@@kupM3Qo?2=bai2(dUyX7 zcs*W6SF2Qtn;&HzsEdWQJu1Q2`KW*5Y6v=}${I?;_ev0&NqLoFGA69fS(@jqe-UEOdPipf5#H3Y1Bd$j;zV>7~Y<}_+`qCa8)WU(k;EOmhv28!{dX(QL-UtkViznh-F5v{ICMCh4QHI($tg3*RvV zsvJcC68R|Jlawloc56kqRAt#xyXUCJ-RpvcU?bK}nCeUeMmdNux|{`+G_cSB(ltPx z1pB9sB#$I%?o8t+En8wSnaYj=ZoOp&5_Sj)Ju$t!Y)kvy(Q=J#X@C309&~*%lYol? z@w-2sj~EDk&;?iS7rQgMQ8FJu*0i6+8VxdSVX0P&tA&CKT4Vmueh6(^gA@UQg~OT? zYTt0fS8`!Rz$mX!72(EaiC?Q-CDY~DMdxF-*UMNzK`a(UmoYPR>Dzhdp2{v_J6k+d zhBh!rT-CXxD_(<=ippMYVA{Z>9Gr;|l~MZw8K+fNLtG;zH5I-vM$&?^`J_NPM!8z+ zM>pbZA)*wokp6gD!-)~n=7^NonX5KeC?Uhznw-%79XpC#J?V$WgV0L7A7TYRA%y&e zhwtd8fGbRa>wSm2fE0 z6}4|djp_t>S`mKErPN`L=d+CJa4a;o${Nh{n+0m9+!O)YdcfY)3reK(N)>osN3>C1 z#U}QKF~|%rD^^^IYSS)F1{}w`wDq3U*zc-&iy1(TS87498lX^QuW|;7rk^ zSaPVGR8AA4+b+0D4J%tkEM-zE1CfbqBl8$uS5?=QJ$2OvR8lP=?DlzaLf@WhJy8Q^ zk|0q$=PgTe?m}f3X?zpJB=yb;pIF(^!9t;JT4{nZmm{3c3N=ua@D%zv&sOm70q2P1 z(LRpd^7kqm`015~2E`ss4q_0~a|8#2AgLhVYgo3zBFTs^LY-m}wbk&Yws-;8P}il! zoUEP`wmq>Q-?S+!Ry;Kp|7zGCMQzwyT7(;;I9Fwhno+86zY?NNJIR7nXs5DeD?L^# zTB_0gty!zp-|rzpI_)9S)#YQ7&rFL&4PJfu7#WF!{Vy4v*JeDor6GxFn`(`oOdHk4TE7Dq=G z6}W|7l6Dq!Mx~^kMFqH%+c1+C6wp3qvngUrV_Idk^hZUxJtC!_mgf;JX!mBH(lEE7 zHIZ4hpbSW*1x};F>22U^hw_J(Z!hj7pCY=lQA`ecwS3Vq9kU0cg0`L4k>Eq=n+sag zQX4(c>v(mymX@jQts%reT_a0rK|5Sv!MEFp>9mLW0qs65g~hnCH#|5Pc6QhAZ)MM7 zTW(nF7WuS&wcTz5vT~UBJL|=2dpmnXtlw^LKEJh^;r~`>Q}X^()D9RtiyTX2xb}~a z&kzgeD;V0{nmvj$cx~4rnzq5g|!wYo-A0N@pG2;JqRbQENFd~6IP}5 zvrC@4<>I(a-rbq)a=CN2YU+yFgUNRa%CWF(|2p#dAwCu^ymUhR;sY~mJ|EZSN*e%O zoHo=iOyds!XDOu_vE|vcaR}Y*Y?E+Ihq1L>#q;SJargvD)y%z-cTJ)#DtGQy57s-o zkcSx6c94aqVd2V$UKR_r<^01~bbXby=PDOkh3RrFqib*w_@@9ZP9H$P-Cj0{w(zU9 za7nSZL9P_U?7TngKwh=mhuhiKjSLy_SD^)uaMmJ&*$%xqhV|FmYu~?~-JJsp`O<}6 z0snr9I{p%kTXoDAdC=UejrelrhT!87g~M(JSL|#eg49seQJJkQJ;pqdbJcURoC@?eUM`ZY1q1MDJG!JYK9H1 z24iV`2hP?iMFXJjqg_W*3$_J0Vq4Dy)ZYDu8}WX|@IGs$EkK?Yr6O-cHO$}5rXB8Q zt%7KXn?rEMQiv6NKd10{tYUqftMIwop9GteSmkP_zWF-B_rxeh>(k88vzj!I*r`X88@79Tx)$adsY9h$jnm1m8|35D zH|X%Z_zXpDa@o3Dvl|(9zDbX)T%`lsyi-A$L=-&7q4AQ=cyPKz=M`D|7pZb^@hT^% za^;wBDLCsG^WeZicP>fL9EpvcJxwD4lf|(H({Hp<6FWU;`OyBQJi%&YHg^B+H1`zP z)nlv1S(k8n>x~7>XmZc8ax_vKsdJG^z9%tV8fCEP{)7d%mvdA&cMlSg4Rk!KeJOtK z){T#`(Q@uCk~*%RFHo@6;q?XT!;Rx9gRu_Zr)ZsrvsCjbCE1##>+H!As{h z@=GYI%S32xtY4(=!srqevOqX=8X~&^+sjqINbe01-i!3!Q2j!^*CV|b>b+k5V!hWQ zz8CAgR^9dfw6R`?%hNXIFuRC%7$V0(SUyDn*(RoP^Xoe@1-Y>_ptzNQ{diJeti zzd(>UOyvdYI9gpUIvlzsIdZus92U(HpQnj1d#3sVwBLyTyBZF5M79yUt39|eoV98a zkHKMffqK5bQx?R+zRp+Y-2I#xKK3I$rS~&iIyX)hiS`_Pnu#82_&%N{ob1Q_G%Y!t z7R8=jcZ&+SmM)@cLWJ6r^m0u&ENoT2dy#67;uoO(M*QD}0JEDy!~0!m*Wr8dDWmLW zhuYrTw{#!W7(!QW~VG2C1IVjGfA@`UR!Bu zv9E7podd3wTJKKW^QjxH2P`X1vgdS$wFrSs38ocJI5Tfkm!$1~gW>fY054=jGhyhK9`8@ zqm*lsYtZ>0fr{?;`<_r~Tg-6jod@*JfadOf8Yrv+Z$ z+NV1zF(kMWl-pKm!%i6Tl~Gc5K@s`5HJ&%TMPjYcMJ2=h)MjurSH2gEPCJGY9UMbm zAMY)|XN^(r;zCxut+JrZ&DpHi-#-1IN#23OO??Fb8fQ( zV^U@Zu;&%HGB0zS+i9M!2W4(ZCsm%o^)|Q0V@W8!@bSg=&Z5rbENhF8)ERo$(N||Q zcvJ4llMr653J1Dnx&T^glvX5C@k$gy*Kuvn-F3WmbIdnk;I_wu-Yb~h z6i^_&erYs^x;e({6~z)?6ik0F(d8N0-SzB695C#>a6dzScLS`|09$T=tu(+^8(`OJ zFdRT=fYtk5X(+dnHI=L5x00u2$wUAl3RzO3z!$7O!!Rtnq9LEUm+OG6>xW`f%N09;$z*pkEIqqZR>0N}EF zw9$KuwcKlLL+w~l%fyOe<{({BjOe2NpaTp;!^pU~|Q`M_F(Xb*Q+ zFlrmP^=F$O7-_SpU?BgwhVvu*dK7~?cu?vdGKR|~^n-_?U;)Xf+PHpnkU!YIb3=Z2 z=?2gT(_$UBg9?P6H5=dsEN+KhFSEaT$NJYUfJpnNv1GWu{#gHJi%ig>Purnm`eg{& z$Z+2SO?2gFLSoP|wzZ`{!XSw`Ht^~gj`J@S!UlS^!JYB+uZ&^C6?jOCN->LAQNC)* zekh?}Mn0e8Ngcrwzt)glo&4PDPsc;N%@V$EjG>U%@O%lb&ksP%dpVwV$GCmH0&CM$ zC(zrtDn0obkd5^Wbo01Kn=|mOIj%L*Sz(&nhkHGpLL&BEyfZiH8IiOd&Y`v9g2Wx% zP3|FUU}qSLJfO~qIe9d@2_wrUi#y!_8!-TL;{lt!BPP+tm@d57s`505eV-oHBQjx< z@pB7Ts1sKvAp4UW(gACQNNEC~cMlM2P+;7O0Jd=V?SKv%^RW2CZCp1s9iJqS&=`Nm zFCZ6K&UyoPG{HcRvIXN)FDsxqE8^SeR2bNK!!zLWn^m1ig!x=YF+5h z6iEev0U!fy67llW&KT_A1r8Q<6L=e@nbiz`gLUceDdfvMa4tizqCPyQ`)!x#Pz$cQ zeG#{bjA^};OH)xo2_!E2jWL!j?135tPwC-iAc6A=b|q;6I{+8Ks1JI2RS-8w#cDv& zlK~s)Vy%WXH?TDs7PDL3u8~^%3=Gnp;^yG#iJ_u%u0KgIddS1^^f71?go+j1Kf#4d zz2O#JAMIHq^j>3%bWlPvp;CIITd8)1i>NTRaKyw?pT!5WE*nc-h>mI%tV!B7IRMHreh zKqwJbT`1BFS;v&9Y6vB7mXo|c+a%txZmSceJSW)j$IyI0!A+j4@B%IaEM_O3A}LT= zNSfzjSVEAfc>*zZNXLxPkx6nh;!i)O<*)s-5N+k0kLN7gURfKOD;Wtd$v6$N1mleM)nQfB!01T zf4jYT=jK{Fy9a}ZT=ex~XWE+<(CoX=uklx(W0Ei*x9M`ba!G#Q%ZHPEsvN^jn_wN} zA{Or80X%ZfP-bOWdY2*uq>m55f>Jao5gD$^bIW^}b3c^iVNL4scMVDP<}G>?^88n7OgqJgai7=EfsD}vRW&TgQ+HJN_A zji7TsRKpS);U}b9GV{L3?V^Mlsh6^urp0C*`N?+1J39ymV&8^g$eJ*5$AhBg6p*3~ zNfQjO1XY#pO`pJO+D+Uwk|jLSLkgoA>MH7wenXf> z@W6aR$nyxwB>^Rhbvt>7g+>fLK@kju%%J&i)6$C$xr5sSI` z8&9wM1O}CkYQi8iSo;#{u#xMU3zg3Jq;__5-IVoQ33QyybiIp!STw<_^_B7zSs%^B z<90>7sqH>_o7;UdgRg1M5-Z%*No;NhS6@wh9e`>@k*co6dgPE*<^O z!#1F8Xb^PI-7im&f$l2ErX)dlJY;5tAHhZs5S{T@$;Nnhoo&ox_^H?fySvVNVirPT z2)<+AQ^N}~Sd3DSkvEOxGB($SU>2X z=)CGGxf%F+t$%)Cbwe1%+v-Qr_c9ty_ z;LC!q(u7vX1}CFzHY~ZRo>~42EKIqqcu$9l+N$0k%SXZGFhV$@a0sIHU-Iv^d+J(zvq6`H4);73>Akc#`k^a>+htL*9YUvZL#` zD3Va329N+68t@gFIsp0dc-RnTM6F7;y-r4)BnV8(d_EX|kZJuv>h%g9JK=3|*aqyk z+=7>~l-(hj+Sa+M{JbT5xJEoIO)Urcds83VsDE6eH{U8PwU6n67c|gqCw+Iy`{R+Z z3^t)9t3sSAYd5FFnF8-=gW>RkDdKP^*$6uWC72p6?+8ocU_3x_0`8GZ?GX`h!|ByfiK!_Cm6lW(wpwl+B-^r;;C%- zPk1RbKWXx=@#v2whOXEzidF!Pww1x{EpBLUMs zKtqv%4SR_EBHdDE%sQh%j!YPBfF4k>2Syas285h$;+#8qK9FP`MxXRvZ`R+3{wlFK z_0U>z2reJ506`weEi{iuM7P;7 zs|ajk67Zr8%^s~&bxzc1kM(&uuLO?3K$Z1lt2}s_P+A7uTt?TIbmUh0>Fv;)PKxfPyz@6MS7}sGJkZzp|Hsfc z`EX@9qvtrm-Vl3YC}}nK`i{b|8-hrtnC>b6-tzi*i?c7d`KJDIwn~^i9iw5*M%W-+8K?#`02ym`Y`VTJ#C!o_Y zVg4lj-V)=RDuAR4HW|Mfgo2mJY12H8)v!z$g~jAvrle0dHU3R0MSydcICj>AD2rlx zfif~cZ&HxPhVhW~L3HTtLkOU3*rMFsjPhKVK!Pk5vHoU(`t9?48stgJ6|48-lzaFb z@R*8Xdn0CRzP~+kr&1*)Cg~w-Ce(VJ552RbYAT- ztO4Rk=?lpil)J74r8_voB-rFIojWSnwy^ug*+v^_N?S@s1K1*EMa1rXKY=;KW?RtKg z4;$26^`SMz-A!U39@*xwhIH13CGARC$DZ$Dix|Z-TJXEDA8kYo$Y6=4qM2>x<=ea{ zN~9)HbkN41gtSbaDs6|z@S%sov}|SmbSy^nZXz4j$p8gi^F-}#lDikURmcX7!HVpR z^A+0DRv&LcM(zST#M3-lM76L>pY;8`HvkP+oD$5YsB#$s9!j^!whImn9>1>~Jwpc%H!Sn4G!wtNRzJ&yG+Ap}A z)6v^%zre4YWTXvC_V-F*I_oPPdt%#2yi5=4DOzd@2PqPU1)2#5kuhk=-8>RFTu!fw zs{#jy@&@72QW~JP4st`7rBeJUxDpGm;%#X!GThamv{Y}eM$3vFA8~o-QDSPj6GcXK#Se^3jE>i7w@;O^7Dtio#L>yjK9kw>(f?iHanRh;DF^Fyt+;)uW)h< za5&@(=6ijzw&@^62@6t(5Ewlo!#H!GvQ~)2EcT@GY`jY|k5C9%=6HQJG{|OFB)l~t z-gKC4j^1NIi1G_Icg5r)`!(2GYK0r#P(gzwl0R{i!1}72vv~AV>#5YRpR~rrqajL3 z;1I$!3E=ptE=U^CHV=zfnu3%TQ{?AQ5v?QpoWy7s`A?)PscAYYmX-4zJ&t@R$7MoM zxQXS2(mR>cdFcmj3`d&e23w)WLs@Z=;OUxMH8m(oY7HS;&b^lKthL@g>)!)I5wW|?JucL6XB?Wj%-OX z9Rs;LB}S)@>^g4=9PJ%BGHBS!3>p$tNQF{O;3fQ71pZV+E_HDZN!+p_G(%?+z|)7w z>}C^-m$UM45^7ay>x57ow}0H@Xm5<}W6vWjssj3VfF%`~qe&FJu)7PKctL9ij@4Ol z`EW&9;v`hUOBMx*)2Qx{djwe&AaesI zhPJdj%MqH^Zq&{WbDFYu#}53EE|%1%rD)$;3v|8&qOZ&;LduL2!v|g+q@-YO6_FCj zfiZ~luEV3a;*yvTx7PwY-YO8H$C*3t3hU6uF4Uq2o{c3mNEsm{$wW%7+ndo^*2E1tp`ig05kwuzLbg`ZFnPC?6ki)p zPK@lWpytv^Bq^`Ws4aMBKI#WsP(QKO*Y8$b*AH+LQbS3N`jcRncjq{L+u+Vi=Uq|> zfe&G&@;;pQ##)oOubieMQJ5xDM8X2I{e%bw;363D7IM9(xoVI6_h|q;sk-* z7?n0b6QV&J!m=?&G{RI-#xJdkz@8W=7SbMtYy*!&WQa}g)}<~WvAI^$EgG~TYA7y+ zN~8pV5-DlMwfuU2M)bqm73V*DVkjjZpTJhd)? zAV-jBJUB{V@ul-`RdJ|ZCznRc=h5RD(J$DihEL5`pUA3{QyiACW5c9%FU$qL<5)Ra zYdQ=o1PhzY9yra&yhWFiK%*Urhp=>a9qW~kZihua8wc$`gRY5pYn}vvkK~~^=l zQ4)$g!89rc>}0UzqXMSp=Cmk+u)xPjB2(62g<(PjnHjpiS*K{Q5fNN}uhRpI8_!2k z*vGLzogofckYTX77i{=jI9-`)7wrrbqJ)&ae0qH~5Q3&A**XBlGK)pSpyT-UaQ)&X;J4Iq`KS|i^E0O zWA%Pq)Hw7qn%&_8hwnxdOmWTDGCHn?>;L*erZ!N#$XIfw+j-0Bc3#s~scht3>w}iG zl?S;7pD5ph={*{#=)wF+ybMNC;20HkJQ*k;c8!-+6@HCG;+3*W(JjpV;%pa5kBQ@S zwv$aG90l-}EfJgNM5&~#$NL~M{hCaGX3Wb4PfltMKV%H#i%o;Ke|I(6p@AhjwArul zWSIax_EDrgkgXniLq60IPB8Ux+S|HKqG?Fnn2wKJJk69YmGT=0+P`1&!8-KdurBCe z7|ByGf|IANI4vV>UFH%~Nk%jWv^X18*BIhDi?79L>i|KA23?xY8}mvMiN0yQhuxp1 zIarOps+gS`qtn?$&IB?Mu^lKeO7SCcOvy}6(ZZb8Q z1aaVA6<6jfFtZ?=dXVN&MB9qO1?jGo?Slk<3M)7;D(PXdsKTtXHZku_(X2?DI6vvE zA;hQQ1Xv+-xGbt7*%z5lN5x<# z{h)ONA4Wzp5cz(goVE~C0n}wRe<=oMmDOVxV!)d@9QzHU=}LiW-H?#5KK z>*jZK^Ft(;Qr!^IJk17@aO*UXj%)CwlR-mQJw*B<-WTUDbb`HjEkYrUl$-`nxiro< zRy5n{abBfd11}|;MipsAworY2E!PBl&9jb@|13MI-uw#bY`vZfX{~cgvXIa}E{Ra7 zgmZBZsaOzFMvMm|1gS(X7zjdIGT34T;vjP+tGcL)P%FEpvLh%MoSoB+{WyCP+mAL` zns%zCf>Vz;x`H?WWbsrAmr_WyPg#ti1gWMZ1Pvt82?xi>dWm9HmePIP8wIT1EfECVRXo!)rUk`{HeSNL)vQ9W^FH;(7!%V0vJe2sg?ehV7xqSz)F_T1XJF z=`^g~r%g4*7gMCtlf*t?YJyfI^L4RiRhkOcgt*K2o{&COavk_mKsZFIz5C&f|?+S zLR;=|`z6ZcJ^s>r{AwE8tRQ}RFkydKC*~kOC~@FHu|V7DloR>%i>}BdrQ9Gsa+4ZpY9K~9+LD;#utxCvuDe8bEWeCYNGO){4(9vN$!S|tTW?Mnp16fgO zA5^~R;OJgv7C<0&L*5daPd3qLHY&|v1t>kI)80ui@Q{TmqcUoUX-FADK_s|2zRXqw zpUYU}0m`T_`N?h)#wf(_0bw{f7tJEWMe)3mlI_z4FhHc+$F1)xl$EjA1Pqn~s7g0& z=e-dH3w5d-TdovKO!sa+MgHjl?z+t5tr=PYtvE@L_(S65_&vWw3M8BVflPD;%uqqI zvQ)!-wnt%glC91*#&S};vMW_p#9_`mrE;V6+s1J$I>>?poG?OWbl9PN{E$Sj|aIx7nk8 zkaX2CDFn1i_j5JQ3WEt9CDEDe!RQF9GlO3@57~~AMNl(~oh$)wXsSMyOPMP1HKWW* zlJksQn`6o?;Y^#B+z9;4vN!!{qd6H_M_eWq59 z688mc)0}F1z^%hx%}FpT6?5hYaAS494+<*_CKlNgA`B>Igy>qrd-$|hW`XA_>b&BmN0duQ-nK^xju66U@+cm?NL zBA2$0m-y1PFdN1&UgT6({F!mAC@@%(#qdYU#FVoh#5Gxnj52L>i>||70d;h)Glkdq z3a_|9p7wLQI4mf0J@7i%9Y54UJnZ*}SU?pEQJ0b1A7@twW>rOHixdlCcnN6sy=B6D zZ$wn$RHHkIF|aVAtySYbYVho2z{w5`$sjU;*c!pY&`21kf@?D=k&q4;eNbB6G6yy1 z3kC|3{}5O!CWw_7x7fO;JQst7wOq|xVeG+{m$6Y!F%(D^n)OnTVo<;aI}vhLV{xLS z&23;0-i<|uKF)?bwvkn$q2TVY(2tLCo*vhb<5(uir!wEaYPC8gd4^iF(ZOt(7A7df zkPIm1_BRymaE=k@dO-)!?OZ(d$)!G8Ni=?WV(SfOAyaQnd2IMiEdZ zs+~^BI@-vm^}%+sF5)`3W4B(nNn!)S@tjk`M{g=knSC7?o>;m!VGg$?XFKQqwtx2c zc}h1r_wH*i-{1pcgsmp>^8jN#ohF;L@`?6;?tP zo^EZ)MU#B#bUZ>9$r_CPxMqi| z6Gt7=tkUPVNKIx#e&Uxs7!ea^(l^cFK>pdRt z<>)%?iOChu%n;&kK|^>z3FBoO)N)VIp&fS;iY_%*5`pEa%o~G&fgjy6u7(u&ZWU}& zhr!dHNS`h^Hi-76>O)MdBokSdxQ<=|KsN7}31^3k0>Z>&9HMxGDvS$Dd^7M&1=(~m zDhmz@n3EMPtH(0baD63ZKU3OTXbtf?y7irufss7=`sGp@AzmC*wM&Z3!#X9X8n-?@ zw+BsOr&}sx3jTV`Z;&+rO6g?qL5(BLt=XMl6Yp&C*1qKgLD=DViH$z2(`0|n(OT>| zHsYFtG$YCA6|8W72W(Vp+>JS&5WkEG(lsAnR7vA$k z7DDCDA4NFOmm=hGk=JrcU&I|V&_SA}BGXS2SF5On#>|Vn2MQNJ2rbIuXj`=)F=VU4 zz>bP(%0c0SP6bj3uQ<7}%(o0EmT)fkY*sk76xbNyEiL1Cg2Us?Tgk00LD)z_ z3#8|TE~ZHbha;B4Y(ZCE=#CVB2@8m+L%&6S80&c~#$9A;RJMJX9WLcqHs;x54oJu+ z$2!E5r-KqeYQtS#5EzE`+_70I)a-;~!?pcHsE4zZId0xO*&B}}VyG=rtVWO7!YMmo z=|hSxeKytRT&5(39y!tn<4&Ri(c5C@_{j3~bR=Xy#kC_N=R~F?&aCbVW}6I9Js;hW z(Ft>mGq`e1z?Ee&pTz?+(N;yDf}mswZjU9*t3Yh!$xRL9vHGmW#kAHDvAgHa(nv?V z*{DQ;v%S{f90Wf;;2HC-(>(r5g*Aevj#v6L1>n;K#)oxuSYfeKity={n(Y0V{xmj$ zBF8~X$Tmucs62%UK0jmT;;vY#-2+mIeiI)xh&Z zi<3?I#C&K$SHnflT}$xZEEvjip+f>@?N%I9MG~BX{;*n%enHpJO4CVUDOE8pB+ije zqnWphwvnrmZg27MnsmE>nviGG2N{?a`3o8??cVKaC7f*ob)xh_5;swO?*7Zp$vvKFH(jiCfZZQ&Un6YW!5Xv%ky zMoUF~N83m2t8>L3Qc}|#GSjt?7DAhlh@HgyeQ<*cA`ycb-D(mzuH47j(j?o7QzGJ=f*#K=aOm^b)h;hvUMpoW^mc?2D9ujBYg{YsD zwjdXhKNj3I#%uzev+%|xjIJ6}75Sg&HYrfrC@&@1aTCQB4q!}9_(BKV_SdJ^rJsoh zmvy8*Z&pyLWGre)_Bzegl!CV?h$8ZKd%TUeEscEX8Pw!ZX*#bRx@gCcz#jTk9K`7D zTt2Z+kelO}{LJFs4f{{pcZ!oFBh${;a((CPjC(YMLxTC0;qFbk`crU$hO3_pl}}(6 zJ1?ymfkiZ}AP}gsCODT_OM}%Vi!-n?3Wr=0eo}@K`r;`M&i7ArBX7q;5l?d6_?4^* zZQdF0iIxc(fb7vUPTF|g9LlJ4gLcAWb3tIG)Q>S=X;NQXS46xI0s*IR@UGagJ`HU(V`A9QJjtMJjxQ}8?m#jPqCjmTjierM5+>q^R zD?7%}k&dNqy^IcCRiEyHkzWl5cdZGz2SAE>mrG#a_OKJ5=0)hNVZ+>zMM*SD8$RSL zRp#0{pbR&@e7JHT*=9>F=?s_Gndz;RLi>J~j-$wN#TzS;s%ScQX1!>0z*U+nNmNyj z)m5@Gv`#f5%Y&7O@}y5sPe;j4LAgHNIU0t;EDHld#D6e%Dxqujc{y>^+#)ryn@j=b z*vffaAvf(>s$FE0WFbcTEy4}wwE{_SaEcxLtyzJmjO>!OhN}f+HQJ7()~Bo<#6VPD z2^wNZBv)^wqP>%(VTnElPpZzKn%A^^#(4=_QA}1Y?@MAPYBI>!v6q z2N&yrp0P2yYb{pS|6=1#gnirD!{t zfWz@)7{D@AjAM6x{nVhC(>k;bMB7=01M5=D4sWh^+pz|aLD79zE)`qMcOf*(4G7_T9PFEr#K8tp+9EWouV-FI! z@X5l($Z3Nd&z6+SG;dxS!vbnNmZc+*c9J9R${uX*k)WUuy|lE;xnB6OXlt={+8li| zZ^^#9mr9BI!x5X9t*V$UirECxyR>1_P$ZO|YL`-*rm!OK)a&mcf@6@WO}CXTxC!1) zFuBtO747H4fy!w@W^j)%v~Hu@!z9E3G0`CGTi8iUsa(%u5jb4}E?c5DrYY{@r<0n5 zWw2K&a>b5BC1-A}E@%fjIjOhCuSzZy4T%n~%28X2ad!>mja=85ZXL5=MbHHO4e70f zmpy;7L*yD&@GPQj^au#9VWc}i#WDohLo%XaLUN2$-&N4Avc}-9u)hjw2g{BF5}dPV z3ll=?a(i`Yb_=kVm$%1rJl7EhtKJ%6d-=$c@>7xr8`?*YKq8nn$%&+txpBd{ zj(fp9gKq5!vm;VwjO+v2$*E}RgKP?IK*Gc6Is|rGdhb{~M-Qy^jv>D921<1QaXEX8 z+w2w3Wa0(!hI_O+^qlkzuNe><83JfISz_}dxx+|GCuu@Jjbm73zcj>jO_oMJM}@F4 zZVA;cV^(l&PBGW5ia=ET9SpyFl%8*rBaLLLTumH4ErqeB;rPG=7!Jlt%gS_RYPO|% zBOrsOs%AA>At+zYu#qEi4Npgz_)!ELJt*c>tKbumuvC`n3A$wN*mk}U5Y2=uYy)HU z<85x2P#uDE12r7+sB*S->85R_lP#yw@c*fT*xYT3VF?4hoPGhr~h$Grn*)O=Nw_I~7 zSVBiS+QJ||%8)i#;=stbVkpsyz~eVY;V0`Np@PdGR$~yr=iJk3zI{Dzvsf}@)y}US zev6m}-f=wT&T9BC$tD&=f0EH-qKm^*F#xJ_z9mrsyMSi9CaH+QKR>2n~HDFh{$|0no7`f9a<76Gg z0Q4R&&810h^6HdyaX>uZ9hQ51wFNy>99fKSA$_uKdov|Tkv%aiSp4%9uf>voydw>z zDwny*!gfMs?5tF+VR4~l%YZm3$qGH~PK7k0Dua+UKxZR(kK5W$$(LmN+2lFlMQom! zXQp`)Ti=ZgqFd5po(*Zm*6aQJhz)2Z2x&^Tyl`I=Y#?OW2QG4_OsdDBfTh`k(L-=J zAeTz1`HY(DErBlduhUFX> zO5(5tl!F@`6s37IQ98oh_sRQ~PSki0K{ct_I>ulO7mVk$lko0RNjKZ^c8KInO&x8g zROzIM2e*?hJJd3c&a_!AGqOu>-1stxCTbnC>jQzRhBWzPE-?u=1lEJj>72yi2Z&NR z%s|#MG?hE5X{c0pS1z?(aLx>lri48=7s;XMVD=@>SE6mPRw!+T4;ETV+c|QMQH{N^ z75CJX(oq*R$vILDA;3VZBH8B%`J7r!mL~)h@48gwuL*t1t2i|)n$2G1v-J36Dec_h ztyb-Vh{V=ldi2-Le&SgO21KBTLFKSw4_fSYo?H(k?7DdWLiWn{u-8$2RMs}UWe-5w zq3bVVcq?5S*cDTZQ)m)f7Ufrs=%$4s#=?pT{J}DC@03%epaffWym_uD7%VPH=_e5e zmstq$HK9t@RpkO1=t17k3zy_5T9ka|_c`%6L;kp7r)1TL$yz?D4HG}rXGTNfB1SA% zZOQ2j?bxltWW`nB)+t0xO=6KM6dp*{3Irza30i_!J)GE_k$T$M{V?;iP#gOKdbEId b#<)#4%@J_CltiFVUPDVX1lcnQ*(m=X*o=uT literal 0 HcmV?d00001 diff --git a/build/Makefile b/build/Makefile new file mode 100644 index 0000000..6c92599 --- /dev/null +++ b/build/Makefile @@ -0,0 +1,686 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "MinGW Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +SHELL = cmd.exe + +# The CMake executable. +CMAKE_COMMAND = "C:\Program Files\CMake\bin\cmake.exe" + +# The command to remove a file. +RM = "C:\Program Files\CMake\bin\cmake.exe" -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + "C:\Program Files\CMake\bin\cpack.exe" --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + "C:\Program Files\CMake\bin\cpack.exe" --config ./CPackSourceConfig.cmake C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + "C:\Program Files\CMake\bin\ctest.exe" --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + "C:\Program Files\CMake\bin\cmake-gui.exe" -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + "C:\Program Files\CMake\bin\cmake.exe" --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\\CMakeFiles\progress.marks + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\naifa\Documents\Projects\C++\GraphicsTest\build\CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named Experimental + +# Build rule for target. +Experimental: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 Experimental +.PHONY : Experimental + +# fast build rule for target. +Experimental/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Experimental.dir\build.make CMakeFiles/Experimental.dir/build +.PHONY : Experimental/fast + +#============================================================================= +# Target rules for targets named Nightly + +# Build rule for target. +Nightly: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 Nightly +.PHONY : Nightly + +# fast build rule for target. +Nightly/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Nightly.dir\build.make CMakeFiles/Nightly.dir/build +.PHONY : Nightly/fast + +#============================================================================= +# Target rules for targets named Continuous + +# Build rule for target. +Continuous: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 Continuous +.PHONY : Continuous + +# fast build rule for target. +Continuous/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\Continuous.dir\build.make CMakeFiles/Continuous.dir/build +.PHONY : Continuous/fast + +#============================================================================= +# Target rules for targets named NightlyMemoryCheck + +# Build rule for target. +NightlyMemoryCheck: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 NightlyMemoryCheck +.PHONY : NightlyMemoryCheck + +# fast build rule for target. +NightlyMemoryCheck/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyMemoryCheck.dir\build.make CMakeFiles/NightlyMemoryCheck.dir/build +.PHONY : NightlyMemoryCheck/fast + +#============================================================================= +# Target rules for targets named NightlyStart + +# Build rule for target. +NightlyStart: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 NightlyStart +.PHONY : NightlyStart + +# fast build rule for target. +NightlyStart/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyStart.dir\build.make CMakeFiles/NightlyStart.dir/build +.PHONY : NightlyStart/fast + +#============================================================================= +# Target rules for targets named NightlyUpdate + +# Build rule for target. +NightlyUpdate: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 NightlyUpdate +.PHONY : NightlyUpdate + +# fast build rule for target. +NightlyUpdate/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyUpdate.dir\build.make CMakeFiles/NightlyUpdate.dir/build +.PHONY : NightlyUpdate/fast + +#============================================================================= +# Target rules for targets named NightlyConfigure + +# Build rule for target. +NightlyConfigure: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 NightlyConfigure +.PHONY : NightlyConfigure + +# fast build rule for target. +NightlyConfigure/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyConfigure.dir\build.make CMakeFiles/NightlyConfigure.dir/build +.PHONY : NightlyConfigure/fast + +#============================================================================= +# Target rules for targets named NightlyBuild + +# Build rule for target. +NightlyBuild: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 NightlyBuild +.PHONY : NightlyBuild + +# fast build rule for target. +NightlyBuild/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyBuild.dir\build.make CMakeFiles/NightlyBuild.dir/build +.PHONY : NightlyBuild/fast + +#============================================================================= +# Target rules for targets named NightlyTest + +# Build rule for target. +NightlyTest: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 NightlyTest +.PHONY : NightlyTest + +# fast build rule for target. +NightlyTest/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyTest.dir\build.make CMakeFiles/NightlyTest.dir/build +.PHONY : NightlyTest/fast + +#============================================================================= +# Target rules for targets named NightlyCoverage + +# Build rule for target. +NightlyCoverage: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 NightlyCoverage +.PHONY : NightlyCoverage + +# fast build rule for target. +NightlyCoverage/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyCoverage.dir\build.make CMakeFiles/NightlyCoverage.dir/build +.PHONY : NightlyCoverage/fast + +#============================================================================= +# Target rules for targets named NightlyMemCheck + +# Build rule for target. +NightlyMemCheck: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 NightlyMemCheck +.PHONY : NightlyMemCheck + +# fast build rule for target. +NightlyMemCheck/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlyMemCheck.dir\build.make CMakeFiles/NightlyMemCheck.dir/build +.PHONY : NightlyMemCheck/fast + +#============================================================================= +# Target rules for targets named NightlySubmit + +# Build rule for target. +NightlySubmit: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 NightlySubmit +.PHONY : NightlySubmit + +# fast build rule for target. +NightlySubmit/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\NightlySubmit.dir\build.make CMakeFiles/NightlySubmit.dir/build +.PHONY : NightlySubmit/fast + +#============================================================================= +# Target rules for targets named ExperimentalStart + +# Build rule for target. +ExperimentalStart: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ExperimentalStart +.PHONY : ExperimentalStart + +# fast build rule for target. +ExperimentalStart/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalStart.dir\build.make CMakeFiles/ExperimentalStart.dir/build +.PHONY : ExperimentalStart/fast + +#============================================================================= +# Target rules for targets named ExperimentalUpdate + +# Build rule for target. +ExperimentalUpdate: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ExperimentalUpdate +.PHONY : ExperimentalUpdate + +# fast build rule for target. +ExperimentalUpdate/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalUpdate.dir\build.make CMakeFiles/ExperimentalUpdate.dir/build +.PHONY : ExperimentalUpdate/fast + +#============================================================================= +# Target rules for targets named ExperimentalConfigure + +# Build rule for target. +ExperimentalConfigure: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ExperimentalConfigure +.PHONY : ExperimentalConfigure + +# fast build rule for target. +ExperimentalConfigure/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalConfigure.dir\build.make CMakeFiles/ExperimentalConfigure.dir/build +.PHONY : ExperimentalConfigure/fast + +#============================================================================= +# Target rules for targets named ExperimentalBuild + +# Build rule for target. +ExperimentalBuild: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ExperimentalBuild +.PHONY : ExperimentalBuild + +# fast build rule for target. +ExperimentalBuild/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalBuild.dir\build.make CMakeFiles/ExperimentalBuild.dir/build +.PHONY : ExperimentalBuild/fast + +#============================================================================= +# Target rules for targets named ExperimentalTest + +# Build rule for target. +ExperimentalTest: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ExperimentalTest +.PHONY : ExperimentalTest + +# fast build rule for target. +ExperimentalTest/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalTest.dir\build.make CMakeFiles/ExperimentalTest.dir/build +.PHONY : ExperimentalTest/fast + +#============================================================================= +# Target rules for targets named ExperimentalCoverage + +# Build rule for target. +ExperimentalCoverage: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ExperimentalCoverage +.PHONY : ExperimentalCoverage + +# fast build rule for target. +ExperimentalCoverage/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalCoverage.dir\build.make CMakeFiles/ExperimentalCoverage.dir/build +.PHONY : ExperimentalCoverage/fast + +#============================================================================= +# Target rules for targets named ExperimentalMemCheck + +# Build rule for target. +ExperimentalMemCheck: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ExperimentalMemCheck +.PHONY : ExperimentalMemCheck + +# fast build rule for target. +ExperimentalMemCheck/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalMemCheck.dir\build.make CMakeFiles/ExperimentalMemCheck.dir/build +.PHONY : ExperimentalMemCheck/fast + +#============================================================================= +# Target rules for targets named ExperimentalSubmit + +# Build rule for target. +ExperimentalSubmit: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ExperimentalSubmit +.PHONY : ExperimentalSubmit + +# fast build rule for target. +ExperimentalSubmit/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ExperimentalSubmit.dir\build.make CMakeFiles/ExperimentalSubmit.dir/build +.PHONY : ExperimentalSubmit/fast + +#============================================================================= +# Target rules for targets named ContinuousStart + +# Build rule for target. +ContinuousStart: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ContinuousStart +.PHONY : ContinuousStart + +# fast build rule for target. +ContinuousStart/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousStart.dir\build.make CMakeFiles/ContinuousStart.dir/build +.PHONY : ContinuousStart/fast + +#============================================================================= +# Target rules for targets named ContinuousUpdate + +# Build rule for target. +ContinuousUpdate: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ContinuousUpdate +.PHONY : ContinuousUpdate + +# fast build rule for target. +ContinuousUpdate/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousUpdate.dir\build.make CMakeFiles/ContinuousUpdate.dir/build +.PHONY : ContinuousUpdate/fast + +#============================================================================= +# Target rules for targets named ContinuousConfigure + +# Build rule for target. +ContinuousConfigure: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ContinuousConfigure +.PHONY : ContinuousConfigure + +# fast build rule for target. +ContinuousConfigure/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousConfigure.dir\build.make CMakeFiles/ContinuousConfigure.dir/build +.PHONY : ContinuousConfigure/fast + +#============================================================================= +# Target rules for targets named ContinuousBuild + +# Build rule for target. +ContinuousBuild: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ContinuousBuild +.PHONY : ContinuousBuild + +# fast build rule for target. +ContinuousBuild/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousBuild.dir\build.make CMakeFiles/ContinuousBuild.dir/build +.PHONY : ContinuousBuild/fast + +#============================================================================= +# Target rules for targets named ContinuousTest + +# Build rule for target. +ContinuousTest: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ContinuousTest +.PHONY : ContinuousTest + +# fast build rule for target. +ContinuousTest/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousTest.dir\build.make CMakeFiles/ContinuousTest.dir/build +.PHONY : ContinuousTest/fast + +#============================================================================= +# Target rules for targets named ContinuousCoverage + +# Build rule for target. +ContinuousCoverage: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ContinuousCoverage +.PHONY : ContinuousCoverage + +# fast build rule for target. +ContinuousCoverage/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousCoverage.dir\build.make CMakeFiles/ContinuousCoverage.dir/build +.PHONY : ContinuousCoverage/fast + +#============================================================================= +# Target rules for targets named ContinuousMemCheck + +# Build rule for target. +ContinuousMemCheck: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ContinuousMemCheck +.PHONY : ContinuousMemCheck + +# fast build rule for target. +ContinuousMemCheck/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousMemCheck.dir\build.make CMakeFiles/ContinuousMemCheck.dir/build +.PHONY : ContinuousMemCheck/fast + +#============================================================================= +# Target rules for targets named ContinuousSubmit + +# Build rule for target. +ContinuousSubmit: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 ContinuousSubmit +.PHONY : ContinuousSubmit + +# fast build rule for target. +ContinuousSubmit/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\ContinuousSubmit.dir\build.make CMakeFiles/ContinuousSubmit.dir/build +.PHONY : ContinuousSubmit/fast + +#============================================================================= +# Target rules for targets named GraphicsTest + +# Build rule for target. +GraphicsTest: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles\Makefile2 GraphicsTest +.PHONY : GraphicsTest + +# fast build rule for target. +GraphicsTest/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/build +.PHONY : GraphicsTest/fast + +C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.obj: C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj +.PHONY : C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.obj + +# target to build an object file +C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj +.PHONY : C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj + +C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.i: C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.i +.PHONY : C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.i + +# target to preprocess a source file +C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.i +.PHONY : C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.i + +C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.s: C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.s +.PHONY : C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.s + +# target to generate assembly for a file +C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.s +.PHONY : C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.s + +funcs.obj: funcs.cpp.obj +.PHONY : funcs.obj + +# target to build an object file +funcs.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/funcs.cpp.obj +.PHONY : funcs.cpp.obj + +funcs.i: funcs.cpp.i +.PHONY : funcs.i + +# target to preprocess a source file +funcs.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/funcs.cpp.i +.PHONY : funcs.cpp.i + +funcs.s: funcs.cpp.s +.PHONY : funcs.s + +# target to generate assembly for a file +funcs.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/funcs.cpp.s +.PHONY : funcs.cpp.s + +main.obj: main.cpp.obj +.PHONY : main.obj + +# target to build an object file +main.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/main.cpp.obj +.PHONY : main.cpp.obj + +main.i: main.cpp.i +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/main.cpp.s +.PHONY : main.cpp.s + +shader.obj: shader.cpp.obj +.PHONY : shader.obj + +# target to build an object file +shader.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/shader.cpp.obj +.PHONY : shader.cpp.obj + +shader.i: shader.cpp.i +.PHONY : shader.i + +# target to preprocess a source file +shader.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/shader.cpp.i +.PHONY : shader.cpp.i + +shader.s: shader.cpp.s +.PHONY : shader.s + +# target to generate assembly for a file +shader.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles\GraphicsTest.dir\build.make CMakeFiles/GraphicsTest.dir/shader.cpp.s +.PHONY : shader.cpp.s + +# Help Target +help: + @echo The following are some of the valid targets for this Makefile: + @echo ... all (the default if no target is provided) + @echo ... clean + @echo ... depend + @echo ... edit_cache + @echo ... package + @echo ... package_source + @echo ... rebuild_cache + @echo ... test + @echo ... Continuous + @echo ... ContinuousBuild + @echo ... ContinuousConfigure + @echo ... ContinuousCoverage + @echo ... ContinuousMemCheck + @echo ... ContinuousStart + @echo ... ContinuousSubmit + @echo ... ContinuousTest + @echo ... ContinuousUpdate + @echo ... Experimental + @echo ... ExperimentalBuild + @echo ... ExperimentalConfigure + @echo ... ExperimentalCoverage + @echo ... ExperimentalMemCheck + @echo ... ExperimentalStart + @echo ... ExperimentalSubmit + @echo ... ExperimentalTest + @echo ... ExperimentalUpdate + @echo ... Nightly + @echo ... NightlyBuild + @echo ... NightlyConfigure + @echo ... NightlyCoverage + @echo ... NightlyMemCheck + @echo ... NightlyMemoryCheck + @echo ... NightlyStart + @echo ... NightlySubmit + @echo ... NightlyTest + @echo ... NightlyUpdate + @echo ... GraphicsTest + @echo ... C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.obj + @echo ... C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.i + @echo ... C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.s + @echo ... funcs.obj + @echo ... funcs.i + @echo ... funcs.s + @echo ... main.obj + @echo ... main.i + @echo ... main.s + @echo ... shader.obj + @echo ... shader.i + @echo ... shader.s +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/Testing/20231226-0809/Test.xml b/build/Testing/20231226-0809/Test.xml new file mode 100644 index 0000000..a82d53a --- /dev/null +++ b/build/Testing/20231226-0809/Test.xml @@ -0,0 +1,34 @@ + + + + Dec 26 02:09 Central Standard Time + 1703578195 + + Dec 26 02:09 Central Standard Time + 1703578195 + 0 + + diff --git a/build/Testing/20231227-0946/Test.xml b/build/Testing/20231227-0946/Test.xml new file mode 100644 index 0000000..80668ce --- /dev/null +++ b/build/Testing/20231227-0946/Test.xml @@ -0,0 +1,34 @@ + + + + Dec 27 03:46 Central Standard Time + 1703670408 + + Dec 27 03:46 Central Standard Time + 1703670408 + 0 + + diff --git a/build/Testing/20231228-1823/Test.xml b/build/Testing/20231228-1823/Test.xml new file mode 100644 index 0000000..1d09634 --- /dev/null +++ b/build/Testing/20231228-1823/Test.xml @@ -0,0 +1,34 @@ + + + + Dec 28 15:02 Central Standard Time + 1703797339 + + Dec 28 15:02 Central Standard Time + 1703797339 + 0 + + diff --git a/build/Testing/20240114-1820/Test.xml b/build/Testing/20240114-1820/Test.xml new file mode 100644 index 0000000..ebc916a --- /dev/null +++ b/build/Testing/20240114-1820/Test.xml @@ -0,0 +1,34 @@ + + + + Jan 14 12:20 Central Standard Time + 1705256419 + + Jan 14 12:20 Central Standard Time + 1705256419 + 0 + + diff --git a/build/Testing/TAG b/build/Testing/TAG new file mode 100644 index 0000000..6c0f517 --- /dev/null +++ b/build/Testing/TAG @@ -0,0 +1,3 @@ +20240114-1820 +Experimental +Experimental diff --git a/build/Testing/Temporary/LastTest_20231226-0809.log b/build/Testing/Temporary/LastTest_20231226-0809.log new file mode 100644 index 0000000..d215c2b --- /dev/null +++ b/build/Testing/Temporary/LastTest_20231226-0809.log @@ -0,0 +1,3 @@ +Start testing: Dec 26 02:09 Central Standard Time +---------------------------------------------------------- +End testing: Dec 26 02:09 Central Standard Time diff --git a/build/Testing/Temporary/LastTest_20231227-0946.log b/build/Testing/Temporary/LastTest_20231227-0946.log new file mode 100644 index 0000000..7dce024 --- /dev/null +++ b/build/Testing/Temporary/LastTest_20231227-0946.log @@ -0,0 +1,3 @@ +Start testing: Dec 27 03:46 Central Standard Time +---------------------------------------------------------- +End testing: Dec 27 03:46 Central Standard Time diff --git a/build/Testing/Temporary/LastTest_20231228-1823.log b/build/Testing/Temporary/LastTest_20231228-1823.log new file mode 100644 index 0000000..22a15fc --- /dev/null +++ b/build/Testing/Temporary/LastTest_20231228-1823.log @@ -0,0 +1,3 @@ +Start testing: Dec 28 15:02 Central Standard Time +---------------------------------------------------------- +End testing: Dec 28 15:02 Central Standard Time diff --git a/build/Testing/Temporary/LastTest_20240114-1820.log b/build/Testing/Temporary/LastTest_20240114-1820.log new file mode 100644 index 0000000..bbbe5c0 --- /dev/null +++ b/build/Testing/Temporary/LastTest_20240114-1820.log @@ -0,0 +1,3 @@ +Start testing: Jan 14 12:20 Central Standard Time +---------------------------------------------------------- +End testing: Jan 14 12:20 Central Standard Time diff --git a/build/awesomeface.png b/build/awesomeface.png new file mode 100644 index 0000000000000000000000000000000000000000..9840caf3e7f4914ea1c6c15f688ffaf2cf44bae8 GIT binary patch literal 59277 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 Q0|5VhP*hj=DQ6!3fBcW&%>V!Z literal 0 HcmV?d00001 diff --git a/build/cmake_install.cmake b/build/cmake_install.cmake new file mode 100644 index 0000000..a359696 --- /dev/null +++ b/build/cmake_install.cmake @@ -0,0 +1,49 @@ +# Install script for directory: C:/Users/naifa/Documents/Projects/C++/GraphicsTest + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/GraphicsTest") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "C:/msys64/ucrt64/bin/objdump.exe") +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/build/compile_commands.json b/build/compile_commands.json new file mode 100644 index 0000000..e7b299f --- /dev/null +++ b/build/compile_commands.json @@ -0,0 +1,26 @@ +[ +{ + "directory": "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build", + "command": "C:\\msys64\\ucrt64\\bin\\g++.exe @CMakeFiles/GraphicsTest.dir/includes_CXX.rsp -g -o CMakeFiles\\GraphicsTest.dir\\main.cpp.obj -c C:\\Users\\naifa\\Documents\\Projects\\C++\\GraphicsTest\\main.cpp", + "file": "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/main.cpp", + "output": "CMakeFiles/GraphicsTest.dir/main.cpp.obj" +}, +{ + "directory": "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build", + "command": "C:\\msys64\\ucrt64\\bin\\g++.exe @CMakeFiles/GraphicsTest.dir/includes_CXX.rsp -g -o CMakeFiles\\GraphicsTest.dir\\funcs.cpp.obj -c C:\\Users\\naifa\\Documents\\Projects\\C++\\GraphicsTest\\funcs.cpp", + "file": "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/funcs.cpp", + "output": "CMakeFiles/GraphicsTest.dir/funcs.cpp.obj" +}, +{ + "directory": "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build", + "command": "C:\\msys64\\ucrt64\\bin\\g++.exe @CMakeFiles/GraphicsTest.dir/includes_CXX.rsp -g -o CMakeFiles\\GraphicsTest.dir\\shader.cpp.obj -c C:\\Users\\naifa\\Documents\\Projects\\C++\\GraphicsTest\\shader.cpp", + "file": "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/shader.cpp", + "output": "CMakeFiles/GraphicsTest.dir/shader.cpp.obj" +}, +{ + "directory": "C:/Users/naifa/Documents/Projects/C++/GraphicsTest/build", + "command": "C:\\msys64\\ucrt64\\bin\\gcc.exe @CMakeFiles/GraphicsTest.dir/includes_C.rsp -g -o CMakeFiles\\GraphicsTest.dir\\C_\\Users\\naifa\\Documents\\Projects\\C++\\libs\\glad\\src\\glad.c.obj -c C:\\Users\\naifa\\Documents\\Projects\\C++\\libs\\glad\\src\\glad.c", + "file": "C:/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c", + "output": "CMakeFiles/GraphicsTest.dir/C_/Users/naifa/Documents/Projects/C++/libs/glad/src/glad.c.obj" +} +] \ No newline at end of file diff --git a/build/wall.jpg b/build/wall.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49631987d967c1201286664f2d6032525f9fe1e8 GIT binary patch literal 256989 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࣮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

&shoeJMBBztTS9`;l|qbF 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

~DU&+q6r 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

+cN8I83`olICW^C^LPSA%8qx6%~ltMDp1yO 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

E+m)_}JJdwsog%%AOO9eCYc*w7Is-5Z$7nDKdHi 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 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would + * be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + *************************************************************************/ + +#ifndef _glfw3_h_ +#define _glfw3_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @file glfw3.h + * @brief The header of the GLFW 3 API. + * + * This is the header file of the GLFW 3 API. It defines all its types and + * declares all its functions. + * + * For more information about how to use this file, see @ref build_include. + */ +/*! @defgroup context Context reference + * @brief Functions and types related to OpenGL and OpenGL ES contexts. + * + * This is the reference documentation for OpenGL and OpenGL ES context related + * functions. For more task-oriented information, see the @ref context_guide. + */ +/*! @defgroup vulkan Vulkan support reference + * @brief Functions and types related to Vulkan. + * + * This is the reference documentation for Vulkan related functions and types. + * For more task-oriented information, see the @ref vulkan_guide. + */ +/*! @defgroup init Initialization, version and error reference + * @brief Functions and types related to initialization and error handling. + * + * This is the reference documentation for initialization and termination of + * the library, version management and error handling. For more task-oriented + * information, see the @ref intro_guide. + */ +/*! @defgroup input Input reference + * @brief Functions and types related to input handling. + * + * This is the reference documentation for input related functions and types. + * For more task-oriented information, see the @ref input_guide. + */ +/*! @defgroup monitor Monitor reference + * @brief Functions and types related to monitors. + * + * This is the reference documentation for monitor related functions and types. + * For more task-oriented information, see the @ref monitor_guide. + */ +/*! @defgroup window Window reference + * @brief Functions and types related to windows. + * + * This is the reference documentation for window related functions and types, + * including creation, deletion and event polling. For more task-oriented + * information, see the @ref window_guide. + */ + + +/************************************************************************* + * Compiler- and platform-specific preprocessor work + *************************************************************************/ + +/* If we are we on Windows, we want a single define for it. + */ +#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) + #define _WIN32 +#endif /* _WIN32 */ + +/* Include because most Windows GLU headers need wchar_t and + * the macOS OpenGL header blocks the definition of ptrdiff_t by glext.h. + * Include it unconditionally to avoid surprising side-effects. + */ +#include + +/* Include because it is needed by Vulkan and related functions. + * Include it unconditionally to avoid surprising side-effects. + */ +#include + +#if defined(GLFW_INCLUDE_VULKAN) + #include +#endif /* Vulkan header */ + +/* The Vulkan header may have indirectly included windows.h (because of + * VK_USE_PLATFORM_WIN32_KHR) so we offer our replacement symbols after it. + */ + +/* It is customary to use APIENTRY for OpenGL function pointer declarations on + * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. + */ +#if !defined(APIENTRY) + #if defined(_WIN32) + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif + #define GLFW_APIENTRY_DEFINED +#endif /* APIENTRY */ + +/* Some Windows OpenGL headers need this. + */ +#if !defined(WINGDIAPI) && defined(_WIN32) + #define WINGDIAPI __declspec(dllimport) + #define GLFW_WINGDIAPI_DEFINED +#endif /* WINGDIAPI */ + +/* Some Windows GLU headers need this. + */ +#if !defined(CALLBACK) && defined(_WIN32) + #define CALLBACK __stdcall + #define GLFW_CALLBACK_DEFINED +#endif /* CALLBACK */ + +/* Include the chosen OpenGL or OpenGL ES headers. + */ +#if defined(GLFW_INCLUDE_ES1) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES2) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES3) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES31) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES32) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_GLCOREARB) + + #if defined(__APPLE__) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif /*GLFW_INCLUDE_GLEXT*/ + + #else /*__APPLE__*/ + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + + #endif /*__APPLE__*/ + +#elif defined(GLFW_INCLUDE_GLU) + + #if defined(__APPLE__) + + #if defined(GLFW_INCLUDE_GLU) + #include + #endif + + #else /*__APPLE__*/ + + #if defined(GLFW_INCLUDE_GLU) + #include + #endif + + #endif /*__APPLE__*/ + +#elif !defined(GLFW_INCLUDE_NONE) && \ + !defined(__gl_h_) && \ + !defined(__gles1_gl_h_) && \ + !defined(__gles2_gl2_h_) && \ + !defined(__gles2_gl3_h_) && \ + !defined(__gles2_gl31_h_) && \ + !defined(__gles2_gl32_h_) && \ + !defined(__gl_glcorearb_h_) && \ + !defined(__gl2_h_) /*legacy*/ && \ + !defined(__gl3_h_) /*legacy*/ && \ + !defined(__gl31_h_) /*legacy*/ && \ + !defined(__gl32_h_) /*legacy*/ && \ + !defined(__glcorearb_h_) /*legacy*/ && \ + !defined(__GL_H__) /*non-standard*/ && \ + !defined(__gltypes_h_) /*non-standard*/ && \ + !defined(__glee_h_) /*non-standard*/ + + #if defined(__APPLE__) + + #if !defined(GLFW_INCLUDE_GLEXT) + #define GL_GLEXT_LEGACY + #endif + #include + + #else /*__APPLE__*/ + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + + #endif /*__APPLE__*/ + +#endif /* OpenGL and OpenGL ES headers */ + +#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) + /* GLFW_DLL must be defined by applications that are linking against the DLL + * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW + * configuration header when compiling the DLL version of the library. + */ + #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined" +#endif + +/* GLFWAPI is used to declare public API functions for export + * from the DLL / shared library / dynamic library. + */ +#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a Win32 DLL */ + #define GLFWAPI __declspec(dllexport) +#elif defined(_WIN32) && defined(GLFW_DLL) + /* We are calling a GLFW Win32 DLL */ + #define GLFWAPI __declspec(dllimport) +#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a Unix shared library */ + #define GLFWAPI __attribute__((visibility("default"))) +#else + #define GLFWAPI +#endif + + +/************************************************************************* + * GLFW API tokens + *************************************************************************/ + +/*! @name GLFW version macros + * @{ */ +/*! @brief The major version number of the GLFW header. + * + * The major version number of the GLFW header. This is incremented when the + * API is changed in non-compatible ways. + * @ingroup init + */ +#define GLFW_VERSION_MAJOR 3 +/*! @brief The minor version number of the GLFW header. + * + * The minor version number of the GLFW header. This is incremented when + * features are added to the API but it remains backward-compatible. + * @ingroup init + */ +#define GLFW_VERSION_MINOR 3 +/*! @brief The revision number of the GLFW header. + * + * The revision number of the GLFW header. This is incremented when a bug fix + * release is made that does not contain any API changes. + * @ingroup init + */ +#define GLFW_VERSION_REVISION 9 +/*! @} */ + +/*! @brief One. + * + * This is only semantic sugar for the number 1. You can instead use `1` or + * `true` or `_True` or `GL_TRUE` or `VK_TRUE` or anything else that is equal + * to one. + * + * @ingroup init + */ +#define GLFW_TRUE 1 +/*! @brief Zero. + * + * This is only semantic sugar for the number 0. You can instead use `0` or + * `false` or `_False` or `GL_FALSE` or `VK_FALSE` or anything else that is + * equal to zero. + * + * @ingroup init + */ +#define GLFW_FALSE 0 + +/*! @name Key and button actions + * @{ */ +/*! @brief The key or mouse button was released. + * + * The key or mouse button was released. + * + * @ingroup input + */ +#define GLFW_RELEASE 0 +/*! @brief The key or mouse button was pressed. + * + * The key or mouse button was pressed. + * + * @ingroup input + */ +#define GLFW_PRESS 1 +/*! @brief The key was held down until it repeated. + * + * The key was held down until it repeated. + * + * @ingroup input + */ +#define GLFW_REPEAT 2 +/*! @} */ + +/*! @defgroup hat_state Joystick hat states + * @brief Joystick hat states. + * + * See [joystick hat input](@ref joystick_hat) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_HAT_CENTERED 0 +#define GLFW_HAT_UP 1 +#define GLFW_HAT_RIGHT 2 +#define GLFW_HAT_DOWN 4 +#define GLFW_HAT_LEFT 8 +#define GLFW_HAT_RIGHT_UP (GLFW_HAT_RIGHT | GLFW_HAT_UP) +#define GLFW_HAT_RIGHT_DOWN (GLFW_HAT_RIGHT | GLFW_HAT_DOWN) +#define GLFW_HAT_LEFT_UP (GLFW_HAT_LEFT | GLFW_HAT_UP) +#define GLFW_HAT_LEFT_DOWN (GLFW_HAT_LEFT | GLFW_HAT_DOWN) + +/*! @ingroup input + */ +#define GLFW_KEY_UNKNOWN -1 + +/*! @} */ + +/*! @defgroup keys Keyboard key tokens + * @brief Keyboard key tokens. + * + * See [key input](@ref input_key) for how these are used. + * + * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), + * but re-arranged to map to 7-bit ASCII for printable keys (function keys are + * put in the 256+ range). + * + * The naming of the key codes follow these rules: + * - The US keyboard layout is used + * - Names of printable alpha-numeric characters are used (e.g. "A", "R", + * "3", etc.) + * - For non-alphanumeric characters, Unicode:ish names are used (e.g. + * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not + * correspond to the Unicode standard (usually for brevity) + * - Keys that lack a clear US mapping are named "WORLD_x" + * - For non-printable keys, custom names are used (e.g. "F4", + * "BACKSPACE", etc.) + * + * @ingroup input + * @{ + */ + +/* Printable keys */ +#define GLFW_KEY_SPACE 32 +#define GLFW_KEY_APOSTROPHE 39 /* ' */ +#define GLFW_KEY_COMMA 44 /* , */ +#define GLFW_KEY_MINUS 45 /* - */ +#define GLFW_KEY_PERIOD 46 /* . */ +#define GLFW_KEY_SLASH 47 /* / */ +#define GLFW_KEY_0 48 +#define GLFW_KEY_1 49 +#define GLFW_KEY_2 50 +#define GLFW_KEY_3 51 +#define GLFW_KEY_4 52 +#define GLFW_KEY_5 53 +#define GLFW_KEY_6 54 +#define GLFW_KEY_7 55 +#define GLFW_KEY_8 56 +#define GLFW_KEY_9 57 +#define GLFW_KEY_SEMICOLON 59 /* ; */ +#define GLFW_KEY_EQUAL 61 /* = */ +#define GLFW_KEY_A 65 +#define GLFW_KEY_B 66 +#define GLFW_KEY_C 67 +#define GLFW_KEY_D 68 +#define GLFW_KEY_E 69 +#define GLFW_KEY_F 70 +#define GLFW_KEY_G 71 +#define GLFW_KEY_H 72 +#define GLFW_KEY_I 73 +#define GLFW_KEY_J 74 +#define GLFW_KEY_K 75 +#define GLFW_KEY_L 76 +#define GLFW_KEY_M 77 +#define GLFW_KEY_N 78 +#define GLFW_KEY_O 79 +#define GLFW_KEY_P 80 +#define GLFW_KEY_Q 81 +#define GLFW_KEY_R 82 +#define GLFW_KEY_S 83 +#define GLFW_KEY_T 84 +#define GLFW_KEY_U 85 +#define GLFW_KEY_V 86 +#define GLFW_KEY_W 87 +#define GLFW_KEY_X 88 +#define GLFW_KEY_Y 89 +#define GLFW_KEY_Z 90 +#define GLFW_KEY_LEFT_BRACKET 91 /* [ */ +#define GLFW_KEY_BACKSLASH 92 /* \ */ +#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */ +#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */ +#define GLFW_KEY_WORLD_1 161 /* non-US #1 */ +#define GLFW_KEY_WORLD_2 162 /* non-US #2 */ + +/* Function keys */ +#define GLFW_KEY_ESCAPE 256 +#define GLFW_KEY_ENTER 257 +#define GLFW_KEY_TAB 258 +#define GLFW_KEY_BACKSPACE 259 +#define GLFW_KEY_INSERT 260 +#define GLFW_KEY_DELETE 261 +#define GLFW_KEY_RIGHT 262 +#define GLFW_KEY_LEFT 263 +#define GLFW_KEY_DOWN 264 +#define GLFW_KEY_UP 265 +#define GLFW_KEY_PAGE_UP 266 +#define GLFW_KEY_PAGE_DOWN 267 +#define GLFW_KEY_HOME 268 +#define GLFW_KEY_END 269 +#define GLFW_KEY_CAPS_LOCK 280 +#define GLFW_KEY_SCROLL_LOCK 281 +#define GLFW_KEY_NUM_LOCK 282 +#define GLFW_KEY_PRINT_SCREEN 283 +#define GLFW_KEY_PAUSE 284 +#define GLFW_KEY_F1 290 +#define GLFW_KEY_F2 291 +#define GLFW_KEY_F3 292 +#define GLFW_KEY_F4 293 +#define GLFW_KEY_F5 294 +#define GLFW_KEY_F6 295 +#define GLFW_KEY_F7 296 +#define GLFW_KEY_F8 297 +#define GLFW_KEY_F9 298 +#define GLFW_KEY_F10 299 +#define GLFW_KEY_F11 300 +#define GLFW_KEY_F12 301 +#define GLFW_KEY_F13 302 +#define GLFW_KEY_F14 303 +#define GLFW_KEY_F15 304 +#define GLFW_KEY_F16 305 +#define GLFW_KEY_F17 306 +#define GLFW_KEY_F18 307 +#define GLFW_KEY_F19 308 +#define GLFW_KEY_F20 309 +#define GLFW_KEY_F21 310 +#define GLFW_KEY_F22 311 +#define GLFW_KEY_F23 312 +#define GLFW_KEY_F24 313 +#define GLFW_KEY_F25 314 +#define GLFW_KEY_KP_0 320 +#define GLFW_KEY_KP_1 321 +#define GLFW_KEY_KP_2 322 +#define GLFW_KEY_KP_3 323 +#define GLFW_KEY_KP_4 324 +#define GLFW_KEY_KP_5 325 +#define GLFW_KEY_KP_6 326 +#define GLFW_KEY_KP_7 327 +#define GLFW_KEY_KP_8 328 +#define GLFW_KEY_KP_9 329 +#define GLFW_KEY_KP_DECIMAL 330 +#define GLFW_KEY_KP_DIVIDE 331 +#define GLFW_KEY_KP_MULTIPLY 332 +#define GLFW_KEY_KP_SUBTRACT 333 +#define GLFW_KEY_KP_ADD 334 +#define GLFW_KEY_KP_ENTER 335 +#define GLFW_KEY_KP_EQUAL 336 +#define GLFW_KEY_LEFT_SHIFT 340 +#define GLFW_KEY_LEFT_CONTROL 341 +#define GLFW_KEY_LEFT_ALT 342 +#define GLFW_KEY_LEFT_SUPER 343 +#define GLFW_KEY_RIGHT_SHIFT 344 +#define GLFW_KEY_RIGHT_CONTROL 345 +#define GLFW_KEY_RIGHT_ALT 346 +#define GLFW_KEY_RIGHT_SUPER 347 +#define GLFW_KEY_MENU 348 + +#define GLFW_KEY_LAST GLFW_KEY_MENU + +/*! @} */ + +/*! @defgroup mods Modifier key flags + * @brief Modifier key flags. + * + * See [key input](@ref input_key) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief If this bit is set one or more Shift keys were held down. + * + * If this bit is set one or more Shift keys were held down. + */ +#define GLFW_MOD_SHIFT 0x0001 +/*! @brief If this bit is set one or more Control keys were held down. + * + * If this bit is set one or more Control keys were held down. + */ +#define GLFW_MOD_CONTROL 0x0002 +/*! @brief If this bit is set one or more Alt keys were held down. + * + * If this bit is set one or more Alt keys were held down. + */ +#define GLFW_MOD_ALT 0x0004 +/*! @brief If this bit is set one or more Super keys were held down. + * + * If this bit is set one or more Super keys were held down. + */ +#define GLFW_MOD_SUPER 0x0008 +/*! @brief If this bit is set the Caps Lock key is enabled. + * + * If this bit is set the Caps Lock key is enabled and the @ref + * GLFW_LOCK_KEY_MODS input mode is set. + */ +#define GLFW_MOD_CAPS_LOCK 0x0010 +/*! @brief If this bit is set the Num Lock key is enabled. + * + * If this bit is set the Num Lock key is enabled and the @ref + * GLFW_LOCK_KEY_MODS input mode is set. + */ +#define GLFW_MOD_NUM_LOCK 0x0020 + +/*! @} */ + +/*! @defgroup buttons Mouse buttons + * @brief Mouse button IDs. + * + * See [mouse button input](@ref input_mouse_button) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_MOUSE_BUTTON_1 0 +#define GLFW_MOUSE_BUTTON_2 1 +#define GLFW_MOUSE_BUTTON_3 2 +#define GLFW_MOUSE_BUTTON_4 3 +#define GLFW_MOUSE_BUTTON_5 4 +#define GLFW_MOUSE_BUTTON_6 5 +#define GLFW_MOUSE_BUTTON_7 6 +#define GLFW_MOUSE_BUTTON_8 7 +#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 +#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 +#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 +#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 +/*! @} */ + +/*! @defgroup joysticks Joysticks + * @brief Joystick IDs. + * + * See [joystick input](@ref joystick) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_JOYSTICK_1 0 +#define GLFW_JOYSTICK_2 1 +#define GLFW_JOYSTICK_3 2 +#define GLFW_JOYSTICK_4 3 +#define GLFW_JOYSTICK_5 4 +#define GLFW_JOYSTICK_6 5 +#define GLFW_JOYSTICK_7 6 +#define GLFW_JOYSTICK_8 7 +#define GLFW_JOYSTICK_9 8 +#define GLFW_JOYSTICK_10 9 +#define GLFW_JOYSTICK_11 10 +#define GLFW_JOYSTICK_12 11 +#define GLFW_JOYSTICK_13 12 +#define GLFW_JOYSTICK_14 13 +#define GLFW_JOYSTICK_15 14 +#define GLFW_JOYSTICK_16 15 +#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 +/*! @} */ + +/*! @defgroup gamepad_buttons Gamepad buttons + * @brief Gamepad buttons. + * + * See @ref gamepad for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_GAMEPAD_BUTTON_A 0 +#define GLFW_GAMEPAD_BUTTON_B 1 +#define GLFW_GAMEPAD_BUTTON_X 2 +#define GLFW_GAMEPAD_BUTTON_Y 3 +#define GLFW_GAMEPAD_BUTTON_LEFT_BUMPER 4 +#define GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER 5 +#define GLFW_GAMEPAD_BUTTON_BACK 6 +#define GLFW_GAMEPAD_BUTTON_START 7 +#define GLFW_GAMEPAD_BUTTON_GUIDE 8 +#define GLFW_GAMEPAD_BUTTON_LEFT_THUMB 9 +#define GLFW_GAMEPAD_BUTTON_RIGHT_THUMB 10 +#define GLFW_GAMEPAD_BUTTON_DPAD_UP 11 +#define GLFW_GAMEPAD_BUTTON_DPAD_RIGHT 12 +#define GLFW_GAMEPAD_BUTTON_DPAD_DOWN 13 +#define GLFW_GAMEPAD_BUTTON_DPAD_LEFT 14 +#define GLFW_GAMEPAD_BUTTON_LAST GLFW_GAMEPAD_BUTTON_DPAD_LEFT + +#define GLFW_GAMEPAD_BUTTON_CROSS GLFW_GAMEPAD_BUTTON_A +#define GLFW_GAMEPAD_BUTTON_CIRCLE GLFW_GAMEPAD_BUTTON_B +#define GLFW_GAMEPAD_BUTTON_SQUARE GLFW_GAMEPAD_BUTTON_X +#define GLFW_GAMEPAD_BUTTON_TRIANGLE GLFW_GAMEPAD_BUTTON_Y +/*! @} */ + +/*! @defgroup gamepad_axes Gamepad axes + * @brief Gamepad axes. + * + * See @ref gamepad for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_GAMEPAD_AXIS_LEFT_X 0 +#define GLFW_GAMEPAD_AXIS_LEFT_Y 1 +#define GLFW_GAMEPAD_AXIS_RIGHT_X 2 +#define GLFW_GAMEPAD_AXIS_RIGHT_Y 3 +#define GLFW_GAMEPAD_AXIS_LEFT_TRIGGER 4 +#define GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER 5 +#define GLFW_GAMEPAD_AXIS_LAST GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER +/*! @} */ + +/*! @defgroup errors Error codes + * @brief Error codes. + * + * See [error handling](@ref error_handling) for how these are used. + * + * @ingroup init + * @{ */ +/*! @brief No error has occurred. + * + * No error has occurred. + * + * @analysis Yay. + */ +#define GLFW_NO_ERROR 0 +/*! @brief GLFW has not been initialized. + * + * This occurs if a GLFW function was called that must not be called unless the + * library is [initialized](@ref intro_init). + * + * @analysis Application programmer error. Initialize GLFW before calling any + * function that requires initialization. + */ +#define GLFW_NOT_INITIALIZED 0x00010001 +/*! @brief No context is current for this thread. + * + * This occurs if a GLFW function was called that needs and operates on the + * current OpenGL or OpenGL ES context but no context is current on the calling + * thread. One such function is @ref glfwSwapInterval. + * + * @analysis Application programmer error. Ensure a context is current before + * calling functions that require a current context. + */ +#define GLFW_NO_CURRENT_CONTEXT 0x00010002 +/*! @brief One of the arguments to the function was an invalid enum value. + * + * One of the arguments to the function was an invalid enum value, for example + * requesting @ref GLFW_RED_BITS with @ref glfwGetWindowAttrib. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_ENUM 0x00010003 +/*! @brief One of the arguments to the function was an invalid value. + * + * One of the arguments to the function was an invalid value, for example + * requesting a non-existent OpenGL or OpenGL ES version like 2.7. + * + * Requesting a valid but unavailable OpenGL or OpenGL ES version will instead + * result in a @ref GLFW_VERSION_UNAVAILABLE error. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_VALUE 0x00010004 +/*! @brief A memory allocation failed. + * + * A memory allocation failed. + * + * @analysis A bug in GLFW or the underlying operating system. Report the bug + * to our [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_OUT_OF_MEMORY 0x00010005 +/*! @brief GLFW could not find support for the requested API on the system. + * + * GLFW could not find support for the requested API on the system. + * + * @analysis The installed graphics driver does not support the requested + * API, or does not support it via the chosen context creation backend. + * Below are a few examples. + * + * @par + * Some pre-installed Windows graphics drivers do not support OpenGL. AMD only + * supports OpenGL ES via EGL, while Nvidia and Intel only support it via + * a WGL or GLX extension. macOS does not provide OpenGL ES at all. The Mesa + * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary + * driver. Older graphics drivers do not support Vulkan. + */ +#define GLFW_API_UNAVAILABLE 0x00010006 +/*! @brief The requested OpenGL or OpenGL ES version is not available. + * + * The requested OpenGL or OpenGL ES version (including any requested context + * or framebuffer hints) is not available on this machine. + * + * @analysis The machine does not support your requirements. If your + * application is sufficiently flexible, downgrade your requirements and try + * again. Otherwise, inform the user that their machine does not match your + * requirements. + * + * @par + * Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0 + * comes out before the 4.x series gets that far, also fail with this error and + * not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions + * will exist. + */ +#define GLFW_VERSION_UNAVAILABLE 0x00010007 +/*! @brief A platform-specific error occurred that does not match any of the + * more specific categories. + * + * A platform-specific error occurred that does not match any of the more + * specific categories. + * + * @analysis A bug or configuration error in GLFW, the underlying operating + * system or its drivers, or a lack of required resources. Report the issue to + * our [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_PLATFORM_ERROR 0x00010008 +/*! @brief The requested format is not supported or available. + * + * If emitted during window creation, the requested pixel format is not + * supported. + * + * If emitted when querying the clipboard, the contents of the clipboard could + * not be converted to the requested format. + * + * @analysis If emitted during window creation, one or more + * [hard constraints](@ref window_hints_hard) did not match any of the + * available pixel formats. If your application is sufficiently flexible, + * downgrade your requirements and try again. Otherwise, inform the user that + * their machine does not match your requirements. + * + * @par + * If emitted when querying the clipboard, ignore the error or report it to + * the user, as appropriate. + */ +#define GLFW_FORMAT_UNAVAILABLE 0x00010009 +/*! @brief The specified window does not have an OpenGL or OpenGL ES context. + * + * A window that does not have an OpenGL or OpenGL ES context was passed to + * a function that requires it to have one. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_NO_WINDOW_CONTEXT 0x0001000A +/*! @} */ + +/*! @addtogroup window + * @{ */ +/*! @brief Input focus window hint and attribute + * + * Input focus [window hint](@ref GLFW_FOCUSED_hint) or + * [window attribute](@ref GLFW_FOCUSED_attrib). + */ +#define GLFW_FOCUSED 0x00020001 +/*! @brief Window iconification window attribute + * + * Window iconification [window attribute](@ref GLFW_ICONIFIED_attrib). + */ +#define GLFW_ICONIFIED 0x00020002 +/*! @brief Window resize-ability window hint and attribute + * + * Window resize-ability [window hint](@ref GLFW_RESIZABLE_hint) and + * [window attribute](@ref GLFW_RESIZABLE_attrib). + */ +#define GLFW_RESIZABLE 0x00020003 +/*! @brief Window visibility window hint and attribute + * + * Window visibility [window hint](@ref GLFW_VISIBLE_hint) and + * [window attribute](@ref GLFW_VISIBLE_attrib). + */ +#define GLFW_VISIBLE 0x00020004 +/*! @brief Window decoration window hint and attribute + * + * Window decoration [window hint](@ref GLFW_DECORATED_hint) and + * [window attribute](@ref GLFW_DECORATED_attrib). + */ +#define GLFW_DECORATED 0x00020005 +/*! @brief Window auto-iconification window hint and attribute + * + * Window auto-iconification [window hint](@ref GLFW_AUTO_ICONIFY_hint) and + * [window attribute](@ref GLFW_AUTO_ICONIFY_attrib). + */ +#define GLFW_AUTO_ICONIFY 0x00020006 +/*! @brief Window decoration window hint and attribute + * + * Window decoration [window hint](@ref GLFW_FLOATING_hint) and + * [window attribute](@ref GLFW_FLOATING_attrib). + */ +#define GLFW_FLOATING 0x00020007 +/*! @brief Window maximization window hint and attribute + * + * Window maximization [window hint](@ref GLFW_MAXIMIZED_hint) and + * [window attribute](@ref GLFW_MAXIMIZED_attrib). + */ +#define GLFW_MAXIMIZED 0x00020008 +/*! @brief Cursor centering window hint + * + * Cursor centering [window hint](@ref GLFW_CENTER_CURSOR_hint). + */ +#define GLFW_CENTER_CURSOR 0x00020009 +/*! @brief Window framebuffer transparency hint and attribute + * + * Window framebuffer transparency + * [window hint](@ref GLFW_TRANSPARENT_FRAMEBUFFER_hint) and + * [window attribute](@ref GLFW_TRANSPARENT_FRAMEBUFFER_attrib). + */ +#define GLFW_TRANSPARENT_FRAMEBUFFER 0x0002000A +/*! @brief Mouse cursor hover window attribute. + * + * Mouse cursor hover [window attribute](@ref GLFW_HOVERED_attrib). + */ +#define GLFW_HOVERED 0x0002000B +/*! @brief Input focus on calling show window hint and attribute + * + * Input focus [window hint](@ref GLFW_FOCUS_ON_SHOW_hint) or + * [window attribute](@ref GLFW_FOCUS_ON_SHOW_attrib). + */ +#define GLFW_FOCUS_ON_SHOW 0x0002000C + +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_RED_BITS). + */ +#define GLFW_RED_BITS 0x00021001 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_GREEN_BITS). + */ +#define GLFW_GREEN_BITS 0x00021002 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_BLUE_BITS). + */ +#define GLFW_BLUE_BITS 0x00021003 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ALPHA_BITS). + */ +#define GLFW_ALPHA_BITS 0x00021004 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_DEPTH_BITS). + */ +#define GLFW_DEPTH_BITS 0x00021005 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_STENCIL_BITS). + */ +#define GLFW_STENCIL_BITS 0x00021006 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_RED_BITS). + */ +#define GLFW_ACCUM_RED_BITS 0x00021007 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_GREEN_BITS). + */ +#define GLFW_ACCUM_GREEN_BITS 0x00021008 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_BLUE_BITS). + */ +#define GLFW_ACCUM_BLUE_BITS 0x00021009 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_ALPHA_BITS). + */ +#define GLFW_ACCUM_ALPHA_BITS 0x0002100A +/*! @brief Framebuffer auxiliary buffer hint. + * + * Framebuffer auxiliary buffer [hint](@ref GLFW_AUX_BUFFERS). + */ +#define GLFW_AUX_BUFFERS 0x0002100B +/*! @brief OpenGL stereoscopic rendering hint. + * + * OpenGL stereoscopic rendering [hint](@ref GLFW_STEREO). + */ +#define GLFW_STEREO 0x0002100C +/*! @brief Framebuffer MSAA samples hint. + * + * Framebuffer MSAA samples [hint](@ref GLFW_SAMPLES). + */ +#define GLFW_SAMPLES 0x0002100D +/*! @brief Framebuffer sRGB hint. + * + * Framebuffer sRGB [hint](@ref GLFW_SRGB_CAPABLE). + */ +#define GLFW_SRGB_CAPABLE 0x0002100E +/*! @brief Monitor refresh rate hint. + * + * Monitor refresh rate [hint](@ref GLFW_REFRESH_RATE). + */ +#define GLFW_REFRESH_RATE 0x0002100F +/*! @brief Framebuffer double buffering hint. + * + * Framebuffer double buffering [hint](@ref GLFW_DOUBLEBUFFER). + */ +#define GLFW_DOUBLEBUFFER 0x00021010 + +/*! @brief Context client API hint and attribute. + * + * Context client API [hint](@ref GLFW_CLIENT_API_hint) and + * [attribute](@ref GLFW_CLIENT_API_attrib). + */ +#define GLFW_CLIENT_API 0x00022001 +/*! @brief Context client API major version hint and attribute. + * + * Context client API major version [hint](@ref GLFW_CONTEXT_VERSION_MAJOR_hint) + * and [attribute](@ref GLFW_CONTEXT_VERSION_MAJOR_attrib). + */ +#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 +/*! @brief Context client API minor version hint and attribute. + * + * Context client API minor version [hint](@ref GLFW_CONTEXT_VERSION_MINOR_hint) + * and [attribute](@ref GLFW_CONTEXT_VERSION_MINOR_attrib). + */ +#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 +/*! @brief Context client API revision number attribute. + * + * Context client API revision number + * [attribute](@ref GLFW_CONTEXT_REVISION_attrib). + */ +#define GLFW_CONTEXT_REVISION 0x00022004 +/*! @brief Context robustness hint and attribute. + * + * Context client API revision number [hint](@ref GLFW_CONTEXT_ROBUSTNESS_hint) + * and [attribute](@ref GLFW_CONTEXT_ROBUSTNESS_attrib). + */ +#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 +/*! @brief OpenGL forward-compatibility hint and attribute. + * + * OpenGL forward-compatibility [hint](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) + * and [attribute](@ref GLFW_OPENGL_FORWARD_COMPAT_attrib). + */ +#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 +/*! @brief Debug mode context hint and attribute. + * + * Debug mode context [hint](@ref GLFW_OPENGL_DEBUG_CONTEXT_hint) and + * [attribute](@ref GLFW_OPENGL_DEBUG_CONTEXT_attrib). + */ +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 +/*! @brief OpenGL profile hint and attribute. + * + * OpenGL profile [hint](@ref GLFW_OPENGL_PROFILE_hint) and + * [attribute](@ref GLFW_OPENGL_PROFILE_attrib). + */ +#define GLFW_OPENGL_PROFILE 0x00022008 +/*! @brief Context flush-on-release hint and attribute. + * + * Context flush-on-release [hint](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) and + * [attribute](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_attrib). + */ +#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 +/*! @brief Context error suppression hint and attribute. + * + * Context error suppression [hint](@ref GLFW_CONTEXT_NO_ERROR_hint) and + * [attribute](@ref GLFW_CONTEXT_NO_ERROR_attrib). + */ +#define GLFW_CONTEXT_NO_ERROR 0x0002200A +/*! @brief Context creation API hint and attribute. + * + * Context creation API [hint](@ref GLFW_CONTEXT_CREATION_API_hint) and + * [attribute](@ref GLFW_CONTEXT_CREATION_API_attrib). + */ +#define GLFW_CONTEXT_CREATION_API 0x0002200B +/*! @brief Window content area scaling window + * [window hint](@ref GLFW_SCALE_TO_MONITOR). + */ +#define GLFW_SCALE_TO_MONITOR 0x0002200C +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint). + */ +#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001 +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_FRAME_NAME_hint). + */ +#define GLFW_COCOA_FRAME_NAME 0x00023002 +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_GRAPHICS_SWITCHING_hint). + */ +#define GLFW_COCOA_GRAPHICS_SWITCHING 0x00023003 +/*! @brief X11 specific + * [window hint](@ref GLFW_X11_CLASS_NAME_hint). + */ +#define GLFW_X11_CLASS_NAME 0x00024001 +/*! @brief X11 specific + * [window hint](@ref GLFW_X11_CLASS_NAME_hint). + */ +#define GLFW_X11_INSTANCE_NAME 0x00024002 +/*! @} */ + +#define GLFW_NO_API 0 +#define GLFW_OPENGL_API 0x00030001 +#define GLFW_OPENGL_ES_API 0x00030002 + +#define GLFW_NO_ROBUSTNESS 0 +#define GLFW_NO_RESET_NOTIFICATION 0x00031001 +#define GLFW_LOSE_CONTEXT_ON_RESET 0x00031002 + +#define GLFW_OPENGL_ANY_PROFILE 0 +#define GLFW_OPENGL_CORE_PROFILE 0x00032001 +#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002 + +#define GLFW_CURSOR 0x00033001 +#define GLFW_STICKY_KEYS 0x00033002 +#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003 +#define GLFW_LOCK_KEY_MODS 0x00033004 +#define GLFW_RAW_MOUSE_MOTION 0x00033005 + +#define GLFW_CURSOR_NORMAL 0x00034001 +#define GLFW_CURSOR_HIDDEN 0x00034002 +#define GLFW_CURSOR_DISABLED 0x00034003 + +#define GLFW_ANY_RELEASE_BEHAVIOR 0 +#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 +#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 + +#define GLFW_NATIVE_CONTEXT_API 0x00036001 +#define GLFW_EGL_CONTEXT_API 0x00036002 +#define GLFW_OSMESA_CONTEXT_API 0x00036003 + +#define GLFW_WAYLAND_PREFER_LIBDECOR 0x00038001 +#define GLFW_WAYLAND_DISABLE_LIBDECOR 0x00038002 + +/*! @defgroup shapes Standard cursor shapes + * @brief Standard system cursor shapes. + * + * See [standard cursor creation](@ref cursor_standard) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief The regular arrow cursor shape. + * + * The regular arrow cursor. + */ +#define GLFW_ARROW_CURSOR 0x00036001 +/*! @brief The text input I-beam cursor shape. + * + * The text input I-beam cursor shape. + */ +#define GLFW_IBEAM_CURSOR 0x00036002 +/*! @brief The crosshair shape. + * + * The crosshair shape. + */ +#define GLFW_CROSSHAIR_CURSOR 0x00036003 +/*! @brief The hand shape. + * + * The hand shape. + */ +#define GLFW_HAND_CURSOR 0x00036004 +/*! @brief The horizontal resize arrow shape. + * + * The horizontal resize arrow shape. + */ +#define GLFW_HRESIZE_CURSOR 0x00036005 +/*! @brief The vertical resize arrow shape. + * + * The vertical resize arrow shape. + */ +#define GLFW_VRESIZE_CURSOR 0x00036006 +/*! @} */ + +#define GLFW_CONNECTED 0x00040001 +#define GLFW_DISCONNECTED 0x00040002 + +/*! @addtogroup init + * @{ */ +/*! @brief Joystick hat buttons init hint. + * + * Joystick hat buttons [init hint](@ref GLFW_JOYSTICK_HAT_BUTTONS). + */ +#define GLFW_JOYSTICK_HAT_BUTTONS 0x00050001 +/*! @brief macOS specific init hint. + * + * macOS specific [init hint](@ref GLFW_COCOA_CHDIR_RESOURCES_hint). + */ +#define GLFW_COCOA_CHDIR_RESOURCES 0x00051001 +/*! @brief macOS specific init hint. + * + * macOS specific [init hint](@ref GLFW_COCOA_MENUBAR_hint). + */ +#define GLFW_COCOA_MENUBAR 0x00051002 +/*! @brief Wayland specific init hint. + * + * Wayland specific [init hint](@ref GLFW_WAYLAND_LIBDECOR_hint). + */ +#define GLFW_WAYLAND_LIBDECOR 0x00053001 +/*! @} */ + +#define GLFW_DONT_CARE -1 + + +/************************************************************************* + * GLFW API types + *************************************************************************/ + +/*! @brief Client API function pointer type. + * + * Generic function pointer used for returning client API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref context_glext + * @sa @ref glfwGetProcAddress + * + * @since Added in version 3.0. + * + * @ingroup context + */ +typedef void (*GLFWglproc)(void); + +/*! @brief Vulkan API function pointer type. + * + * Generic function pointer used for returning Vulkan API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref vulkan_proc + * @sa @ref glfwGetInstanceProcAddress + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +typedef void (*GLFWvkproc)(void); + +/*! @brief Opaque monitor object. + * + * Opaque monitor object. + * + * @see @ref monitor_object + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef struct GLFWmonitor GLFWmonitor; + +/*! @brief Opaque window object. + * + * Opaque window object. + * + * @see @ref window_object + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef struct GLFWwindow GLFWwindow; + +/*! @brief Opaque cursor object. + * + * Opaque cursor object. + * + * @see @ref cursor_object + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef struct GLFWcursor GLFWcursor; + +/*! @brief The function pointer type for error callbacks. + * + * This is the function pointer type for error callbacks. An error callback + * function has the following signature: + * @code + * void callback_name(int error_code, const char* description) + * @endcode + * + * @param[in] error_code An [error code](@ref errors). Future releases may add + * more error codes. + * @param[in] description A UTF-8 encoded string describing the error. + * + * @pointer_lifetime The error description string is valid until the callback + * function returns. + * + * @sa @ref error_handling + * @sa @ref glfwSetErrorCallback + * + * @since Added in version 3.0. + * + * @ingroup init + */ +typedef void (* GLFWerrorfun)(int error_code, const char* description); + +/*! @brief The function pointer type for window position callbacks. + * + * This is the function pointer type for window position callbacks. A window + * position callback function has the following signature: + * @code + * void callback_name(GLFWwindow* window, int xpos, int ypos) + * @endcode + * + * @param[in] window The window that was moved. + * @param[in] xpos The new x-coordinate, in screen coordinates, of the + * upper-left corner of the content area of the window. + * @param[in] ypos The new y-coordinate, in screen coordinates, of the + * upper-left corner of the content area of the window. + * + * @sa @ref window_pos + * @sa @ref glfwSetWindowPosCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowposfun)(GLFWwindow* window, int xpos, int ypos); + +/*! @brief The function pointer type for window size callbacks. + * + * This is the function pointer type for window size callbacks. A window size + * callback function has the following signature: + * @code + * void callback_name(GLFWwindow* window, int width, int height) + * @endcode + * + * @param[in] window The window that was resized. + * @param[in] width The new width, in screen coordinates, of the window. + * @param[in] height The new height, in screen coordinates, of the window. + * + * @sa @ref window_size + * @sa @ref glfwSetWindowSizeCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowsizefun)(GLFWwindow* window, int width, int height); + +/*! @brief The function pointer type for window close callbacks. + * + * This is the function pointer type for window close callbacks. A window + * close callback function has the following signature: + * @code + * void function_name(GLFWwindow* window) + * @endcode + * + * @param[in] window The window that the user attempted to close. + * + * @sa @ref window_close + * @sa @ref glfwSetWindowCloseCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowclosefun)(GLFWwindow* window); + +/*! @brief The function pointer type for window content refresh callbacks. + * + * This is the function pointer type for window content refresh callbacks. + * A window content refresh callback function has the following signature: + * @code + * void function_name(GLFWwindow* window); + * @endcode + * + * @param[in] window The window whose content needs to be refreshed. + * + * @sa @ref window_refresh + * @sa @ref glfwSetWindowRefreshCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowrefreshfun)(GLFWwindow* window); + +/*! @brief The function pointer type for window focus callbacks. + * + * This is the function pointer type for window focus callbacks. A window + * focus callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int focused) + * @endcode + * + * @param[in] window The window that gained or lost input focus. + * @param[in] focused `GLFW_TRUE` if the window was given input focus, or + * `GLFW_FALSE` if it lost it. + * + * @sa @ref window_focus + * @sa @ref glfwSetWindowFocusCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowfocusfun)(GLFWwindow* window, int focused); + +/*! @brief The function pointer type for window iconify callbacks. + * + * This is the function pointer type for window iconify callbacks. A window + * iconify callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int iconified) + * @endcode + * + * @param[in] window The window that was iconified or restored. + * @param[in] iconified `GLFW_TRUE` if the window was iconified, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_iconify + * @sa @ref glfwSetWindowIconifyCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowiconifyfun)(GLFWwindow* window, int iconified); + +/*! @brief The function pointer type for window maximize callbacks. + * + * This is the function pointer type for window maximize callbacks. A window + * maximize callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int maximized) + * @endcode + * + * @param[in] window The window that was maximized or restored. + * @param[in] maximized `GLFW_TRUE` if the window was maximized, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_maximize + * @sa glfwSetWindowMaximizeCallback + * + * @since Added in version 3.3. + * + * @ingroup window + */ +typedef void (* GLFWwindowmaximizefun)(GLFWwindow* window, int maximized); + +/*! @brief The function pointer type for framebuffer size callbacks. + * + * This is the function pointer type for framebuffer size callbacks. + * A framebuffer size callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * + * @param[in] window The window whose framebuffer was resized. + * @param[in] width The new width, in pixels, of the framebuffer. + * @param[in] height The new height, in pixels, of the framebuffer. + * + * @sa @ref window_fbsize + * @sa @ref glfwSetFramebufferSizeCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWframebuffersizefun)(GLFWwindow* window, int width, int height); + +/*! @brief The function pointer type for window content scale callbacks. + * + * This is the function pointer type for window content scale callbacks. + * A window content scale callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, float xscale, float yscale) + * @endcode + * + * @param[in] window The window whose content scale changed. + * @param[in] xscale The new x-axis content scale of the window. + * @param[in] yscale The new y-axis content scale of the window. + * + * @sa @ref window_scale + * @sa @ref glfwSetWindowContentScaleCallback + * + * @since Added in version 3.3. + * + * @ingroup window + */ +typedef void (* GLFWwindowcontentscalefun)(GLFWwindow* window, float xscale, float yscale); + +/*! @brief The function pointer type for mouse button callbacks. + * + * This is the function pointer type for mouse button callback functions. + * A mouse button callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int button, int action, int mods) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] button The [mouse button](@ref buttons) that was pressed or + * released. + * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. Future releases + * may add more actions. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_mouse_button + * @sa @ref glfwSetMouseButtonCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWmousebuttonfun)(GLFWwindow* window, int button, int action, int mods); + +/*! @brief The function pointer type for cursor position callbacks. + * + * This is the function pointer type for cursor position callbacks. A cursor + * position callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, double xpos, double ypos); + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] xpos The new cursor x-coordinate, relative to the left edge of + * the content area. + * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the + * content area. + * + * @sa @ref cursor_pos + * @sa @ref glfwSetCursorPosCallback + * + * @since Added in version 3.0. Replaces `GLFWmouseposfun`. + * + * @ingroup input + */ +typedef void (* GLFWcursorposfun)(GLFWwindow* window, double xpos, double ypos); + +/*! @brief The function pointer type for cursor enter/leave callbacks. + * + * This is the function pointer type for cursor enter/leave callbacks. + * A cursor enter/leave callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int entered) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] entered `GLFW_TRUE` if the cursor entered the window's content + * area, or `GLFW_FALSE` if it left it. + * + * @sa @ref cursor_enter + * @sa @ref glfwSetCursorEnterCallback + * + * @since Added in version 3.0. + * + * @ingroup input + */ +typedef void (* GLFWcursorenterfun)(GLFWwindow* window, int entered); + +/*! @brief The function pointer type for scroll callbacks. + * + * This is the function pointer type for scroll callbacks. A scroll callback + * function has the following signature: + * @code + * void function_name(GLFWwindow* window, double xoffset, double yoffset) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] xoffset The scroll offset along the x-axis. + * @param[in] yoffset The scroll offset along the y-axis. + * + * @sa @ref scrolling + * @sa @ref glfwSetScrollCallback + * + * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. + * + * @ingroup input + */ +typedef void (* GLFWscrollfun)(GLFWwindow* window, double xoffset, double yoffset); + +/*! @brief The function pointer type for keyboard key callbacks. + * + * This is the function pointer type for keyboard key callbacks. A keyboard + * key callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] key The [keyboard key](@ref keys) that was pressed or released. + * @param[in] scancode The system-specific scancode of the key. + * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. Future + * releases may add more actions. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_key + * @sa @ref glfwSetKeyCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle, scancode and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWkeyfun)(GLFWwindow* window, int key, int scancode, int action, int mods); + +/*! @brief The function pointer type for Unicode character callbacks. + * + * This is the function pointer type for Unicode character callbacks. + * A Unicode character callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * + * @sa @ref input_char + * @sa @ref glfwSetCharCallback + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +typedef void (* GLFWcharfun)(GLFWwindow* window, unsigned int codepoint); + +/*! @brief The function pointer type for Unicode character with modifiers + * callbacks. + * + * This is the function pointer type for Unicode character with modifiers + * callbacks. It is called for each input character, regardless of what + * modifier keys are held down. A Unicode character with modifiers callback + * function has the following signature: + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_char + * @sa @ref glfwSetCharModsCallback + * + * @deprecated Scheduled for removal in version 4.0. + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWcharmodsfun)(GLFWwindow* window, unsigned int codepoint, int mods); + +/*! @brief The function pointer type for path drop callbacks. + * + * This is the function pointer type for path drop callbacks. A path drop + * callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int path_count, const char* paths[]) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] path_count The number of dropped paths. + * @param[in] paths The UTF-8 encoded file and/or directory path names. + * + * @pointer_lifetime The path array and its strings are valid until the + * callback function returns. + * + * @sa @ref path_drop + * @sa @ref glfwSetDropCallback + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWdropfun)(GLFWwindow* window, int path_count, const char* paths[]); + +/*! @brief The function pointer type for monitor configuration callbacks. + * + * This is the function pointer type for monitor configuration callbacks. + * A monitor callback function has the following signature: + * @code + * void function_name(GLFWmonitor* monitor, int event) + * @endcode + * + * @param[in] monitor The monitor that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future + * releases may add more events. + * + * @sa @ref monitor_event + * @sa @ref glfwSetMonitorCallback + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef void (* GLFWmonitorfun)(GLFWmonitor* monitor, int event); + +/*! @brief The function pointer type for joystick configuration callbacks. + * + * This is the function pointer type for joystick configuration callbacks. + * A joystick configuration callback function has the following signature: + * @code + * void function_name(int jid, int event) + * @endcode + * + * @param[in] jid The joystick that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future + * releases may add more events. + * + * @sa @ref joystick_event + * @sa @ref glfwSetJoystickCallback + * + * @since Added in version 3.2. + * + * @ingroup input + */ +typedef void (* GLFWjoystickfun)(int jid, int event); + +/*! @brief Video mode type. + * + * This describes a single video mode. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoMode + * @sa @ref glfwGetVideoModes + * + * @since Added in version 1.0. + * @glfw3 Added refresh rate member. + * + * @ingroup monitor + */ +typedef struct GLFWvidmode +{ + /*! The width, in screen coordinates, of the video mode. + */ + int width; + /*! The height, in screen coordinates, of the video mode. + */ + int height; + /*! The bit depth of the red channel of the video mode. + */ + int redBits; + /*! The bit depth of the green channel of the video mode. + */ + int greenBits; + /*! The bit depth of the blue channel of the video mode. + */ + int blueBits; + /*! The refresh rate, in Hz, of the video mode. + */ + int refreshRate; +} GLFWvidmode; + +/*! @brief Gamma ramp. + * + * This describes the gamma ramp for a monitor. + * + * @sa @ref monitor_gamma + * @sa @ref glfwGetGammaRamp + * @sa @ref glfwSetGammaRamp + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef struct GLFWgammaramp +{ + /*! An array of value describing the response of the red channel. + */ + unsigned short* red; + /*! An array of value describing the response of the green channel. + */ + unsigned short* green; + /*! An array of value describing the response of the blue channel. + */ + unsigned short* blue; + /*! The number of elements in each array. + */ + unsigned int size; +} GLFWgammaramp; + +/*! @brief Image data. + * + * This describes a single 2D image. See the documentation for each related + * function what the expected pixel format is. + * + * @sa @ref cursor_custom + * @sa @ref window_icon + * + * @since Added in version 2.1. + * @glfw3 Removed format and bytes-per-pixel members. + * + * @ingroup window + */ +typedef struct GLFWimage +{ + /*! The width, in pixels, of this image. + */ + int width; + /*! The height, in pixels, of this image. + */ + int height; + /*! The pixel data of this image, arranged left-to-right, top-to-bottom. + */ + unsigned char* pixels; +} GLFWimage; + +/*! @brief Gamepad input state + * + * This describes the input state of a gamepad. + * + * @sa @ref gamepad + * @sa @ref glfwGetGamepadState + * + * @since Added in version 3.3. + * + * @ingroup input + */ +typedef struct GLFWgamepadstate +{ + /*! The states of each [gamepad button](@ref gamepad_buttons), `GLFW_PRESS` + * or `GLFW_RELEASE`. + */ + unsigned char buttons[15]; + /*! The states of each [gamepad axis](@ref gamepad_axes), in the range -1.0 + * to 1.0 inclusive. + */ + float axes[6]; +} GLFWgamepadstate; + + +/************************************************************************* + * GLFW API functions + *************************************************************************/ + +/*! @brief Initializes the GLFW library. + * + * This function initializes the GLFW library. Before most GLFW functions can + * be used, GLFW must be initialized, and before an application terminates GLFW + * should be terminated in order to free any resources allocated during or + * after initialization. + * + * If this function fails, it calls @ref glfwTerminate before returning. If it + * succeeds, you should call @ref glfwTerminate before the application exits. + * + * Additional calls to this function after successful initialization but before + * termination will return `GLFW_TRUE` immediately. + * + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark @macos This function will change the current directory of the + * application to the `Contents/Resources` subdirectory of the application's + * bundle, if present. This can be disabled with the @ref + * GLFW_COCOA_CHDIR_RESOURCES init hint. + * + * @remark @x11 This function will set the `LC_CTYPE` category of the + * application locale according to the current environment if that category is + * still "C". This is because the "C" locale breaks Unicode text input. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa @ref glfwTerminate + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI int glfwInit(void); + +/*! @brief Terminates the GLFW library. + * + * This function destroys all remaining windows and cursors, restores any + * modified gamma ramps and frees any other allocated resources. Once this + * function is called, you must again call @ref glfwInit successfully before + * you will be able to use most GLFW functions. + * + * If GLFW has been successfully initialized, this function should be called + * before the application exits. If initialization fails, there is no need to + * call this function, as it is called by @ref glfwInit before it returns + * failure. + * + * This function has no effect if GLFW is not initialized. + * + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark This function may be called before @ref glfwInit. + * + * @warning The contexts of any remaining windows must not be current on any + * other thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa @ref glfwInit + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwTerminate(void); + +/*! @brief Sets the specified init hint to the desired value. + * + * This function sets hints for the next initialization of GLFW. + * + * The values you set hints to are never reset by GLFW, but they only take + * effect during initialization. Once GLFW has been initialized, any values + * you set will be ignored until the library is terminated and initialized + * again. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [init hint](@ref init_hints) to set. + * @param[in] value The new value of the init hint. + * + * @errors Possible errors include @ref GLFW_INVALID_ENUM and @ref + * GLFW_INVALID_VALUE. + * + * @remarks This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa init_hints + * @sa glfwInit + * + * @since Added in version 3.3. + * + * @ingroup init + */ +GLFWAPI void glfwInitHint(int hint, int value); + +/*! @brief Retrieves the version of the GLFW library. + * + * This function retrieves the major, minor and revision numbers of the GLFW + * library. It is intended for when you are using GLFW as a shared library and + * want to ensure that you are using the minimum required version. + * + * Any or all of the version arguments may be `NULL`. + * + * @param[out] major Where to store the major version number, or `NULL`. + * @param[out] minor Where to store the minor version number, or `NULL`. + * @param[out] rev Where to store the revision number, or `NULL`. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa @ref glfwGetVersionString + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); + +/*! @brief Returns a string describing the compile-time configuration. + * + * This function returns the compile-time generated + * [version string](@ref intro_version_string) of the GLFW library binary. It + * describes the version, platform, compiler and any platform-specific + * compile-time options. It should not be confused with the OpenGL or OpenGL + * ES version string, queried with `glGetString`. + * + * __Do not use the version string__ to parse the GLFW library version. The + * @ref glfwGetVersion function provides the version of the running library + * binary in numerical format. + * + * @return The ASCII encoded GLFW version string. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @pointer_lifetime The returned string is static and compile-time generated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa @ref glfwGetVersion + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI const char* glfwGetVersionString(void); + +/*! @brief Returns and clears the last error for the calling thread. + * + * This function returns and clears the [error code](@ref errors) of the last + * error that occurred on the calling thread, and optionally a UTF-8 encoded + * human-readable description of it. If no error has occurred since the last + * call, it returns @ref GLFW_NO_ERROR (zero) and the description pointer is + * set to `NULL`. + * + * @param[in] description Where to store the error description pointer, or `NULL`. + * @return The last error code for the calling thread, or @ref GLFW_NO_ERROR + * (zero). + * + * @errors None. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * next error occurs or the library is terminated. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref error_handling + * @sa @ref glfwSetErrorCallback + * + * @since Added in version 3.3. + * + * @ingroup init + */ +GLFWAPI int glfwGetError(const char** description); + +/*! @brief Sets the error callback. + * + * This function sets the error callback, which is called with an error code + * and a human-readable description each time a GLFW error occurs. + * + * The error code is set before the callback is called. Calling @ref + * glfwGetError from the error callback will return the same value as the error + * code argument. + * + * The error callback is called on the thread where the error occurred. If you + * are using GLFW from multiple threads, your error callback needs to be + * written accordingly. + * + * Because the description string may have been generated specifically for that + * error, it is not guaranteed to be valid after the callback has returned. If + * you wish to use it after the callback returns, you need to make a copy. + * + * Once set, the error callback remains set even after the library has been + * terminated. + * + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set. + * + * @callback_signature + * @code + * void callback_name(int error_code, const char* description) + * @endcode + * For more information about the callback parameters, see the + * [callback pointer type](@ref GLFWerrorfun). + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref error_handling + * @sa @ref glfwGetError + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun callback); + +/*! @brief Returns the currently connected monitors. + * + * This function returns an array of handles for all currently connected + * monitors. The primary monitor is always first in the returned array. If no + * monitors were found, this function returns `NULL`. + * + * @param[out] count Where to store the number of monitors in the returned + * array. This is set to zero if an error occurred. + * @return An array of monitor handles, or `NULL` if no monitors were found or + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * monitor configuration changes or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_monitors + * @sa @ref monitor_event + * @sa @ref glfwGetPrimaryMonitor + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); + +/*! @brief Returns the primary monitor. + * + * This function returns the primary monitor. This is usually the monitor + * where elements like the task bar or global menu bar are located. + * + * @return The primary monitor, or `NULL` if no monitors were found or if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @remark The primary monitor is always first in the array returned by @ref + * glfwGetMonitors. + * + * @sa @ref monitor_monitors + * @sa @ref glfwGetMonitors + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); + +/*! @brief Returns the position of the monitor's viewport on the virtual screen. + * + * This function returns the position, in screen coordinates, of the upper-left + * corner of the specified monitor. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. + * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); + +/*! @brief Retrieves the work area of the monitor. + * + * This function returns the position, in screen coordinates, of the upper-left + * corner of the work area of the specified monitor along with the work area + * size in screen coordinates. The work area is defined as the area of the + * monitor not occluded by the operating system task bar where present. If no + * task bar exists then the work area is the monitor resolution in screen + * coordinates. + * + * Any or all of the position and size arguments may be `NULL`. If an error + * occurs, all non-`NULL` position and size arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. + * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. + * @param[out] width Where to store the monitor width, or `NULL`. + * @param[out] height Where to store the monitor height, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_workarea + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height); + +/*! @brief Returns the physical size of the monitor. + * + * This function returns the size, in millimetres, of the display area of the + * specified monitor. + * + * Some systems do not provide accurate monitor size information, either + * because the monitor + * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) + * data is incorrect or because the driver does not report it accurately. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] widthMM Where to store the width, in millimetres, of the + * monitor's display area, or `NULL`. + * @param[out] heightMM Where to store the height, in millimetres, of the + * monitor's display area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @win32 On Windows 8 and earlier the physical size is calculated from + * the current resolution and system DPI instead of querying the monitor EDID data. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); + +/*! @brief Retrieves the content scale for the specified monitor. + * + * This function retrieves the content scale for the specified monitor. The + * content scale is the ratio between the current DPI and the platform's + * default DPI. This is especially important for text and any UI elements. If + * the pixel dimensions of your UI scaled by this look appropriate on your + * machine then it should appear at a reasonable size on other machines + * regardless of their DPI and scaling settings. This relies on the system DPI + * and scaling settings being somewhat correct. + * + * The content scale may depend on both the monitor resolution and pixel + * density and on user settings. It may be very different from the raw DPI + * calculated from the physical size and current resolution. + * + * @param[in] monitor The monitor to query. + * @param[out] xscale Where to store the x-axis content scale, or `NULL`. + * @param[out] yscale Where to store the y-axis content scale, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_scale + * @sa @ref glfwGetWindowContentScale + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* monitor, float* xscale, float* yscale); + +/*! @brief Returns the name of the specified monitor. + * + * This function returns a human-readable name, encoded as UTF-8, of the + * specified monitor. The name typically reflects the make and model of the + * monitor and is not guaranteed to be unique among the connected monitors. + * + * @param[in] monitor The monitor to query. + * @return The UTF-8 encoded name of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); + +/*! @brief Sets the user pointer of the specified monitor. + * + * This function sets the user-defined pointer of the specified monitor. The + * current value is retained until the monitor is disconnected. The initial + * value is `NULL`. + * + * This function may be called from the monitor callback, even for a monitor + * that is being disconnected. + * + * @param[in] monitor The monitor whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref monitor_userptr + * @sa @ref glfwGetMonitorUserPointer + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* monitor, void* pointer); + +/*! @brief Returns the user pointer of the specified monitor. + * + * This function returns the current value of the user-defined pointer of the + * specified monitor. The initial value is `NULL`. + * + * This function may be called from the monitor callback, even for a monitor + * that is being disconnected. + * + * @param[in] monitor The monitor whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref monitor_userptr + * @sa @ref glfwSetMonitorUserPointer + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* monitor); + +/*! @brief Sets the monitor configuration callback. + * + * This function sets the monitor configuration callback, or removes the + * currently set callback. This is called when a monitor is connected to or + * disconnected from the system. + * + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWmonitor* monitor, int event) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWmonitorfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_event + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun callback); + +/*! @brief Returns the available video modes for the specified monitor. + * + * This function returns an array of all video modes supported by the specified + * monitor. The returned array is sorted in ascending order, first by color + * bit depth (the sum of all channel depths), then by resolution area (the + * product of width and height), then resolution width and finally by refresh + * rate. + * + * @param[in] monitor The monitor to query. + * @param[out] count Where to store the number of video modes in the returned + * array. This is set to zero if an error occurred. + * @return An array of video modes, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected, this function is called again for that monitor or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoMode + * + * @since Added in version 1.0. + * @glfw3 Changed to return an array of modes for a specific monitor. + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); + +/*! @brief Returns the current mode of the specified monitor. + * + * This function returns the current video mode of the specified monitor. If + * you have created a full screen window for that monitor, the return value + * will depend on whether that window is iconified. + * + * @param[in] monitor The monitor to query. + * @return The current mode of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoModes + * + * @since Added in version 3.0. Replaces `glfwGetDesktopMode`. + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); + +/*! @brief Generates a gamma ramp and sets it for the specified monitor. + * + * This function generates an appropriately sized gamma ramp from the specified + * exponent and then calls @ref glfwSetGammaRamp with it. The value must be + * a finite number greater than zero. + * + * The software controlled gamma ramp is applied _in addition_ to the hardware + * gamma correction, which today is usually an approximation of sRGB gamma. + * This means that setting a perfectly linear ramp, or gamma 1.0, will produce + * the default (usually sRGB-like) behavior. + * + * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref + * GLFW_SRGB_CAPABLE hint. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] gamma The desired exponent. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); + +/*! @brief Returns the current gamma ramp for the specified monitor. + * + * This function returns the current gamma ramp of the specified monitor. + * + * @param[in] monitor The monitor to query. + * @return The current gamma ramp, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR while + * returning `NULL`. + * + * @pointer_lifetime The returned structure and its arrays are allocated and + * freed by GLFW. You should not free them yourself. They are valid until the + * specified monitor is disconnected, this function is called again for that + * monitor or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); + +/*! @brief Sets the current gamma ramp for the specified monitor. + * + * This function sets the current gamma ramp for the specified monitor. The + * original gamma ramp for that monitor is saved by GLFW the first time this + * function is called and is restored by @ref glfwTerminate. + * + * The software controlled gamma ramp is applied _in addition_ to the hardware + * gamma correction, which today is usually an approximation of sRGB gamma. + * This means that setting a perfectly linear ramp, or gamma 1.0, will produce + * the default (usually sRGB-like) behavior. + * + * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref + * GLFW_SRGB_CAPABLE hint. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] ramp The gamma ramp to use. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark The size of the specified gamma ramp should match the size of the + * current ramp for that monitor. + * + * @remark @win32 The gamma ramp size must be 256. + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified gamma ramp is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); + +/*! @brief Resets all window hints to their default values. + * + * This function resets all window hints to their + * [default values](@ref window_hints_values). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHint + * @sa @ref glfwWindowHintString + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwDefaultWindowHints(void); + +/*! @brief Sets the specified window hint to the desired value. + * + * This function sets hints for the next call to @ref glfwCreateWindow. The + * hints, once set, retain their values until changed by a call to this + * function or @ref glfwDefaultWindowHints, or until the library is terminated. + * + * Only integer value hints can be set with this function. String value hints + * are set with @ref glfwWindowHintString. + * + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHintString + * @sa @ref glfwDefaultWindowHints + * + * @since Added in version 3.0. Replaces `glfwOpenWindowHint`. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHint(int hint, int value); + +/*! @brief Sets the specified window hint to the desired value. + * + * This function sets hints for the next call to @ref glfwCreateWindow. The + * hints, once set, retain their values until changed by a call to this + * function or @ref glfwDefaultWindowHints, or until the library is terminated. + * + * Only string type hints can be set with this function. Integer value hints + * are set with @ref glfwWindowHint. + * + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHint + * @sa @ref glfwDefaultWindowHints + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHintString(int hint, const char* value); + +/*! @brief Creates a window and its associated context. + * + * This function creates a window and its associated OpenGL or OpenGL ES + * context. Most of the options controlling how the window and its context + * should be created are specified with [window hints](@ref window_hints). + * + * Successful creation does not change which context is current. Before you + * can use the newly created context, you need to + * [make it current](@ref context_current). For information about the `share` + * parameter, see @ref context_sharing. + * + * The created window, framebuffer and context may differ from what you + * requested, as not all parameters and hints are + * [hard constraints](@ref window_hints_hard). This includes the size of the + * window, especially for full screen windows. To query the actual attributes + * of the created window, framebuffer and context, see @ref + * glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize. + * + * To create a full screen window, you need to specify the monitor the window + * will cover. If no monitor is specified, the window will be windowed mode. + * Unless you have a way for the user to choose a specific monitor, it is + * recommended that you pick the primary monitor. For more information on how + * to query connected monitors, see @ref monitor_monitors. + * + * For full screen windows, the specified size becomes the resolution of the + * window's _desired video mode_. As long as a full screen window is not + * iconified, the supported video mode most closely matching the desired video + * mode is set for the specified monitor. For more information about full + * screen windows, including the creation of so called _windowed full screen_ + * or _borderless full screen_ windows, see @ref window_windowed_full_screen. + * + * Once you have created the window, you can switch it between windowed and + * full screen mode with @ref glfwSetWindowMonitor. This will not affect its + * OpenGL or OpenGL ES context. + * + * By default, newly created windows use the placement recommended by the + * window system. To create the window at a specific position, make it + * initially invisible using the [GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window + * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) + * it. + * + * As long as at least one full screen window is not iconified, the screensaver + * is prohibited from starting. + * + * Window systems put limits on window sizes. Very large or very small window + * dimensions may be overridden by the window system on creation. Check the + * actual [size](@ref window_size) after creation. + * + * The [swap interval](@ref buffer_swap) is not set during window creation and + * the initial value may vary depending on driver settings and defaults. + * + * @param[in] width The desired width, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] height The desired height, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] title The initial, UTF-8 encoded window title. + * @param[in] monitor The monitor to use for full screen mode, or `NULL` for + * windowed mode. + * @param[in] share The window whose context to share resources with, or `NULL` + * to not share resources. + * @return The handle of the created window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref + * GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @win32 Window creation will fail if the Microsoft GDI software + * OpenGL implementation is the only one available. + * + * @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it + * will be set as the initial icon for the window. If no such icon is present, + * the `IDI_APPLICATION` icon will be used instead. To set a different icon, + * see @ref glfwSetWindowIcon. + * + * @remark @win32 The context to share resources with must not be current on + * any other thread. + * + * @remark @macos The OS only supports forward-compatible core profile contexts + * for OpenGL versions 3.2 and later. Before creating an OpenGL context of + * version 3.2 or later you must set the + * [GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) and + * [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hints accordingly. + * OpenGL 3.0 and 3.1 contexts are not supported at all on macOS. + * + * @remark @macos The GLFW window has no icon, as it is not a document + * window, but the dock icon will be the same as the application bundle's icon. + * For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @remark @macos The first time a window is created the menu bar is created. + * If GLFW finds a `MainMenu.nib` it is loaded and assumed to contain a menu + * bar. Otherwise a minimal menu bar is created manually with common commands + * like Hide, Quit and About. The About entry opens a minimal about dialog + * with information from the application's bundle. Menu bar creation can be + * disabled entirely with the @ref GLFW_COCOA_MENUBAR init hint. + * + * @remark @macos On OS X 10.10 and later the window frame will not be rendered + * at full resolution on Retina displays unless the + * [GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint) + * hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the + * application bundle's `Info.plist`. For more information, see + * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) + * in the Mac Developer Library. The GLFW test and example programs use + * a custom `Info.plist` template for this, which can be found as + * `CMake/MacOSXBundleInfo.plist.in` in the source tree. + * + * @remark @macos When activating frame autosaving with + * [GLFW_COCOA_FRAME_NAME](@ref GLFW_COCOA_FRAME_NAME_hint), the specified + * window size and position may be overridden by previously saved values. + * + * @remark @x11 Some window managers will not respect the placement of + * initially hidden windows. + * + * @remark @x11 Due to the asynchronous nature of X11, it may take a moment for + * a window to reach its requested state. This means you may not be able to + * query the final size, position or other attributes directly after window + * creation. + * + * @remark @x11 The class part of the `WM_CLASS` window property will by + * default be set to the window title passed to this function. The instance + * part will use the contents of the `RESOURCE_NAME` environment variable, if + * present and not empty, or fall back to the window title. Set the + * [GLFW_X11_CLASS_NAME](@ref GLFW_X11_CLASS_NAME_hint) and + * [GLFW_X11_INSTANCE_NAME](@ref GLFW_X11_INSTANCE_NAME_hint) window hints to + * override this. + * + * @remark @wayland Compositors should implement the xdg-decoration protocol + * for GLFW to decorate the window properly. If this protocol isn't + * supported, or if the compositor prefers client-side decorations, a very + * simple fallback frame will be drawn using the wp_viewporter protocol. A + * compositor can still emit close, maximize or fullscreen events, using for + * instance a keybind mechanism. If neither of these protocols is supported, + * the window won't be decorated. + * + * @remark @wayland A full screen window will not attempt to change the mode, + * no matter what the requested size or refresh rate. + * + * @remark @wayland Screensaver inhibition requires the idle-inhibit protocol + * to be implemented in the user's compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa @ref glfwDestroyWindow + * + * @since Added in version 3.0. Replaces `glfwOpenWindow`. + * + * @ingroup window + */ +GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); + +/*! @brief Destroys the specified window and its context. + * + * This function destroys the specified window and its context. On calling + * this function, no further callbacks will be called for that window. + * + * If the context of the specified window is current on the main thread, it is + * detached before being destroyed. + * + * @param[in] window The window to destroy. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @note The context of the specified window must not be current on any other + * thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa @ref glfwCreateWindow + * + * @since Added in version 3.0. Replaces `glfwCloseWindow`. + * + * @ingroup window + */ +GLFWAPI void glfwDestroyWindow(GLFWwindow* window); + +/*! @brief Checks the close flag of the specified window. + * + * This function returns the value of the close flag of the specified window. + * + * @param[in] window The window to query. + * @return The value of the close flag. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); + +/*! @brief Sets the close flag of the specified window. + * + * This function sets the value of the close flag of the specified window. + * This can be used to override the user's attempt to close the window, or + * to signal that it should be closed. + * + * @param[in] window The window whose flag to change. + * @param[in] value The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); + +/*! @brief Sets the title of the specified window. + * + * This function sets the window title, encoded as UTF-8, of the specified + * window. + * + * @param[in] window The window whose title to change. + * @param[in] title The UTF-8 encoded window title. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos The window title will not be updated until the next time you + * process events. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_title + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); + +/*! @brief Sets the icon for the specified window. + * + * This function sets the icon of the specified window. If passed an array of + * candidate images, those of or closest to the sizes desired by the system are + * selected. If no images are specified, the window reverts to its default + * icon. + * + * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + * bits per channel with the red channel first. They are arranged canonically + * as packed sequential rows, starting from the top-left corner. + * + * The desired image sizes varies depending on platform and system settings. + * The selected images will be rescaled as needed. Good sizes include 16x16, + * 32x32 and 48x48. + * + * @param[in] window The window whose icon to set. + * @param[in] count The number of images in the specified array, or zero to + * revert to the default window icon. + * @param[in] images The images to create the icon from. This is ignored if + * count is zero. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @remark @macos The GLFW window has no icon, as it is not a document + * window, so this function does nothing. The dock icon will be the same as + * the application bundle's icon. For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @remark @wayland There is no existing protocol to change an icon, the + * window will thus inherit the one defined in the application's desktop file. + * This function always emits @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_icon + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images); + +/*! @brief Retrieves the position of the content area of the specified window. + * + * This function retrieves the position, in screen coordinates, of the + * upper-left corner of the content area of the specified window. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The window to query. + * @param[out] xpos Where to store the x-coordinate of the upper-left corner of + * the content area, or `NULL`. + * @param[out] ypos Where to store the y-coordinate of the upper-left corner of + * the content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland There is no way for an application to retrieve the global + * position of its windows, this function will always emit @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa @ref glfwSetWindowPos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); + +/*! @brief Sets the position of the content area of the specified window. + * + * This function sets the position, in screen coordinates, of the upper-left + * corner of the content area of the specified windowed mode window. If the + * window is a full screen window, this function does nothing. + * + * __Do not use this function__ to move an already visible window unless you + * have very good reasons for doing so, as it will confuse and annoy the user. + * + * The window manager may put limits on what positions are allowed. GLFW + * cannot and should not override these limits. + * + * @param[in] window The window to query. + * @param[in] xpos The x-coordinate of the upper-left corner of the content area. + * @param[in] ypos The y-coordinate of the upper-left corner of the content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland There is no way for an application to set the global + * position of its windows, this function will always emit @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa @ref glfwGetWindowPos + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); + +/*! @brief Retrieves the size of the content area of the specified window. + * + * This function retrieves the size, in screen coordinates, of the content area + * of the specified window. If you wish to retrieve the size of the + * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose size to retrieve. + * @param[out] width Where to store the width, in screen coordinates, of the + * content area, or `NULL`. + * @param[out] height Where to store the height, in screen coordinates, of the + * content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa @ref glfwSetWindowSize + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Sets the size limits of the specified window. + * + * This function sets the size limits of the content area of the specified + * window. If the window is full screen, the size limits only take effect + * once it is made windowed. If the window is not resizable, this function + * does nothing. + * + * The size limits are applied immediately to a windowed mode window and may + * cause it to be resized. + * + * The maximum dimensions must be greater than or equal to the minimum + * dimensions and all must be greater than or equal to zero. + * + * @param[in] window The window to set limits for. + * @param[in] minwidth The minimum width, in screen coordinates, of the content + * area, or `GLFW_DONT_CARE`. + * @param[in] minheight The minimum height, in screen coordinates, of the + * content area, or `GLFW_DONT_CARE`. + * @param[in] maxwidth The maximum width, in screen coordinates, of the content + * area, or `GLFW_DONT_CARE`. + * @param[in] maxheight The maximum height, in screen coordinates, of the + * content area, or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @remark @wayland The size limits will not be applied until the window is + * actually resized, either by the user or by the compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa @ref glfwSetWindowAspectRatio + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight); + +/*! @brief Sets the aspect ratio of the specified window. + * + * This function sets the required aspect ratio of the content area of the + * specified window. If the window is full screen, the aspect ratio only takes + * effect once it is made windowed. If the window is not resizable, this + * function does nothing. + * + * The aspect ratio is specified as a numerator and a denominator and both + * values must be greater than zero. For example, the common 16:9 aspect ratio + * is specified as 16 and 9, respectively. + * + * If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect + * ratio limit is disabled. + * + * The aspect ratio is applied immediately to a windowed mode window and may + * cause it to be resized. + * + * @param[in] window The window to set limits for. + * @param[in] numer The numerator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * @param[in] denom The denominator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @remark @wayland The aspect ratio will not be applied until the window is + * actually resized, either by the user or by the compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa @ref glfwSetWindowSizeLimits + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); + +/*! @brief Sets the size of the content area of the specified window. + * + * This function sets the size, in screen coordinates, of the content area of + * the specified window. + * + * For full screen windows, this function updates the resolution of its desired + * video mode and switches to the video mode closest to it, without affecting + * the window's context. As the context is unaffected, the bit depths of the + * framebuffer remain unchanged. + * + * If you wish to update the refresh rate of the desired video mode in addition + * to its resolution, see @ref glfwSetWindowMonitor. + * + * The window manager may put limits on what sizes are allowed. GLFW cannot + * and should not override these limits. + * + * @param[in] window The window to resize. + * @param[in] width The desired width, in screen coordinates, of the window + * content area. + * @param[in] height The desired height, in screen coordinates, of the window + * content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland A full screen window will not attempt to change the mode, + * no matter what the requested size. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa @ref glfwGetWindowSize + * @sa @ref glfwSetWindowMonitor + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); + +/*! @brief Retrieves the size of the framebuffer of the specified window. + * + * This function retrieves the size, in pixels, of the framebuffer of the + * specified window. If you wish to retrieve the size of the window in screen + * coordinates, see @ref glfwGetWindowSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose framebuffer to query. + * @param[out] width Where to store the width, in pixels, of the framebuffer, + * or `NULL`. + * @param[out] height Where to store the height, in pixels, of the framebuffer, + * or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * @sa @ref glfwSetFramebufferSizeCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Retrieves the size of the frame of the window. + * + * This function retrieves the size, in screen coordinates, of each edge of the + * frame of the specified window. This size includes the title bar, if the + * window has one. The size of the frame may vary depending on the + * [window-related hints](@ref window_hints_wnd) used to create it. + * + * Because this function retrieves the size of each window frame edge and not + * the offset along a particular coordinate axis, the retrieved values will + * always be zero or positive. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose frame size to query. + * @param[out] left Where to store the size, in screen coordinates, of the left + * edge of the window frame, or `NULL`. + * @param[out] top Where to store the size, in screen coordinates, of the top + * edge of the window frame, or `NULL`. + * @param[out] right Where to store the size, in screen coordinates, of the + * right edge of the window frame, or `NULL`. + * @param[out] bottom Where to store the size, in screen coordinates, of the + * bottom edge of the window frame, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); + +/*! @brief Retrieves the content scale for the specified window. + * + * This function retrieves the content scale for the specified window. The + * content scale is the ratio between the current DPI and the platform's + * default DPI. This is especially important for text and any UI elements. If + * the pixel dimensions of your UI scaled by this look appropriate on your + * machine then it should appear at a reasonable size on other machines + * regardless of their DPI and scaling settings. This relies on the system DPI + * and scaling settings being somewhat correct. + * + * On systems where each monitors can have its own content scale, the window + * content scale will depend on which monitor the system considers the window + * to be on. + * + * @param[in] window The window to query. + * @param[out] xscale Where to store the x-axis content scale, or `NULL`. + * @param[out] yscale Where to store the y-axis content scale, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_scale + * @sa @ref glfwSetWindowContentScaleCallback + * @sa @ref glfwGetMonitorContentScale + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowContentScale(GLFWwindow* window, float* xscale, float* yscale); + +/*! @brief Returns the opacity of the whole window. + * + * This function returns the opacity of the window, including any decorations. + * + * The opacity (or alpha) value is a positive finite number between zero and + * one, where zero is fully transparent and one is fully opaque. If the system + * does not support whole window transparency, this function always returns one. + * + * The initial opacity value for newly created windows is one. + * + * @param[in] window The window to query. + * @return The opacity value of the specified window. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_transparency + * @sa @ref glfwSetWindowOpacity + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI float glfwGetWindowOpacity(GLFWwindow* window); + +/*! @brief Sets the opacity of the whole window. + * + * This function sets the opacity of the window, including any decorations. + * + * The opacity (or alpha) value is a positive finite number between zero and + * one, where zero is fully transparent and one is fully opaque. + * + * The initial opacity value for newly created windows is one. + * + * A window created with framebuffer transparency may not use whole window + * transparency. The results of doing this are undefined. + * + * @param[in] window The window to set the opacity for. + * @param[in] opacity The desired opacity of the specified window. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_transparency + * @sa @ref glfwGetWindowOpacity + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity); + +/*! @brief Iconifies the specified window. + * + * This function iconifies (minimizes) the specified window if it was + * previously restored. If the window is already iconified, this function does + * nothing. + * + * If the specified window is a full screen window, GLFW restores the original + * video mode of the monitor. The window's desired video mode is set again + * when the window is restored. + * + * @param[in] window The window to iconify. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwRestoreWindow + * @sa @ref glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwIconifyWindow(GLFWwindow* window); + +/*! @brief Restores the specified window. + * + * This function restores the specified window if it was previously iconified + * (minimized) or maximized. If the window is already restored, this function + * does nothing. + * + * If the specified window is an iconified full screen window, its desired + * video mode is set again for its monitor when the window is restored. + * + * @param[in] window The window to restore. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwIconifyWindow + * @sa @ref glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwRestoreWindow(GLFWwindow* window); + +/*! @brief Maximizes the specified window. + * + * This function maximizes the specified window if it was previously not + * maximized. If the window is already maximized, this function does nothing. + * + * If the specified window is a full screen window, this function does nothing. + * + * @param[in] window The window to maximize. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwIconifyWindow + * @sa @ref glfwRestoreWindow + * + * @since Added in GLFW 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwMaximizeWindow(GLFWwindow* window); + +/*! @brief Makes the specified window visible. + * + * This function makes the specified window visible if it was previously + * hidden. If the window is already visible or is in full screen mode, this + * function does nothing. + * + * By default, windowed mode windows are focused when shown + * Set the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint + * to change this behavior for all newly created windows, or change the + * behavior for an existing window with @ref glfwSetWindowAttrib. + * + * @param[in] window The window to make visible. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Because Wayland wants every frame of the desktop to be + * complete, this function does not immediately make the window visible. + * Instead it will become visible the next time the window framebuffer is + * updated after this call. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa @ref glfwHideWindow + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwShowWindow(GLFWwindow* window); + +/*! @brief Hides the specified window. + * + * This function hides the specified window if it was previously visible. If + * the window is already hidden or is in full screen mode, this function does + * nothing. + * + * @param[in] window The window to hide. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa @ref glfwShowWindow + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwHideWindow(GLFWwindow* window); + +/*! @brief Brings the specified window to front and sets input focus. + * + * This function brings the specified window to front and sets input focus. + * The window should already be visible and not iconified. + * + * By default, both windowed and full screen mode windows are focused when + * initially created. Set the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) to + * disable this behavior. + * + * Also by default, windowed mode windows are focused when shown + * with @ref glfwShowWindow. Set the + * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) to disable this behavior. + * + * __Do not use this function__ to steal focus from other applications unless + * you are certain that is what the user wants. Focus stealing can be + * extremely disruptive. + * + * For a less disruptive way of getting the user's attention, see + * [attention requests](@ref window_attention). + * + * @param[in] window The window to give input focus. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland It is not possible for an application to bring its windows + * to front, this function will always emit @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * @sa @ref window_attention + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwFocusWindow(GLFWwindow* window); + +/*! @brief Requests user attention to the specified window. + * + * This function requests user attention to the specified window. On + * platforms where this is not supported, attention is requested to the + * application as a whole. + * + * Once the user has given attention, usually by focusing the window or + * application, the system will end the request automatically. + * + * @param[in] window The window to request attention to. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos Attention is requested to the application as a whole, not the + * specific window. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attention + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwRequestWindowAttention(GLFWwindow* window); + +/*! @brief Returns the monitor that the window uses for full screen mode. + * + * This function returns the handle of the monitor that the specified window is + * in full screen on. + * + * @param[in] window The window to query. + * @return The monitor, or `NULL` if the window is in windowed mode or an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref glfwSetWindowMonitor + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); + +/*! @brief Sets the mode, monitor, video mode and placement of a window. + * + * This function sets the monitor that the window uses for full screen mode or, + * if the monitor is `NULL`, makes it windowed mode. + * + * When setting a monitor, this function updates the width, height and refresh + * rate of the desired video mode and switches to the video mode closest to it. + * The window position is ignored when setting a monitor. + * + * When the monitor is `NULL`, the position, width and height are used to + * place the window content area. The refresh rate is ignored when no monitor + * is specified. + * + * If you only wish to update the resolution of a full screen window or the + * size of a windowed mode window, see @ref glfwSetWindowSize. + * + * When a window transitions from full screen to windowed mode, this function + * restores any previous window settings such as whether it is decorated, + * floating, resizable, has size or aspect ratio limits, etc. + * + * @param[in] window The window whose monitor, size or video mode to set. + * @param[in] monitor The desired monitor, or `NULL` to set windowed mode. + * @param[in] xpos The desired x-coordinate of the upper-left corner of the + * content area. + * @param[in] ypos The desired y-coordinate of the upper-left corner of the + * content area. + * @param[in] width The desired with, in screen coordinates, of the content + * area or video mode. + * @param[in] height The desired height, in screen coordinates, of the content + * area or video mode. + * @param[in] refreshRate The desired refresh rate, in Hz, of the video mode, + * or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark The OpenGL or OpenGL ES context will not be destroyed or otherwise + * affected by any resizing or mode switching, although you may need to update + * your viewport if the framebuffer size has changed. + * + * @remark @wayland The desired window position is ignored, as there is no way + * for an application to set this property. + * + * @remark @wayland Setting the window to full screen will not attempt to + * change the mode, no matter what the requested size or refresh rate. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref window_full_screen + * @sa @ref glfwGetWindowMonitor + * @sa @ref glfwSetWindowSize + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); + +/*! @brief Returns an attribute of the specified window. + * + * This function returns the value of an attribute of the specified window or + * its OpenGL or OpenGL ES context. + * + * @param[in] window The window to query. + * @param[in] attrib The [window attribute](@ref window_attribs) whose value to + * return. + * @return The value of the attribute, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @remark Framebuffer related hints are not window attributes. See @ref + * window_attribs_fb for more information. + * + * @remark Zero is a valid value for many window and context related + * attributes so you cannot use a return value of zero as an indication of + * errors. However, this function should not fail as long as it is passed + * valid arguments and the library has been [initialized](@ref intro_init). + * + * @remark @wayland The Wayland protocol provides no way to check whether a + * window is iconfied, so @ref GLFW_ICONIFIED always returns `GLFW_FALSE`. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * @sa @ref glfwSetWindowAttrib + * + * @since Added in version 3.0. Replaces `glfwGetWindowParam` and + * `glfwGetGLVersion`. + * + * @ingroup window + */ +GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); + +/*! @brief Sets an attribute of the specified window. + * + * This function sets the value of an attribute of the specified window. + * + * The supported attributes are [GLFW_DECORATED](@ref GLFW_DECORATED_attrib), + * [GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib), + * [GLFW_FLOATING](@ref GLFW_FLOATING_attrib), + * [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and + * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib). + * + * Some of these attributes are ignored for full screen windows. The new + * value will take effect if the window is later made windowed. + * + * Some of these attributes are ignored for windowed mode windows. The new + * value will take effect if the window is later made full screen. + * + * @param[in] window The window to set the attribute for. + * @param[in] attrib A supported window attribute. + * @param[in] value `GLFW_TRUE` or `GLFW_FALSE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark Calling @ref glfwGetWindowAttrib will always return the latest + * value, even if that value is ignored by the current mode of the window. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * @sa @ref glfwGetWindowAttrib + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAttrib(GLFWwindow* window, int attrib, int value); + +/*! @brief Sets the user pointer of the specified window. + * + * This function sets the user-defined pointer of the specified window. The + * current value is retained until the window is destroyed. The initial value + * is `NULL`. + * + * @param[in] window The window whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa @ref glfwGetWindowUserPointer + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); + +/*! @brief Returns the user pointer of the specified window. + * + * This function returns the current value of the user-defined pointer of the + * specified window. The initial value is `NULL`. + * + * @param[in] window The window whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa @ref glfwSetWindowUserPointer + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); + +/*! @brief Sets the position callback for the specified window. + * + * This function sets the position callback of the specified window, which is + * called when the window is moved. The callback is provided with the + * position, in screen coordinates, of the upper-left corner of the content + * area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int xpos, int ypos) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowposfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @wayland This callback will never be called, as there is no way for + * an application to know its global position. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun callback); + +/*! @brief Sets the size callback for the specified window. + * + * This function sets the size callback of the specified window, which is + * called when the window is resized. The callback is provided with the size, + * in screen coordinates, of the content area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowsizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun callback); + +/*! @brief Sets the close callback for the specified window. + * + * This function sets the close callback of the specified window, which is + * called when the user attempts to close the window, for example by clicking + * the close widget in the title bar. + * + * The close flag is set before this callback is called, but you can modify it + * at any time with @ref glfwSetWindowShouldClose. + * + * The close callback is not triggered by @ref glfwDestroyWindow. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowclosefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @macos Selecting Quit from the application menu will trigger the + * close callback for all windows. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_close + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun callback); + +/*! @brief Sets the refresh callback for the specified window. + * + * This function sets the refresh callback of the specified window, which is + * called when the content area of the window needs to be redrawn, for example + * if the window has been exposed after having been covered by another window. + * + * On compositing window systems such as Aero, Compiz, Aqua or Wayland, where + * the window contents are saved off-screen, this callback may be called only + * very infrequently or never at all. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window); + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowrefreshfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_refresh + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun callback); + +/*! @brief Sets the focus callback for the specified window. + * + * This function sets the focus callback of the specified window, which is + * called when the window gains or loses input focus. + * + * After the focus callback is called for a window that lost input focus, + * synthetic key and mouse button release events will be generated for all such + * that had been pressed. For more information, see @ref glfwSetKeyCallback + * and @ref glfwSetMouseButtonCallback. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int focused) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowfocusfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun callback); + +/*! @brief Sets the iconify callback for the specified window. + * + * This function sets the iconification callback of the specified window, which + * is called when the window is iconified or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int iconified) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowiconifyfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @wayland The XDG-shell protocol has no event for iconification, so + * this callback will never be called. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun callback); + +/*! @brief Sets the maximize callback for the specified window. + * + * This function sets the maximization callback of the specified window, which + * is called when the window is maximized or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int maximized) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowmaximizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_maximize + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun callback); + +/*! @brief Sets the framebuffer resize callback for the specified window. + * + * This function sets the framebuffer resize callback of the specified window, + * which is called when the framebuffer of the specified window is resized. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWframebuffersizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun callback); + +/*! @brief Sets the window content scale callback for the specified window. + * + * This function sets the window content scale callback of the specified window, + * which is called when the content scale of the specified window changes. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, float xscale, float yscale) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowcontentscalefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_scale + * @sa @ref glfwGetWindowContentScale + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* window, GLFWwindowcontentscalefun callback); + +/*! @brief Processes all pending events. + * + * This function processes only those events that are already in the event + * queue and then returns immediately. Processing events will cause the window + * and input callbacks associated with those events to be called. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwWaitEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 1.0. + * + * @ingroup window + */ +GLFWAPI void glfwPollEvents(void); + +/*! @brief Waits until events are queued and processes them. + * + * This function puts the calling thread to sleep until at least one event is + * available in the event queue. Once one or more events are available, + * it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue + * are processed and the function then returns immediately. Processing events + * will cause the window and input callbacks associated with those events to be + * called. + * + * Since not all events are associated with callbacks, this function may return + * without a callback having been called even if you are monitoring all + * callbacks. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwPollEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 2.5. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEvents(void); + +/*! @brief Waits with timeout until events are queued and processes them. + * + * This function puts the calling thread to sleep until at least one event is + * available in the event queue, or until the specified timeout is reached. If + * one or more events are available, it behaves exactly like @ref + * glfwPollEvents, i.e. the events in the queue are processed and the function + * then returns immediately. Processing events will cause the window and input + * callbacks associated with those events to be called. + * + * The timeout value must be a positive finite number. + * + * Since not all events are associated with callbacks, this function may return + * without a callback having been called even if you are monitoring all + * callbacks. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @param[in] timeout The maximum amount of time, in seconds, to wait. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwPollEvents + * @sa @ref glfwWaitEvents + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEventsTimeout(double timeout); + +/*! @brief Posts an empty event to the event queue. + * + * This function posts an empty event from the current thread to the event + * queue, causing @ref glfwWaitEvents or @ref glfwWaitEventsTimeout to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref events + * @sa @ref glfwWaitEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwPostEmptyEvent(void); + +/*! @brief Returns the value of an input option for the specified window. + * + * This function returns the value of an input option for the specified window. + * The mode must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, + * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or + * @ref GLFW_RAW_MOUSE_MOTION. + * + * @param[in] window The window to query. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, + * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or + * `GLFW_RAW_MOUSE_MOTION`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref glfwSetInputMode + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); + +/*! @brief Sets an input option for the specified window. + * + * This function sets an input mode option for the specified window. The mode + * must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, + * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or + * @ref GLFW_RAW_MOUSE_MOTION. + * + * If the mode is `GLFW_CURSOR`, the value must be one of the following cursor + * modes: + * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. + * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the + * content area of the window but does not restrict the cursor from leaving. + * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual + * and unlimited cursor movement. This is useful for implementing for + * example 3D camera controls. + * + * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to + * enable sticky keys, or `GLFW_FALSE` to disable it. If sticky keys are + * enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS` + * the next time it is called even if the key had been released before the + * call. This is useful when you are only interested in whether keys have been + * pressed but not when or in which order. + * + * If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either + * `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it. + * If sticky mouse buttons are enabled, a mouse button press will ensure that + * @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even + * if the mouse button had been released before the call. This is useful when + * you are only interested in whether mouse buttons have been pressed but not + * when or in which order. + * + * If the mode is `GLFW_LOCK_KEY_MODS`, the value must be either `GLFW_TRUE` to + * enable lock key modifier bits, or `GLFW_FALSE` to disable them. If enabled, + * callbacks that receive modifier bits will also have the @ref + * GLFW_MOD_CAPS_LOCK bit set when the event was generated with Caps Lock on, + * and the @ref GLFW_MOD_NUM_LOCK bit when Num Lock was on. + * + * If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE` + * to enable raw (unscaled and unaccelerated) mouse motion when the cursor is + * disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported, + * attempting to set this will emit @ref GLFW_PLATFORM_ERROR. Call @ref + * glfwRawMouseMotionSupported to check for support. + * + * @param[in] window The window whose input mode to set. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, + * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or + * `GLFW_RAW_MOUSE_MOTION`. + * @param[in] value The new value of the specified input mode. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref glfwGetInputMode + * + * @since Added in version 3.0. Replaces `glfwEnable` and `glfwDisable`. + * + * @ingroup input + */ +GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); + +/*! @brief Returns whether raw mouse motion is supported. + * + * This function returns whether raw mouse motion is supported on the current + * system. This status does not change after GLFW has been initialized so you + * only need to check this once. If you attempt to enable raw motion on + * a system that does not support it, @ref GLFW_PLATFORM_ERROR will be emitted. + * + * Raw mouse motion is closer to the actual motion of the mouse across + * a surface. It is not affected by the scaling and acceleration applied to + * the motion of the desktop cursor. That processing is suitable for a cursor + * while raw motion is better for controlling for example a 3D camera. Because + * of this, raw mouse motion is only provided when the cursor is disabled. + * + * @return `GLFW_TRUE` if raw mouse motion is supported on the current machine, + * or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref raw_mouse_motion + * @sa @ref glfwSetInputMode + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwRawMouseMotionSupported(void); + +/*! @brief Returns the layout-specific name of the specified printable key. + * + * This function returns the name of the specified printable key, encoded as + * UTF-8. This is typically the character that key would produce without any + * modifier keys, intended for displaying key bindings to the user. For dead + * keys, it is typically the diacritic it would add to a character. + * + * __Do not use this function__ for [text input](@ref input_char). You will + * break text input for many languages even if it happens to work for yours. + * + * If the key is `GLFW_KEY_UNKNOWN`, the scancode is used to identify the key, + * otherwise the scancode is ignored. If you specify a non-printable key, or + * `GLFW_KEY_UNKNOWN` and a scancode that maps to a non-printable key, this + * function returns `NULL` but does not emit an error. + * + * This behavior allows you to always pass in the arguments in the + * [key callback](@ref input_key) without modification. + * + * The printable keys are: + * - `GLFW_KEY_APOSTROPHE` + * - `GLFW_KEY_COMMA` + * - `GLFW_KEY_MINUS` + * - `GLFW_KEY_PERIOD` + * - `GLFW_KEY_SLASH` + * - `GLFW_KEY_SEMICOLON` + * - `GLFW_KEY_EQUAL` + * - `GLFW_KEY_LEFT_BRACKET` + * - `GLFW_KEY_RIGHT_BRACKET` + * - `GLFW_KEY_BACKSLASH` + * - `GLFW_KEY_WORLD_1` + * - `GLFW_KEY_WORLD_2` + * - `GLFW_KEY_0` to `GLFW_KEY_9` + * - `GLFW_KEY_A` to `GLFW_KEY_Z` + * - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9` + * - `GLFW_KEY_KP_DECIMAL` + * - `GLFW_KEY_KP_DIVIDE` + * - `GLFW_KEY_KP_MULTIPLY` + * - `GLFW_KEY_KP_SUBTRACT` + * - `GLFW_KEY_KP_ADD` + * - `GLFW_KEY_KP_EQUAL` + * + * Names for printable keys depend on keyboard layout, while names for + * non-printable keys are the same across layouts but depend on the application + * language and should be localized along with other user interface text. + * + * @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. + * @param[in] scancode The scancode of the key to query. + * @return The UTF-8 encoded, layout-specific name of the key, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE, @ref GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @remark The contents of the returned string may change when a keyboard + * layout change event is received. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key_name + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetKeyName(int key, int scancode); + +/*! @brief Returns the platform-specific scancode of the specified key. + * + * This function returns the platform-specific scancode of the specified key. + * + * If the specified [key token](@ref keys) corresponds to a physical key not + * supported on the current platform then this method will return `-1`. + * Calling this function with anything other than a key token will return `-1` + * and generate a @ref GLFW_INVALID_ENUM error. + * + * @param[in] key Any [key token](@ref keys). + * @return The platform-specific scancode for the key, or `-1` if the key is + * not supported on the current platform or an [error](@ref error_handling) + * occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref input_key + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwGetKeyScancode(int key); + +/*! @brief Returns the last reported state of a keyboard key for the specified + * window. + * + * This function returns the last state reported for the specified key to the + * specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. The action `GLFW_REPEAT` is only reported to the key callback. + * + * If the @ref GLFW_STICKY_KEYS input mode is enabled, this function returns + * `GLFW_PRESS` the first time you call it for a key that was pressed, even if + * that key has already been released. + * + * The key functions deal with physical keys, with [key tokens](@ref keys) + * named after their use on the standard US keyboard layout. If you want to + * input text, use the Unicode character callback instead. + * + * The [modifier key bit masks](@ref mods) are not key tokens and cannot be + * used with this function. + * + * __Do not use this function__ to implement [text input](@ref input_char). + * + * @param[in] window The desired window. + * @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is + * not a valid key for this function. + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetKey(GLFWwindow* window, int key); + +/*! @brief Returns the last reported state of a mouse button for the specified + * window. + * + * This function returns the last state reported for the specified mouse button + * to the specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. + * + * If the @ref GLFW_STICKY_MOUSE_BUTTONS input mode is enabled, this function + * returns `GLFW_PRESS` the first time you call it for a mouse button that was + * pressed, even if that mouse button has already been released. + * + * @param[in] window The desired window. + * @param[in] button The desired [mouse button](@ref buttons). + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); + +/*! @brief Retrieves the position of the cursor relative to the content area of + * the window. + * + * This function returns the position of the cursor, in screen coordinates, + * relative to the upper-left corner of the content area of the specified + * window. + * + * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor + * position is unbounded and limited only by the minimum and maximum values of + * a `double`. + * + * The coordinate can be converted to their integer equivalents with the + * `floor` function. Casting directly to an integer type works for positive + * coordinates, but fails for negative ones. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The desired window. + * @param[out] xpos Where to store the cursor x-coordinate, relative to the + * left edge of the content area, or `NULL`. + * @param[out] ypos Where to store the cursor y-coordinate, relative to the to + * top edge of the content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa @ref glfwSetCursorPos + * + * @since Added in version 3.0. Replaces `glfwGetMousePos`. + * + * @ingroup input + */ +GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); + +/*! @brief Sets the position of the cursor, relative to the content area of the + * window. + * + * This function sets the position, in screen coordinates, of the cursor + * relative to the upper-left corner of the content area of the specified + * window. The window must have input focus. If the window does not have + * input focus when this function is called, it fails silently. + * + * __Do not use this function__ to implement things like camera controls. GLFW + * already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the + * cursor, transparently re-centers it and provides unconstrained cursor + * motion. See @ref glfwSetInputMode for more information. + * + * If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is + * unconstrained and limited only by the minimum and maximum values of + * a `double`. + * + * @param[in] window The desired window. + * @param[in] xpos The desired x-coordinate, relative to the left edge of the + * content area. + * @param[in] ypos The desired y-coordinate, relative to the top edge of the + * content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland This function will only work when the cursor mode is + * `GLFW_CURSOR_DISABLED`, otherwise it will do nothing. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa @ref glfwGetCursorPos + * + * @since Added in version 3.0. Replaces `glfwSetMousePos`. + * + * @ingroup input + */ +GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); + +/*! @brief Creates a custom cursor. + * + * Creates a new custom cursor image that can be set for a window with @ref + * glfwSetCursor. The cursor can be destroyed with @ref glfwDestroyCursor. + * Any remaining cursors are destroyed by @ref glfwTerminate. + * + * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + * bits per channel with the red channel first. They are arranged canonically + * as packed sequential rows, starting from the top-left corner. + * + * The cursor hotspot is specified in pixels, relative to the upper-left corner + * of the cursor image. Like all other coordinate systems in GLFW, the X-axis + * points to the right and the Y-axis points down. + * + * @param[in] image The desired cursor image. + * @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot. + * @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot. + * @return The handle of the created cursor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwDestroyCursor + * @sa @ref glfwCreateStandardCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot); + +/*! @brief Creates a cursor with a standard shape. + * + * Returns a cursor with a [standard shape](@ref shapes), that can be set for + * a window with @ref glfwSetCursor. + * + * @param[in] shape One of the [standard shapes](@ref shapes). + * @return A new cursor ready to use or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwCreateCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); + +/*! @brief Destroys a cursor. + * + * This function destroys a cursor previously created with @ref + * glfwCreateCursor. Any remaining cursors will be destroyed by @ref + * glfwTerminate. + * + * If the specified cursor is current for any window, that window will be + * reverted to the default cursor. This does not affect the cursor mode. + * + * @param[in] cursor The cursor object to destroy. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwCreateCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); + +/*! @brief Sets the cursor for the window. + * + * This function sets the cursor image to be used when the cursor is over the + * content area of the specified window. The set cursor will only be visible + * when the [cursor mode](@ref cursor_mode) of the window is + * `GLFW_CURSOR_NORMAL`. + * + * On some platforms, the set cursor may not be visible unless the window also + * has input focus. + * + * @param[in] window The window to set the cursor for. + * @param[in] cursor The cursor to set, or `NULL` to switch back to the default + * arrow cursor. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); + +/*! @brief Sets the key callback. + * + * This function sets the key callback of the specified window, which is called + * when a key is pressed, repeated or released. + * + * The key functions deal with physical keys, with layout independent + * [key tokens](@ref keys) named after their values in the standard US keyboard + * layout. If you want to input text, use the + * [character callback](@ref glfwSetCharCallback) instead. + * + * When a window loses input focus, it will generate synthetic key release + * events for all pressed keys with associated key tokens. You can tell these + * events from user-generated events by the fact that the synthetic ones are + * generated after the focus loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * The scancode of a key is specific to that platform or sometimes even to that + * machine. Scancodes are intended to allow users to bind keys that don't have + * a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their + * state is not saved and so it cannot be queried with @ref glfwGetKey. + * + * Sometimes GLFW needs to generate synthetic key events, in which case the + * scancode may be zero. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new key callback, or `NULL` to remove the currently + * set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWkeyfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback); + +/*! @brief Sets the Unicode character callback. + * + * This function sets the character callback of the specified window, which is + * called when a Unicode character is input. + * + * The character callback is intended for Unicode text input. As it deals with + * characters, it is keyboard layout dependent, whereas the + * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 + * to physical keys, as a key may produce zero, one or more characters. If you + * want to know whether a specific physical key was pressed or released, see + * the key callback instead. + * + * The character callback behaves as system text input normally does and will + * not be called if modifier keys are held down that would prevent normal text + * input on that platform, for example a Super (Command) key on macOS or Alt key + * on Windows. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcharfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun callback); + +/*! @brief Sets the Unicode character with modifiers callback. + * + * This function sets the character with modifiers callback of the specified + * window, which is called when a Unicode character is input regardless of what + * modifier keys are used. + * + * The character with modifiers callback is intended for implementing custom + * Unicode character input. For regular Unicode text input, see the + * [character callback](@ref glfwSetCharCallback). Like the character + * callback, the character with modifiers callback deals with characters and is + * keyboard layout dependent. Characters do not map 1:1 to physical keys, as + * a key may produce zero, one or more characters. If you want to know whether + * a specific physical key was pressed or released, see the + * [key callback](@ref glfwSetKeyCallback) instead. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * [error](@ref error_handling) occurred. + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcharmodsfun). + * + * @deprecated Scheduled for removal in version 4.0. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun callback); + +/*! @brief Sets the mouse button callback. + * + * This function sets the mouse button callback of the specified window, which + * is called when a mouse button is pressed or released. + * + * When a window loses input focus, it will generate synthetic mouse button + * release events for all pressed mouse buttons. You can tell these events + * from user-generated events by the fact that the synthetic ones are generated + * after the focus loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int button, int action, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWmousebuttonfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun callback); + +/*! @brief Sets the cursor position callback. + * + * This function sets the cursor position callback of the specified window, + * which is called when the cursor is moved. The callback is provided with the + * position, in screen coordinates, relative to the upper-left corner of the + * content area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, double xpos, double ypos); + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcursorposfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * + * @since Added in version 3.0. Replaces `glfwSetMousePosCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun callback); + +/*! @brief Sets the cursor enter/leave callback. + * + * This function sets the cursor boundary crossing callback of the specified + * window, which is called when the cursor enters or leaves the content area of + * the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int entered) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcursorenterfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_enter + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun callback); + +/*! @brief Sets the scroll callback. + * + * This function sets the scroll callback of the specified window, which is + * called when a scrolling device is used, such as a mouse wheel or scrolling + * area of a touchpad. + * + * The scroll callback receives all scrolling input, like that from a mouse + * wheel or a touchpad scrolling area. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new scroll callback, or `NULL` to remove the + * currently set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, double xoffset, double yoffset) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWscrollfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref scrolling + * + * @since Added in version 3.0. Replaces `glfwSetMouseWheelCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun callback); + +/*! @brief Sets the path drop callback. + * + * This function sets the path drop callback of the specified window, which is + * called when one or more dragged paths are dropped on the window. + * + * Because the path array and its strings may have been generated specifically + * for that event, they are not guaranteed to be valid after the callback has + * returned. If you wish to use them after the callback returns, you need to + * make a deep copy. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new file drop callback, or `NULL` to remove the + * currently set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int path_count, const char* paths[]) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWdropfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @wayland File drop is currently unimplemented. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref path_drop + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun callback); + +/*! @brief Returns whether the specified joystick is present. + * + * This function returns whether the specified joystick is present. + * + * There is no need to call this function before other functions that accept + * a joystick ID, as they all check for presence before performing any other + * work. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick + * + * @since Added in version 3.0. Replaces `glfwGetJoystickParam`. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickPresent(int jid); + +/*! @brief Returns the values of all axes of the specified joystick. + * + * This function returns the values of all axes of the specified joystick. + * Each element in the array is a value between -1.0 and 1.0. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of axis values in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of axis values, or `NULL` if the joystick is not present or + * an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_axis + * + * @since Added in version 3.0. Replaces `glfwGetJoystickPos`. + * + * @ingroup input + */ +GLFWAPI const float* glfwGetJoystickAxes(int jid, int* count); + +/*! @brief Returns the state of all buttons of the specified joystick. + * + * This function returns the state of all buttons of the specified joystick. + * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. + * + * For backward compatibility with earlier versions that did not have @ref + * glfwGetJoystickHats, the button array also includes all hats, each + * represented as four buttons. The hats are in the same order as returned by + * __glfwGetJoystickHats__ and are in the order _up_, _right_, _down_ and + * _left_. To disable these extra buttons, set the @ref + * GLFW_JOYSTICK_HAT_BUTTONS init hint before initialization. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of button states in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of button states, or `NULL` if the joystick is not present + * or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_button + * + * @since Added in version 2.2. + * @glfw3 Changed to return a dynamic array. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count); + +/*! @brief Returns the state of all hats of the specified joystick. + * + * This function returns the state of all hats of the specified joystick. + * Each element in the array is one of the following values: + * + * Name | Value + * ---- | ----- + * `GLFW_HAT_CENTERED` | 0 + * `GLFW_HAT_UP` | 1 + * `GLFW_HAT_RIGHT` | 2 + * `GLFW_HAT_DOWN` | 4 + * `GLFW_HAT_LEFT` | 8 + * `GLFW_HAT_RIGHT_UP` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_UP` + * `GLFW_HAT_RIGHT_DOWN` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_DOWN` + * `GLFW_HAT_LEFT_UP` | `GLFW_HAT_LEFT` \| `GLFW_HAT_UP` + * `GLFW_HAT_LEFT_DOWN` | `GLFW_HAT_LEFT` \| `GLFW_HAT_DOWN` + * + * The diagonal directions are bitwise combinations of the primary (up, right, + * down and left) directions and you can test for these individually by ANDing + * it with the corresponding direction. + * + * @code + * if (hats[2] & GLFW_HAT_RIGHT) + * { + * // State of hat 2 could be right-up, right or right-down + * } + * @endcode + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of hat states in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of hat states, or `NULL` if the joystick is not present + * or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, this function is called again for that joystick or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_hat + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickHats(int jid, int* count); + +/*! @brief Returns the name of the specified joystick. + * + * This function returns the name, encoded as UTF-8, of the specified joystick. + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick + * is not present or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_name + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickName(int jid); + +/*! @brief Returns the SDL compatible GUID of the specified joystick. + * + * This function returns the SDL compatible GUID, as a UTF-8 encoded + * hexadecimal string, of the specified joystick. The returned string is + * allocated and freed by GLFW. You should not free it yourself. + * + * The GUID is what connects a joystick to a gamepad mapping. A connected + * joystick will always have a GUID even if there is no gamepad mapping + * assigned to it. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * The GUID uses the format introduced in SDL 2.0.5. This GUID tries to + * uniquely identify the make and model of a joystick but does not identify + * a specific unit, e.g. all wired Xbox 360 controllers will have the same + * GUID on that platform. The GUID for a unit may vary between platforms + * depending on what hardware information the platform specific APIs provide. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded GUID of the joystick, or `NULL` if the joystick + * is not present or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickGUID(int jid); + +/*! @brief Sets the user pointer of the specified joystick. + * + * This function sets the user-defined pointer of the specified joystick. The + * current value is retained until the joystick is disconnected. The initial + * value is `NULL`. + * + * This function may be called from the joystick callback, even for a joystick + * that is being disconnected. + * + * @param[in] jid The joystick whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref joystick_userptr + * @sa @ref glfwGetJoystickUserPointer + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI void glfwSetJoystickUserPointer(int jid, void* pointer); + +/*! @brief Returns the user pointer of the specified joystick. + * + * This function returns the current value of the user-defined pointer of the + * specified joystick. The initial value is `NULL`. + * + * This function may be called from the joystick callback, even for a joystick + * that is being disconnected. + * + * @param[in] jid The joystick whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref joystick_userptr + * @sa @ref glfwSetJoystickUserPointer + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI void* glfwGetJoystickUserPointer(int jid); + +/*! @brief Returns whether the specified joystick has a gamepad mapping. + * + * This function returns whether the specified joystick is both present and has + * a gamepad mapping. + * + * If the specified joystick is present but does not have a gamepad mapping + * this function will return `GLFW_FALSE` but will not generate an error. Call + * @ref glfwJoystickPresent to check if a joystick is present regardless of + * whether it has a mapping. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return `GLFW_TRUE` if a joystick is both present and has a gamepad mapping, + * or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwGetGamepadState + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickIsGamepad(int jid); + +/*! @brief Sets the joystick configuration callback. + * + * This function sets the joystick configuration callback, or removes the + * currently set callback. This is called when a joystick is connected to or + * disconnected from the system. + * + * For joystick connection and disconnection events to be delivered on all + * platforms, you need to call one of the [event processing](@ref events) + * functions. Joystick disconnection may also be detected and the callback + * called by joystick functions. The function will then return whatever it + * returns if the joystick is not present. + * + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(int jid, int event) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWjoystickfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_event + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun callback); + +/*! @brief Adds the specified SDL_GameControllerDB gamepad mappings. + * + * This function parses the specified ASCII encoded string and updates the + * internal list with any gamepad mappings it finds. This string may + * contain either a single gamepad mapping or many mappings separated by + * newlines. The parser supports the full format of the `gamecontrollerdb.txt` + * source file including empty lines and comments. + * + * See @ref gamepad_mapping for a description of the format. + * + * If there is already a gamepad mapping for a given GUID in the internal list, + * it will be replaced by the one passed to this function. If the library is + * terminated and re-initialized the internal list will revert to the built-in + * default. + * + * @param[in] string The string containing the gamepad mappings. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwJoystickIsGamepad + * @sa @ref glfwGetGamepadName + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwUpdateGamepadMappings(const char* string); + +/*! @brief Returns the human-readable gamepad name for the specified joystick. + * + * This function returns the human-readable name of the gamepad from the + * gamepad mapping assigned to the specified joystick. + * + * If the specified joystick is not present or does not have a gamepad mapping + * this function will return `NULL` but will not generate an error. Call + * @ref glfwJoystickPresent to check whether it is present regardless of + * whether it has a mapping. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the gamepad, or `NULL` if the + * joystick is not present, does not have a mapping or an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref GLFW_INVALID_ENUM. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, the gamepad mappings are updated or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwJoystickIsGamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetGamepadName(int jid); + +/*! @brief Retrieves the state of the specified joystick remapped as a gamepad. + * + * This function retrieves the state of the specified joystick remapped to + * an Xbox-like gamepad. + * + * If the specified joystick is not present or does not have a gamepad mapping + * this function will return `GLFW_FALSE` but will not generate an error. Call + * @ref glfwJoystickPresent to check whether it is present regardless of + * whether it has a mapping. + * + * The Guide button may not be available for input as it is often hooked by the + * system or the Steam client. + * + * Not all devices have all the buttons or axes provided by @ref + * GLFWgamepadstate. Unavailable buttons and axes will always report + * `GLFW_RELEASE` and 0.0 respectively. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] state The gamepad input state of the joystick. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if no joystick is + * connected, it has no gamepad mapping or an [error](@ref error_handling) + * occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwUpdateGamepadMappings + * @sa @ref glfwJoystickIsGamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state); + +/*! @brief Sets the clipboard to the specified string. + * + * This function sets the system clipboard to the specified, UTF-8 encoded + * string. + * + * @param[in] window Deprecated. Any valid window or `NULL`. + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa @ref glfwGetClipboardString + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); + +/*! @brief Returns the contents of the clipboard as a string. + * + * This function returns the contents of the system clipboard, if it contains + * or is convertible to a UTF-8 encoded string. If the clipboard is empty or + * if its contents cannot be converted, `NULL` is returned and a @ref + * GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @param[in] window Deprecated. Any valid window or `NULL`. + * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_FORMAT_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref + * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa @ref glfwSetClipboardString + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); + +/*! @brief Returns the GLFW time. + * + * This function returns the current GLFW time, in seconds. Unless the time + * has been set using @ref glfwSetTime it measures time elapsed since GLFW was + * initialized. + * + * This function and @ref glfwSetTime are helper functions on top of @ref + * glfwGetTimerFrequency and @ref glfwGetTimerValue. + * + * The resolution of the timer is system dependent, but is usually on the order + * of a few micro- or nanoseconds. It uses the highest-resolution monotonic + * time source on each supported platform. + * + * @return The current time, in seconds, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal base time is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwSetTime. + * + * @sa @ref time + * + * @since Added in version 1.0. + * + * @ingroup input + */ +GLFWAPI double glfwGetTime(void); + +/*! @brief Sets the GLFW time. + * + * This function sets the current GLFW time, in seconds. The value must be + * a positive finite number less than or equal to 18446744073.0, which is + * approximately 584.5 years. + * + * This function and @ref glfwGetTime are helper functions on top of @ref + * glfwGetTimerFrequency and @ref glfwGetTimerValue. + * + * @param[in] time The new value, in seconds. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @remark The upper limit of GLFW time is calculated as + * floor((264 - 1) / 109) and is due to implementations + * storing nanoseconds in 64 bits. The limit may be increased in the future. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal base time is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwGetTime. + * + * @sa @ref time + * + * @since Added in version 2.2. + * + * @ingroup input + */ +GLFWAPI void glfwSetTime(double time); + +/*! @brief Returns the current value of the raw timer. + * + * This function returns the current value of the raw timer, measured in + * 1 / frequency seconds. To get the frequency, call @ref + * glfwGetTimerFrequency. + * + * @return The value of the timer, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa @ref glfwGetTimerFrequency + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerValue(void); + +/*! @brief Returns the frequency, in Hz, of the raw timer. + * + * This function returns the frequency, in Hz, of the raw timer. + * + * @return The frequency of the timer, in Hz, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa @ref glfwGetTimerValue + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerFrequency(void); + +/*! @brief Makes the context of the specified window current for the calling + * thread. + * + * This function makes the OpenGL or OpenGL ES context of the specified window + * current on the calling thread. It can also detach the current context from + * the calling thread without making a new one current by passing in `NULL`. + * + * A context must only be made current on a single thread at a time and each + * thread can have only a single current context at a time. Making a context + * current detaches any previously current context on the calling thread. + * + * When moving a context between threads, you must detach it (make it + * non-current) on the old thread before making it current on the new one. + * + * By default, making a context non-current implicitly forces a pipeline flush. + * On machines that support `GL_KHR_context_flush_control`, you can control + * whether a context performs this flush by setting the + * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) + * hint. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * @param[in] window The window whose context to make current, or `NULL` to + * detach the current context. + * + * @remarks If the previously current context was created via a different + * context creation API than the one passed to this function, GLFW will still + * detach the previous one from its API before making the new one current. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa @ref glfwGetCurrentContext + * + * @since Added in version 3.0. + * + * @ingroup context + */ +GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); + +/*! @brief Returns the window whose context is current on the calling thread. + * + * This function returns the window whose OpenGL or OpenGL ES context is + * current on the calling thread. + * + * @return The window whose context is current, or `NULL` if no window's + * context is current. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa @ref glfwMakeContextCurrent + * + * @since Added in version 3.0. + * + * @ingroup context + */ +GLFWAPI GLFWwindow* glfwGetCurrentContext(void); + +/*! @brief Swaps the front and back buffers of the specified window. + * + * This function swaps the front and back buffers of the specified window when + * rendering with OpenGL or OpenGL ES. If the swap interval is greater than + * zero, the GPU driver waits the specified number of screen updates before + * swapping the buffers. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see `vkQueuePresentKHR` instead. + * + * @param[in] window The window whose buffers to swap. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark __EGL:__ The context of the specified window must be current on the + * calling thread. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa @ref glfwSwapInterval + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSwapBuffers(GLFWwindow* window); + +/*! @brief Sets the swap interval for the current context. + * + * This function sets the swap interval for the current OpenGL or OpenGL ES + * context, i.e. the number of screen updates to wait from the time @ref + * glfwSwapBuffers was called before swapping the buffers and returning. This + * is sometimes called _vertical synchronization_, _vertical retrace + * synchronization_ or just _vsync_. + * + * A context that supports either of the `WGL_EXT_swap_control_tear` and + * `GLX_EXT_swap_control_tear` extensions also accepts _negative_ swap + * intervals, which allows the driver to swap immediately even if a frame + * arrives a little bit late. You can check for these extensions with @ref + * glfwExtensionSupported. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see the present mode of your swapchain instead. + * + * @param[in] interval The minimum number of screen updates to wait for + * until the buffers are swapped by @ref glfwSwapBuffers. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark This function is not called during context creation, leaving the + * swap interval set to whatever is the default on that platform. This is done + * because some swap interval extensions used by GLFW do not allow the swap + * interval to be reset to zero once it has been set to a non-zero value. + * + * @remark Some GPU drivers do not honor the requested swap interval, either + * because of a user setting that overrides the application's request or due to + * bugs in the driver. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa @ref glfwSwapBuffers + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI void glfwSwapInterval(int interval); + +/*! @brief Returns whether the specified extension is available. + * + * This function returns whether the specified + * [API extension](@ref context_glext) is supported by the current OpenGL or + * OpenGL ES context. It searches both for client API extension and context + * creation API extensions. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * As this functions retrieves and searches one or more extension strings each + * call, it is recommended that you cache its results if it is going to be used + * frequently. The extension strings will not change during the lifetime of + * a context, so there is no danger in doing this. + * + * This function does not apply to Vulkan. If you are using Vulkan, see @ref + * glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` + * and `vkEnumerateDeviceExtensionProperties` instead. + * + * @param[in] extension The ASCII encoded name of the extension. + * @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa @ref glfwGetProcAddress + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI int glfwExtensionSupported(const char* extension); + +/*! @brief Returns the address of the specified function for the current + * context. + * + * This function returns the address of the specified OpenGL or OpenGL ES + * [core or extension function](@ref context_glext), if it is supported + * by the current context. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and + * `vkGetDeviceProcAddr` instead. + * + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark The address of a given function is not guaranteed to be the same + * between contexts. + * + * @remark This function may return a non-`NULL` address despite the + * associated version or extension not being available. Always check the + * context version or extension string first. + * + * @pointer_lifetime The returned function pointer is valid until the context + * is destroyed or the library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa @ref glfwExtensionSupported + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); + +/*! @brief Returns whether the Vulkan loader and an ICD have been found. + * + * This function returns whether the Vulkan loader and any minimally functional + * ICD have been found. + * + * The availability of a Vulkan loader and even an ICD does not by itself guarantee that + * surface creation or even instance creation is possible. Call @ref + * glfwGetRequiredInstanceExtensions to check whether the extensions necessary for Vulkan + * surface creation are available and @ref glfwGetPhysicalDevicePresentationSupport to + * check whether a queue family of a physical device supports image presentation. + * + * @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_support + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwVulkanSupported(void); + +/*! @brief Returns the Vulkan instance extensions required by GLFW. + * + * This function returns an array of names of Vulkan instance extensions required + * by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the + * list will always contain `VK_KHR_surface`, so if you don't require any + * additional extensions you can pass this list directly to the + * `VkInstanceCreateInfo` struct. + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available. + * + * If Vulkan is available but no set of extensions allowing window surface + * creation was found, this function returns `NULL`. You may still use Vulkan + * for off-screen rendering and compute work. + * + * @param[out] count Where to store the number of extensions in the returned + * array. This is set to zero if an error occurred. + * @return An array of ASCII encoded extension names, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @remark Additional extensions may be required by future versions of GLFW. + * You should check if any extensions you wish to enable are already in the + * returned array, as it is an error to specify an extension more than once in + * the `VkInstanceCreateInfo` struct. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_ext + * @sa @ref glfwCreateWindowSurface + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); + +#if defined(VK_VERSION_1_0) + +/*! @brief Returns the address of the specified Vulkan instance function. + * + * This function returns the address of the specified Vulkan core or extension + * function for the specified instance. If instance is set to `NULL` it can + * return any function exported from the Vulkan loader, including at least the + * following functions: + * + * - `vkEnumerateInstanceExtensionProperties` + * - `vkEnumerateInstanceLayerProperties` + * - `vkCreateInstance` + * - `vkGetInstanceProcAddr` + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available. + * + * This function is equivalent to calling `vkGetInstanceProcAddr` with + * a platform-specific query of the Vulkan loader as a fallback. + * + * @param[in] instance The Vulkan instance to query, or `NULL` to retrieve + * functions related to instance creation. + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @pointer_lifetime The returned function pointer is valid until the library + * is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_proc + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); + +/*! @brief Returns whether the specified queue family can present images. + * + * This function returns whether the specified queue family of the specified + * physical device supports presentation to the platform GLFW was built for. + * + * If Vulkan or the required window surface creation instance extensions are + * not available on the machine, or if the specified instance was not created + * with the required extensions, this function returns `GLFW_FALSE` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available and @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * @param[in] instance The instance that the physical device belongs to. + * @param[in] device The physical device that the queue family belongs to. + * @param[in] queuefamily The index of the queue family to query. + * @return `GLFW_TRUE` if the queue family supports presentation, or + * `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @remark @macos This function currently always returns `GLFW_TRUE`, as the + * `VK_MVK_macos_surface` and `VK_EXT_metal_surface` extensions do not provide + * a `vkGetPhysicalDevice*PresentationSupport` type function. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_present + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); + +/*! @brief Creates a Vulkan surface for the specified window. + * + * This function creates a Vulkan surface for the specified window. + * + * If the Vulkan loader or at least one minimally functional ICD were not found, + * this function returns `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref + * GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported to check whether + * Vulkan is at least minimally available. + * + * If the required window surface creation instance extensions are not + * available or if the specified instance was not created with these extensions + * enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * The window surface cannot be shared with another API so the window must + * have been created with the [client api hint](@ref GLFW_CLIENT_API_attrib) + * set to `GLFW_NO_API` otherwise it generates a @ref GLFW_INVALID_VALUE error + * and returns `VK_ERROR_NATIVE_WINDOW_IN_USE_KHR`. + * + * The window surface must be destroyed before the specified Vulkan instance. + * It is the responsibility of the caller to destroy the window surface. GLFW + * does not destroy it for you. Call `vkDestroySurfaceKHR` to destroy the + * surface. + * + * @param[in] instance The Vulkan instance to create the surface in. + * @param[in] window The window to create the surface for. + * @param[in] allocator The allocator to use, or `NULL` to use the default + * allocator. + * @param[out] surface Where to store the handle of the surface. This is set + * to `VK_NULL_HANDLE` if an error occurred. + * @return `VK_SUCCESS` if successful, or a Vulkan error code if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE, @ref GLFW_PLATFORM_ERROR and @ref GLFW_INVALID_VALUE + * + * @remark If an error occurs before the creation call is made, GLFW returns + * the Vulkan error code most appropriate for the error. Appropriate use of + * @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should + * eliminate almost all occurrences of these errors. + * + * @remark @macos GLFW prefers the `VK_EXT_metal_surface` extension, with the + * `VK_MVK_macos_surface` extension as a fallback. The name of the selected + * extension, if any, is included in the array returned by @ref + * glfwGetRequiredInstanceExtensions. + * + * @remark @macos This function creates and sets a `CAMetalLayer` instance for + * the window content view, which is required for MoltenVK to function. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_surface + * @sa @ref glfwGetRequiredInstanceExtensions + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); + +#endif /*VK_VERSION_1_0*/ + + +/************************************************************************* + * Global definition cleanup + *************************************************************************/ + +/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ + +#ifdef GLFW_WINGDIAPI_DEFINED + #undef WINGDIAPI + #undef GLFW_WINGDIAPI_DEFINED +#endif + +#ifdef GLFW_CALLBACK_DEFINED + #undef CALLBACK + #undef GLFW_CALLBACK_DEFINED +#endif + +/* Some OpenGL related headers need GLAPIENTRY, but it is unconditionally + * defined by some gl.h variants (OpenBSD) so define it after if needed. + */ +#ifndef GLAPIENTRY + #define GLAPIENTRY APIENTRY + #define GLFW_GLAPIENTRY_DEFINED +#endif + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_h_ */ + diff --git a/dep/GLFW/glfw3native.h b/dep/GLFW/glfw3native.h new file mode 100644 index 0000000..7e09389 --- /dev/null +++ b/dep/GLFW/glfw3native.h @@ -0,0 +1,634 @@ +/************************************************************************* + * GLFW 3.3 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2018 Camilla Löwy + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would + * be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + *************************************************************************/ + +#ifndef _glfw3_native_h_ +#define _glfw3_native_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @file glfw3native.h + * @brief The header of the native access functions. + * + * This is the header file of the native access functions. See @ref native for + * more information. + */ +/*! @defgroup native Native access + * @brief Functions related to accessing native handles. + * + * **By using the native access functions you assert that you know what you're + * doing and how to fix problems caused by using them. If you don't, you + * shouldn't be using them.** + * + * Before the inclusion of @ref glfw3native.h, you may define zero or more + * window system API macro and zero or more context creation API macros. + * + * The chosen backends must match those the library was compiled for. Failure + * to do this will cause a link-time error. + * + * The available window API macros are: + * * `GLFW_EXPOSE_NATIVE_WIN32` + * * `GLFW_EXPOSE_NATIVE_COCOA` + * * `GLFW_EXPOSE_NATIVE_X11` + * * `GLFW_EXPOSE_NATIVE_WAYLAND` + * + * The available context API macros are: + * * `GLFW_EXPOSE_NATIVE_WGL` + * * `GLFW_EXPOSE_NATIVE_NSGL` + * * `GLFW_EXPOSE_NATIVE_GLX` + * * `GLFW_EXPOSE_NATIVE_EGL` + * * `GLFW_EXPOSE_NATIVE_OSMESA` + * + * These macros select which of the native access functions that are declared + * and which platform-specific headers to include. It is then up your (by + * definition platform-specific) code to handle which of these should be + * defined. + * + * If you do not want the platform-specific headers to be included, define + * `GLFW_NATIVE_INCLUDE_NONE` before including the @ref glfw3native.h header. + * + * @code + * #define GLFW_EXPOSE_NATIVE_WIN32 + * #define GLFW_EXPOSE_NATIVE_WGL + * #define GLFW_NATIVE_INCLUDE_NONE + * #include + * @endcode + */ + + +/************************************************************************* + * System headers and types + *************************************************************************/ + +#if !defined(GLFW_NATIVE_INCLUDE_NONE) + + #if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL) + /* This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + * example to allow applications to correctly declare a GL_KHR_debug callback) + * but windows.h assumes no one will define APIENTRY before it does + */ + #if defined(GLFW_APIENTRY_DEFINED) + #undef APIENTRY + #undef GLFW_APIENTRY_DEFINED + #endif + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL) + #if defined(__OBJC__) + #import + #else + #include + #include + #endif + #endif + + #if defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX) + #include + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_WAYLAND) + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_WGL) + /* WGL is declared by windows.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_NSGL) + /* NSGL is declared by Cocoa.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_GLX) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, glx.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_EGL) + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_OSMESA) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, osmesa.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + +#endif /*GLFW_NATIVE_INCLUDE_NONE*/ + + +/************************************************************************* + * Functions + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) +/*! @brief Returns the adapter device name of the specified monitor. + * + * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) + * of the specified monitor, or `NULL` if an [error](@ref error_handling) + * occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the display device name of the specified monitor. + * + * @return The UTF-8 encoded display device name (for example + * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `HWND` of the specified window. + * + * @return The `HWND` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark The `HDC` associated with the window can be queried with the + * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) + * function. + * @code + * HDC dc = GetDC(glfwGetWin32Window(window)); + * @endcode + * This DC is private and does not need to be released. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WGL) +/*! @brief Returns the `HGLRC` of the specified window. + * + * @return The `HGLRC` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @remark The `HDC` associated with the window can be queried with the + * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) + * function. + * @code + * HDC dc = GetDC(glfwGetWin32Window(window)); + * @endcode + * This DC is private and does not need to be released. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_COCOA) +/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. + * + * @return The `CGDirectDisplayID` of the specified monitor, or + * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the `NSWindow` of the specified window. + * + * @return The `NSWindow` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_NSGL) +/*! @brief Returns the `NSOpenGLContext` of the specified window. + * + * @return The `NSOpenGLContext` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_X11) +/*! @brief Returns the `Display` used by GLFW. + * + * @return The `Display` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Display* glfwGetX11Display(void); + +/*! @brief Returns the `RRCrtc` of the specified monitor. + * + * @return The `RRCrtc` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the `RROutput` of the specified monitor. + * + * @return The `RROutput` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `Window` of the specified window. + * + * @return The `Window` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Window glfwGetX11Window(GLFWwindow* window); + +/*! @brief Sets the current primary selection to the specified string. + * + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwGetX11SelectionString + * @sa glfwSetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI void glfwSetX11SelectionString(const char* string); + +/*! @brief Returns the contents of the current primary selection as a string. + * + * If the selection is empty or if its contents cannot be converted, `NULL` + * is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @return The contents of the selection as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref + * glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the + * library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwSetX11SelectionString + * @sa glfwGetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetX11SelectionString(void); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_GLX) +/*! @brief Returns the `GLXContext` of the specified window. + * + * @return The `GLXContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); + +/*! @brief Returns the `GLXWindow` of the specified window. + * + * @return The `GLXWindow` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) +/*! @brief Returns the `struct wl_display*` used by GLFW. + * + * @return The `struct wl_display*` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); + +/*! @brief Returns the `struct wl_output*` of the specified monitor. + * + * @return The `struct wl_output*` of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the main `struct wl_surface*` of the specified window. + * + * @return The main `struct wl_surface*` of the specified window, or `NULL` if + * an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_EGL) +/*! @brief Returns the `EGLDisplay` used by GLFW. + * + * @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark Because EGL is initialized on demand, this function will return + * `EGL_NO_DISPLAY` until the first context has been created via EGL. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLDisplay glfwGetEGLDisplay(void); + +/*! @brief Returns the `EGLContext` of the specified window. + * + * @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); + +/*! @brief Returns the `EGLSurface` of the specified window. + * + * @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_OSMESA) +/*! @brief Retrieves the color buffer associated with the specified window. + * + * @param[in] window The window whose color buffer to retrieve. + * @param[out] width Where to store the width of the color buffer, or `NULL`. + * @param[out] height Where to store the height of the color buffer, or `NULL`. + * @param[out] format Where to store the OSMesa pixel format of the color + * buffer, or `NULL`. + * @param[out] buffer Where to store the address of the color buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer); + +/*! @brief Retrieves the depth buffer associated with the specified window. + * + * @param[in] window The window whose depth buffer to retrieve. + * @param[out] width Where to store the width of the depth buffer, or `NULL`. + * @param[out] height Where to store the height of the depth buffer, or `NULL`. + * @param[out] bytesPerValue Where to store the number of bytes per depth + * buffer element, or `NULL`. + * @param[out] buffer Where to store the address of the depth buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer); + +/*! @brief Returns the `OSMesaContext` of the specified window. + * + * @return The `OSMesaContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_native_h_ */ + diff --git a/dep/glad/glad.h b/dep/glad/glad.h new file mode 100644 index 0000000..b6c83ca --- /dev/null +++ b/dep/glad/glad.h @@ -0,0 +1,3611 @@ +/* + + OpenGL loader generated by glad 0.1.36 on Mon Dec 25 19:55:09 2023. + + Language/Generator: C/C++ + Specification: gl + APIs: gl=3.3 + Profile: compatibility + Extensions: + + Loader: True + Local files: False + Omit khrplatform: False + Reproducible: False + + Commandline: + --profile="compatibility" --api="gl=3.3" --generator="c" --spec="gl" --extensions="" + Online: + https://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&loader=on&api=gl%3D3.3 +*/ + + +#ifndef __glad_h_ +#define __glad_h_ + +#ifdef __gl_h_ +#error OpenGL header already included, remove this include, glad already provides it +#endif +#define __gl_h_ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define APIENTRY __stdcall +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY APIENTRY +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +struct gladGLversionStruct { + int major; + int minor; +}; + +typedef void* (* GLADloadproc)(const char *name); + +#ifndef GLAPI +# if defined(GLAD_GLAPI_EXPORT) +# if defined(_WIN32) || defined(__CYGWIN__) +# if defined(GLAD_GLAPI_EXPORT_BUILD) +# if defined(__GNUC__) +# define GLAPI __attribute__ ((dllexport)) extern +# else +# define GLAPI __declspec(dllexport) extern +# endif +# else +# if defined(__GNUC__) +# define GLAPI __attribute__ ((dllimport)) extern +# else +# define GLAPI __declspec(dllimport) extern +# endif +# endif +# elif defined(__GNUC__) && defined(GLAD_GLAPI_EXPORT_BUILD) +# define GLAPI __attribute__ ((visibility ("default"))) extern +# else +# define GLAPI extern +# endif +# else +# define GLAPI extern +# endif +#endif + +GLAPI struct gladGLversionStruct GLVersion; + +GLAPI int gladLoadGL(void); + +GLAPI int gladLoadGLLoader(GLADloadproc); + +#include +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef khronos_int8_t GLbyte; +typedef khronos_uint8_t GLubyte; +typedef khronos_int16_t GLshort; +typedef khronos_uint16_t GLushort; +typedef int GLint; +typedef unsigned int GLuint; +typedef khronos_int32_t GLclampx; +typedef int GLsizei; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void *GLeglClientBufferEXT; +typedef void *GLeglImageOES; +typedef char GLchar; +typedef char GLcharARB; +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef khronos_uint16_t GLhalf; +typedef khronos_uint16_t GLhalfARB; +typedef khronos_int32_t GLfixed; +typedef khronos_intptr_t GLintptr; +typedef khronos_intptr_t GLintptrARB; +typedef khronos_ssize_t GLsizeiptr; +typedef khronos_ssize_t GLsizeiptrARB; +typedef khronos_int64_t GLint64; +typedef khronos_int64_t GLint64EXT; +typedef khronos_uint64_t GLuint64; +typedef khronos_uint64_t GLuint64EXT; +typedef struct __GLsync *GLsync; +struct _cl_context; +struct _cl_event; +typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +typedef unsigned short GLhalfNV; +typedef GLintptr GLvdpauSurfaceNV; +typedef void (APIENTRY *GLVULKANPROCNV)(void); +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_FALSE 0 +#define GL_TRUE 1 +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_NONE 0 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_VIEWPORT 0x0BA2 +#define GL_DITHER 0x0BD0 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND 0x0BE2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_READ_BUFFER 0x0C02 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_CLEAR 0x1500 +#define GL_AND 0x1501 +#define GL_AND_REVERSE 0x1502 +#define GL_COPY 0x1503 +#define GL_AND_INVERTED 0x1504 +#define GL_NOOP 0x1505 +#define GL_XOR 0x1506 +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_EQUIV 0x1509 +#define GL_INVERT 0x150A +#define GL_OR_REVERSE 0x150B +#define GL_COPY_INVERTED 0x150C +#define GL_OR_INVERTED 0x150D +#define GL_NAND 0x150E +#define GL_SET 0x150F +#define GL_TEXTURE 0x1702 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_STENCIL_INDEX 0x1901 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_REPEAT 0x2901 +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 +#define GL_ACCUM 0x0100 +#define GL_LOAD 0x0101 +#define GL_RETURN 0x0102 +#define GL_MULT 0x0103 +#define GL_ADD 0x0104 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LIST_MODE 0x0B30 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_SHADE_MODEL 0x0B54 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_FOG 0x0B60 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_COLOR 0x0B66 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_NORMALIZE 0x0BA1 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_LOGIC_OP 0x0BF1 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_INDEX_MODE 0x0C30 +#define GL_RGBA_MODE 0x0C31 +#define GL_RENDER_MODE 0x0C40 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_FOG_HINT 0x0C54 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_INDEX_BITS 0x0D51 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_EMISSION 0x1600 +#define GL_SHININESS 0x1601 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_COLOR_INDEX 0x1900 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_BITMAP 0x1A00 +#define GL_RENDER 0x1C00 +#define GL_FEEDBACK 0x1C01 +#define GL_SELECT 0x1C02 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_ENV 0x2300 +#define GL_EYE_LINEAR 0x2400 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_SPHERE_MAP 0x2402 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_PLANE 0x2502 +#define GL_CLAMP 0x2900 +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_DOUBLE 0x140A +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_RESCALE_NORMAL 0x803A +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#define GL_BLEND_COLOR 0x8005 +#define GL_BLEND_EQUATION 0x8009 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_FUNC_SUBTRACT 0x800A +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SRC1_ALPHA 0x8589 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_FOG_COORD_SRC 0x8450 +#define GL_FOG_COORD 0x8451 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_RGB 0x8582 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC2_ALPHA 0x858A +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_COLOR_ATTACHMENT16 0x8CF0 +#define GL_COLOR_ATTACHMENT17 0x8CF1 +#define GL_COLOR_ATTACHMENT18 0x8CF2 +#define GL_COLOR_ATTACHMENT19 0x8CF3 +#define GL_COLOR_ATTACHMENT20 0x8CF4 +#define GL_COLOR_ATTACHMENT21 0x8CF5 +#define GL_COLOR_ATTACHMENT22 0x8CF6 +#define GL_COLOR_ATTACHMENT23 0x8CF7 +#define GL_COLOR_ATTACHMENT24 0x8CF8 +#define GL_COLOR_ATTACHMENT25 0x8CF9 +#define GL_COLOR_ATTACHMENT26 0x8CFA +#define GL_COLOR_ATTACHMENT27 0x8CFB +#define GL_COLOR_ATTACHMENT28 0x8CFC +#define GL_COLOR_ATTACHMENT29 0x8CFD +#define GL_COLOR_ATTACHMENT30 0x8CFE +#define GL_COLOR_ATTACHMENT31 0x8CFF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_INDEX 0x8222 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_HALF_FLOAT 0x140B +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_ALPHA_INTEGER 0x8D97 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFF +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_DEPTH_CLAMP 0x864F +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_SRC1_COLOR 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_RGB10_A2UI 0x906F +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 +#define GL_INT_2_10_10_10_REV 0x8D9F +#ifndef GL_VERSION_1_0 +#define GL_VERSION_1_0 1 +GLAPI int GLAD_GL_VERSION_1_0; +typedef void (APIENTRYP PFNGLCULLFACEPROC)(GLenum mode); +GLAPI PFNGLCULLFACEPROC glad_glCullFace; +#define glCullFace glad_glCullFace +typedef void (APIENTRYP PFNGLFRONTFACEPROC)(GLenum mode); +GLAPI PFNGLFRONTFACEPROC glad_glFrontFace; +#define glFrontFace glad_glFrontFace +typedef void (APIENTRYP PFNGLHINTPROC)(GLenum target, GLenum mode); +GLAPI PFNGLHINTPROC glad_glHint; +#define glHint glad_glHint +typedef void (APIENTRYP PFNGLLINEWIDTHPROC)(GLfloat width); +GLAPI PFNGLLINEWIDTHPROC glad_glLineWidth; +#define glLineWidth glad_glLineWidth +typedef void (APIENTRYP PFNGLPOINTSIZEPROC)(GLfloat size); +GLAPI PFNGLPOINTSIZEPROC glad_glPointSize; +#define glPointSize glad_glPointSize +typedef void (APIENTRYP PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); +GLAPI PFNGLPOLYGONMODEPROC glad_glPolygonMode; +#define glPolygonMode glad_glPolygonMode +typedef void (APIENTRYP PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI PFNGLSCISSORPROC glad_glScissor; +#define glScissor glad_glScissor +typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); +GLAPI PFNGLTEXPARAMETERFPROC glad_glTexParameterf; +#define glTexParameterf glad_glTexParameterf +typedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat *params); +GLAPI PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; +#define glTexParameterfv glad_glTexParameterfv +typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); +GLAPI PFNGLTEXPARAMETERIPROC glad_glTexParameteri; +#define glTexParameteri glad_glTexParameteri +typedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint *params); +GLAPI PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; +#define glTexParameteriv glad_glTexParameteriv +typedef void (APIENTRYP PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXIMAGE1DPROC glad_glTexImage1D; +#define glTexImage1D glad_glTexImage1D +typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXIMAGE2DPROC glad_glTexImage2D; +#define glTexImage2D glad_glTexImage2D +typedef void (APIENTRYP PFNGLDRAWBUFFERPROC)(GLenum buf); +GLAPI PFNGLDRAWBUFFERPROC glad_glDrawBuffer; +#define glDrawBuffer glad_glDrawBuffer +typedef void (APIENTRYP PFNGLCLEARPROC)(GLbitfield mask); +GLAPI PFNGLCLEARPROC glad_glClear; +#define glClear glad_glClear +typedef void (APIENTRYP PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI PFNGLCLEARCOLORPROC glad_glClearColor; +#define glClearColor glad_glClearColor +typedef void (APIENTRYP PFNGLCLEARSTENCILPROC)(GLint s); +GLAPI PFNGLCLEARSTENCILPROC glad_glClearStencil; +#define glClearStencil glad_glClearStencil +typedef void (APIENTRYP PFNGLCLEARDEPTHPROC)(GLdouble depth); +GLAPI PFNGLCLEARDEPTHPROC glad_glClearDepth; +#define glClearDepth glad_glClearDepth +typedef void (APIENTRYP PFNGLSTENCILMASKPROC)(GLuint mask); +GLAPI PFNGLSTENCILMASKPROC glad_glStencilMask; +#define glStencilMask glad_glStencilMask +typedef void (APIENTRYP PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GLAPI PFNGLCOLORMASKPROC glad_glColorMask; +#define glColorMask glad_glColorMask +typedef void (APIENTRYP PFNGLDEPTHMASKPROC)(GLboolean flag); +GLAPI PFNGLDEPTHMASKPROC glad_glDepthMask; +#define glDepthMask glad_glDepthMask +typedef void (APIENTRYP PFNGLDISABLEPROC)(GLenum cap); +GLAPI PFNGLDISABLEPROC glad_glDisable; +#define glDisable glad_glDisable +typedef void (APIENTRYP PFNGLENABLEPROC)(GLenum cap); +GLAPI PFNGLENABLEPROC glad_glEnable; +#define glEnable glad_glEnable +typedef void (APIENTRYP PFNGLFINISHPROC)(void); +GLAPI PFNGLFINISHPROC glad_glFinish; +#define glFinish glad_glFinish +typedef void (APIENTRYP PFNGLFLUSHPROC)(void); +GLAPI PFNGLFLUSHPROC glad_glFlush; +#define glFlush glad_glFlush +typedef void (APIENTRYP PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); +GLAPI PFNGLBLENDFUNCPROC glad_glBlendFunc; +#define glBlendFunc glad_glBlendFunc +typedef void (APIENTRYP PFNGLLOGICOPPROC)(GLenum opcode); +GLAPI PFNGLLOGICOPPROC glad_glLogicOp; +#define glLogicOp glad_glLogicOp +typedef void (APIENTRYP PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); +GLAPI PFNGLSTENCILFUNCPROC glad_glStencilFunc; +#define glStencilFunc glad_glStencilFunc +typedef void (APIENTRYP PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); +GLAPI PFNGLSTENCILOPPROC glad_glStencilOp; +#define glStencilOp glad_glStencilOp +typedef void (APIENTRYP PFNGLDEPTHFUNCPROC)(GLenum func); +GLAPI PFNGLDEPTHFUNCPROC glad_glDepthFunc; +#define glDepthFunc glad_glDepthFunc +typedef void (APIENTRYP PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param); +GLAPI PFNGLPIXELSTOREFPROC glad_glPixelStoref; +#define glPixelStoref glad_glPixelStoref +typedef void (APIENTRYP PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); +GLAPI PFNGLPIXELSTOREIPROC glad_glPixelStorei; +#define glPixelStorei glad_glPixelStorei +typedef void (APIENTRYP PFNGLREADBUFFERPROC)(GLenum src); +GLAPI PFNGLREADBUFFERPROC glad_glReadBuffer; +#define glReadBuffer glad_glReadBuffer +typedef void (APIENTRYP PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +GLAPI PFNGLREADPIXELSPROC glad_glReadPixels; +#define glReadPixels glad_glReadPixels +typedef void (APIENTRYP PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean *data); +GLAPI PFNGLGETBOOLEANVPROC glad_glGetBooleanv; +#define glGetBooleanv glad_glGetBooleanv +typedef void (APIENTRYP PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble *data); +GLAPI PFNGLGETDOUBLEVPROC glad_glGetDoublev; +#define glGetDoublev glad_glGetDoublev +typedef GLenum (APIENTRYP PFNGLGETERRORPROC)(void); +GLAPI PFNGLGETERRORPROC glad_glGetError; +#define glGetError glad_glGetError +typedef void (APIENTRYP PFNGLGETFLOATVPROC)(GLenum pname, GLfloat *data); +GLAPI PFNGLGETFLOATVPROC glad_glGetFloatv; +#define glGetFloatv glad_glGetFloatv +typedef void (APIENTRYP PFNGLGETINTEGERVPROC)(GLenum pname, GLint *data); +GLAPI PFNGLGETINTEGERVPROC glad_glGetIntegerv; +#define glGetIntegerv glad_glGetIntegerv +typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC)(GLenum name); +GLAPI PFNGLGETSTRINGPROC glad_glGetString; +#define glGetString glad_glGetString +typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI PFNGLGETTEXIMAGEPROC glad_glGetTexImage; +#define glGetTexImage glad_glGetTexImage +typedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat *params); +GLAPI PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; +#define glGetTexParameterfv glad_glGetTexParameterfv +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; +#define glGetTexParameteriv glad_glGetTexParameteriv +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv; +#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv; +#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv +typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC)(GLenum cap); +GLAPI PFNGLISENABLEDPROC glad_glIsEnabled; +#define glIsEnabled glad_glIsEnabled +typedef void (APIENTRYP PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); +GLAPI PFNGLDEPTHRANGEPROC glad_glDepthRange; +#define glDepthRange glad_glDepthRange +typedef void (APIENTRYP PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI PFNGLVIEWPORTPROC glad_glViewport; +#define glViewport glad_glViewport +typedef void (APIENTRYP PFNGLNEWLISTPROC)(GLuint list, GLenum mode); +GLAPI PFNGLNEWLISTPROC glad_glNewList; +#define glNewList glad_glNewList +typedef void (APIENTRYP PFNGLENDLISTPROC)(void); +GLAPI PFNGLENDLISTPROC glad_glEndList; +#define glEndList glad_glEndList +typedef void (APIENTRYP PFNGLCALLLISTPROC)(GLuint list); +GLAPI PFNGLCALLLISTPROC glad_glCallList; +#define glCallList glad_glCallList +typedef void (APIENTRYP PFNGLCALLLISTSPROC)(GLsizei n, GLenum type, const void *lists); +GLAPI PFNGLCALLLISTSPROC glad_glCallLists; +#define glCallLists glad_glCallLists +typedef void (APIENTRYP PFNGLDELETELISTSPROC)(GLuint list, GLsizei range); +GLAPI PFNGLDELETELISTSPROC glad_glDeleteLists; +#define glDeleteLists glad_glDeleteLists +typedef GLuint (APIENTRYP PFNGLGENLISTSPROC)(GLsizei range); +GLAPI PFNGLGENLISTSPROC glad_glGenLists; +#define glGenLists glad_glGenLists +typedef void (APIENTRYP PFNGLLISTBASEPROC)(GLuint base); +GLAPI PFNGLLISTBASEPROC glad_glListBase; +#define glListBase glad_glListBase +typedef void (APIENTRYP PFNGLBEGINPROC)(GLenum mode); +GLAPI PFNGLBEGINPROC glad_glBegin; +#define glBegin glad_glBegin +typedef void (APIENTRYP PFNGLBITMAPPROC)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +GLAPI PFNGLBITMAPPROC glad_glBitmap; +#define glBitmap glad_glBitmap +typedef void (APIENTRYP PFNGLCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue); +GLAPI PFNGLCOLOR3BPROC glad_glColor3b; +#define glColor3b glad_glColor3b +typedef void (APIENTRYP PFNGLCOLOR3BVPROC)(const GLbyte *v); +GLAPI PFNGLCOLOR3BVPROC glad_glColor3bv; +#define glColor3bv glad_glColor3bv +typedef void (APIENTRYP PFNGLCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue); +GLAPI PFNGLCOLOR3DPROC glad_glColor3d; +#define glColor3d glad_glColor3d +typedef void (APIENTRYP PFNGLCOLOR3DVPROC)(const GLdouble *v); +GLAPI PFNGLCOLOR3DVPROC glad_glColor3dv; +#define glColor3dv glad_glColor3dv +typedef void (APIENTRYP PFNGLCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue); +GLAPI PFNGLCOLOR3FPROC glad_glColor3f; +#define glColor3f glad_glColor3f +typedef void (APIENTRYP PFNGLCOLOR3FVPROC)(const GLfloat *v); +GLAPI PFNGLCOLOR3FVPROC glad_glColor3fv; +#define glColor3fv glad_glColor3fv +typedef void (APIENTRYP PFNGLCOLOR3IPROC)(GLint red, GLint green, GLint blue); +GLAPI PFNGLCOLOR3IPROC glad_glColor3i; +#define glColor3i glad_glColor3i +typedef void (APIENTRYP PFNGLCOLOR3IVPROC)(const GLint *v); +GLAPI PFNGLCOLOR3IVPROC glad_glColor3iv; +#define glColor3iv glad_glColor3iv +typedef void (APIENTRYP PFNGLCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue); +GLAPI PFNGLCOLOR3SPROC glad_glColor3s; +#define glColor3s glad_glColor3s +typedef void (APIENTRYP PFNGLCOLOR3SVPROC)(const GLshort *v); +GLAPI PFNGLCOLOR3SVPROC glad_glColor3sv; +#define glColor3sv glad_glColor3sv +typedef void (APIENTRYP PFNGLCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue); +GLAPI PFNGLCOLOR3UBPROC glad_glColor3ub; +#define glColor3ub glad_glColor3ub +typedef void (APIENTRYP PFNGLCOLOR3UBVPROC)(const GLubyte *v); +GLAPI PFNGLCOLOR3UBVPROC glad_glColor3ubv; +#define glColor3ubv glad_glColor3ubv +typedef void (APIENTRYP PFNGLCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue); +GLAPI PFNGLCOLOR3UIPROC glad_glColor3ui; +#define glColor3ui glad_glColor3ui +typedef void (APIENTRYP PFNGLCOLOR3UIVPROC)(const GLuint *v); +GLAPI PFNGLCOLOR3UIVPROC glad_glColor3uiv; +#define glColor3uiv glad_glColor3uiv +typedef void (APIENTRYP PFNGLCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue); +GLAPI PFNGLCOLOR3USPROC glad_glColor3us; +#define glColor3us glad_glColor3us +typedef void (APIENTRYP PFNGLCOLOR3USVPROC)(const GLushort *v); +GLAPI PFNGLCOLOR3USVPROC glad_glColor3usv; +#define glColor3usv glad_glColor3usv +typedef void (APIENTRYP PFNGLCOLOR4BPROC)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +GLAPI PFNGLCOLOR4BPROC glad_glColor4b; +#define glColor4b glad_glColor4b +typedef void (APIENTRYP PFNGLCOLOR4BVPROC)(const GLbyte *v); +GLAPI PFNGLCOLOR4BVPROC glad_glColor4bv; +#define glColor4bv glad_glColor4bv +typedef void (APIENTRYP PFNGLCOLOR4DPROC)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +GLAPI PFNGLCOLOR4DPROC glad_glColor4d; +#define glColor4d glad_glColor4d +typedef void (APIENTRYP PFNGLCOLOR4DVPROC)(const GLdouble *v); +GLAPI PFNGLCOLOR4DVPROC glad_glColor4dv; +#define glColor4dv glad_glColor4dv +typedef void (APIENTRYP PFNGLCOLOR4FPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI PFNGLCOLOR4FPROC glad_glColor4f; +#define glColor4f glad_glColor4f +typedef void (APIENTRYP PFNGLCOLOR4FVPROC)(const GLfloat *v); +GLAPI PFNGLCOLOR4FVPROC glad_glColor4fv; +#define glColor4fv glad_glColor4fv +typedef void (APIENTRYP PFNGLCOLOR4IPROC)(GLint red, GLint green, GLint blue, GLint alpha); +GLAPI PFNGLCOLOR4IPROC glad_glColor4i; +#define glColor4i glad_glColor4i +typedef void (APIENTRYP PFNGLCOLOR4IVPROC)(const GLint *v); +GLAPI PFNGLCOLOR4IVPROC glad_glColor4iv; +#define glColor4iv glad_glColor4iv +typedef void (APIENTRYP PFNGLCOLOR4SPROC)(GLshort red, GLshort green, GLshort blue, GLshort alpha); +GLAPI PFNGLCOLOR4SPROC glad_glColor4s; +#define glColor4s glad_glColor4s +typedef void (APIENTRYP PFNGLCOLOR4SVPROC)(const GLshort *v); +GLAPI PFNGLCOLOR4SVPROC glad_glColor4sv; +#define glColor4sv glad_glColor4sv +typedef void (APIENTRYP PFNGLCOLOR4UBPROC)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +GLAPI PFNGLCOLOR4UBPROC glad_glColor4ub; +#define glColor4ub glad_glColor4ub +typedef void (APIENTRYP PFNGLCOLOR4UBVPROC)(const GLubyte *v); +GLAPI PFNGLCOLOR4UBVPROC glad_glColor4ubv; +#define glColor4ubv glad_glColor4ubv +typedef void (APIENTRYP PFNGLCOLOR4UIPROC)(GLuint red, GLuint green, GLuint blue, GLuint alpha); +GLAPI PFNGLCOLOR4UIPROC glad_glColor4ui; +#define glColor4ui glad_glColor4ui +typedef void (APIENTRYP PFNGLCOLOR4UIVPROC)(const GLuint *v); +GLAPI PFNGLCOLOR4UIVPROC glad_glColor4uiv; +#define glColor4uiv glad_glColor4uiv +typedef void (APIENTRYP PFNGLCOLOR4USPROC)(GLushort red, GLushort green, GLushort blue, GLushort alpha); +GLAPI PFNGLCOLOR4USPROC glad_glColor4us; +#define glColor4us glad_glColor4us +typedef void (APIENTRYP PFNGLCOLOR4USVPROC)(const GLushort *v); +GLAPI PFNGLCOLOR4USVPROC glad_glColor4usv; +#define glColor4usv glad_glColor4usv +typedef void (APIENTRYP PFNGLEDGEFLAGPROC)(GLboolean flag); +GLAPI PFNGLEDGEFLAGPROC glad_glEdgeFlag; +#define glEdgeFlag glad_glEdgeFlag +typedef void (APIENTRYP PFNGLEDGEFLAGVPROC)(const GLboolean *flag); +GLAPI PFNGLEDGEFLAGVPROC glad_glEdgeFlagv; +#define glEdgeFlagv glad_glEdgeFlagv +typedef void (APIENTRYP PFNGLENDPROC)(void); +GLAPI PFNGLENDPROC glad_glEnd; +#define glEnd glad_glEnd +typedef void (APIENTRYP PFNGLINDEXDPROC)(GLdouble c); +GLAPI PFNGLINDEXDPROC glad_glIndexd; +#define glIndexd glad_glIndexd +typedef void (APIENTRYP PFNGLINDEXDVPROC)(const GLdouble *c); +GLAPI PFNGLINDEXDVPROC glad_glIndexdv; +#define glIndexdv glad_glIndexdv +typedef void (APIENTRYP PFNGLINDEXFPROC)(GLfloat c); +GLAPI PFNGLINDEXFPROC glad_glIndexf; +#define glIndexf glad_glIndexf +typedef void (APIENTRYP PFNGLINDEXFVPROC)(const GLfloat *c); +GLAPI PFNGLINDEXFVPROC glad_glIndexfv; +#define glIndexfv glad_glIndexfv +typedef void (APIENTRYP PFNGLINDEXIPROC)(GLint c); +GLAPI PFNGLINDEXIPROC glad_glIndexi; +#define glIndexi glad_glIndexi +typedef void (APIENTRYP PFNGLINDEXIVPROC)(const GLint *c); +GLAPI PFNGLINDEXIVPROC glad_glIndexiv; +#define glIndexiv glad_glIndexiv +typedef void (APIENTRYP PFNGLINDEXSPROC)(GLshort c); +GLAPI PFNGLINDEXSPROC glad_glIndexs; +#define glIndexs glad_glIndexs +typedef void (APIENTRYP PFNGLINDEXSVPROC)(const GLshort *c); +GLAPI PFNGLINDEXSVPROC glad_glIndexsv; +#define glIndexsv glad_glIndexsv +typedef void (APIENTRYP PFNGLNORMAL3BPROC)(GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI PFNGLNORMAL3BPROC glad_glNormal3b; +#define glNormal3b glad_glNormal3b +typedef void (APIENTRYP PFNGLNORMAL3BVPROC)(const GLbyte *v); +GLAPI PFNGLNORMAL3BVPROC glad_glNormal3bv; +#define glNormal3bv glad_glNormal3bv +typedef void (APIENTRYP PFNGLNORMAL3DPROC)(GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI PFNGLNORMAL3DPROC glad_glNormal3d; +#define glNormal3d glad_glNormal3d +typedef void (APIENTRYP PFNGLNORMAL3DVPROC)(const GLdouble *v); +GLAPI PFNGLNORMAL3DVPROC glad_glNormal3dv; +#define glNormal3dv glad_glNormal3dv +typedef void (APIENTRYP PFNGLNORMAL3FPROC)(GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI PFNGLNORMAL3FPROC glad_glNormal3f; +#define glNormal3f glad_glNormal3f +typedef void (APIENTRYP PFNGLNORMAL3FVPROC)(const GLfloat *v); +GLAPI PFNGLNORMAL3FVPROC glad_glNormal3fv; +#define glNormal3fv glad_glNormal3fv +typedef void (APIENTRYP PFNGLNORMAL3IPROC)(GLint nx, GLint ny, GLint nz); +GLAPI PFNGLNORMAL3IPROC glad_glNormal3i; +#define glNormal3i glad_glNormal3i +typedef void (APIENTRYP PFNGLNORMAL3IVPROC)(const GLint *v); +GLAPI PFNGLNORMAL3IVPROC glad_glNormal3iv; +#define glNormal3iv glad_glNormal3iv +typedef void (APIENTRYP PFNGLNORMAL3SPROC)(GLshort nx, GLshort ny, GLshort nz); +GLAPI PFNGLNORMAL3SPROC glad_glNormal3s; +#define glNormal3s glad_glNormal3s +typedef void (APIENTRYP PFNGLNORMAL3SVPROC)(const GLshort *v); +GLAPI PFNGLNORMAL3SVPROC glad_glNormal3sv; +#define glNormal3sv glad_glNormal3sv +typedef void (APIENTRYP PFNGLRASTERPOS2DPROC)(GLdouble x, GLdouble y); +GLAPI PFNGLRASTERPOS2DPROC glad_glRasterPos2d; +#define glRasterPos2d glad_glRasterPos2d +typedef void (APIENTRYP PFNGLRASTERPOS2DVPROC)(const GLdouble *v); +GLAPI PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv; +#define glRasterPos2dv glad_glRasterPos2dv +typedef void (APIENTRYP PFNGLRASTERPOS2FPROC)(GLfloat x, GLfloat y); +GLAPI PFNGLRASTERPOS2FPROC glad_glRasterPos2f; +#define glRasterPos2f glad_glRasterPos2f +typedef void (APIENTRYP PFNGLRASTERPOS2FVPROC)(const GLfloat *v); +GLAPI PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv; +#define glRasterPos2fv glad_glRasterPos2fv +typedef void (APIENTRYP PFNGLRASTERPOS2IPROC)(GLint x, GLint y); +GLAPI PFNGLRASTERPOS2IPROC glad_glRasterPos2i; +#define glRasterPos2i glad_glRasterPos2i +typedef void (APIENTRYP PFNGLRASTERPOS2IVPROC)(const GLint *v); +GLAPI PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv; +#define glRasterPos2iv glad_glRasterPos2iv +typedef void (APIENTRYP PFNGLRASTERPOS2SPROC)(GLshort x, GLshort y); +GLAPI PFNGLRASTERPOS2SPROC glad_glRasterPos2s; +#define glRasterPos2s glad_glRasterPos2s +typedef void (APIENTRYP PFNGLRASTERPOS2SVPROC)(const GLshort *v); +GLAPI PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv; +#define glRasterPos2sv glad_glRasterPos2sv +typedef void (APIENTRYP PFNGLRASTERPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z); +GLAPI PFNGLRASTERPOS3DPROC glad_glRasterPos3d; +#define glRasterPos3d glad_glRasterPos3d +typedef void (APIENTRYP PFNGLRASTERPOS3DVPROC)(const GLdouble *v); +GLAPI PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv; +#define glRasterPos3dv glad_glRasterPos3dv +typedef void (APIENTRYP PFNGLRASTERPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z); +GLAPI PFNGLRASTERPOS3FPROC glad_glRasterPos3f; +#define glRasterPos3f glad_glRasterPos3f +typedef void (APIENTRYP PFNGLRASTERPOS3FVPROC)(const GLfloat *v); +GLAPI PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv; +#define glRasterPos3fv glad_glRasterPos3fv +typedef void (APIENTRYP PFNGLRASTERPOS3IPROC)(GLint x, GLint y, GLint z); +GLAPI PFNGLRASTERPOS3IPROC glad_glRasterPos3i; +#define glRasterPos3i glad_glRasterPos3i +typedef void (APIENTRYP PFNGLRASTERPOS3IVPROC)(const GLint *v); +GLAPI PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv; +#define glRasterPos3iv glad_glRasterPos3iv +typedef void (APIENTRYP PFNGLRASTERPOS3SPROC)(GLshort x, GLshort y, GLshort z); +GLAPI PFNGLRASTERPOS3SPROC glad_glRasterPos3s; +#define glRasterPos3s glad_glRasterPos3s +typedef void (APIENTRYP PFNGLRASTERPOS3SVPROC)(const GLshort *v); +GLAPI PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv; +#define glRasterPos3sv glad_glRasterPos3sv +typedef void (APIENTRYP PFNGLRASTERPOS4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI PFNGLRASTERPOS4DPROC glad_glRasterPos4d; +#define glRasterPos4d glad_glRasterPos4d +typedef void (APIENTRYP PFNGLRASTERPOS4DVPROC)(const GLdouble *v); +GLAPI PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv; +#define glRasterPos4dv glad_glRasterPos4dv +typedef void (APIENTRYP PFNGLRASTERPOS4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI PFNGLRASTERPOS4FPROC glad_glRasterPos4f; +#define glRasterPos4f glad_glRasterPos4f +typedef void (APIENTRYP PFNGLRASTERPOS4FVPROC)(const GLfloat *v); +GLAPI PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv; +#define glRasterPos4fv glad_glRasterPos4fv +typedef void (APIENTRYP PFNGLRASTERPOS4IPROC)(GLint x, GLint y, GLint z, GLint w); +GLAPI PFNGLRASTERPOS4IPROC glad_glRasterPos4i; +#define glRasterPos4i glad_glRasterPos4i +typedef void (APIENTRYP PFNGLRASTERPOS4IVPROC)(const GLint *v); +GLAPI PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv; +#define glRasterPos4iv glad_glRasterPos4iv +typedef void (APIENTRYP PFNGLRASTERPOS4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI PFNGLRASTERPOS4SPROC glad_glRasterPos4s; +#define glRasterPos4s glad_glRasterPos4s +typedef void (APIENTRYP PFNGLRASTERPOS4SVPROC)(const GLshort *v); +GLAPI PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv; +#define glRasterPos4sv glad_glRasterPos4sv +typedef void (APIENTRYP PFNGLRECTDPROC)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +GLAPI PFNGLRECTDPROC glad_glRectd; +#define glRectd glad_glRectd +typedef void (APIENTRYP PFNGLRECTDVPROC)(const GLdouble *v1, const GLdouble *v2); +GLAPI PFNGLRECTDVPROC glad_glRectdv; +#define glRectdv glad_glRectdv +typedef void (APIENTRYP PFNGLRECTFPROC)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +GLAPI PFNGLRECTFPROC glad_glRectf; +#define glRectf glad_glRectf +typedef void (APIENTRYP PFNGLRECTFVPROC)(const GLfloat *v1, const GLfloat *v2); +GLAPI PFNGLRECTFVPROC glad_glRectfv; +#define glRectfv glad_glRectfv +typedef void (APIENTRYP PFNGLRECTIPROC)(GLint x1, GLint y1, GLint x2, GLint y2); +GLAPI PFNGLRECTIPROC glad_glRecti; +#define glRecti glad_glRecti +typedef void (APIENTRYP PFNGLRECTIVPROC)(const GLint *v1, const GLint *v2); +GLAPI PFNGLRECTIVPROC glad_glRectiv; +#define glRectiv glad_glRectiv +typedef void (APIENTRYP PFNGLRECTSPROC)(GLshort x1, GLshort y1, GLshort x2, GLshort y2); +GLAPI PFNGLRECTSPROC glad_glRects; +#define glRects glad_glRects +typedef void (APIENTRYP PFNGLRECTSVPROC)(const GLshort *v1, const GLshort *v2); +GLAPI PFNGLRECTSVPROC glad_glRectsv; +#define glRectsv glad_glRectsv +typedef void (APIENTRYP PFNGLTEXCOORD1DPROC)(GLdouble s); +GLAPI PFNGLTEXCOORD1DPROC glad_glTexCoord1d; +#define glTexCoord1d glad_glTexCoord1d +typedef void (APIENTRYP PFNGLTEXCOORD1DVPROC)(const GLdouble *v); +GLAPI PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv; +#define glTexCoord1dv glad_glTexCoord1dv +typedef void (APIENTRYP PFNGLTEXCOORD1FPROC)(GLfloat s); +GLAPI PFNGLTEXCOORD1FPROC glad_glTexCoord1f; +#define glTexCoord1f glad_glTexCoord1f +typedef void (APIENTRYP PFNGLTEXCOORD1FVPROC)(const GLfloat *v); +GLAPI PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv; +#define glTexCoord1fv glad_glTexCoord1fv +typedef void (APIENTRYP PFNGLTEXCOORD1IPROC)(GLint s); +GLAPI PFNGLTEXCOORD1IPROC glad_glTexCoord1i; +#define glTexCoord1i glad_glTexCoord1i +typedef void (APIENTRYP PFNGLTEXCOORD1IVPROC)(const GLint *v); +GLAPI PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv; +#define glTexCoord1iv glad_glTexCoord1iv +typedef void (APIENTRYP PFNGLTEXCOORD1SPROC)(GLshort s); +GLAPI PFNGLTEXCOORD1SPROC glad_glTexCoord1s; +#define glTexCoord1s glad_glTexCoord1s +typedef void (APIENTRYP PFNGLTEXCOORD1SVPROC)(const GLshort *v); +GLAPI PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv; +#define glTexCoord1sv glad_glTexCoord1sv +typedef void (APIENTRYP PFNGLTEXCOORD2DPROC)(GLdouble s, GLdouble t); +GLAPI PFNGLTEXCOORD2DPROC glad_glTexCoord2d; +#define glTexCoord2d glad_glTexCoord2d +typedef void (APIENTRYP PFNGLTEXCOORD2DVPROC)(const GLdouble *v); +GLAPI PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv; +#define glTexCoord2dv glad_glTexCoord2dv +typedef void (APIENTRYP PFNGLTEXCOORD2FPROC)(GLfloat s, GLfloat t); +GLAPI PFNGLTEXCOORD2FPROC glad_glTexCoord2f; +#define glTexCoord2f glad_glTexCoord2f +typedef void (APIENTRYP PFNGLTEXCOORD2FVPROC)(const GLfloat *v); +GLAPI PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv; +#define glTexCoord2fv glad_glTexCoord2fv +typedef void (APIENTRYP PFNGLTEXCOORD2IPROC)(GLint s, GLint t); +GLAPI PFNGLTEXCOORD2IPROC glad_glTexCoord2i; +#define glTexCoord2i glad_glTexCoord2i +typedef void (APIENTRYP PFNGLTEXCOORD2IVPROC)(const GLint *v); +GLAPI PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv; +#define glTexCoord2iv glad_glTexCoord2iv +typedef void (APIENTRYP PFNGLTEXCOORD2SPROC)(GLshort s, GLshort t); +GLAPI PFNGLTEXCOORD2SPROC glad_glTexCoord2s; +#define glTexCoord2s glad_glTexCoord2s +typedef void (APIENTRYP PFNGLTEXCOORD2SVPROC)(const GLshort *v); +GLAPI PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv; +#define glTexCoord2sv glad_glTexCoord2sv +typedef void (APIENTRYP PFNGLTEXCOORD3DPROC)(GLdouble s, GLdouble t, GLdouble r); +GLAPI PFNGLTEXCOORD3DPROC glad_glTexCoord3d; +#define glTexCoord3d glad_glTexCoord3d +typedef void (APIENTRYP PFNGLTEXCOORD3DVPROC)(const GLdouble *v); +GLAPI PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv; +#define glTexCoord3dv glad_glTexCoord3dv +typedef void (APIENTRYP PFNGLTEXCOORD3FPROC)(GLfloat s, GLfloat t, GLfloat r); +GLAPI PFNGLTEXCOORD3FPROC glad_glTexCoord3f; +#define glTexCoord3f glad_glTexCoord3f +typedef void (APIENTRYP PFNGLTEXCOORD3FVPROC)(const GLfloat *v); +GLAPI PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv; +#define glTexCoord3fv glad_glTexCoord3fv +typedef void (APIENTRYP PFNGLTEXCOORD3IPROC)(GLint s, GLint t, GLint r); +GLAPI PFNGLTEXCOORD3IPROC glad_glTexCoord3i; +#define glTexCoord3i glad_glTexCoord3i +typedef void (APIENTRYP PFNGLTEXCOORD3IVPROC)(const GLint *v); +GLAPI PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv; +#define glTexCoord3iv glad_glTexCoord3iv +typedef void (APIENTRYP PFNGLTEXCOORD3SPROC)(GLshort s, GLshort t, GLshort r); +GLAPI PFNGLTEXCOORD3SPROC glad_glTexCoord3s; +#define glTexCoord3s glad_glTexCoord3s +typedef void (APIENTRYP PFNGLTEXCOORD3SVPROC)(const GLshort *v); +GLAPI PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv; +#define glTexCoord3sv glad_glTexCoord3sv +typedef void (APIENTRYP PFNGLTEXCOORD4DPROC)(GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI PFNGLTEXCOORD4DPROC glad_glTexCoord4d; +#define glTexCoord4d glad_glTexCoord4d +typedef void (APIENTRYP PFNGLTEXCOORD4DVPROC)(const GLdouble *v); +GLAPI PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv; +#define glTexCoord4dv glad_glTexCoord4dv +typedef void (APIENTRYP PFNGLTEXCOORD4FPROC)(GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI PFNGLTEXCOORD4FPROC glad_glTexCoord4f; +#define glTexCoord4f glad_glTexCoord4f +typedef void (APIENTRYP PFNGLTEXCOORD4FVPROC)(const GLfloat *v); +GLAPI PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv; +#define glTexCoord4fv glad_glTexCoord4fv +typedef void (APIENTRYP PFNGLTEXCOORD4IPROC)(GLint s, GLint t, GLint r, GLint q); +GLAPI PFNGLTEXCOORD4IPROC glad_glTexCoord4i; +#define glTexCoord4i glad_glTexCoord4i +typedef void (APIENTRYP PFNGLTEXCOORD4IVPROC)(const GLint *v); +GLAPI PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv; +#define glTexCoord4iv glad_glTexCoord4iv +typedef void (APIENTRYP PFNGLTEXCOORD4SPROC)(GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI PFNGLTEXCOORD4SPROC glad_glTexCoord4s; +#define glTexCoord4s glad_glTexCoord4s +typedef void (APIENTRYP PFNGLTEXCOORD4SVPROC)(const GLshort *v); +GLAPI PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv; +#define glTexCoord4sv glad_glTexCoord4sv +typedef void (APIENTRYP PFNGLVERTEX2DPROC)(GLdouble x, GLdouble y); +GLAPI PFNGLVERTEX2DPROC glad_glVertex2d; +#define glVertex2d glad_glVertex2d +typedef void (APIENTRYP PFNGLVERTEX2DVPROC)(const GLdouble *v); +GLAPI PFNGLVERTEX2DVPROC glad_glVertex2dv; +#define glVertex2dv glad_glVertex2dv +typedef void (APIENTRYP PFNGLVERTEX2FPROC)(GLfloat x, GLfloat y); +GLAPI PFNGLVERTEX2FPROC glad_glVertex2f; +#define glVertex2f glad_glVertex2f +typedef void (APIENTRYP PFNGLVERTEX2FVPROC)(const GLfloat *v); +GLAPI PFNGLVERTEX2FVPROC glad_glVertex2fv; +#define glVertex2fv glad_glVertex2fv +typedef void (APIENTRYP PFNGLVERTEX2IPROC)(GLint x, GLint y); +GLAPI PFNGLVERTEX2IPROC glad_glVertex2i; +#define glVertex2i glad_glVertex2i +typedef void (APIENTRYP PFNGLVERTEX2IVPROC)(const GLint *v); +GLAPI PFNGLVERTEX2IVPROC glad_glVertex2iv; +#define glVertex2iv glad_glVertex2iv +typedef void (APIENTRYP PFNGLVERTEX2SPROC)(GLshort x, GLshort y); +GLAPI PFNGLVERTEX2SPROC glad_glVertex2s; +#define glVertex2s glad_glVertex2s +typedef void (APIENTRYP PFNGLVERTEX2SVPROC)(const GLshort *v); +GLAPI PFNGLVERTEX2SVPROC glad_glVertex2sv; +#define glVertex2sv glad_glVertex2sv +typedef void (APIENTRYP PFNGLVERTEX3DPROC)(GLdouble x, GLdouble y, GLdouble z); +GLAPI PFNGLVERTEX3DPROC glad_glVertex3d; +#define glVertex3d glad_glVertex3d +typedef void (APIENTRYP PFNGLVERTEX3DVPROC)(const GLdouble *v); +GLAPI PFNGLVERTEX3DVPROC glad_glVertex3dv; +#define glVertex3dv glad_glVertex3dv +typedef void (APIENTRYP PFNGLVERTEX3FPROC)(GLfloat x, GLfloat y, GLfloat z); +GLAPI PFNGLVERTEX3FPROC glad_glVertex3f; +#define glVertex3f glad_glVertex3f +typedef void (APIENTRYP PFNGLVERTEX3FVPROC)(const GLfloat *v); +GLAPI PFNGLVERTEX3FVPROC glad_glVertex3fv; +#define glVertex3fv glad_glVertex3fv +typedef void (APIENTRYP PFNGLVERTEX3IPROC)(GLint x, GLint y, GLint z); +GLAPI PFNGLVERTEX3IPROC glad_glVertex3i; +#define glVertex3i glad_glVertex3i +typedef void (APIENTRYP PFNGLVERTEX3IVPROC)(const GLint *v); +GLAPI PFNGLVERTEX3IVPROC glad_glVertex3iv; +#define glVertex3iv glad_glVertex3iv +typedef void (APIENTRYP PFNGLVERTEX3SPROC)(GLshort x, GLshort y, GLshort z); +GLAPI PFNGLVERTEX3SPROC glad_glVertex3s; +#define glVertex3s glad_glVertex3s +typedef void (APIENTRYP PFNGLVERTEX3SVPROC)(const GLshort *v); +GLAPI PFNGLVERTEX3SVPROC glad_glVertex3sv; +#define glVertex3sv glad_glVertex3sv +typedef void (APIENTRYP PFNGLVERTEX4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI PFNGLVERTEX4DPROC glad_glVertex4d; +#define glVertex4d glad_glVertex4d +typedef void (APIENTRYP PFNGLVERTEX4DVPROC)(const GLdouble *v); +GLAPI PFNGLVERTEX4DVPROC glad_glVertex4dv; +#define glVertex4dv glad_glVertex4dv +typedef void (APIENTRYP PFNGLVERTEX4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI PFNGLVERTEX4FPROC glad_glVertex4f; +#define glVertex4f glad_glVertex4f +typedef void (APIENTRYP PFNGLVERTEX4FVPROC)(const GLfloat *v); +GLAPI PFNGLVERTEX4FVPROC glad_glVertex4fv; +#define glVertex4fv glad_glVertex4fv +typedef void (APIENTRYP PFNGLVERTEX4IPROC)(GLint x, GLint y, GLint z, GLint w); +GLAPI PFNGLVERTEX4IPROC glad_glVertex4i; +#define glVertex4i glad_glVertex4i +typedef void (APIENTRYP PFNGLVERTEX4IVPROC)(const GLint *v); +GLAPI PFNGLVERTEX4IVPROC glad_glVertex4iv; +#define glVertex4iv glad_glVertex4iv +typedef void (APIENTRYP PFNGLVERTEX4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI PFNGLVERTEX4SPROC glad_glVertex4s; +#define glVertex4s glad_glVertex4s +typedef void (APIENTRYP PFNGLVERTEX4SVPROC)(const GLshort *v); +GLAPI PFNGLVERTEX4SVPROC glad_glVertex4sv; +#define glVertex4sv glad_glVertex4sv +typedef void (APIENTRYP PFNGLCLIPPLANEPROC)(GLenum plane, const GLdouble *equation); +GLAPI PFNGLCLIPPLANEPROC glad_glClipPlane; +#define glClipPlane glad_glClipPlane +typedef void (APIENTRYP PFNGLCOLORMATERIALPROC)(GLenum face, GLenum mode); +GLAPI PFNGLCOLORMATERIALPROC glad_glColorMaterial; +#define glColorMaterial glad_glColorMaterial +typedef void (APIENTRYP PFNGLFOGFPROC)(GLenum pname, GLfloat param); +GLAPI PFNGLFOGFPROC glad_glFogf; +#define glFogf glad_glFogf +typedef void (APIENTRYP PFNGLFOGFVPROC)(GLenum pname, const GLfloat *params); +GLAPI PFNGLFOGFVPROC glad_glFogfv; +#define glFogfv glad_glFogfv +typedef void (APIENTRYP PFNGLFOGIPROC)(GLenum pname, GLint param); +GLAPI PFNGLFOGIPROC glad_glFogi; +#define glFogi glad_glFogi +typedef void (APIENTRYP PFNGLFOGIVPROC)(GLenum pname, const GLint *params); +GLAPI PFNGLFOGIVPROC glad_glFogiv; +#define glFogiv glad_glFogiv +typedef void (APIENTRYP PFNGLLIGHTFPROC)(GLenum light, GLenum pname, GLfloat param); +GLAPI PFNGLLIGHTFPROC glad_glLightf; +#define glLightf glad_glLightf +typedef void (APIENTRYP PFNGLLIGHTFVPROC)(GLenum light, GLenum pname, const GLfloat *params); +GLAPI PFNGLLIGHTFVPROC glad_glLightfv; +#define glLightfv glad_glLightfv +typedef void (APIENTRYP PFNGLLIGHTIPROC)(GLenum light, GLenum pname, GLint param); +GLAPI PFNGLLIGHTIPROC glad_glLighti; +#define glLighti glad_glLighti +typedef void (APIENTRYP PFNGLLIGHTIVPROC)(GLenum light, GLenum pname, const GLint *params); +GLAPI PFNGLLIGHTIVPROC glad_glLightiv; +#define glLightiv glad_glLightiv +typedef void (APIENTRYP PFNGLLIGHTMODELFPROC)(GLenum pname, GLfloat param); +GLAPI PFNGLLIGHTMODELFPROC glad_glLightModelf; +#define glLightModelf glad_glLightModelf +typedef void (APIENTRYP PFNGLLIGHTMODELFVPROC)(GLenum pname, const GLfloat *params); +GLAPI PFNGLLIGHTMODELFVPROC glad_glLightModelfv; +#define glLightModelfv glad_glLightModelfv +typedef void (APIENTRYP PFNGLLIGHTMODELIPROC)(GLenum pname, GLint param); +GLAPI PFNGLLIGHTMODELIPROC glad_glLightModeli; +#define glLightModeli glad_glLightModeli +typedef void (APIENTRYP PFNGLLIGHTMODELIVPROC)(GLenum pname, const GLint *params); +GLAPI PFNGLLIGHTMODELIVPROC glad_glLightModeliv; +#define glLightModeliv glad_glLightModeliv +typedef void (APIENTRYP PFNGLLINESTIPPLEPROC)(GLint factor, GLushort pattern); +GLAPI PFNGLLINESTIPPLEPROC glad_glLineStipple; +#define glLineStipple glad_glLineStipple +typedef void (APIENTRYP PFNGLMATERIALFPROC)(GLenum face, GLenum pname, GLfloat param); +GLAPI PFNGLMATERIALFPROC glad_glMaterialf; +#define glMaterialf glad_glMaterialf +typedef void (APIENTRYP PFNGLMATERIALFVPROC)(GLenum face, GLenum pname, const GLfloat *params); +GLAPI PFNGLMATERIALFVPROC glad_glMaterialfv; +#define glMaterialfv glad_glMaterialfv +typedef void (APIENTRYP PFNGLMATERIALIPROC)(GLenum face, GLenum pname, GLint param); +GLAPI PFNGLMATERIALIPROC glad_glMateriali; +#define glMateriali glad_glMateriali +typedef void (APIENTRYP PFNGLMATERIALIVPROC)(GLenum face, GLenum pname, const GLint *params); +GLAPI PFNGLMATERIALIVPROC glad_glMaterialiv; +#define glMaterialiv glad_glMaterialiv +typedef void (APIENTRYP PFNGLPOLYGONSTIPPLEPROC)(const GLubyte *mask); +GLAPI PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple; +#define glPolygonStipple glad_glPolygonStipple +typedef void (APIENTRYP PFNGLSHADEMODELPROC)(GLenum mode); +GLAPI PFNGLSHADEMODELPROC glad_glShadeModel; +#define glShadeModel glad_glShadeModel +typedef void (APIENTRYP PFNGLTEXENVFPROC)(GLenum target, GLenum pname, GLfloat param); +GLAPI PFNGLTEXENVFPROC glad_glTexEnvf; +#define glTexEnvf glad_glTexEnvf +typedef void (APIENTRYP PFNGLTEXENVFVPROC)(GLenum target, GLenum pname, const GLfloat *params); +GLAPI PFNGLTEXENVFVPROC glad_glTexEnvfv; +#define glTexEnvfv glad_glTexEnvfv +typedef void (APIENTRYP PFNGLTEXENVIPROC)(GLenum target, GLenum pname, GLint param); +GLAPI PFNGLTEXENVIPROC glad_glTexEnvi; +#define glTexEnvi glad_glTexEnvi +typedef void (APIENTRYP PFNGLTEXENVIVPROC)(GLenum target, GLenum pname, const GLint *params); +GLAPI PFNGLTEXENVIVPROC glad_glTexEnviv; +#define glTexEnviv glad_glTexEnviv +typedef void (APIENTRYP PFNGLTEXGENDPROC)(GLenum coord, GLenum pname, GLdouble param); +GLAPI PFNGLTEXGENDPROC glad_glTexGend; +#define glTexGend glad_glTexGend +typedef void (APIENTRYP PFNGLTEXGENDVPROC)(GLenum coord, GLenum pname, const GLdouble *params); +GLAPI PFNGLTEXGENDVPROC glad_glTexGendv; +#define glTexGendv glad_glTexGendv +typedef void (APIENTRYP PFNGLTEXGENFPROC)(GLenum coord, GLenum pname, GLfloat param); +GLAPI PFNGLTEXGENFPROC glad_glTexGenf; +#define glTexGenf glad_glTexGenf +typedef void (APIENTRYP PFNGLTEXGENFVPROC)(GLenum coord, GLenum pname, const GLfloat *params); +GLAPI PFNGLTEXGENFVPROC glad_glTexGenfv; +#define glTexGenfv glad_glTexGenfv +typedef void (APIENTRYP PFNGLTEXGENIPROC)(GLenum coord, GLenum pname, GLint param); +GLAPI PFNGLTEXGENIPROC glad_glTexGeni; +#define glTexGeni glad_glTexGeni +typedef void (APIENTRYP PFNGLTEXGENIVPROC)(GLenum coord, GLenum pname, const GLint *params); +GLAPI PFNGLTEXGENIVPROC glad_glTexGeniv; +#define glTexGeniv glad_glTexGeniv +typedef void (APIENTRYP PFNGLFEEDBACKBUFFERPROC)(GLsizei size, GLenum type, GLfloat *buffer); +GLAPI PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer; +#define glFeedbackBuffer glad_glFeedbackBuffer +typedef void (APIENTRYP PFNGLSELECTBUFFERPROC)(GLsizei size, GLuint *buffer); +GLAPI PFNGLSELECTBUFFERPROC glad_glSelectBuffer; +#define glSelectBuffer glad_glSelectBuffer +typedef GLint (APIENTRYP PFNGLRENDERMODEPROC)(GLenum mode); +GLAPI PFNGLRENDERMODEPROC glad_glRenderMode; +#define glRenderMode glad_glRenderMode +typedef void (APIENTRYP PFNGLINITNAMESPROC)(void); +GLAPI PFNGLINITNAMESPROC glad_glInitNames; +#define glInitNames glad_glInitNames +typedef void (APIENTRYP PFNGLLOADNAMEPROC)(GLuint name); +GLAPI PFNGLLOADNAMEPROC glad_glLoadName; +#define glLoadName glad_glLoadName +typedef void (APIENTRYP PFNGLPASSTHROUGHPROC)(GLfloat token); +GLAPI PFNGLPASSTHROUGHPROC glad_glPassThrough; +#define glPassThrough glad_glPassThrough +typedef void (APIENTRYP PFNGLPOPNAMEPROC)(void); +GLAPI PFNGLPOPNAMEPROC glad_glPopName; +#define glPopName glad_glPopName +typedef void (APIENTRYP PFNGLPUSHNAMEPROC)(GLuint name); +GLAPI PFNGLPUSHNAMEPROC glad_glPushName; +#define glPushName glad_glPushName +typedef void (APIENTRYP PFNGLCLEARACCUMPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI PFNGLCLEARACCUMPROC glad_glClearAccum; +#define glClearAccum glad_glClearAccum +typedef void (APIENTRYP PFNGLCLEARINDEXPROC)(GLfloat c); +GLAPI PFNGLCLEARINDEXPROC glad_glClearIndex; +#define glClearIndex glad_glClearIndex +typedef void (APIENTRYP PFNGLINDEXMASKPROC)(GLuint mask); +GLAPI PFNGLINDEXMASKPROC glad_glIndexMask; +#define glIndexMask glad_glIndexMask +typedef void (APIENTRYP PFNGLACCUMPROC)(GLenum op, GLfloat value); +GLAPI PFNGLACCUMPROC glad_glAccum; +#define glAccum glad_glAccum +typedef void (APIENTRYP PFNGLPOPATTRIBPROC)(void); +GLAPI PFNGLPOPATTRIBPROC glad_glPopAttrib; +#define glPopAttrib glad_glPopAttrib +typedef void (APIENTRYP PFNGLPUSHATTRIBPROC)(GLbitfield mask); +GLAPI PFNGLPUSHATTRIBPROC glad_glPushAttrib; +#define glPushAttrib glad_glPushAttrib +typedef void (APIENTRYP PFNGLMAP1DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI PFNGLMAP1DPROC glad_glMap1d; +#define glMap1d glad_glMap1d +typedef void (APIENTRYP PFNGLMAP1FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI PFNGLMAP1FPROC glad_glMap1f; +#define glMap1f glad_glMap1f +typedef void (APIENTRYP PFNGLMAP2DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI PFNGLMAP2DPROC glad_glMap2d; +#define glMap2d glad_glMap2d +typedef void (APIENTRYP PFNGLMAP2FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +GLAPI PFNGLMAP2FPROC glad_glMap2f; +#define glMap2f glad_glMap2f +typedef void (APIENTRYP PFNGLMAPGRID1DPROC)(GLint un, GLdouble u1, GLdouble u2); +GLAPI PFNGLMAPGRID1DPROC glad_glMapGrid1d; +#define glMapGrid1d glad_glMapGrid1d +typedef void (APIENTRYP PFNGLMAPGRID1FPROC)(GLint un, GLfloat u1, GLfloat u2); +GLAPI PFNGLMAPGRID1FPROC glad_glMapGrid1f; +#define glMapGrid1f glad_glMapGrid1f +typedef void (APIENTRYP PFNGLMAPGRID2DPROC)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +GLAPI PFNGLMAPGRID2DPROC glad_glMapGrid2d; +#define glMapGrid2d glad_glMapGrid2d +typedef void (APIENTRYP PFNGLMAPGRID2FPROC)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +GLAPI PFNGLMAPGRID2FPROC glad_glMapGrid2f; +#define glMapGrid2f glad_glMapGrid2f +typedef void (APIENTRYP PFNGLEVALCOORD1DPROC)(GLdouble u); +GLAPI PFNGLEVALCOORD1DPROC glad_glEvalCoord1d; +#define glEvalCoord1d glad_glEvalCoord1d +typedef void (APIENTRYP PFNGLEVALCOORD1DVPROC)(const GLdouble *u); +GLAPI PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv; +#define glEvalCoord1dv glad_glEvalCoord1dv +typedef void (APIENTRYP PFNGLEVALCOORD1FPROC)(GLfloat u); +GLAPI PFNGLEVALCOORD1FPROC glad_glEvalCoord1f; +#define glEvalCoord1f glad_glEvalCoord1f +typedef void (APIENTRYP PFNGLEVALCOORD1FVPROC)(const GLfloat *u); +GLAPI PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv; +#define glEvalCoord1fv glad_glEvalCoord1fv +typedef void (APIENTRYP PFNGLEVALCOORD2DPROC)(GLdouble u, GLdouble v); +GLAPI PFNGLEVALCOORD2DPROC glad_glEvalCoord2d; +#define glEvalCoord2d glad_glEvalCoord2d +typedef void (APIENTRYP PFNGLEVALCOORD2DVPROC)(const GLdouble *u); +GLAPI PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv; +#define glEvalCoord2dv glad_glEvalCoord2dv +typedef void (APIENTRYP PFNGLEVALCOORD2FPROC)(GLfloat u, GLfloat v); +GLAPI PFNGLEVALCOORD2FPROC glad_glEvalCoord2f; +#define glEvalCoord2f glad_glEvalCoord2f +typedef void (APIENTRYP PFNGLEVALCOORD2FVPROC)(const GLfloat *u); +GLAPI PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv; +#define glEvalCoord2fv glad_glEvalCoord2fv +typedef void (APIENTRYP PFNGLEVALMESH1PROC)(GLenum mode, GLint i1, GLint i2); +GLAPI PFNGLEVALMESH1PROC glad_glEvalMesh1; +#define glEvalMesh1 glad_glEvalMesh1 +typedef void (APIENTRYP PFNGLEVALPOINT1PROC)(GLint i); +GLAPI PFNGLEVALPOINT1PROC glad_glEvalPoint1; +#define glEvalPoint1 glad_glEvalPoint1 +typedef void (APIENTRYP PFNGLEVALMESH2PROC)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +GLAPI PFNGLEVALMESH2PROC glad_glEvalMesh2; +#define glEvalMesh2 glad_glEvalMesh2 +typedef void (APIENTRYP PFNGLEVALPOINT2PROC)(GLint i, GLint j); +GLAPI PFNGLEVALPOINT2PROC glad_glEvalPoint2; +#define glEvalPoint2 glad_glEvalPoint2 +typedef void (APIENTRYP PFNGLALPHAFUNCPROC)(GLenum func, GLfloat ref); +GLAPI PFNGLALPHAFUNCPROC glad_glAlphaFunc; +#define glAlphaFunc glad_glAlphaFunc +typedef void (APIENTRYP PFNGLPIXELZOOMPROC)(GLfloat xfactor, GLfloat yfactor); +GLAPI PFNGLPIXELZOOMPROC glad_glPixelZoom; +#define glPixelZoom glad_glPixelZoom +typedef void (APIENTRYP PFNGLPIXELTRANSFERFPROC)(GLenum pname, GLfloat param); +GLAPI PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf; +#define glPixelTransferf glad_glPixelTransferf +typedef void (APIENTRYP PFNGLPIXELTRANSFERIPROC)(GLenum pname, GLint param); +GLAPI PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi; +#define glPixelTransferi glad_glPixelTransferi +typedef void (APIENTRYP PFNGLPIXELMAPFVPROC)(GLenum map, GLsizei mapsize, const GLfloat *values); +GLAPI PFNGLPIXELMAPFVPROC glad_glPixelMapfv; +#define glPixelMapfv glad_glPixelMapfv +typedef void (APIENTRYP PFNGLPIXELMAPUIVPROC)(GLenum map, GLsizei mapsize, const GLuint *values); +GLAPI PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv; +#define glPixelMapuiv glad_glPixelMapuiv +typedef void (APIENTRYP PFNGLPIXELMAPUSVPROC)(GLenum map, GLsizei mapsize, const GLushort *values); +GLAPI PFNGLPIXELMAPUSVPROC glad_glPixelMapusv; +#define glPixelMapusv glad_glPixelMapusv +typedef void (APIENTRYP PFNGLCOPYPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +GLAPI PFNGLCOPYPIXELSPROC glad_glCopyPixels; +#define glCopyPixels glad_glCopyPixels +typedef void (APIENTRYP PFNGLDRAWPIXELSPROC)(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLDRAWPIXELSPROC glad_glDrawPixels; +#define glDrawPixels glad_glDrawPixels +typedef void (APIENTRYP PFNGLGETCLIPPLANEPROC)(GLenum plane, GLdouble *equation); +GLAPI PFNGLGETCLIPPLANEPROC glad_glGetClipPlane; +#define glGetClipPlane glad_glGetClipPlane +typedef void (APIENTRYP PFNGLGETLIGHTFVPROC)(GLenum light, GLenum pname, GLfloat *params); +GLAPI PFNGLGETLIGHTFVPROC glad_glGetLightfv; +#define glGetLightfv glad_glGetLightfv +typedef void (APIENTRYP PFNGLGETLIGHTIVPROC)(GLenum light, GLenum pname, GLint *params); +GLAPI PFNGLGETLIGHTIVPROC glad_glGetLightiv; +#define glGetLightiv glad_glGetLightiv +typedef void (APIENTRYP PFNGLGETMAPDVPROC)(GLenum target, GLenum query, GLdouble *v); +GLAPI PFNGLGETMAPDVPROC glad_glGetMapdv; +#define glGetMapdv glad_glGetMapdv +typedef void (APIENTRYP PFNGLGETMAPFVPROC)(GLenum target, GLenum query, GLfloat *v); +GLAPI PFNGLGETMAPFVPROC glad_glGetMapfv; +#define glGetMapfv glad_glGetMapfv +typedef void (APIENTRYP PFNGLGETMAPIVPROC)(GLenum target, GLenum query, GLint *v); +GLAPI PFNGLGETMAPIVPROC glad_glGetMapiv; +#define glGetMapiv glad_glGetMapiv +typedef void (APIENTRYP PFNGLGETMATERIALFVPROC)(GLenum face, GLenum pname, GLfloat *params); +GLAPI PFNGLGETMATERIALFVPROC glad_glGetMaterialfv; +#define glGetMaterialfv glad_glGetMaterialfv +typedef void (APIENTRYP PFNGLGETMATERIALIVPROC)(GLenum face, GLenum pname, GLint *params); +GLAPI PFNGLGETMATERIALIVPROC glad_glGetMaterialiv; +#define glGetMaterialiv glad_glGetMaterialiv +typedef void (APIENTRYP PFNGLGETPIXELMAPFVPROC)(GLenum map, GLfloat *values); +GLAPI PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv; +#define glGetPixelMapfv glad_glGetPixelMapfv +typedef void (APIENTRYP PFNGLGETPIXELMAPUIVPROC)(GLenum map, GLuint *values); +GLAPI PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv; +#define glGetPixelMapuiv glad_glGetPixelMapuiv +typedef void (APIENTRYP PFNGLGETPIXELMAPUSVPROC)(GLenum map, GLushort *values); +GLAPI PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv; +#define glGetPixelMapusv glad_glGetPixelMapusv +typedef void (APIENTRYP PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte *mask); +GLAPI PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple; +#define glGetPolygonStipple glad_glGetPolygonStipple +typedef void (APIENTRYP PFNGLGETTEXENVFVPROC)(GLenum target, GLenum pname, GLfloat *params); +GLAPI PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv; +#define glGetTexEnvfv glad_glGetTexEnvfv +typedef void (APIENTRYP PFNGLGETTEXENVIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETTEXENVIVPROC glad_glGetTexEnviv; +#define glGetTexEnviv glad_glGetTexEnviv +typedef void (APIENTRYP PFNGLGETTEXGENDVPROC)(GLenum coord, GLenum pname, GLdouble *params); +GLAPI PFNGLGETTEXGENDVPROC glad_glGetTexGendv; +#define glGetTexGendv glad_glGetTexGendv +typedef void (APIENTRYP PFNGLGETTEXGENFVPROC)(GLenum coord, GLenum pname, GLfloat *params); +GLAPI PFNGLGETTEXGENFVPROC glad_glGetTexGenfv; +#define glGetTexGenfv glad_glGetTexGenfv +typedef void (APIENTRYP PFNGLGETTEXGENIVPROC)(GLenum coord, GLenum pname, GLint *params); +GLAPI PFNGLGETTEXGENIVPROC glad_glGetTexGeniv; +#define glGetTexGeniv glad_glGetTexGeniv +typedef GLboolean (APIENTRYP PFNGLISLISTPROC)(GLuint list); +GLAPI PFNGLISLISTPROC glad_glIsList; +#define glIsList glad_glIsList +typedef void (APIENTRYP PFNGLFRUSTUMPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI PFNGLFRUSTUMPROC glad_glFrustum; +#define glFrustum glad_glFrustum +typedef void (APIENTRYP PFNGLLOADIDENTITYPROC)(void); +GLAPI PFNGLLOADIDENTITYPROC glad_glLoadIdentity; +#define glLoadIdentity glad_glLoadIdentity +typedef void (APIENTRYP PFNGLLOADMATRIXFPROC)(const GLfloat *m); +GLAPI PFNGLLOADMATRIXFPROC glad_glLoadMatrixf; +#define glLoadMatrixf glad_glLoadMatrixf +typedef void (APIENTRYP PFNGLLOADMATRIXDPROC)(const GLdouble *m); +GLAPI PFNGLLOADMATRIXDPROC glad_glLoadMatrixd; +#define glLoadMatrixd glad_glLoadMatrixd +typedef void (APIENTRYP PFNGLMATRIXMODEPROC)(GLenum mode); +GLAPI PFNGLMATRIXMODEPROC glad_glMatrixMode; +#define glMatrixMode glad_glMatrixMode +typedef void (APIENTRYP PFNGLMULTMATRIXFPROC)(const GLfloat *m); +GLAPI PFNGLMULTMATRIXFPROC glad_glMultMatrixf; +#define glMultMatrixf glad_glMultMatrixf +typedef void (APIENTRYP PFNGLMULTMATRIXDPROC)(const GLdouble *m); +GLAPI PFNGLMULTMATRIXDPROC glad_glMultMatrixd; +#define glMultMatrixd glad_glMultMatrixd +typedef void (APIENTRYP PFNGLORTHOPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI PFNGLORTHOPROC glad_glOrtho; +#define glOrtho glad_glOrtho +typedef void (APIENTRYP PFNGLPOPMATRIXPROC)(void); +GLAPI PFNGLPOPMATRIXPROC glad_glPopMatrix; +#define glPopMatrix glad_glPopMatrix +typedef void (APIENTRYP PFNGLPUSHMATRIXPROC)(void); +GLAPI PFNGLPUSHMATRIXPROC glad_glPushMatrix; +#define glPushMatrix glad_glPushMatrix +typedef void (APIENTRYP PFNGLROTATEDPROC)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI PFNGLROTATEDPROC glad_glRotated; +#define glRotated glad_glRotated +typedef void (APIENTRYP PFNGLROTATEFPROC)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI PFNGLROTATEFPROC glad_glRotatef; +#define glRotatef glad_glRotatef +typedef void (APIENTRYP PFNGLSCALEDPROC)(GLdouble x, GLdouble y, GLdouble z); +GLAPI PFNGLSCALEDPROC glad_glScaled; +#define glScaled glad_glScaled +typedef void (APIENTRYP PFNGLSCALEFPROC)(GLfloat x, GLfloat y, GLfloat z); +GLAPI PFNGLSCALEFPROC glad_glScalef; +#define glScalef glad_glScalef +typedef void (APIENTRYP PFNGLTRANSLATEDPROC)(GLdouble x, GLdouble y, GLdouble z); +GLAPI PFNGLTRANSLATEDPROC glad_glTranslated; +#define glTranslated glad_glTranslated +typedef void (APIENTRYP PFNGLTRANSLATEFPROC)(GLfloat x, GLfloat y, GLfloat z); +GLAPI PFNGLTRANSLATEFPROC glad_glTranslatef; +#define glTranslatef glad_glTranslatef +#endif +#ifndef GL_VERSION_1_1 +#define GL_VERSION_1_1 1 +GLAPI int GLAD_GL_VERSION_1_1; +typedef void (APIENTRYP PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); +GLAPI PFNGLDRAWARRAYSPROC glad_glDrawArrays; +#define glDrawArrays glad_glDrawArrays +typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices); +GLAPI PFNGLDRAWELEMENTSPROC glad_glDrawElements; +#define glDrawElements glad_glDrawElements +typedef void (APIENTRYP PFNGLGETPOINTERVPROC)(GLenum pname, void **params); +GLAPI PFNGLGETPOINTERVPROC glad_glGetPointerv; +#define glGetPointerv glad_glGetPointerv +typedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); +GLAPI PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; +#define glPolygonOffset glad_glPolygonOffset +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D; +#define glCopyTexImage1D glad_glCopyTexImage1D +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; +#define glCopyTexImage2D glad_glCopyTexImage2D +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D; +#define glCopyTexSubImage1D glad_glCopyTexSubImage1D +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; +#define glCopyTexSubImage2D glad_glCopyTexSubImage2D +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D; +#define glTexSubImage1D glad_glTexSubImage1D +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; +#define glTexSubImage2D glad_glTexSubImage2D +typedef void (APIENTRYP PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); +GLAPI PFNGLBINDTEXTUREPROC glad_glBindTexture; +#define glBindTexture glad_glBindTexture +typedef void (APIENTRYP PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint *textures); +GLAPI PFNGLDELETETEXTURESPROC glad_glDeleteTextures; +#define glDeleteTextures glad_glDeleteTextures +typedef void (APIENTRYP PFNGLGENTEXTURESPROC)(GLsizei n, GLuint *textures); +GLAPI PFNGLGENTEXTURESPROC glad_glGenTextures; +#define glGenTextures glad_glGenTextures +typedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC)(GLuint texture); +GLAPI PFNGLISTEXTUREPROC glad_glIsTexture; +#define glIsTexture glad_glIsTexture +typedef void (APIENTRYP PFNGLARRAYELEMENTPROC)(GLint i); +GLAPI PFNGLARRAYELEMENTPROC glad_glArrayElement; +#define glArrayElement glad_glArrayElement +typedef void (APIENTRYP PFNGLCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI PFNGLCOLORPOINTERPROC glad_glColorPointer; +#define glColorPointer glad_glColorPointer +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEPROC)(GLenum array); +GLAPI PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState; +#define glDisableClientState glad_glDisableClientState +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERPROC)(GLsizei stride, const void *pointer); +GLAPI PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer; +#define glEdgeFlagPointer glad_glEdgeFlagPointer +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEPROC)(GLenum array); +GLAPI PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState; +#define glEnableClientState glad_glEnableClientState +typedef void (APIENTRYP PFNGLINDEXPOINTERPROC)(GLenum type, GLsizei stride, const void *pointer); +GLAPI PFNGLINDEXPOINTERPROC glad_glIndexPointer; +#define glIndexPointer glad_glIndexPointer +typedef void (APIENTRYP PFNGLINTERLEAVEDARRAYSPROC)(GLenum format, GLsizei stride, const void *pointer); +GLAPI PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays; +#define glInterleavedArrays glad_glInterleavedArrays +typedef void (APIENTRYP PFNGLNORMALPOINTERPROC)(GLenum type, GLsizei stride, const void *pointer); +GLAPI PFNGLNORMALPOINTERPROC glad_glNormalPointer; +#define glNormalPointer glad_glNormalPointer +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer; +#define glTexCoordPointer glad_glTexCoordPointer +typedef void (APIENTRYP PFNGLVERTEXPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI PFNGLVERTEXPOINTERPROC glad_glVertexPointer; +#define glVertexPointer glad_glVertexPointer +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTPROC)(GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident; +#define glAreTexturesResident glad_glAreTexturesResident +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESPROC)(GLsizei n, const GLuint *textures, const GLfloat *priorities); +GLAPI PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures; +#define glPrioritizeTextures glad_glPrioritizeTextures +typedef void (APIENTRYP PFNGLINDEXUBPROC)(GLubyte c); +GLAPI PFNGLINDEXUBPROC glad_glIndexub; +#define glIndexub glad_glIndexub +typedef void (APIENTRYP PFNGLINDEXUBVPROC)(const GLubyte *c); +GLAPI PFNGLINDEXUBVPROC glad_glIndexubv; +#define glIndexubv glad_glIndexubv +typedef void (APIENTRYP PFNGLPOPCLIENTATTRIBPROC)(void); +GLAPI PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib; +#define glPopClientAttrib glad_glPopClientAttrib +typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask); +GLAPI PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib; +#define glPushClientAttrib glad_glPushClientAttrib +#endif +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +GLAPI int GLAD_GL_VERSION_1_2; +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +GLAPI PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; +#define glDrawRangeElements glad_glDrawRangeElements +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXIMAGE3DPROC glad_glTexImage3D; +#define glTexImage3D glad_glTexImage3D +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; +#define glTexSubImage3D glad_glTexSubImage3D +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; +#define glCopyTexSubImage3D glad_glCopyTexSubImage3D +#endif +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +GLAPI int GLAD_GL_VERSION_1_3; +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC)(GLenum texture); +GLAPI PFNGLACTIVETEXTUREPROC glad_glActiveTexture; +#define glActiveTexture glad_glActiveTexture +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); +GLAPI PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; +#define glSampleCoverage glad_glSampleCoverage +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; +#define glCompressedTexImage3D glad_glCompressedTexImage3D +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; +#define glCompressedTexImage2D glad_glCompressedTexImage2D +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D; +#define glCompressedTexImage1D glad_glCompressedTexImage1D +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; +#define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; +#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D; +#define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void *img); +GLAPI PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage; +#define glGetCompressedTexImage glad_glGetCompressedTexImage +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC)(GLenum texture); +GLAPI PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture; +#define glClientActiveTexture glad_glClientActiveTexture +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC)(GLenum target, GLdouble s); +GLAPI PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d; +#define glMultiTexCoord1d glad_glMultiTexCoord1d +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC)(GLenum target, const GLdouble *v); +GLAPI PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv; +#define glMultiTexCoord1dv glad_glMultiTexCoord1dv +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC)(GLenum target, GLfloat s); +GLAPI PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f; +#define glMultiTexCoord1f glad_glMultiTexCoord1f +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC)(GLenum target, const GLfloat *v); +GLAPI PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv; +#define glMultiTexCoord1fv glad_glMultiTexCoord1fv +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC)(GLenum target, GLint s); +GLAPI PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i; +#define glMultiTexCoord1i glad_glMultiTexCoord1i +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC)(GLenum target, const GLint *v); +GLAPI PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv; +#define glMultiTexCoord1iv glad_glMultiTexCoord1iv +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC)(GLenum target, GLshort s); +GLAPI PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s; +#define glMultiTexCoord1s glad_glMultiTexCoord1s +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC)(GLenum target, const GLshort *v); +GLAPI PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv; +#define glMultiTexCoord1sv glad_glMultiTexCoord1sv +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC)(GLenum target, GLdouble s, GLdouble t); +GLAPI PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d; +#define glMultiTexCoord2d glad_glMultiTexCoord2d +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC)(GLenum target, const GLdouble *v); +GLAPI PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv; +#define glMultiTexCoord2dv glad_glMultiTexCoord2dv +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC)(GLenum target, GLfloat s, GLfloat t); +GLAPI PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f; +#define glMultiTexCoord2f glad_glMultiTexCoord2f +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC)(GLenum target, const GLfloat *v); +GLAPI PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv; +#define glMultiTexCoord2fv glad_glMultiTexCoord2fv +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC)(GLenum target, GLint s, GLint t); +GLAPI PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i; +#define glMultiTexCoord2i glad_glMultiTexCoord2i +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC)(GLenum target, const GLint *v); +GLAPI PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv; +#define glMultiTexCoord2iv glad_glMultiTexCoord2iv +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC)(GLenum target, GLshort s, GLshort t); +GLAPI PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s; +#define glMultiTexCoord2s glad_glMultiTexCoord2s +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC)(GLenum target, const GLshort *v); +GLAPI PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv; +#define glMultiTexCoord2sv glad_glMultiTexCoord2sv +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d; +#define glMultiTexCoord3d glad_glMultiTexCoord3d +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC)(GLenum target, const GLdouble *v); +GLAPI PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv; +#define glMultiTexCoord3dv glad_glMultiTexCoord3dv +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f; +#define glMultiTexCoord3f glad_glMultiTexCoord3f +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC)(GLenum target, const GLfloat *v); +GLAPI PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv; +#define glMultiTexCoord3fv glad_glMultiTexCoord3fv +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC)(GLenum target, GLint s, GLint t, GLint r); +GLAPI PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i; +#define glMultiTexCoord3i glad_glMultiTexCoord3i +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC)(GLenum target, const GLint *v); +GLAPI PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv; +#define glMultiTexCoord3iv glad_glMultiTexCoord3iv +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC)(GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s; +#define glMultiTexCoord3s glad_glMultiTexCoord3s +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC)(GLenum target, const GLshort *v); +GLAPI PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv; +#define glMultiTexCoord3sv glad_glMultiTexCoord3sv +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d; +#define glMultiTexCoord4d glad_glMultiTexCoord4d +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC)(GLenum target, const GLdouble *v); +GLAPI PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv; +#define glMultiTexCoord4dv glad_glMultiTexCoord4dv +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f; +#define glMultiTexCoord4f glad_glMultiTexCoord4f +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC)(GLenum target, const GLfloat *v); +GLAPI PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv; +#define glMultiTexCoord4fv glad_glMultiTexCoord4fv +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i; +#define glMultiTexCoord4i glad_glMultiTexCoord4i +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC)(GLenum target, const GLint *v); +GLAPI PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv; +#define glMultiTexCoord4iv glad_glMultiTexCoord4iv +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s; +#define glMultiTexCoord4s glad_glMultiTexCoord4s +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC)(GLenum target, const GLshort *v); +GLAPI PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv; +#define glMultiTexCoord4sv glad_glMultiTexCoord4sv +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC)(const GLfloat *m); +GLAPI PFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf; +#define glLoadTransposeMatrixf glad_glLoadTransposeMatrixf +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC)(const GLdouble *m); +GLAPI PFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd; +#define glLoadTransposeMatrixd glad_glLoadTransposeMatrixd +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC)(const GLfloat *m); +GLAPI PFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf; +#define glMultTransposeMatrixf glad_glMultTransposeMatrixf +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC)(const GLdouble *m); +GLAPI PFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd; +#define glMultTransposeMatrixd glad_glMultTransposeMatrixd +#endif +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +GLAPI int GLAD_GL_VERSION_1_4; +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; +#define glBlendFuncSeparate glad_glBlendFuncSeparate +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +GLAPI PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays; +#define glMultiDrawArrays glad_glMultiDrawArrays +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +GLAPI PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements; +#define glMultiDrawElements glad_glMultiDrawElements +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); +GLAPI PFNGLPOINTPARAMETERFPROC glad_glPointParameterf; +#define glPointParameterf glad_glPointParameterf +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat *params); +GLAPI PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv; +#define glPointParameterfv glad_glPointParameterfv +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param); +GLAPI PFNGLPOINTPARAMETERIPROC glad_glPointParameteri; +#define glPointParameteri glad_glPointParameteri +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint *params); +GLAPI PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv; +#define glPointParameteriv glad_glPointParameteriv +typedef void (APIENTRYP PFNGLFOGCOORDFPROC)(GLfloat coord); +GLAPI PFNGLFOGCOORDFPROC glad_glFogCoordf; +#define glFogCoordf glad_glFogCoordf +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC)(const GLfloat *coord); +GLAPI PFNGLFOGCOORDFVPROC glad_glFogCoordfv; +#define glFogCoordfv glad_glFogCoordfv +typedef void (APIENTRYP PFNGLFOGCOORDDPROC)(GLdouble coord); +GLAPI PFNGLFOGCOORDDPROC glad_glFogCoordd; +#define glFogCoordd glad_glFogCoordd +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC)(const GLdouble *coord); +GLAPI PFNGLFOGCOORDDVPROC glad_glFogCoorddv; +#define glFogCoorddv glad_glFogCoorddv +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC)(GLenum type, GLsizei stride, const void *pointer); +GLAPI PFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer; +#define glFogCoordPointer glad_glFogCoordPointer +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue); +GLAPI PFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b; +#define glSecondaryColor3b glad_glSecondaryColor3b +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC)(const GLbyte *v); +GLAPI PFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv; +#define glSecondaryColor3bv glad_glSecondaryColor3bv +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue); +GLAPI PFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d; +#define glSecondaryColor3d glad_glSecondaryColor3d +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC)(const GLdouble *v); +GLAPI PFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv; +#define glSecondaryColor3dv glad_glSecondaryColor3dv +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue); +GLAPI PFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f; +#define glSecondaryColor3f glad_glSecondaryColor3f +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC)(const GLfloat *v); +GLAPI PFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv; +#define glSecondaryColor3fv glad_glSecondaryColor3fv +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC)(GLint red, GLint green, GLint blue); +GLAPI PFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i; +#define glSecondaryColor3i glad_glSecondaryColor3i +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC)(const GLint *v); +GLAPI PFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv; +#define glSecondaryColor3iv glad_glSecondaryColor3iv +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue); +GLAPI PFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s; +#define glSecondaryColor3s glad_glSecondaryColor3s +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC)(const GLshort *v); +GLAPI PFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv; +#define glSecondaryColor3sv glad_glSecondaryColor3sv +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue); +GLAPI PFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub; +#define glSecondaryColor3ub glad_glSecondaryColor3ub +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC)(const GLubyte *v); +GLAPI PFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv; +#define glSecondaryColor3ubv glad_glSecondaryColor3ubv +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue); +GLAPI PFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui; +#define glSecondaryColor3ui glad_glSecondaryColor3ui +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC)(const GLuint *v); +GLAPI PFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv; +#define glSecondaryColor3uiv glad_glSecondaryColor3uiv +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue); +GLAPI PFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us; +#define glSecondaryColor3us glad_glSecondaryColor3us +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC)(const GLushort *v); +GLAPI PFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv; +#define glSecondaryColor3usv glad_glSecondaryColor3usv +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI PFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer; +#define glSecondaryColorPointer glad_glSecondaryColorPointer +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC)(GLdouble x, GLdouble y); +GLAPI PFNGLWINDOWPOS2DPROC glad_glWindowPos2d; +#define glWindowPos2d glad_glWindowPos2d +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC)(const GLdouble *v); +GLAPI PFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv; +#define glWindowPos2dv glad_glWindowPos2dv +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC)(GLfloat x, GLfloat y); +GLAPI PFNGLWINDOWPOS2FPROC glad_glWindowPos2f; +#define glWindowPos2f glad_glWindowPos2f +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC)(const GLfloat *v); +GLAPI PFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv; +#define glWindowPos2fv glad_glWindowPos2fv +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC)(GLint x, GLint y); +GLAPI PFNGLWINDOWPOS2IPROC glad_glWindowPos2i; +#define glWindowPos2i glad_glWindowPos2i +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC)(const GLint *v); +GLAPI PFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv; +#define glWindowPos2iv glad_glWindowPos2iv +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC)(GLshort x, GLshort y); +GLAPI PFNGLWINDOWPOS2SPROC glad_glWindowPos2s; +#define glWindowPos2s glad_glWindowPos2s +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC)(const GLshort *v); +GLAPI PFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv; +#define glWindowPos2sv glad_glWindowPos2sv +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z); +GLAPI PFNGLWINDOWPOS3DPROC glad_glWindowPos3d; +#define glWindowPos3d glad_glWindowPos3d +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC)(const GLdouble *v); +GLAPI PFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv; +#define glWindowPos3dv glad_glWindowPos3dv +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z); +GLAPI PFNGLWINDOWPOS3FPROC glad_glWindowPos3f; +#define glWindowPos3f glad_glWindowPos3f +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC)(const GLfloat *v); +GLAPI PFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv; +#define glWindowPos3fv glad_glWindowPos3fv +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC)(GLint x, GLint y, GLint z); +GLAPI PFNGLWINDOWPOS3IPROC glad_glWindowPos3i; +#define glWindowPos3i glad_glWindowPos3i +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC)(const GLint *v); +GLAPI PFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv; +#define glWindowPos3iv glad_glWindowPos3iv +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC)(GLshort x, GLshort y, GLshort z); +GLAPI PFNGLWINDOWPOS3SPROC glad_glWindowPos3s; +#define glWindowPos3s glad_glWindowPos3s +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC)(const GLshort *v); +GLAPI PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv; +#define glWindowPos3sv glad_glWindowPos3sv +typedef void (APIENTRYP PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI PFNGLBLENDCOLORPROC glad_glBlendColor; +#define glBlendColor glad_glBlendColor +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC)(GLenum mode); +GLAPI PFNGLBLENDEQUATIONPROC glad_glBlendEquation; +#define glBlendEquation glad_glBlendEquation +#endif +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +GLAPI int GLAD_GL_VERSION_1_5; +typedef void (APIENTRYP PFNGLGENQUERIESPROC)(GLsizei n, GLuint *ids); +GLAPI PFNGLGENQUERIESPROC glad_glGenQueries; +#define glGenQueries glad_glGenQueries +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint *ids); +GLAPI PFNGLDELETEQUERIESPROC glad_glDeleteQueries; +#define glDeleteQueries glad_glDeleteQueries +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC)(GLuint id); +GLAPI PFNGLISQUERYPROC glad_glIsQuery; +#define glIsQuery glad_glIsQuery +typedef void (APIENTRYP PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); +GLAPI PFNGLBEGINQUERYPROC glad_glBeginQuery; +#define glBeginQuery glad_glBeginQuery +typedef void (APIENTRYP PFNGLENDQUERYPROC)(GLenum target); +GLAPI PFNGLENDQUERYPROC glad_glEndQuery; +#define glEndQuery glad_glEndQuery +typedef void (APIENTRYP PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETQUERYIVPROC glad_glGetQueryiv; +#define glGetQueryiv glad_glGetQueryiv +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint *params); +GLAPI PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv; +#define glGetQueryObjectiv glad_glGetQueryObjectiv +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint *params); +GLAPI PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; +#define glGetQueryObjectuiv glad_glGetQueryObjectuiv +typedef void (APIENTRYP PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); +GLAPI PFNGLBINDBUFFERPROC glad_glBindBuffer; +#define glBindBuffer glad_glBindBuffer +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint *buffers); +GLAPI PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; +#define glDeleteBuffers glad_glDeleteBuffers +typedef void (APIENTRYP PFNGLGENBUFFERSPROC)(GLsizei n, GLuint *buffers); +GLAPI PFNGLGENBUFFERSPROC glad_glGenBuffers; +#define glGenBuffers glad_glGenBuffers +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC)(GLuint buffer); +GLAPI PFNGLISBUFFERPROC glad_glIsBuffer; +#define glIsBuffer glad_glIsBuffer +typedef void (APIENTRYP PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void *data, GLenum usage); +GLAPI PFNGLBUFFERDATAPROC glad_glBufferData; +#define glBufferData glad_glBufferData +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; +#define glBufferSubData glad_glBufferSubData +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void *data); +GLAPI PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData; +#define glGetBufferSubData glad_glGetBufferSubData +typedef void * (APIENTRYP PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); +GLAPI PFNGLMAPBUFFERPROC glad_glMapBuffer; +#define glMapBuffer glad_glMapBuffer +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC)(GLenum target); +GLAPI PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; +#define glUnmapBuffer glad_glUnmapBuffer +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; +#define glGetBufferParameteriv glad_glGetBufferParameteriv +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void **params); +GLAPI PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; +#define glGetBufferPointerv glad_glGetBufferPointerv +#endif +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +GLAPI int GLAD_GL_VERSION_2_0; +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); +GLAPI PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; +#define glBlendEquationSeparate glad_glBlendEquationSeparate +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum *bufs); +GLAPI PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; +#define glDrawBuffers glad_glDrawBuffers +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; +#define glStencilOpSeparate glad_glStencilOpSeparate +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); +GLAPI PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; +#define glStencilFuncSeparate glad_glStencilFuncSeparate +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); +GLAPI PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; +#define glStencilMaskSeparate glad_glStencilMaskSeparate +typedef void (APIENTRYP PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); +GLAPI PFNGLATTACHSHADERPROC glad_glAttachShader; +#define glAttachShader glad_glAttachShader +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar *name); +GLAPI PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; +#define glBindAttribLocation glad_glBindAttribLocation +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC)(GLuint shader); +GLAPI PFNGLCOMPILESHADERPROC glad_glCompileShader; +#define glCompileShader glad_glCompileShader +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC)(void); +GLAPI PFNGLCREATEPROGRAMPROC glad_glCreateProgram; +#define glCreateProgram glad_glCreateProgram +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC)(GLenum type); +GLAPI PFNGLCREATESHADERPROC glad_glCreateShader; +#define glCreateShader glad_glCreateShader +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC)(GLuint program); +GLAPI PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; +#define glDeleteProgram glad_glDeleteProgram +typedef void (APIENTRYP PFNGLDELETESHADERPROC)(GLuint shader); +GLAPI PFNGLDELETESHADERPROC glad_glDeleteShader; +#define glDeleteShader glad_glDeleteShader +typedef void (APIENTRYP PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); +GLAPI PFNGLDETACHSHADERPROC glad_glDetachShader; +#define glDetachShader glad_glDetachShader +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); +GLAPI PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; +#define glDisableVertexAttribArray glad_glDisableVertexAttribArray +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); +GLAPI PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; +#define glEnableVertexAttribArray glad_glEnableVertexAttribArray +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; +#define glGetActiveAttrib glad_glGetActiveAttrib +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; +#define glGetActiveUniform glad_glGetActiveUniform +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +GLAPI PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; +#define glGetAttachedShaders glad_glGetAttachedShaders +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar *name); +GLAPI PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; +#define glGetAttribLocation glad_glGetAttribLocation +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint *params); +GLAPI PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; +#define glGetProgramiv glad_glGetProgramiv +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; +#define glGetProgramInfoLog glad_glGetProgramInfoLog +typedef void (APIENTRYP PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint *params); +GLAPI PFNGLGETSHADERIVPROC glad_glGetShaderiv; +#define glGetShaderiv glad_glGetShaderiv +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; +#define glGetShaderInfoLog glad_glGetShaderInfoLog +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GLAPI PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; +#define glGetShaderSource glad_glGetShaderSource +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar *name); +GLAPI PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; +#define glGetUniformLocation glad_glGetUniformLocation +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat *params); +GLAPI PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; +#define glGetUniformfv glad_glGetUniformfv +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint *params); +GLAPI PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; +#define glGetUniformiv glad_glGetUniformiv +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble *params); +GLAPI PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv; +#define glGetVertexAttribdv glad_glGetVertexAttribdv +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat *params); +GLAPI PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; +#define glGetVertexAttribfv glad_glGetVertexAttribfv +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint *params); +GLAPI PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; +#define glGetVertexAttribiv glad_glGetVertexAttribiv +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void **pointer); +GLAPI PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; +#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC)(GLuint program); +GLAPI PFNGLISPROGRAMPROC glad_glIsProgram; +#define glIsProgram glad_glIsProgram +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC)(GLuint shader); +GLAPI PFNGLISSHADERPROC glad_glIsShader; +#define glIsShader glad_glIsShader +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC)(GLuint program); +GLAPI PFNGLLINKPROGRAMPROC glad_glLinkProgram; +#define glLinkProgram glad_glLinkProgram +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +GLAPI PFNGLSHADERSOURCEPROC glad_glShaderSource; +#define glShaderSource glad_glShaderSource +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC)(GLuint program); +GLAPI PFNGLUSEPROGRAMPROC glad_glUseProgram; +#define glUseProgram glad_glUseProgram +typedef void (APIENTRYP PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); +GLAPI PFNGLUNIFORM1FPROC glad_glUniform1f; +#define glUniform1f glad_glUniform1f +typedef void (APIENTRYP PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); +GLAPI PFNGLUNIFORM2FPROC glad_glUniform2f; +#define glUniform2f glad_glUniform2f +typedef void (APIENTRYP PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI PFNGLUNIFORM3FPROC glad_glUniform3f; +#define glUniform3f glad_glUniform3f +typedef void (APIENTRYP PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI PFNGLUNIFORM4FPROC glad_glUniform4f; +#define glUniform4f glad_glUniform4f +typedef void (APIENTRYP PFNGLUNIFORM1IPROC)(GLint location, GLint v0); +GLAPI PFNGLUNIFORM1IPROC glad_glUniform1i; +#define glUniform1i glad_glUniform1i +typedef void (APIENTRYP PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); +GLAPI PFNGLUNIFORM2IPROC glad_glUniform2i; +#define glUniform2i glad_glUniform2i +typedef void (APIENTRYP PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); +GLAPI PFNGLUNIFORM3IPROC glad_glUniform3i; +#define glUniform3i glad_glUniform3i +typedef void (APIENTRYP PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI PFNGLUNIFORM4IPROC glad_glUniform4i; +#define glUniform4i glad_glUniform4i +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLUNIFORM1FVPROC glad_glUniform1fv; +#define glUniform1fv glad_glUniform1fv +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLUNIFORM2FVPROC glad_glUniform2fv; +#define glUniform2fv glad_glUniform2fv +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLUNIFORM3FVPROC glad_glUniform3fv; +#define glUniform3fv glad_glUniform3fv +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLUNIFORM4FVPROC glad_glUniform4fv; +#define glUniform4fv glad_glUniform4fv +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLUNIFORM1IVPROC glad_glUniform1iv; +#define glUniform1iv glad_glUniform1iv +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLUNIFORM2IVPROC glad_glUniform2iv; +#define glUniform2iv glad_glUniform2iv +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLUNIFORM3IVPROC glad_glUniform3iv; +#define glUniform3iv glad_glUniform3iv +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLUNIFORM4IVPROC glad_glUniform4iv; +#define glUniform4iv glad_glUniform4iv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; +#define glUniformMatrix2fv glad_glUniformMatrix2fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; +#define glUniformMatrix3fv glad_glUniformMatrix3fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; +#define glUniformMatrix4fv glad_glUniformMatrix4fv +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC)(GLuint program); +GLAPI PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; +#define glValidateProgram glad_glValidateProgram +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); +GLAPI PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d; +#define glVertexAttrib1d glad_glVertexAttrib1d +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv; +#define glVertexAttrib1dv glad_glVertexAttrib1dv +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); +GLAPI PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; +#define glVertexAttrib1f glad_glVertexAttrib1f +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat *v); +GLAPI PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; +#define glVertexAttrib1fv glad_glVertexAttrib1fv +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x); +GLAPI PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s; +#define glVertexAttrib1s glad_glVertexAttrib1s +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv; +#define glVertexAttrib1sv glad_glVertexAttrib1sv +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y); +GLAPI PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d; +#define glVertexAttrib2d glad_glVertexAttrib2d +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv; +#define glVertexAttrib2dv glad_glVertexAttrib2dv +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); +GLAPI PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; +#define glVertexAttrib2f glad_glVertexAttrib2f +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat *v); +GLAPI PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; +#define glVertexAttrib2fv glad_glVertexAttrib2fv +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y); +GLAPI PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s; +#define glVertexAttrib2s glad_glVertexAttrib2s +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv; +#define glVertexAttrib2sv glad_glVertexAttrib2sv +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d; +#define glVertexAttrib3d glad_glVertexAttrib3d +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv; +#define glVertexAttrib3dv glad_glVertexAttrib3dv +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; +#define glVertexAttrib3f glad_glVertexAttrib3f +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat *v); +GLAPI PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; +#define glVertexAttrib3fv glad_glVertexAttrib3fv +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s; +#define glVertexAttrib3s glad_glVertexAttrib3s +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv; +#define glVertexAttrib3sv glad_glVertexAttrib3sv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte *v); +GLAPI PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv; +#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv; +#define glVertexAttrib4Niv glad_glVertexAttrib4Niv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv; +#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub; +#define glVertexAttrib4Nub glad_glVertexAttrib4Nub +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte *v); +GLAPI PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv; +#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv; +#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort *v); +GLAPI PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv; +#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte *v); +GLAPI PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv; +#define glVertexAttrib4bv glad_glVertexAttrib4bv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d; +#define glVertexAttrib4d glad_glVertexAttrib4d +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv; +#define glVertexAttrib4dv glad_glVertexAttrib4dv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; +#define glVertexAttrib4f glad_glVertexAttrib4f +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat *v); +GLAPI PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; +#define glVertexAttrib4fv glad_glVertexAttrib4fv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv; +#define glVertexAttrib4iv glad_glVertexAttrib4iv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s; +#define glVertexAttrib4s glad_glVertexAttrib4s +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv; +#define glVertexAttrib4sv glad_glVertexAttrib4sv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte *v); +GLAPI PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv; +#define glVertexAttrib4ubv glad_glVertexAttrib4ubv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv; +#define glVertexAttrib4uiv glad_glVertexAttrib4uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort *v); +GLAPI PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv; +#define glVertexAttrib4usv glad_glVertexAttrib4usv +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +GLAPI PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; +#define glVertexAttribPointer glad_glVertexAttribPointer +#endif +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 +GLAPI int GLAD_GL_VERSION_2_1; +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; +#define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; +#define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; +#define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; +#define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; +#define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; +#define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv +#endif +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 +GLAPI int GLAD_GL_VERSION_3_0; +typedef void (APIENTRYP PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI PFNGLCOLORMASKIPROC glad_glColorMaski; +#define glColorMaski glad_glColorMaski +typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean *data); +GLAPI PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v; +#define glGetBooleani_v glad_glGetBooleani_v +typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint *data); +GLAPI PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; +#define glGetIntegeri_v glad_glGetIntegeri_v +typedef void (APIENTRYP PFNGLENABLEIPROC)(GLenum target, GLuint index); +GLAPI PFNGLENABLEIPROC glad_glEnablei; +#define glEnablei glad_glEnablei +typedef void (APIENTRYP PFNGLDISABLEIPROC)(GLenum target, GLuint index); +GLAPI PFNGLDISABLEIPROC glad_glDisablei; +#define glDisablei glad_glDisablei +typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC)(GLenum target, GLuint index); +GLAPI PFNGLISENABLEDIPROC glad_glIsEnabledi; +#define glIsEnabledi glad_glIsEnabledi +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); +GLAPI PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; +#define glBeginTransformFeedback glad_glBeginTransformFeedback +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC)(void); +GLAPI PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; +#define glEndTransformFeedback glad_glEndTransformFeedback +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; +#define glBindBufferRange glad_glBindBufferRange +typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer); +GLAPI PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; +#define glBindBufferBase glad_glBindBufferBase +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; +#define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; +#define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying +typedef void (APIENTRYP PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); +GLAPI PFNGLCLAMPCOLORPROC glad_glClampColor; +#define glClampColor glad_glClampColor +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); +GLAPI PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; +#define glBeginConditionalRender glad_glBeginConditionalRender +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC)(void); +GLAPI PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; +#define glEndConditionalRender glad_glEndConditionalRender +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; +#define glVertexAttribIPointer glad_glVertexAttribIPointer +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint *params); +GLAPI PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; +#define glGetVertexAttribIiv glad_glGetVertexAttribIiv +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint *params); +GLAPI PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; +#define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); +GLAPI PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i; +#define glVertexAttribI1i glad_glVertexAttribI1i +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y); +GLAPI PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i; +#define glVertexAttribI2i glad_glVertexAttribI2i +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z); +GLAPI PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i; +#define glVertexAttribI3i glad_glVertexAttribI3i +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; +#define glVertexAttribI4i glad_glVertexAttribI4i +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); +GLAPI PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui; +#define glVertexAttribI1ui glad_glVertexAttribI1ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y); +GLAPI PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui; +#define glVertexAttribI2ui glad_glVertexAttribI2ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui; +#define glVertexAttribI3ui glad_glVertexAttribI3ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; +#define glVertexAttribI4ui glad_glVertexAttribI4ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv; +#define glVertexAttribI1iv glad_glVertexAttribI1iv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv; +#define glVertexAttribI2iv glad_glVertexAttribI2iv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv; +#define glVertexAttribI3iv glad_glVertexAttribI3iv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; +#define glVertexAttribI4iv glad_glVertexAttribI4iv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv; +#define glVertexAttribI1uiv glad_glVertexAttribI1uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv; +#define glVertexAttribI2uiv glad_glVertexAttribI2uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv; +#define glVertexAttribI3uiv glad_glVertexAttribI3uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; +#define glVertexAttribI4uiv glad_glVertexAttribI4uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte *v); +GLAPI PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv; +#define glVertexAttribI4bv glad_glVertexAttribI4bv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv; +#define glVertexAttribI4sv glad_glVertexAttribI4sv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte *v); +GLAPI PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv; +#define glVertexAttribI4ubv glad_glVertexAttribI4ubv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort *v); +GLAPI PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv; +#define glVertexAttribI4usv glad_glVertexAttribI4usv +typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint *params); +GLAPI PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; +#define glGetUniformuiv glad_glGetUniformuiv +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar *name); +GLAPI PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation; +#define glBindFragDataLocation glad_glBindFragDataLocation +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar *name); +GLAPI PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; +#define glGetFragDataLocation glad_glGetFragDataLocation +typedef void (APIENTRYP PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); +GLAPI PFNGLUNIFORM1UIPROC glad_glUniform1ui; +#define glUniform1ui glad_glUniform1ui +typedef void (APIENTRYP PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); +GLAPI PFNGLUNIFORM2UIPROC glad_glUniform2ui; +#define glUniform2ui glad_glUniform2ui +typedef void (APIENTRYP PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI PFNGLUNIFORM3UIPROC glad_glUniform3ui; +#define glUniform3ui glad_glUniform3ui +typedef void (APIENTRYP PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI PFNGLUNIFORM4UIPROC glad_glUniform4ui; +#define glUniform4ui glad_glUniform4ui +typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; +#define glUniform1uiv glad_glUniform1uiv +typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; +#define glUniform2uiv glad_glUniform2uiv +typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; +#define glUniform3uiv glad_glUniform3uiv +typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; +#define glUniform4uiv glad_glUniform4uiv +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint *params); +GLAPI PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv; +#define glTexParameterIiv glad_glTexParameterIiv +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint *params); +GLAPI PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv; +#define glTexParameterIuiv glad_glTexParameterIuiv +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv; +#define glGetTexParameterIiv glad_glGetTexParameterIiv +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint *params); +GLAPI PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv; +#define glGetTexParameterIuiv glad_glGetTexParameterIuiv +typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; +#define glClearBufferiv glad_glClearBufferiv +typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; +#define glClearBufferuiv glad_glClearBufferuiv +typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; +#define glClearBufferfv glad_glClearBufferfv +typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; +#define glClearBufferfi glad_glClearBufferfi +typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); +GLAPI PFNGLGETSTRINGIPROC glad_glGetStringi; +#define glGetStringi glad_glGetStringi +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); +GLAPI PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; +#define glIsRenderbuffer glad_glIsRenderbuffer +typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); +GLAPI PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; +#define glBindRenderbuffer glad_glBindRenderbuffer +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers); +GLAPI PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; +#define glDeleteRenderbuffers glad_glDeleteRenderbuffers +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers); +GLAPI PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; +#define glGenRenderbuffers glad_glGenRenderbuffers +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; +#define glRenderbufferStorage glad_glRenderbufferStorage +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; +#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); +GLAPI PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; +#define glIsFramebuffer glad_glIsFramebuffer +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); +GLAPI PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; +#define glBindFramebuffer glad_glBindFramebuffer +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers); +GLAPI PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; +#define glDeleteFramebuffers glad_glDeleteFramebuffers +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers); +GLAPI PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; +#define glGenFramebuffers glad_glGenFramebuffers +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); +GLAPI PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; +#define glCheckFramebufferStatus glad_glCheckFramebufferStatus +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D; +#define glFramebufferTexture1D glad_glFramebufferTexture1D +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; +#define glFramebufferTexture2D glad_glFramebufferTexture2D +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D; +#define glFramebufferTexture3D glad_glFramebufferTexture3D +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; +#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; +#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv +typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC)(GLenum target); +GLAPI PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; +#define glGenerateMipmap glad_glGenerateMipmap +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; +#define glBlitFramebuffer glad_glBlitFramebuffer +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; +#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; +#define glFramebufferTextureLayer glad_glFramebufferTextureLayer +typedef void * (APIENTRYP PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; +#define glMapBufferRange glad_glMapBufferRange +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); +GLAPI PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; +#define glFlushMappedBufferRange glad_glFlushMappedBufferRange +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC)(GLuint array); +GLAPI PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; +#define glBindVertexArray glad_glBindVertexArray +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint *arrays); +GLAPI PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; +#define glDeleteVertexArrays glad_glDeleteVertexArrays +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint *arrays); +GLAPI PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; +#define glGenVertexArrays glad_glGenVertexArrays +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC)(GLuint array); +GLAPI PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; +#define glIsVertexArray glad_glIsVertexArray +#endif +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 +GLAPI int GLAD_GL_VERSION_3_1; +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +GLAPI PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; +#define glDrawArraysInstanced glad_glDrawArraysInstanced +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +GLAPI PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; +#define glDrawElementsInstanced glad_glDrawElementsInstanced +typedef void (APIENTRYP PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); +GLAPI PFNGLTEXBUFFERPROC glad_glTexBuffer; +#define glTexBuffer glad_glTexBuffer +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); +GLAPI PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex; +#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex +typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; +#define glCopyBufferSubData glad_glCopyBufferSubData +typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +GLAPI PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; +#define glGetUniformIndices glad_glGetUniformIndices +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +GLAPI PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; +#define glGetActiveUniformsiv glad_glGetActiveUniformsiv +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +GLAPI PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName; +#define glGetActiveUniformName glad_glGetActiveUniformName +typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar *uniformBlockName); +GLAPI PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; +#define glGetUniformBlockIndex glad_glGetUniformBlockIndex +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +GLAPI PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; +#define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +GLAPI PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; +#define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName +typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +GLAPI PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; +#define glUniformBlockBinding glad_glUniformBlockBinding +#endif +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 +GLAPI int GLAD_GL_VERSION_3_2; +typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex; +#define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex; +#define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +GLAPI PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex; +#define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +GLAPI PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex; +#define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC)(GLenum mode); +GLAPI PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex; +#define glProvokingVertex glad_glProvokingVertex +typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); +GLAPI PFNGLFENCESYNCPROC glad_glFenceSync; +#define glFenceSync glad_glFenceSync +typedef GLboolean (APIENTRYP PFNGLISSYNCPROC)(GLsync sync); +GLAPI PFNGLISSYNCPROC glad_glIsSync; +#define glIsSync glad_glIsSync +typedef void (APIENTRYP PFNGLDELETESYNCPROC)(GLsync sync); +GLAPI PFNGLDELETESYNCPROC glad_glDeleteSync; +#define glDeleteSync glad_glDeleteSync +typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; +#define glClientWaitSync glad_glClientWaitSync +typedef void (APIENTRYP PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI PFNGLWAITSYNCPROC glad_glWaitSync; +#define glWaitSync glad_glWaitSync +typedef void (APIENTRYP PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 *data); +GLAPI PFNGLGETINTEGER64VPROC glad_glGetInteger64v; +#define glGetInteger64v glad_glGetInteger64v +typedef void (APIENTRYP PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +GLAPI PFNGLGETSYNCIVPROC glad_glGetSynciv; +#define glGetSynciv glad_glGetSynciv +typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 *data); +GLAPI PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; +#define glGetInteger64i_v glad_glGetInteger64i_v +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 *params); +GLAPI PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; +#define glGetBufferParameteri64v glad_glGetBufferParameteri64v +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture; +#define glFramebufferTexture glad_glFramebufferTexture +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample; +#define glTexImage2DMultisample glad_glTexImage2DMultisample +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample; +#define glTexImage3DMultisample glad_glTexImage3DMultisample +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat *val); +GLAPI PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv; +#define glGetMultisamplefv glad_glGetMultisamplefv +typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); +GLAPI PFNGLSAMPLEMASKIPROC glad_glSampleMaski; +#define glSampleMaski glad_glSampleMaski +#endif +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 +GLAPI int GLAD_GL_VERSION_3_3; +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GLAPI PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed; +#define glBindFragDataLocationIndexed glad_glBindFragDataLocationIndexed +typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar *name); +GLAPI PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex; +#define glGetFragDataIndex glad_glGetFragDataIndex +typedef void (APIENTRYP PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint *samplers); +GLAPI PFNGLGENSAMPLERSPROC glad_glGenSamplers; +#define glGenSamplers glad_glGenSamplers +typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint *samplers); +GLAPI PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; +#define glDeleteSamplers glad_glDeleteSamplers +typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC)(GLuint sampler); +GLAPI PFNGLISSAMPLERPROC glad_glIsSampler; +#define glIsSampler glad_glIsSampler +typedef void (APIENTRYP PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); +GLAPI PFNGLBINDSAMPLERPROC glad_glBindSampler; +#define glBindSampler glad_glBindSampler +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); +GLAPI PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; +#define glSamplerParameteri glad_glSamplerParameteri +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint *param); +GLAPI PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; +#define glSamplerParameteriv glad_glSamplerParameteriv +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param); +GLAPI PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; +#define glSamplerParameterf glad_glSamplerParameterf +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat *param); +GLAPI PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; +#define glSamplerParameterfv glad_glSamplerParameterfv +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint *param); +GLAPI PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv; +#define glSamplerParameterIiv glad_glSamplerParameterIiv +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint *param); +GLAPI PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv; +#define glSamplerParameterIuiv glad_glSamplerParameterIuiv +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint *params); +GLAPI PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; +#define glGetSamplerParameteriv glad_glGetSamplerParameteriv +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint *params); +GLAPI PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv; +#define glGetSamplerParameterIiv glad_glGetSamplerParameterIiv +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat *params); +GLAPI PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; +#define glGetSamplerParameterfv glad_glGetSamplerParameterfv +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint *params); +GLAPI PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv; +#define glGetSamplerParameterIuiv glad_glGetSamplerParameterIuiv +typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); +GLAPI PFNGLQUERYCOUNTERPROC glad_glQueryCounter; +#define glQueryCounter glad_glQueryCounter +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 *params); +GLAPI PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v; +#define glGetQueryObjecti64v glad_glGetQueryObjecti64v +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 *params); +GLAPI PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v; +#define glGetQueryObjectui64v glad_glGetQueryObjectui64v +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); +GLAPI PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; +#define glVertexAttribDivisor glad_glVertexAttribDivisor +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui; +#define glVertexAttribP1ui glad_glVertexAttribP1ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv; +#define glVertexAttribP1uiv glad_glVertexAttribP1uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui; +#define glVertexAttribP2ui glad_glVertexAttribP2ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv; +#define glVertexAttribP2uiv glad_glVertexAttribP2uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui; +#define glVertexAttribP3ui glad_glVertexAttribP3ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv; +#define glVertexAttribP3uiv glad_glVertexAttribP3uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui; +#define glVertexAttribP4ui glad_glVertexAttribP4ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv; +#define glVertexAttribP4uiv glad_glVertexAttribP4uiv +typedef void (APIENTRYP PFNGLVERTEXP2UIPROC)(GLenum type, GLuint value); +GLAPI PFNGLVERTEXP2UIPROC glad_glVertexP2ui; +#define glVertexP2ui glad_glVertexP2ui +typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC)(GLenum type, const GLuint *value); +GLAPI PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv; +#define glVertexP2uiv glad_glVertexP2uiv +typedef void (APIENTRYP PFNGLVERTEXP3UIPROC)(GLenum type, GLuint value); +GLAPI PFNGLVERTEXP3UIPROC glad_glVertexP3ui; +#define glVertexP3ui glad_glVertexP3ui +typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC)(GLenum type, const GLuint *value); +GLAPI PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv; +#define glVertexP3uiv glad_glVertexP3uiv +typedef void (APIENTRYP PFNGLVERTEXP4UIPROC)(GLenum type, GLuint value); +GLAPI PFNGLVERTEXP4UIPROC glad_glVertexP4ui; +#define glVertexP4ui glad_glVertexP4ui +typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC)(GLenum type, const GLuint *value); +GLAPI PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv; +#define glVertexP4uiv glad_glVertexP4uiv +typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC)(GLenum type, GLuint coords); +GLAPI PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui; +#define glTexCoordP1ui glad_glTexCoordP1ui +typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC)(GLenum type, const GLuint *coords); +GLAPI PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv; +#define glTexCoordP1uiv glad_glTexCoordP1uiv +typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC)(GLenum type, GLuint coords); +GLAPI PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui; +#define glTexCoordP2ui glad_glTexCoordP2ui +typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC)(GLenum type, const GLuint *coords); +GLAPI PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv; +#define glTexCoordP2uiv glad_glTexCoordP2uiv +typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC)(GLenum type, GLuint coords); +GLAPI PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui; +#define glTexCoordP3ui glad_glTexCoordP3ui +typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC)(GLenum type, const GLuint *coords); +GLAPI PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv; +#define glTexCoordP3uiv glad_glTexCoordP3uiv +typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC)(GLenum type, GLuint coords); +GLAPI PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui; +#define glTexCoordP4ui glad_glTexCoordP4ui +typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC)(GLenum type, const GLuint *coords); +GLAPI PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv; +#define glTexCoordP4uiv glad_glTexCoordP4uiv +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC)(GLenum texture, GLenum type, GLuint coords); +GLAPI PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui; +#define glMultiTexCoordP1ui glad_glMultiTexCoordP1ui +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); +GLAPI PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv; +#define glMultiTexCoordP1uiv glad_glMultiTexCoordP1uiv +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC)(GLenum texture, GLenum type, GLuint coords); +GLAPI PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui; +#define glMultiTexCoordP2ui glad_glMultiTexCoordP2ui +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); +GLAPI PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv; +#define glMultiTexCoordP2uiv glad_glMultiTexCoordP2uiv +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC)(GLenum texture, GLenum type, GLuint coords); +GLAPI PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui; +#define glMultiTexCoordP3ui glad_glMultiTexCoordP3ui +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); +GLAPI PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv; +#define glMultiTexCoordP3uiv glad_glMultiTexCoordP3uiv +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC)(GLenum texture, GLenum type, GLuint coords); +GLAPI PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui; +#define glMultiTexCoordP4ui glad_glMultiTexCoordP4ui +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); +GLAPI PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv; +#define glMultiTexCoordP4uiv glad_glMultiTexCoordP4uiv +typedef void (APIENTRYP PFNGLNORMALP3UIPROC)(GLenum type, GLuint coords); +GLAPI PFNGLNORMALP3UIPROC glad_glNormalP3ui; +#define glNormalP3ui glad_glNormalP3ui +typedef void (APIENTRYP PFNGLNORMALP3UIVPROC)(GLenum type, const GLuint *coords); +GLAPI PFNGLNORMALP3UIVPROC glad_glNormalP3uiv; +#define glNormalP3uiv glad_glNormalP3uiv +typedef void (APIENTRYP PFNGLCOLORP3UIPROC)(GLenum type, GLuint color); +GLAPI PFNGLCOLORP3UIPROC glad_glColorP3ui; +#define glColorP3ui glad_glColorP3ui +typedef void (APIENTRYP PFNGLCOLORP3UIVPROC)(GLenum type, const GLuint *color); +GLAPI PFNGLCOLORP3UIVPROC glad_glColorP3uiv; +#define glColorP3uiv glad_glColorP3uiv +typedef void (APIENTRYP PFNGLCOLORP4UIPROC)(GLenum type, GLuint color); +GLAPI PFNGLCOLORP4UIPROC glad_glColorP4ui; +#define glColorP4ui glad_glColorP4ui +typedef void (APIENTRYP PFNGLCOLORP4UIVPROC)(GLenum type, const GLuint *color); +GLAPI PFNGLCOLORP4UIVPROC glad_glColorP4uiv; +#define glColorP4uiv glad_glColorP4uiv +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC)(GLenum type, GLuint color); +GLAPI PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui; +#define glSecondaryColorP3ui glad_glSecondaryColorP3ui +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC)(GLenum type, const GLuint *color); +GLAPI PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv; +#define glSecondaryColorP3uiv glad_glSecondaryColorP3uiv +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/dep/glm/CMakeLists.txt b/dep/glm/CMakeLists.txt new file mode 100644 index 0000000..4ff51c8 --- /dev/null +++ b/dep/glm/CMakeLists.txt @@ -0,0 +1,70 @@ +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) +file(GLOB_RECURSE CORE_INLINE ./detail/*.inl) +file(GLOB_RECURSE CORE_HEADER ./detail/*.hpp) + +file(GLOB_RECURSE EXT_SOURCE ./ext/*.cpp) +file(GLOB_RECURSE EXT_INLINE ./ext/*.inl) +file(GLOB_RECURSE EXT_HEADER ./ext/*.hpp) + +file(GLOB_RECURSE GTC_SOURCE ./gtc/*.cpp) +file(GLOB_RECURSE GTC_INLINE ./gtc/*.inl) +file(GLOB_RECURSE GTC_HEADER ./gtc/*.hpp) + +file(GLOB_RECURSE GTX_SOURCE ./gtx/*.cpp) +file(GLOB_RECURSE GTX_INLINE ./gtx/*.inl) +file(GLOB_RECURSE GTX_HEADER ./gtx/*.hpp) + +file(GLOB_RECURSE SIMD_SOURCE ./simd/*.cpp) +file(GLOB_RECURSE SIMD_INLINE ./simd/*.inl) +file(GLOB_RECURSE SIMD_HEADER ./simd/*.h) + +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}) +source_group("EXT Files" FILES ${EXT_SOURCE}) +source_group("EXT Files" FILES ${EXT_INLINE}) +source_group("EXT Files" FILES ${EXT_HEADER}) +source_group("GTC Files" FILES ${GTC_SOURCE}) +source_group("GTC Files" FILES ${GTC_INLINE}) +source_group("GTC Files" FILES ${GTC_HEADER}) +source_group("GTX Files" FILES ${GTX_SOURCE}) +source_group("GTX Files" FILES ${GTX_INLINE}) +source_group("GTX Files" FILES ${GTX_HEADER}) +source_group("SIMD Files" FILES ${SIMD_SOURCE}) +source_group("SIMD Files" FILES ${SIMD_INLINE}) +source_group("SIMD Files" FILES ${SIMD_HEADER}) + +add_library(glm INTERFACE) +target_include_directories(glm INTERFACE ../) + +if(BUILD_STATIC_LIBS) +add_library(glm_static STATIC ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT} + ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} + ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} + ${EXT_SOURCE} ${EXT_INLINE} ${EXT_HEADER} + ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} + ${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER} + ${SIMD_SOURCE} ${SIMD_INLINE} ${SIMD_HEADER}) + target_link_libraries(glm_static PUBLIC glm) + add_library(glm::glm_static ALIAS glm_static) +endif() + +if(BUILD_SHARED_LIBS) +add_library(glm_shared SHARED ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT} + ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} + ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} + ${EXT_SOURCE} ${EXT_INLINE} ${EXT_HEADER} + ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} + ${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER} + ${SIMD_SOURCE} ${SIMD_INLINE} ${SIMD_HEADER}) + target_link_libraries(glm_shared PUBLIC glm) + add_library(glm::glm_shared ALIAS glm_shared) +endif() diff --git a/dep/glm/common.hpp b/dep/glm/common.hpp new file mode 100644 index 0000000..0328dc9 --- /dev/null +++ b/dep/glm/common.hpp @@ -0,0 +1,539 @@ +/// @ref core +/// @file glm/common.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.3 Common Functions +/// +/// @defgroup core_func_common Common functions +/// @ingroup core +/// +/// Provides GLSL common functions +/// +/// These all operate component-wise. The description is per component. +/// +/// Include to use these core features. + +#pragma once + +#include "detail/qualifier.hpp" +#include "detail/_fixes.hpp" + +namespace glm +{ + /// @addtogroup core_func_common + /// @{ + + /// Returns x if x >= 0; otherwise, it returns -x. + /// + /// @tparam genType floating-point or signed integer; scalar or vector types. + /// + /// @see GLSL abs man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR genType abs(genType x); + + /// Returns x if x >= 0; otherwise, it returns -x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL abs man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec abs(vec const& x); + + /// Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL sign man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec sign(vec const& x); + + /// Returns a value equal to the nearest integer that is less then or equal to x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL floor man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec floor(vec const& x); + + /// Returns a value equal to the nearest integer to x + /// whose absolute value is not larger than the absolute value of x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL trunc man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec trunc(vec const& x); + + /// Returns a value equal to the nearest integer to x. + /// The fraction 0.5 will round in a direction chosen by the + /// implementation, presumably the direction that is fastest. + /// This includes the possibility that round(x) returns the + /// same value as roundEven(x) for all values of x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL round man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec round(vec const& x); + + /// 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.) + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL roundEven man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + /// @see New round to even technique + template + GLM_FUNC_DECL vec roundEven(vec const& x); + + /// Returns a value equal to the nearest integer + /// that is greater than or equal to x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL ceil man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec ceil(vec const& x); + + /// Return x - floor(x). + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL fract man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType fract(genType x); + + /// Return x - floor(x). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL fract man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec fract(vec const& x); + + template + GLM_FUNC_DECL genType mod(genType x, genType y); + + template + GLM_FUNC_DECL vec mod(vec const& x, T y); + + /// Modulus. Returns x - y * floor(x / y) + /// for each component in x using the floating point value y. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types, include glm/gtc/integer for integer scalar types support + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL mod man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec mod(vec const& x, vec const& y); + + /// Returns the fractional part of x and sets i to the integer + /// part (as a whole number floating point value). Both the + /// return value and the output parameter will have the same + /// sign as x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL modf man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType modf(genType x, genType& i); + + /// Returns y if y < x; otherwise, it returns x. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see GLSL min man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR genType min(genType x, genType y); + + /// Returns y if y < x; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL min man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec min(vec const& x, T y); + + /// Returns y if y < x; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL min man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec min(vec const& x, vec const& y); + + /// Returns y if x < y; otherwise, it returns x. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see GLSL max man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR genType max(genType x, genType y); + + /// Returns y if x < y; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL max man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec max(vec const& x, T y); + + /// Returns y if x < y; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL max man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec max(vec const& x, vec const& y); + + /// Returns min(max(x, minVal), maxVal) for each component in x + /// using the floating-point values minVal and maxVal. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see GLSL clamp man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR genType clamp(genType x, genType minVal, genType maxVal); + + /// Returns min(max(x, minVal), maxVal) for each component in x + /// using the floating-point values minVal and maxVal. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL clamp man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec clamp(vec const& x, T minVal, T maxVal); + + /// Returns min(max(x, minVal), maxVal) for each component in x + /// using the floating-point values minVal and maxVal. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL clamp man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec clamp(vec const& x, vec const& minVal, vec const& maxVal); + + /// 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]. + /// + /// 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 + /// component of 'a' that is true, the corresponding + /// component of 'y' is returned. Components of 'x' and 'y' that + /// are not selected are allowed to be invalid floating point + /// values and will have no effect on the results. Thus, this + /// provides different functionality than + /// genType mix(genType x, genType y, genType(a)) + /// where a is a Boolean vector. + /// + /// @see GLSL mix man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + /// + /// @param[in] x Value to interpolate. + /// @param[in] y Value to interpolate. + /// @param[in] a Interpolant. + /// + /// @tparam genTypeT Floating point scalar or vector. + /// @tparam genTypeU Floating point or boolean scalar or vector. It can't be a vector if it is the length of genTypeT. + /// + /// @code + /// #include + /// ... + /// float a; + /// bool b; + /// glm::dvec3 e; + /// glm::dvec3 f; + /// glm::vec4 g; + /// glm::vec4 h; + /// ... + /// glm::vec4 r = glm::mix(g, h, a); // Interpolate with a floating-point scalar two vectors. + /// glm::vec4 s = glm::mix(g, h, b); // Returns g or h; + /// glm::dvec3 t = glm::mix(e, f, a); // Types of the third parameter is not required to match with the first and the second. + /// glm::vec4 u = glm::mix(g, h, r); // Interpolations can be perform per component with a vector for the last parameter. + /// @endcode + template + GLM_FUNC_DECL genTypeT mix(genTypeT x, genTypeT y, genTypeU a); + + template + GLM_FUNC_DECL vec mix(vec const& x, vec const& y, vec const& a); + + template + GLM_FUNC_DECL vec mix(vec const& x, vec const& y, U a); + + /// Returns 0.0 if x < edge, otherwise it returns 1.0 for each component of a genType. + /// + /// @see GLSL step man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType step(genType edge, genType x); + + /// Returns 0.0 if x < edge, otherwise it returns 1.0. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL step man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec step(T edge, vec const& x); + + /// Returns 0.0 if x < edge, otherwise it returns 1.0. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL step man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec step(vec const& edge, vec const& x); + + /// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and + /// performs smooth Hermite interpolation between 0 and 1 + /// when edge0 < x < edge1. This is useful in cases where + /// you would want a threshold function with a smooth + /// transition. This is equivalent to: + /// genType t; + /// t = clamp ((x - edge0) / (edge1 - edge0), 0, 1); + /// return t * t * (3 - 2 * t); + /// Results are undefined if edge0 >= edge1. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL smoothstep man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType smoothstep(genType edge0, genType edge1, genType x); + + template + GLM_FUNC_DECL vec smoothstep(T edge0, T edge1, vec const& x); + + template + GLM_FUNC_DECL vec smoothstep(vec const& edge0, vec const& edge1, vec const& x); + + /// Returns true if x holds a NaN (not a number) + /// representation in the underlying implementation's set of + /// floating point representations. Returns false otherwise, + /// including for implementations with no NaN + /// representations. + /// + /// /!\ When using compiler fast math, this function may fail. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL isnan man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec isnan(vec const& x); + + /// Returns true if x holds a positive infinity or negative + /// infinity representation in the underlying implementation's + /// set of floating point representations. Returns false + /// otherwise, including for implementations with no infinity + /// representations. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL isinf man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec isinf(vec const& x); + + /// Returns a signed integer value representing + /// the encoding of a floating-point value. The floating-point + /// value's bit-level representation is preserved. + /// + /// @see GLSL floatBitsToInt man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + GLM_FUNC_DECL int floatBitsToInt(float const& v); + + /// Returns a signed integer value representing + /// the encoding of a floating-point value. The floatingpoint + /// value's bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL floatBitsToInt man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec floatBitsToInt(vec const& v); + + /// Returns a unsigned integer value representing + /// the encoding of a floating-point value. The floatingpoint + /// value's bit-level representation is preserved. + /// + /// @see GLSL floatBitsToUint man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + GLM_FUNC_DECL uint floatBitsToUint(float const& v); + + /// Returns a unsigned integer value representing + /// the encoding of a floating-point value. The floatingpoint + /// value's bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL floatBitsToUint man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec floatBitsToUint(vec const& v); + + /// Returns a floating-point value corresponding to a signed + /// integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @see GLSL intBitsToFloat man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + GLM_FUNC_DECL float intBitsToFloat(int const& v); + + /// Returns a floating-point value corresponding to a signed + /// integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL intBitsToFloat man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec intBitsToFloat(vec const& v); + + /// Returns a floating-point value corresponding to a + /// unsigned integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @see GLSL uintBitsToFloat man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + GLM_FUNC_DECL float uintBitsToFloat(uint const& v); + + /// Returns a floating-point value corresponding to a + /// unsigned integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL uintBitsToFloat man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL vec uintBitsToFloat(vec const& v); + + /// Computes and returns a * b + c. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL fma man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType fma(genType const& a, genType const& b, genType const& c); + + /// Splits x into a floating-point significand in the range + /// [0.5, 1.0) and an integral exponent of two, such that: + /// x = significand * exp(2, exponent) + /// + /// The significand is returned by the function and the + /// exponent is returned in the parameter exp. For a + /// floating-point value of zero, the significant and exponent + /// are both zero. For a floating-point value that is an + /// infinity or is not a number, the results are undefined. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL frexp man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType frexp(genType x, int& exp); + + template + GLM_FUNC_DECL vec frexp(vec const& v, vec& exp); + + /// Builds a floating-point number from x and the + /// corresponding integral exponent of two in exp, returning: + /// significand * exp(2, exponent) + /// + /// If this product is too large to be represented in the + /// floating-point type, the result is undefined. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL ldexp man page; + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL genType ldexp(genType const& x, int const& exp); + + template + GLM_FUNC_DECL vec ldexp(vec const& v, vec const& exp); + + /// @} +}//namespace glm + +#include "detail/func_common.inl" + diff --git a/dep/glm/detail/_features.hpp b/dep/glm/detail/_features.hpp new file mode 100644 index 0000000..b0cbe9f --- /dev/null +++ b/dep/glm/detail/_features.hpp @@ -0,0 +1,394 @@ +#pragma once + +// #define GLM_CXX98_EXCEPTIONS +// #define GLM_CXX98_RTTI + +// #define GLM_CXX11_RVALUE_REFERENCES +// Rvalue references - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html + +// GLM_CXX11_TRAILING_RETURN +// Rvalue references for *this - GCC not supported +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm + +// GLM_CXX11_NONSTATIC_MEMBER_INIT +// Initialization of class objects by rvalues - GCC any +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1610.html + +// GLM_CXX11_NONSTATIC_MEMBER_INIT +// Non-static data member initializers - GCC 4.7 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm + +// #define GLM_CXX11_VARIADIC_TEMPLATE +// Variadic templates - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf + +// +// Extending variadic template template parameters - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf + +// #define GLM_CXX11_GENERALIZED_INITIALIZERS +// Initializer lists - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm + +// #define GLM_CXX11_STATIC_ASSERT +// Static assertions - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html + +// #define GLM_CXX11_AUTO_TYPE +// auto-typed variables - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf + +// #define GLM_CXX11_AUTO_TYPE +// Multi-declarator auto - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1737.pdf + +// #define GLM_CXX11_AUTO_TYPE +// Removal of auto as a storage-class specifier - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm + +// #define GLM_CXX11_AUTO_TYPE +// New function declarator syntax - GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm + +// #define GLM_CXX11_LAMBDAS +// New wording for C++0x lambdas - GCC 4.5 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2927.pdf + +// #define GLM_CXX11_DECLTYPE +// Declared type of an expression - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf + +// +// Right angle brackets - GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html + +// +// Default template arguments for function templates DR226 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226 + +// +// Solving the SFINAE problem for expressions DR339 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html + +// #define GLM_CXX11_ALIAS_TEMPLATE +// Template aliases N2258 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf + +// +// Extern templates N1987 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm + +// #define GLM_CXX11_NULLPTR +// Null pointer constant N2431 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf + +// #define GLM_CXX11_STRONG_ENUMS +// Strongly-typed enums N2347 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf + +// +// Forward declarations for enums N2764 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf + +// +// Generalized attributes N2761 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf + +// +// Generalized constant expressions N2235 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf + +// +// Alignment support N2341 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf + +// #define GLM_CXX11_DELEGATING_CONSTRUCTORS +// Delegating constructors N1986 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf + +// +// Inheriting constructors N2540 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm + +// #define GLM_CXX11_EXPLICIT_CONVERSIONS +// Explicit conversion operators N2437 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf + +// +// New character types N2249 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2249.html + +// +// Unicode string literals N2442 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm + +// +// Raw string literals N2442 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm + +// +// Universal character name literals N2170 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html + +// #define GLM_CXX11_USER_LITERALS +// User-defined literals N2765 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.pdf + +// +// Standard Layout Types N2342 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm + +// #define GLM_CXX11_DEFAULTED_FUNCTIONS +// #define GLM_CXX11_DELETED_FUNCTIONS +// Defaulted and deleted functions N2346 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm + +// +// Extended friend declarations N1791 GCC 4.7 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf + +// +// Extending sizeof N2253 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html + +// #define GLM_CXX11_INLINE_NAMESPACES +// Inline namespaces N2535 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm + +// #define GLM_CXX11_UNRESTRICTED_UNIONS +// Unrestricted unions N2544 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf + +// #define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS +// Local and unnamed types as template arguments N2657 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm + +// #define GLM_CXX11_RANGE_FOR +// Range-based for N2930 GCC 4.6 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2930.html + +// #define GLM_CXX11_OVERRIDE_CONTROL +// Explicit virtual overrides N2928 N3206 N3272 GCC 4.7 +// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2928.htm +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3272.htm + +// +// Minimal support for garbage collection and reachability-based leak detection N2670 No +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2670.htm + +// #define GLM_CXX11_NOEXCEPT +// Allowing move constructors to throw [noexcept] N3050 GCC 4.6 (core language only) +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html + +// +// Defining move special member functions N3053 GCC 4.6 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html + +// +// Sequence points N2239 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html + +// +// Atomic operations N2427 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html + +// +// Strong Compare and Exchange N2748 GCC 4.5 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html + +// +// Bidirectional Fences N2752 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2752.htm + +// +// Memory model N2429 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2429.htm + +// +// Data-dependency ordering: atomics and memory model N2664 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2664.htm + +// +// Propagating exceptions N2179 GCC 4.4 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html + +// +// Abandoning a process and at_quick_exit N2440 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2440.htm + +// +// Allow atomics use in signal handlers N2547 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2547.htm + +// +// Thread-local storage N2659 GCC 4.8 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm + +// +// Dynamic initialization and destruction with concurrency N2660 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm + +// +// __func__ predefined identifier N2340 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm + +// +// C99 preprocessor N1653 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm + +// +// long long N1811 GCC 4.3 +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf + +// +// Extended integral types N1988 Yes +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1988.pdf + +#if(GLM_COMPILER & GLM_COMPILER_GCC) + +# define GLM_CXX11_STATIC_ASSERT + +#elif(GLM_COMPILER & GLM_COMPILER_CLANG) +# if(__has_feature(cxx_exceptions)) +# define GLM_CXX98_EXCEPTIONS +# endif + +# if(__has_feature(cxx_rtti)) +# define GLM_CXX98_RTTI +# endif + +# if(__has_feature(cxx_access_control_sfinae)) +# define GLM_CXX11_ACCESS_CONTROL_SFINAE +# endif + +# if(__has_feature(cxx_alias_templates)) +# define GLM_CXX11_ALIAS_TEMPLATE +# endif + +# if(__has_feature(cxx_alignas)) +# define GLM_CXX11_ALIGNAS +# endif + +# if(__has_feature(cxx_attributes)) +# define GLM_CXX11_ATTRIBUTES +# endif + +# if(__has_feature(cxx_constexpr)) +# define GLM_CXX11_CONSTEXPR +# endif + +# if(__has_feature(cxx_decltype)) +# define GLM_CXX11_DECLTYPE +# endif + +# if(__has_feature(cxx_default_function_template_args)) +# define GLM_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS +# endif + +# if(__has_feature(cxx_defaulted_functions)) +# define GLM_CXX11_DEFAULTED_FUNCTIONS +# endif + +# if(__has_feature(cxx_delegating_constructors)) +# define GLM_CXX11_DELEGATING_CONSTRUCTORS +# endif + +# if(__has_feature(cxx_deleted_functions)) +# define GLM_CXX11_DELETED_FUNCTIONS +# endif + +# if(__has_feature(cxx_explicit_conversions)) +# define GLM_CXX11_EXPLICIT_CONVERSIONS +# endif + +# if(__has_feature(cxx_generalized_initializers)) +# define GLM_CXX11_GENERALIZED_INITIALIZERS +# endif + +# if(__has_feature(cxx_implicit_moves)) +# define GLM_CXX11_IMPLICIT_MOVES +# endif + +# if(__has_feature(cxx_inheriting_constructors)) +# define GLM_CXX11_INHERITING_CONSTRUCTORS +# endif + +# if(__has_feature(cxx_inline_namespaces)) +# define GLM_CXX11_INLINE_NAMESPACES +# endif + +# if(__has_feature(cxx_lambdas)) +# define GLM_CXX11_LAMBDAS +# endif + +# if(__has_feature(cxx_local_type_template_args)) +# define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS +# endif + +# if(__has_feature(cxx_noexcept)) +# define GLM_CXX11_NOEXCEPT +# endif + +# if(__has_feature(cxx_nonstatic_member_init)) +# define GLM_CXX11_NONSTATIC_MEMBER_INIT +# endif + +# if(__has_feature(cxx_nullptr)) +# define GLM_CXX11_NULLPTR +# endif + +# if(__has_feature(cxx_override_control)) +# define GLM_CXX11_OVERRIDE_CONTROL +# endif + +# if(__has_feature(cxx_reference_qualified_functions)) +# define GLM_CXX11_REFERENCE_QUALIFIED_FUNCTIONS +# endif + +# if(__has_feature(cxx_range_for)) +# define GLM_CXX11_RANGE_FOR +# endif + +# if(__has_feature(cxx_raw_string_literals)) +# define GLM_CXX11_RAW_STRING_LITERALS +# endif + +# if(__has_feature(cxx_rvalue_references)) +# define GLM_CXX11_RVALUE_REFERENCES +# endif + +# if(__has_feature(cxx_static_assert)) +# define GLM_CXX11_STATIC_ASSERT +# endif + +# if(__has_feature(cxx_auto_type)) +# define GLM_CXX11_AUTO_TYPE +# endif + +# if(__has_feature(cxx_strong_enums)) +# define GLM_CXX11_STRONG_ENUMS +# endif + +# if(__has_feature(cxx_trailing_return)) +# define GLM_CXX11_TRAILING_RETURN +# endif + +# if(__has_feature(cxx_unicode_literals)) +# define GLM_CXX11_UNICODE_LITERALS +# endif + +# if(__has_feature(cxx_unrestricted_unions)) +# define GLM_CXX11_UNRESTRICTED_UNIONS +# endif + +# if(__has_feature(cxx_user_literals)) +# define GLM_CXX11_USER_LITERALS +# endif + +# if(__has_feature(cxx_variadic_templates)) +# define GLM_CXX11_VARIADIC_TEMPLATES +# endif + +#endif//(GLM_COMPILER & GLM_COMPILER_CLANG) diff --git a/dep/glm/detail/_fixes.hpp b/dep/glm/detail/_fixes.hpp new file mode 100644 index 0000000..a503c7c --- /dev/null +++ b/dep/glm/detail/_fixes.hpp @@ -0,0 +1,27 @@ +#include + +//! Workaround for compatibility with other libraries +#ifdef max +#undef max +#endif + +//! Workaround for compatibility with other libraries +#ifdef min +#undef min +#endif + +//! Workaround for Android +#ifdef isnan +#undef isnan +#endif + +//! Workaround for Android +#ifdef isinf +#undef isinf +#endif + +//! Workaround for Chrone Native Client +#ifdef log2 +#undef log2 +#endif + diff --git a/dep/glm/detail/_noise.hpp b/dep/glm/detail/_noise.hpp new file mode 100644 index 0000000..5a874a0 --- /dev/null +++ b/dep/glm/detail/_noise.hpp @@ -0,0 +1,81 @@ +#pragma once + +#include "../common.hpp" + +namespace glm{ +namespace detail +{ + template + GLM_FUNC_QUALIFIER T mod289(T const& x) + { + return x - floor(x * (static_cast(1.0) / static_cast(289.0))) * static_cast(289.0); + } + + template + GLM_FUNC_QUALIFIER T permute(T const& x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> permute(vec<2, T, Q> const& x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> permute(vec<3, T, Q> const& x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> permute(vec<4, T, Q> const& x) + { + return mod289(((x * static_cast(34)) + static_cast(1)) * x); + } + + template + GLM_FUNC_QUALIFIER T taylorInvSqrt(T const& r) + { + return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> taylorInvSqrt(vec<2, T, Q> const& r) + { + return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> taylorInvSqrt(vec<3, T, Q> const& r) + { + return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> taylorInvSqrt(vec<4, T, Q> const& r) + { + return static_cast(1.79284291400159) - static_cast(0.85373472095314) * r; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> fade(vec<2, T, Q> const& t) + { + return (t * t * t) * (t * (t * static_cast(6) - static_cast(15)) + static_cast(10)); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> fade(vec<3, T, Q> const& t) + { + return (t * t * t) * (t * (t * static_cast(6) - static_cast(15)) + static_cast(10)); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> fade(vec<4, T, Q> const& t) + { + return (t * t * t) * (t * (t * static_cast(6) - static_cast(15)) + static_cast(10)); + } +}//namespace detail +}//namespace glm + diff --git a/dep/glm/detail/_swizzle.hpp b/dep/glm/detail/_swizzle.hpp new file mode 100644 index 0000000..87896ef --- /dev/null +++ b/dep/glm/detail/_swizzle.hpp @@ -0,0 +1,804 @@ +#pragma once + +namespace glm{ +namespace detail +{ + // Internal class for implementing swizzle operators + template + struct _swizzle_base0 + { + protected: + GLM_FUNC_QUALIFIER T& elem(size_t i){ return (reinterpret_cast(_buffer))[i]; } + GLM_FUNC_QUALIFIER T const& elem(size_t i) const{ return (reinterpret_cast(_buffer))[i]; } + + // Use an opaque buffer to *ensure* the compiler doesn't call a constructor. + // The size 1 buffer is assumed to aligned to the actual members so that the + // elem() + char _buffer[1]; + }; + + template + struct _swizzle_base1 : public _swizzle_base0 + { + }; + + template + struct _swizzle_base1<2, T, Q, E0,E1,-1,-2, Aligned> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<2, T, Q> operator ()() const { return vec<2, T, Q>(this->elem(E0), this->elem(E1)); } + }; + + template + struct _swizzle_base1<3, T, Q, E0,E1,E2,-1, Aligned> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<3, T, Q> operator ()() const { return vec<3, T, Q>(this->elem(E0), this->elem(E1), this->elem(E2)); } + }; + + template + struct _swizzle_base1<4, T, Q, E0,E1,E2,E3, Aligned> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<4, T, Q> operator ()() const { return vec<4, T, Q>(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); } + }; + + // Internal class for implementing swizzle operators + /* + Template parameters: + + T = type of scalar values (e.g. float, double) + N = number of components in the vector (e.g. 3) + E0...3 = what index the n-th element of this swizzle refers to in the unswizzled vec + + DUPLICATE_ELEMENTS = 1 if there is a repeated element, 0 otherwise (used to specialize swizzles + containing duplicate elements so that they cannot be used as r-values). + */ + template + struct _swizzle_base2 : public _swizzle_base1::value> + { + struct op_equal + { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) const{ e = t; } + }; + + struct op_minus + { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) const{ e -= t; } + }; + + struct op_plus + { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) const{ e += t; } + }; + + struct op_mul + { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) const{ e *= t; } + }; + + struct op_div + { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) const{ e /= t; } + }; + + public: + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (const T& t) + { + for (int i = 0; i < N; ++i) + (*this)[i] = t; + return *this; + } + + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (vec const& that) + { + _apply_op(that, op_equal()); + return *this; + } + + GLM_FUNC_QUALIFIER void operator -= (vec const& that) + { + _apply_op(that, op_minus()); + } + + GLM_FUNC_QUALIFIER void operator += (vec const& that) + { + _apply_op(that, op_plus()); + } + + GLM_FUNC_QUALIFIER void operator *= (vec const& that) + { + _apply_op(that, op_mul()); + } + + GLM_FUNC_QUALIFIER void operator /= (vec const& that) + { + _apply_op(that, op_div()); + } + + GLM_FUNC_QUALIFIER T& operator[](size_t i) + { + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + GLM_FUNC_QUALIFIER T operator[](size_t i) const + { + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + + protected: + template + GLM_FUNC_QUALIFIER void _apply_op(vec const& that, const U& op) + { + // Make a copy of the data in this == &that. + // The copier should optimize out the copy in cases where the function is + // properly inlined and the copy is not necessary. + T t[N]; + for (int i = 0; i < N; ++i) + t[i] = that[i]; + for (int i = 0; i < N; ++i) + op( (*this)[i], t[i] ); + } + }; + + // Specialization for swizzles containing duplicate elements. These cannot be modified. + template + struct _swizzle_base2 : public _swizzle_base1::value> + { + struct Stub {}; + + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (Stub const&) { return *this; } + + GLM_FUNC_QUALIFIER T operator[] (size_t i) const + { + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + }; + + template + struct _swizzle : public _swizzle_base2 + { + typedef _swizzle_base2 base_type; + + using base_type::operator=; + + GLM_FUNC_QUALIFIER operator vec () const { return (*this)(); } + }; + +// +// To prevent the C++ syntax from getting entirely overwhelming, define some alias macros +// +#define GLM_SWIZZLE_TEMPLATE1 template +#define GLM_SWIZZLE_TEMPLATE2 template +#define GLM_SWIZZLE_TYPE1 _swizzle +#define GLM_SWIZZLE_TYPE2 _swizzle + +// +// Wrapper for a binary operator (e.g. u.yy + v.zy) +// +#define GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ + GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER vec operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b) \ + { \ + return a() OPERAND b(); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const vec& b) \ + { \ + return a() OPERAND b; \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec operator OPERAND ( const vec& a, const GLM_SWIZZLE_TYPE1& b) \ + { \ + return a OPERAND b(); \ + } + +// +// Wrapper for a operand between a swizzle and a binary (e.g. 1.0f - u.xyz) +// +#define GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const T& b) \ + { \ + return a() OPERAND b; \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec operator OPERAND ( const T& a, const GLM_SWIZZLE_TYPE1& b) \ + { \ + return a OPERAND b(); \ + } + +// +// Macro for wrapping a function taking one argument (e.g. abs()) +// +#define GLM_SWIZZLE_FUNCTION_1_ARGS(RETURN_TYPE,FUNCTION) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a) \ + { \ + return FUNCTION(a()); \ + } + +// +// Macro for wrapping a function taking two vector arguments (e.g. dot()). +// +#define GLM_SWIZZLE_FUNCTION_2_ARGS(RETURN_TYPE,FUNCTION) \ + GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b) \ + { \ + return FUNCTION(a(), b()); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE1& b) \ + { \ + return FUNCTION(a(), b()); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const typename V& b) \ + { \ + return FUNCTION(a(), b); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const V& a, const GLM_SWIZZLE_TYPE1& b) \ + { \ + return FUNCTION(a, b()); \ + } + +// +// Macro for wrapping a function take 2 vec arguments followed by a scalar (e.g. mix()). +// +#define GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(RETURN_TYPE,FUNCTION) \ + GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b, const T& c) \ + { \ + return FUNCTION(a(), b(), c); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE1& b, const T& c) \ + { \ + return FUNCTION(a(), b(), c); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const typename S0::vec_type& b, const T& c)\ + { \ + return FUNCTION(a(), b, c); \ + } \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const typename V& a, const GLM_SWIZZLE_TYPE1& b, const T& c) \ + { \ + return FUNCTION(a, b(), c); \ + } + +}//namespace detail +}//namespace glm + +namespace glm +{ + namespace detail + { + GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(-) + GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(*) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(+) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(-) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(*) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(/) + } + + // + // Swizzles are distinct types from the unswizzled type. The below macros will + // provide template specializations for the swizzle types for the given functions + // so that the compiler does not have any ambiguity to choosing how to handle + // the function. + // + // The alternative is to use the operator()() when calling the function in order + // to explicitly convert the swizzled type to the unswizzled type. + // + + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, abs); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acos); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acosh); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, all); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, any); + + //GLM_SWIZZLE_FUNCTION_2_ARGS(value_type, dot); + //GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, cross); + //GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, step); + //GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(vec_type, mix); +} + +#define GLM_SWIZZLE2_2_MEMBERS(T, Q, E0,E1) \ + struct { detail::_swizzle<2, T, Q, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2, T, Q, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2, T, Q, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2, T, Q, 1,1,-1,-2> E1 ## E1; }; + +#define GLM_SWIZZLE2_3_MEMBERS(T, Q, E0,E1) \ + struct { detail::_swizzle<3,T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3,T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 1,1,1,-1> E1 ## E1 ## E1; }; + +#define GLM_SWIZZLE2_4_MEMBERS(T, Q, E0,E1) \ + struct { detail::_swizzle<4,T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; + +#define GLM_SWIZZLE3_2_MEMBERS(T, Q, E0,E1,E2) \ + struct { detail::_swizzle<2,T, Q, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 0,2,-1,-2> E0 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 1,1,-1,-2> E1 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 1,2,-1,-2> E1 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 2,0,-1,-2> E2 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 2,1,-1,-2> E2 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 2,2,-1,-2> E2 ## E2; }; + +#define GLM_SWIZZLE3_3_MEMBERS(T, Q ,E0,E1,E2) \ + struct { detail::_swizzle<3, T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,2,-1> E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,2,-1> E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,0,-1> E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,1,-1> E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,2,-1> E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,2,-1> E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,1,-1> E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,2,-1> E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,0,-1> E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,1,-1> E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,2,-1> E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,0,-1> E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,1,-1> E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,2,-1> E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,0,-1> E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,1,-1> E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,2,-1> E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,0,-1> E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,1,-1> E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,2,-1> E2 ## E2 ## E2; }; + +#define GLM_SWIZZLE3_4_MEMBERS(T, Q, E0,E1,E2) \ + struct { detail::_swizzle<4,T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; + +#define GLM_SWIZZLE4_2_MEMBERS(T, Q, E0,E1,E2,E3) \ + struct { detail::_swizzle<2,T, Q, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 0,2,-1,-2> E0 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 0,3,-1,-2> E0 ## E3; }; \ + struct { detail::_swizzle<2,T, Q, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 1,1,-1,-2> E1 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 1,2,-1,-2> E1 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 1,3,-1,-2> E1 ## E3; }; \ + struct { detail::_swizzle<2,T, Q, 2,0,-1,-2> E2 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 2,1,-1,-2> E2 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 2,2,-1,-2> E2 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 2,3,-1,-2> E2 ## E3; }; \ + struct { detail::_swizzle<2,T, Q, 3,0,-1,-2> E3 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 3,1,-1,-2> E3 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 3,2,-1,-2> E3 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 3,3,-1,-2> E3 ## E3; }; + +#define GLM_SWIZZLE4_3_MEMBERS(T, Q, E0,E1,E2,E3) \ + struct { detail::_swizzle<3, T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,2,-1> E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,3,-1> E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,2,-1> E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,3,-1> E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,0,-1> E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,1,-1> E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,2,-1> E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,3,-1> E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,0,-1> E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,1,-1> E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,2,-1> E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,3,-1> E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,2,-1> E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,3,-1> E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,1,-1> E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,2,-1> E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,3,-1> E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,0,-1> E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,1,-1> E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,2,-1> E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,3,-1> E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,0,-1> E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,1,-1> E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,2,-1> E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,3,-1> E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,0,-1> E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,1,-1> E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,2,-1> E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,3,-1> E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,0,-1> E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,1,-1> E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,2,-1> E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,3,-1> E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,0,-1> E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,1,-1> E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,2,-1> E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,3,-1> E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,0,-1> E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,1,-1> E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,2,-1> E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,3,-1> E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,0,-1> E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,1,-1> E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,2,-1> E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,3,-1> E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,0,-1> E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,1,-1> E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,2,-1> E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,3,-1> E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,0,-1> E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,1,-1> E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,2,-1> E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,3,-1> E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,0,-1> E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,1,-1> E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,2,-1> E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,3,-1> E3 ## E3 ## E3; }; + +#define GLM_SWIZZLE4_4_MEMBERS(T, Q, E0,E1,E2,E3) \ + struct { detail::_swizzle<4, T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,0,3> E0 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,3> E0 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,3> E0 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,0> E0 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,1> E0 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,2> E0 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,3> E0 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,3> E0 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,3> E0 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,3> E0 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,0> E0 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,1> E0 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,2> E0 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,3> E0 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,3> E0 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,3> E0 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,3> E0 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,0> E0 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,1> E0 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,2> E0 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,3> E0 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,0> E0 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,1> E0 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,2> E0 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,3> E0 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,0> E0 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,1> E0 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,2> E0 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,3> E0 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,0> E0 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,1> E0 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,2> E0 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,3> E0 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,0> E0 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,1> E0 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,2> E0 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,3> E0 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,3> E1 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,3> E1 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,3> E1 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,0> E1 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,1> E1 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,2> E1 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,3> E1 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,3> E1 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,3> E1 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,3> E1 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,0> E1 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,1> E1 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,2> E1 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,3> E1 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,3> E1 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,3> E1 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,3> E1 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,0> E1 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,1> E1 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,2> E1 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,3> E1 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,0> E1 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,1> E1 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,2> E1 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,3> E1 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,0> E1 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,1> E1 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,2> E1 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,3> E1 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,0> E1 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,1> E1 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,2> E1 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,3> E1 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,0> E1 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,1> E1 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,2> E1 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,3> E1 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,3> E2 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,3> E2 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,3> E2 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,0> E2 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,1> E2 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,2> E2 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,3> E2 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,3> E2 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,3> E2 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,3> E2 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,0> E2 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,1> E2 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,2> E2 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,3> E2 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,3> E2 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,3> E2 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,3> E2 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,0> E2 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,1> E2 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,2> E2 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,3> E2 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,0> E2 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,1> E2 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,2> E2 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,3> E2 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,0> E2 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,1> E2 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,2> E2 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,3> E2 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,0> E2 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,1> E2 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,2> E2 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,3> E2 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,0> E2 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,1> E2 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,2> E2 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,3> E2 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,0> E3 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,1> E3 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,2> E3 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,3> E3 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,0> E3 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,1> E3 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,2> E3 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,3> E3 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,0> E3 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,1> E3 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,2> E3 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,3> E3 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,0> E3 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,1> E3 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,2> E3 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,3> E3 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,0> E3 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,1> E3 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,2> E3 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,3> E3 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,0> E3 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,1> E3 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,2> E3 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,3> E3 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,0> E3 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,1> E3 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,2> E3 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,3> E3 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,0> E3 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,1> E3 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,2> E3 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,3> E3 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,0> E3 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,1> E3 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,2> E3 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,3> E3 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,0> E3 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,1> E3 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,2> E3 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,3> E3 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,0> E3 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,1> E3 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,2> E3 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,3> E3 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,0> E3 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,1> E3 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,2> E3 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,3> E3 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,0> E3 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,1> E3 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,2> E3 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,3> E3 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,0> E3 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,1> E3 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,2> E3 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,3> E3 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,0> E3 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,1> E3 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,2> E3 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,3> E3 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,0> E3 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,1> E3 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,2> E3 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,3> E3 ## E3 ## E3 ## E3; }; diff --git a/dep/glm/detail/_swizzle_func.hpp b/dep/glm/detail/_swizzle_func.hpp new file mode 100644 index 0000000..d93c6af --- /dev/null +++ b/dep/glm/detail/_swizzle_func.hpp @@ -0,0 +1,682 @@ +#pragma once + +#define GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, CONST, A, B) \ + vec<2, T, Q> A ## B() CONST \ + { \ + return vec<2, T, Q>(this->A, this->B); \ + } + +#define GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, CONST, A, B, C) \ + vec<3, T, Q> A ## B ## C() CONST \ + { \ + return vec<3, T, Q>(this->A, this->B, this->C); \ + } + +#define GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, CONST, A, B, C, D) \ + vec<4, T, Q> A ## B ## C ## D() CONST \ + { \ + return vec<4, T, Q>(this->A, this->B, this->C, this->D); \ + } + +#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(T, P, L, CONST, A, B) \ + template \ + vec vec::A ## B() CONST \ + { \ + return vec<2, T, Q>(this->A, this->B); \ + } + +#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(T, P, L, CONST, A, B, C) \ + template \ + vec<3, T, Q> vec::A ## B ## C() CONST \ + { \ + return vec<3, T, Q>(this->A, this->B, this->C); \ + } + +#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(T, P, L, CONST, A, B, C, D) \ + template \ + vec<4, T, Q> vec::A ## B ## C ## D() CONST \ + { \ + return vec<4, T, Q>(this->A, this->B, this->C, this->D); \ + } + +#define GLM_MUTABLE + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, 2, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, 2, GLM_MUTABLE, B, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC2(T, P) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, x, y) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, r, g) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, s, t) + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, B) + +#define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, C, B, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(T, P, A, B, C) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC3(T, P) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, x, y, z) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, r, g, b) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, s, t, p) + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, C) + +#define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, C, B) + +#define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, B, C, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC4(T, P) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, x, y, z, w) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, r, g, b, a) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, s, t, p, q) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(T, P, A, B) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, x, y) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, r, g) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, s, t) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, C) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, C) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, C) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(T, P, A, B, C) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, P) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, x, y, z) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, r, g, b) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, s, t, p) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, D) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, D) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, D) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, x, y, z, w) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, r, g, b, a) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, s, t, p, q) + diff --git a/dep/glm/detail/_vectorize.hpp b/dep/glm/detail/_vectorize.hpp new file mode 100644 index 0000000..1fcaec3 --- /dev/null +++ b/dep/glm/detail/_vectorize.hpp @@ -0,0 +1,162 @@ +#pragma once + +namespace glm{ +namespace detail +{ + template class vec, length_t L, typename R, typename T, qualifier Q> + struct functor1{}; + + template class vec, typename R, typename T, qualifier Q> + struct functor1 + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<1, R, Q> call(R (*Func) (T x), vec<1, T, Q> const& v) + { + return vec<1, R, Q>(Func(v.x)); + } + }; + + template class vec, typename R, typename T, qualifier Q> + struct functor1 + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<2, R, Q> call(R (*Func) (T x), vec<2, T, Q> const& v) + { + return vec<2, R, Q>(Func(v.x), Func(v.y)); + } + }; + + template class vec, typename R, typename T, qualifier Q> + struct functor1 + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<3, R, Q> call(R (*Func) (T x), vec<3, T, Q> const& v) + { + return vec<3, R, Q>(Func(v.x), Func(v.y), Func(v.z)); + } + }; + + template class vec, typename R, typename T, qualifier Q> + struct functor1 + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, R, Q> call(R (*Func) (T x), vec<4, T, Q> const& v) + { + return vec<4, R, Q>(Func(v.x), Func(v.y), Func(v.z), Func(v.w)); + } + }; + + template class vec, length_t L, typename T, qualifier Q> + struct functor2{}; + + template class vec, typename T, qualifier Q> + struct functor2 + { + GLM_FUNC_QUALIFIER static vec<1, T, Q> call(T (*Func) (T x, T y), vec<1, T, Q> const& a, vec<1, T, Q> const& b) + { + return vec<1, T, Q>(Func(a.x, b.x)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2 + { + GLM_FUNC_QUALIFIER static vec<2, T, Q> call(T (*Func) (T x, T y), vec<2, T, Q> const& a, vec<2, T, Q> const& b) + { + return vec<2, T, Q>(Func(a.x, b.x), Func(a.y, b.y)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2 + { + GLM_FUNC_QUALIFIER static vec<3, T, Q> call(T (*Func) (T x, T y), vec<3, T, Q> const& a, vec<3, T, Q> const& b) + { + return vec<3, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2 + { + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(T (*Func) (T x, T y), vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w)); + } + }; + + template class vec, length_t L, typename T, qualifier Q> + struct functor2_vec_sca{}; + + template class vec, typename T, qualifier Q> + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static vec<1, T, Q> call(T (*Func) (T x, T y), vec<1, T, Q> const& a, T b) + { + return vec<1, T, Q>(Func(a.x, b)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static vec<2, T, Q> call(T (*Func) (T x, T y), vec<2, T, Q> const& a, T b) + { + return vec<2, T, Q>(Func(a.x, b), Func(a.y, b)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static vec<3, T, Q> call(T (*Func) (T x, T y), vec<3, T, Q> const& a, T b) + { + return vec<3, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b)); + } + }; + + template class vec, typename T, qualifier Q> + struct functor2_vec_sca + { + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(T (*Func) (T x, T y), vec<4, T, Q> const& a, T b) + { + return vec<4, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b)); + } + }; + + template + struct functor2_vec_int {}; + + template + struct functor2_vec_int<1, T, Q> + { + GLM_FUNC_QUALIFIER static vec<1, int, Q> call(int (*Func) (T x, int y), vec<1, T, Q> const& a, vec<1, int, Q> const& b) + { + return vec<1, int, Q>(Func(a.x, b.x)); + } + }; + + template + struct functor2_vec_int<2, T, Q> + { + GLM_FUNC_QUALIFIER static vec<2, int, Q> call(int (*Func) (T x, int y), vec<2, T, Q> const& a, vec<2, int, Q> const& b) + { + return vec<2, int, Q>(Func(a.x, b.x), Func(a.y, b.y)); + } + }; + + template + struct functor2_vec_int<3, T, Q> + { + GLM_FUNC_QUALIFIER static vec<3, int, Q> call(int (*Func) (T x, int y), vec<3, T, Q> const& a, vec<3, int, Q> const& b) + { + return vec<3, int, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z)); + } + }; + + template + struct functor2_vec_int<4, T, Q> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(int (*Func) (T x, int y), vec<4, T, Q> const& a, vec<4, int, Q> const& b) + { + return vec<4, int, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w)); + } + }; +}//namespace detail +}//namespace glm diff --git a/dep/glm/detail/compute_common.hpp b/dep/glm/detail/compute_common.hpp new file mode 100644 index 0000000..cc24b9e --- /dev/null +++ b/dep/glm/detail/compute_common.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include "setup.hpp" +#include + +namespace glm{ +namespace detail +{ + template + struct compute_abs + {}; + + template + struct compute_abs + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genFIType call(genFIType x) + { + GLM_STATIC_ASSERT( + std::numeric_limits::is_iec559 || std::numeric_limits::is_signed, + "'abs' only accept floating-point and integer scalar or vector inputs"); + + return x >= genFIType(0) ? x : -x; + // TODO, perf comp with: *(((int *) &x) + 1) &= 0x7fffffff; + } + }; + +#if GLM_COMPILER & GLM_COMPILER_CUDA + template<> + struct compute_abs + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static float call(float x) + { + return fabsf(x); + } + }; +#endif + + template + struct compute_abs + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genFIType call(genFIType x) + { + GLM_STATIC_ASSERT( + (!std::numeric_limits::is_signed && std::numeric_limits::is_integer), + "'abs' only accept floating-point and integer scalar or vector inputs"); + return x; + } + }; +}//namespace detail +}//namespace glm diff --git a/dep/glm/detail/compute_vector_relational.hpp b/dep/glm/detail/compute_vector_relational.hpp new file mode 100644 index 0000000..167b634 --- /dev/null +++ b/dep/glm/detail/compute_vector_relational.hpp @@ -0,0 +1,30 @@ +#pragma once + +//#include "compute_common.hpp" +#include "setup.hpp" +#include + +namespace glm{ +namespace detail +{ + template + struct compute_equal + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(T a, T b) + { + return a == b; + } + }; +/* + template + struct compute_equal + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(T a, T b) + { + return detail::compute_abs::is_signed>::call(b - a) <= static_cast(0); + //return std::memcmp(&a, &b, sizeof(T)) == 0; + } + }; +*/ +}//namespace detail +}//namespace glm diff --git a/dep/glm/detail/func_common.inl b/dep/glm/detail/func_common.inl new file mode 100644 index 0000000..4b5f144 --- /dev/null +++ b/dep/glm/detail/func_common.inl @@ -0,0 +1,792 @@ +/// @ref core +/// @file glm/detail/func_common.inl + +#include "../vector_relational.hpp" +#include "compute_common.hpp" +#include "type_vec1.hpp" +#include "type_vec2.hpp" +#include "type_vec3.hpp" +#include "type_vec4.hpp" +#include "_vectorize.hpp" +#include + +namespace glm +{ + // min + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType min(genType x, genType y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'min' only accept floating-point or integer inputs"); + return (y < x) ? y : x; + } + + // max + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType max(genType x, genType y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'max' only accept floating-point or integer inputs"); + + return (x < y) ? y : x; + } + + // abs + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR int abs(int x) + { + int const y = x >> (sizeof(int) * 8 - 1); + return (x ^ y) - y; + } + + // round +# if GLM_HAS_CXX11_STL + using ::std::round; +# else + template + GLM_FUNC_QUALIFIER genType round(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'round' only accept floating-point inputs"); + + return x < static_cast(0) ? static_cast(int(x - static_cast(0.5))) : static_cast(int(x + static_cast(0.5))); + } +# endif + + // trunc +# if GLM_HAS_CXX11_STL + using ::std::trunc; +# else + template + GLM_FUNC_QUALIFIER genType trunc(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'trunc' only accept floating-point inputs"); + + return x < static_cast(0) ? -std::floor(-x) : std::floor(x); + } +# endif + +}//namespace glm + +namespace glm{ +namespace detail +{ + template + struct compute_abs_vector + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec call(vec const& x) + { + return detail::functor1::call(abs, x); + } + }; + + template + struct compute_mix_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y, vec const& a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); + + return vec(vec(x) * (static_cast(1) - a) + vec(y) * a); + } + }; + + template + struct compute_mix_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y, vec const& a) + { + vec Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = a[i] ? y[i] : x[i]; + return Result; + } + }; + + template + struct compute_mix_scalar + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y, U const& a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); + + return vec(vec(x) * (static_cast(1) - a) + vec(y) * a); + } + }; + + template + struct compute_mix_scalar + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y, bool const& a) + { + return a ? y : x; + } + }; + + template + struct compute_mix + { + GLM_FUNC_QUALIFIER static T call(T const& x, T const& y, U const& a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); + + return static_cast(static_cast(x) * (static_cast(1) - a) + static_cast(y) * a); + } + }; + + template + struct compute_mix + { + GLM_FUNC_QUALIFIER static T call(T const& x, T const& y, bool const& a) + { + return a ? y : x; + } + }; + + template + struct compute_sign + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return vec(glm::lessThan(vec(0), x)) - vec(glm::lessThan(x, vec(0))); + } + }; + +# if GLM_ARCH == GLM_ARCH_X86 + template + struct compute_sign + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + T const Shift(static_cast(sizeof(T) * 8 - 1)); + vec const y(vec::type, Q>(-x) >> typename detail::make_unsigned::type(Shift)); + + return (x >> Shift) | y; + } + }; +# endif + + template + struct compute_floor + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(std::floor, x); + } + }; + + template + struct compute_ceil + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(std::ceil, x); + } + }; + + template + struct compute_fract + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return x - floor(x); + } + }; + + template + struct compute_trunc + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(trunc, x); + } + }; + + template + struct compute_round + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(round, x); + } + }; + + template + struct compute_mod + { + GLM_FUNC_QUALIFIER static vec call(vec const& a, vec const& b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'mod' only accept floating-point inputs. Include for integer inputs."); + return a - b * floor(a / b); + } + }; + + template + struct compute_min_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y) + { + return detail::functor2::call(min, x, y); + } + }; + + template + struct compute_max_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& y) + { + return detail::functor2::call(max, x, y); + } + }; + + template + struct compute_clamp_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, vec const& minVal, vec const& maxVal) + { + return min(max(x, minVal), maxVal); + } + }; + + template + struct compute_step_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& edge, vec const& x) + { + return mix(vec(1), vec(0), glm::lessThan(x, edge)); + } + }; + + template + struct compute_smoothstep_vector + { + GLM_FUNC_QUALIFIER static vec call(vec const& edge0, vec const& edge1, vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'smoothstep' only accept floating-point inputs"); + vec const tmp(clamp((x - edge0) / (edge1 - edge0), static_cast(0), static_cast(1))); + return tmp * tmp * (static_cast(3) - static_cast(2) * tmp); + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genFIType abs(genFIType x) + { + return detail::compute_abs::is_signed>::call(x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec abs(vec const& x) + { + return detail::compute_abs_vector::value>::call(x); + } + + // sign + // fast and works for any type + template + GLM_FUNC_QUALIFIER genFIType sign(genFIType x) + { + GLM_STATIC_ASSERT( + std::numeric_limits::is_iec559 || (std::numeric_limits::is_signed && std::numeric_limits::is_integer), + "'sign' only accept signed inputs"); + + return detail::compute_sign<1, genFIType, defaultp, + std::numeric_limits::is_iec559, detail::is_aligned::value>::call(vec<1, genFIType>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec sign(vec const& x) + { + GLM_STATIC_ASSERT( + std::numeric_limits::is_iec559 || (std::numeric_limits::is_signed && std::numeric_limits::is_integer), + "'sign' only accept signed inputs"); + + return detail::compute_sign::is_iec559, detail::is_aligned::value>::call(x); + } + + // floor + using ::std::floor; + template + GLM_FUNC_QUALIFIER vec floor(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'floor' only accept floating-point inputs."); + return detail::compute_floor::value>::call(x); + } + + template + GLM_FUNC_QUALIFIER vec trunc(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'trunc' only accept floating-point inputs"); + return detail::compute_trunc::value>::call(x); + } + + template + GLM_FUNC_QUALIFIER vec round(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'round' only accept floating-point inputs"); + return detail::compute_round::value>::call(x); + } + +/* + // roundEven + template + GLM_FUNC_QUALIFIER genType roundEven(genType const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'roundEven' only accept floating-point inputs"); + + return genType(int(x + genType(int(x) % 2))); + } +*/ + + // roundEven + template + GLM_FUNC_QUALIFIER genType roundEven(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'roundEven' only accept floating-point inputs"); + + int Integer = static_cast(x); + genType IntegerPart = static_cast(Integer); + genType FractionalPart = fract(x); + + if(FractionalPart > static_cast(0.5) || FractionalPart < static_cast(0.5)) + { + return round(x); + } + else if((Integer % 2) == 0) + { + return IntegerPart; + } + else if(x <= static_cast(0)) // Work around... + { + return IntegerPart - static_cast(1); + } + else + { + return IntegerPart + static_cast(1); + } + //else // Bug on MinGW 4.5.2 + //{ + // return mix(IntegerPart + genType(-1), IntegerPart + genType(1), x <= genType(0)); + //} + } + + template + GLM_FUNC_QUALIFIER vec roundEven(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'roundEven' only accept floating-point inputs"); + return detail::functor1::call(roundEven, x); + } + + // ceil + using ::std::ceil; + template + GLM_FUNC_QUALIFIER vec ceil(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'ceil' only accept floating-point inputs"); + return detail::compute_ceil::value>::call(x); + } + + // fract + template + GLM_FUNC_QUALIFIER genType fract(genType x) + { + return fract(vec<1, genType>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec fract(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fract' only accept floating-point inputs"); + return detail::compute_fract::value>::call(x); + } + + // mod + template + GLM_FUNC_QUALIFIER genType mod(genType x, genType y) + { +# if GLM_COMPILER & GLM_COMPILER_CUDA + // Another Cuda compiler bug https://github.com/g-truc/glm/issues/530 + vec<1, genType, defaultp> Result(mod(vec<1, genType, defaultp>(x), y)); + return Result.x; +# else + return mod(vec<1, genType, defaultp>(x), y).x; +# endif + } + + template + GLM_FUNC_QUALIFIER vec mod(vec const& x, T y) + { + return detail::compute_mod::value>::call(x, vec(y)); + } + + template + GLM_FUNC_QUALIFIER vec mod(vec const& x, vec const& y) + { + return detail::compute_mod::value>::call(x, y); + } + + // modf + template + GLM_FUNC_QUALIFIER genType modf(genType x, genType & i) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'modf' only accept floating-point inputs"); + return std::modf(x, &i); + } + + template + GLM_FUNC_QUALIFIER vec<1, T, Q> modf(vec<1, T, Q> const& x, vec<1, T, Q> & i) + { + return vec<1, T, Q>( + modf(x.x, i.x)); + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> modf(vec<2, T, Q> const& x, vec<2, T, Q> & i) + { + return vec<2, T, Q>( + modf(x.x, i.x), + modf(x.y, i.y)); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> modf(vec<3, T, Q> const& x, vec<3, T, Q> & i) + { + return vec<3, T, Q>( + modf(x.x, i.x), + modf(x.y, i.y), + modf(x.z, i.z)); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> modf(vec<4, T, Q> const& x, vec<4, T, Q> & i) + { + return vec<4, T, Q>( + modf(x.x, i.x), + modf(x.y, i.y), + modf(x.z, i.z), + modf(x.w, i.w)); + } + + //// Only valid if (INT_MIN <= x-y <= INT_MAX) + //// min(x,y) + //r = y + ((x - y) & ((x - y) >> (sizeof(int) * + //CHAR_BIT - 1))); + //// max(x,y) + //r = x - ((x - y) & ((x - y) >> (sizeof(int) * + //CHAR_BIT - 1))); + + // min + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec min(vec const& a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'min' only accept floating-point or integer inputs"); + return detail::compute_min_vector::value>::call(a, vec(b)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec min(vec const& a, vec const& b) + { + return detail::compute_min_vector::value>::call(a, b); + } + + // max + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec max(vec const& a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'max' only accept floating-point or integer inputs"); + return detail::compute_max_vector::value>::call(a, vec(b)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec max(vec const& a, vec const& b) + { + return detail::compute_max_vector::value>::call(a, b); + } + + // clamp + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType clamp(genType x, genType minVal, genType maxVal) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'clamp' only accept floating-point or integer inputs"); + return min(max(x, minVal), maxVal); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec clamp(vec const& x, T minVal, T maxVal) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'clamp' only accept floating-point or integer inputs"); + return detail::compute_clamp_vector::value>::call(x, vec(minVal), vec(maxVal)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec clamp(vec const& x, vec const& minVal, vec const& maxVal) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer, "'clamp' only accept floating-point or integer inputs"); + return detail::compute_clamp_vector::value>::call(x, minVal, maxVal); + } + + template + GLM_FUNC_QUALIFIER genTypeT mix(genTypeT x, genTypeT y, genTypeU a) + { + return detail::compute_mix::call(x, y, a); + } + + template + GLM_FUNC_QUALIFIER vec mix(vec const& x, vec const& y, U a) + { + return detail::compute_mix_scalar::value>::call(x, y, a); + } + + template + GLM_FUNC_QUALIFIER vec mix(vec const& x, vec const& y, vec const& a) + { + return detail::compute_mix_vector::value>::call(x, y, a); + } + + // step + template + GLM_FUNC_QUALIFIER genType step(genType edge, genType x) + { + return mix(static_cast(1), static_cast(0), x < edge); + } + + template + GLM_FUNC_QUALIFIER vec step(T edge, vec const& x) + { + return detail::compute_step_vector::value>::call(vec(edge), x); + } + + template + GLM_FUNC_QUALIFIER vec step(vec const& edge, vec const& x) + { + return detail::compute_step_vector::value>::call(edge, x); + } + + // smoothstep + template + GLM_FUNC_QUALIFIER genType smoothstep(genType edge0, genType edge1, genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'smoothstep' only accept floating-point inputs"); + + genType const tmp(clamp((x - edge0) / (edge1 - edge0), genType(0), genType(1))); + return tmp * tmp * (genType(3) - genType(2) * tmp); + } + + template + GLM_FUNC_QUALIFIER vec smoothstep(T edge0, T edge1, vec const& x) + { + return detail::compute_smoothstep_vector::value>::call(vec(edge0), vec(edge1), x); + } + + template + GLM_FUNC_QUALIFIER vec smoothstep(vec const& edge0, vec const& edge1, vec const& x) + { + return detail::compute_smoothstep_vector::value>::call(edge0, edge1, x); + } + +# if GLM_HAS_CXX11_STL + using std::isnan; +# else + template + GLM_FUNC_QUALIFIER bool isnan(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isnan' only accept floating-point inputs"); + +# if GLM_HAS_CXX11_STL + return std::isnan(x); +# elif GLM_COMPILER & GLM_COMPILER_VC + return _isnan(x) != 0; +# elif GLM_COMPILER & GLM_COMPILER_INTEL +# if GLM_PLATFORM & GLM_PLATFORM_WINDOWS + return _isnan(x) != 0; +# else + return ::isnan(x) != 0; +# endif +# elif (GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)) && (GLM_PLATFORM & GLM_PLATFORM_ANDROID) && __cplusplus < 201103L + return _isnan(x) != 0; +# elif GLM_COMPILER & GLM_COMPILER_CUDA + return ::isnan(x) != 0; +# else + return std::isnan(x); +# endif + } +# endif + + template + GLM_FUNC_QUALIFIER vec isnan(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isnan' only accept floating-point inputs"); + + vec Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = glm::isnan(v[l]); + return Result; + } + +# if GLM_HAS_CXX11_STL + using std::isinf; +# else + template + GLM_FUNC_QUALIFIER bool isinf(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isinf' only accept floating-point inputs"); + +# if GLM_HAS_CXX11_STL + return std::isinf(x); +# elif GLM_COMPILER & (GLM_COMPILER_INTEL | GLM_COMPILER_VC) +# if(GLM_PLATFORM & GLM_PLATFORM_WINDOWS) + return _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF; +# else + return ::isinf(x); +# endif +# elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG) +# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID && __cplusplus < 201103L) + return _isinf(x) != 0; +# else + return std::isinf(x); +# endif +# elif GLM_COMPILER & GLM_COMPILER_CUDA + // http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__MATH__DOUBLE_g13431dd2b40b51f9139cbb7f50c18fab.html#g13431dd2b40b51f9139cbb7f50c18fab + return ::isinf(double(x)) != 0; +# else + return std::isinf(x); +# endif + } +# endif + + template + GLM_FUNC_QUALIFIER vec isinf(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isinf' only accept floating-point inputs"); + + vec Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = glm::isinf(v[l]); + return Result; + } + + GLM_FUNC_QUALIFIER int floatBitsToInt(float const& v) + { + union + { + float in; + int out; + } u; + + u.in = v; + + return u.out; + } + + template + GLM_FUNC_QUALIFIER vec floatBitsToInt(vec const& v) + { + return reinterpret_cast&>(const_cast&>(v)); + } + + GLM_FUNC_QUALIFIER uint floatBitsToUint(float const& v) + { + union + { + float in; + uint out; + } u; + + u.in = v; + + return u.out; + } + + template + GLM_FUNC_QUALIFIER vec floatBitsToUint(vec const& v) + { + return reinterpret_cast&>(const_cast&>(v)); + } + + GLM_FUNC_QUALIFIER float intBitsToFloat(int const& v) + { + union + { + int in; + float out; + } u; + + u.in = v; + + return u.out; + } + + template + GLM_FUNC_QUALIFIER vec intBitsToFloat(vec const& v) + { + return reinterpret_cast&>(const_cast&>(v)); + } + + GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const& v) + { + union + { + uint in; + float out; + } u; + + u.in = v; + + return u.out; + } + + template + GLM_FUNC_QUALIFIER vec uintBitsToFloat(vec const& v) + { + return reinterpret_cast&>(const_cast&>(v)); + } + +# if GLM_HAS_CXX11_STL + using std::fma; +# else + template + GLM_FUNC_QUALIFIER genType fma(genType const& a, genType const& b, genType const& c) + { + return a * b + c; + } +# endif + + template + GLM_FUNC_QUALIFIER genType frexp(genType x, int& exp) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'frexp' only accept floating-point inputs"); + + return std::frexp(x, &exp); + } + + template + GLM_FUNC_QUALIFIER vec frexp(vec const& v, vec& exp) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'frexp' only accept floating-point inputs"); + + vec Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = std::frexp(v[l], &exp[l]); + return Result; + } + + template + GLM_FUNC_QUALIFIER genType ldexp(genType const& x, int const& exp) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'ldexp' only accept floating-point inputs"); + + return std::ldexp(x, exp); + } + + template + GLM_FUNC_QUALIFIER vec ldexp(vec const& v, vec const& exp) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'ldexp' only accept floating-point inputs"); + + vec Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = std::ldexp(v[l], exp[l]); + return Result; + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_common_simd.inl" +#endif diff --git a/dep/glm/detail/func_common_simd.inl b/dep/glm/detail/func_common_simd.inl new file mode 100644 index 0000000..ce0032d --- /dev/null +++ b/dep/glm/detail/func_common_simd.inl @@ -0,0 +1,231 @@ +/// @ref core +/// @file glm/detail/func_common_simd.inl + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +#include "../simd/common.h" + +#include + +namespace glm{ +namespace detail +{ + template + struct compute_abs_vector<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> result; + result.data = glm_vec4_abs(v.data); + return result; + } + }; + + template + struct compute_abs_vector<4, int, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v) + { + vec<4, int, Q> result; + result.data = glm_ivec4_abs(v.data); + return result; + } + }; + + template + struct compute_floor<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> result; + result.data = glm_vec4_floor(v.data); + return result; + } + }; + + template + struct compute_ceil<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> result; + result.data = glm_vec4_ceil(v.data); + return result; + } + }; + + template + struct compute_fract<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> result; + result.data = glm_vec4_fract(v.data); + return result; + } + }; + + template + struct compute_round<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> result; + result.data = glm_vec4_round(v.data); + return result; + } + }; + + template + struct compute_mod<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& y) + { + vec<4, float, Q> result; + result.data = glm_vec4_mod(x.data, y.data); + return result; + } + }; + + template + struct compute_min_vector<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + vec<4, float, Q> result; + result.data = _mm_min_ps(v1.data, v2.data); + return result; + } + }; + + template + struct compute_min_vector<4, int, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + vec<4, int, Q> result; + result.data = _mm_min_epi32(v1.data, v2.data); + return result; + } + }; + + template + struct compute_min_vector<4, uint, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& v1, vec<4, uint, Q> const& v2) + { + vec<4, uint, Q> result; + result.data = _mm_min_epu32(v1.data, v2.data); + return result; + } + }; + + template + struct compute_max_vector<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + vec<4, float, Q> result; + result.data = _mm_max_ps(v1.data, v2.data); + return result; + } + }; + + template + struct compute_max_vector<4, int, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + vec<4, int, Q> result; + result.data = _mm_max_epi32(v1.data, v2.data); + return result; + } + }; + + template + struct compute_max_vector<4, uint, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& v1, vec<4, uint, Q> const& v2) + { + vec<4, uint, Q> result; + result.data = _mm_max_epu32(v1.data, v2.data); + return result; + } + }; + + template + struct compute_clamp_vector<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& minVal, vec<4, float, Q> const& maxVal) + { + vec<4, float, Q> result; + result.data = _mm_min_ps(_mm_max_ps(x.data, minVal.data), maxVal.data); + return result; + } + }; + + template + struct compute_clamp_vector<4, int, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& x, vec<4, int, Q> const& minVal, vec<4, int, Q> const& maxVal) + { + vec<4, int, Q> result; + result.data = _mm_min_epi32(_mm_max_epi32(x.data, minVal.data), maxVal.data); + return result; + } + }; + + template + struct compute_clamp_vector<4, uint, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& x, vec<4, uint, Q> const& minVal, vec<4, uint, Q> const& maxVal) + { + vec<4, uint, Q> result; + result.data = _mm_min_epu32(_mm_max_epu32(x.data, minVal.data), maxVal.data); + return result; + } + }; + + template + struct compute_mix_vector<4, float, bool, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& y, vec<4, bool, Q> const& a) + { + __m128i const Load = _mm_set_epi32(-static_cast(a.w), -static_cast(a.z), -static_cast(a.y), -static_cast(a.x)); + __m128 const Mask = _mm_castsi128_ps(Load); + + vec<4, float, Q> Result; +# if 0 && GLM_ARCH & GLM_ARCH_AVX + Result.data = _mm_blendv_ps(x.data, y.data, Mask); +# else + Result.data = _mm_or_ps(_mm_and_ps(Mask, y.data), _mm_andnot_ps(Mask, x.data)); +# endif + return Result; + } + }; +/* FIXME + template + struct compute_step_vector + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& edge, vec<4, float, Q> const& x) + { + vec<4, float, Q> Result; + result.data = glm_vec4_step(edge.data, x.data); + return result; + } + }; +*/ + template + struct compute_smoothstep_vector<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& edge0, vec<4, float, Q> const& edge1, vec<4, float, Q> const& x) + { + vec<4, float, Q> Result; + Result.data = glm_vec4_smoothstep(edge0.data, edge1.data, x.data); + return Result; + } + }; +}//namespace detail +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/dep/glm/detail/func_exponential.inl b/dep/glm/detail/func_exponential.inl new file mode 100644 index 0000000..2040d41 --- /dev/null +++ b/dep/glm/detail/func_exponential.inl @@ -0,0 +1,152 @@ +/// @ref core +/// @file glm/detail/func_exponential.inl + +#include "../vector_relational.hpp" +#include "_vectorize.hpp" +#include +#include +#include + +namespace glm{ +namespace detail +{ +# if GLM_HAS_CXX11_STL + using std::log2; +# else + template + genType log2(genType Value) + { + return std::log(Value) * static_cast(1.4426950408889634073599246810019); + } +# endif + + template + struct compute_log2 + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'log2' only accept floating-point inputs. Include for integer inputs."); + + return detail::functor1::call(log2, v); + } + }; + + template + struct compute_sqrt + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(std::sqrt, x); + } + }; + + template + struct compute_inversesqrt + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return static_cast(1) / sqrt(x); + } + }; + + template + struct compute_inversesqrt + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + vec tmp(x); + vec xhalf(tmp * 0.5f); + vec* p = reinterpret_cast*>(const_cast*>(&x)); + vec i = vec(0x5f375a86) - (*p >> vec(1)); + vec* ptmp = reinterpret_cast*>(&i); + tmp = *ptmp; + tmp = tmp * (1.5f - xhalf * tmp * tmp); + return tmp; + } + }; +}//namespace detail + + // pow + using std::pow; + template + GLM_FUNC_QUALIFIER vec pow(vec const& base, vec const& exponent) + { + return detail::functor2::call(pow, base, exponent); + } + + // exp + using std::exp; + template + GLM_FUNC_QUALIFIER vec exp(vec const& x) + { + return detail::functor1::call(exp, x); + } + + // log + using std::log; + template + GLM_FUNC_QUALIFIER vec log(vec const& x) + { + return detail::functor1::call(log, x); + } + +# if GLM_HAS_CXX11_STL + using std::exp2; +# else + //exp2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType exp2(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'exp2' only accept floating-point inputs"); + + return std::exp(static_cast(0.69314718055994530941723212145818) * x); + } +# endif + + template + GLM_FUNC_QUALIFIER vec exp2(vec const& x) + { + return detail::functor1::call(exp2, x); + } + + // log2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType log2(genType x) + { + return log2(vec<1, genType>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec log2(vec const& x) + { + return detail::compute_log2::is_iec559, detail::is_aligned::value>::call(x); + } + + // sqrt + using std::sqrt; + template + GLM_FUNC_QUALIFIER vec sqrt(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'sqrt' only accept floating-point inputs"); + return detail::compute_sqrt::value>::call(x); + } + + // inversesqrt + template + GLM_FUNC_QUALIFIER genType inversesqrt(genType x) + { + return static_cast(1) / sqrt(x); + } + + template + GLM_FUNC_QUALIFIER vec inversesqrt(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'inversesqrt' only accept floating-point inputs"); + return detail::compute_inversesqrt::value>::call(x); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_exponential_simd.inl" +#endif + diff --git a/dep/glm/detail/func_exponential_simd.inl b/dep/glm/detail/func_exponential_simd.inl new file mode 100644 index 0000000..fb78951 --- /dev/null +++ b/dep/glm/detail/func_exponential_simd.inl @@ -0,0 +1,37 @@ +/// @ref core +/// @file glm/detail/func_exponential_simd.inl + +#include "../simd/exponential.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ + template + struct compute_sqrt<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> Result; + Result.data = _mm_sqrt_ps(v.data); + return Result; + } + }; + +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE + template<> + struct compute_sqrt<4, float, aligned_lowp, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, aligned_lowp> call(vec<4, float, aligned_lowp> const& v) + { + vec<4, float, aligned_lowp> Result; + Result.data = glm_vec4_sqrt_lowp(v.data); + return Result; + } + }; +# endif +}//namespace detail +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/dep/glm/detail/func_geometric.inl b/dep/glm/detail/func_geometric.inl new file mode 100644 index 0000000..9cde28f --- /dev/null +++ b/dep/glm/detail/func_geometric.inl @@ -0,0 +1,243 @@ +#include "../exponential.hpp" +#include "../common.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_length + { + GLM_FUNC_QUALIFIER static T call(vec const& v) + { + return sqrt(dot(v, v)); + } + }; + + template + struct compute_distance + { + GLM_FUNC_QUALIFIER static T call(vec const& p0, vec const& p1) + { + return length(p1 - p0); + } + }; + + template + struct compute_dot{}; + + template + struct compute_dot, T, Aligned> + { + GLM_FUNC_QUALIFIER static T call(vec<1, T, Q> const& a, vec<1, T, Q> const& b) + { + return a.x * b.x; + } + }; + + template + struct compute_dot, T, Aligned> + { + GLM_FUNC_QUALIFIER static T call(vec<2, T, Q> const& a, vec<2, T, Q> const& b) + { + vec<2, T, Q> tmp(a * b); + return tmp.x + tmp.y; + } + }; + + template + struct compute_dot, T, Aligned> + { + GLM_FUNC_QUALIFIER static T call(vec<3, T, Q> const& a, vec<3, T, Q> const& b) + { + vec<3, T, Q> tmp(a * b); + return tmp.x + tmp.y + tmp.z; + } + }; + + template + struct compute_dot, T, Aligned> + { + GLM_FUNC_QUALIFIER static T call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> tmp(a * b); + return (tmp.x + tmp.y) + (tmp.z + tmp.w); + } + }; + + template + struct compute_cross + { + GLM_FUNC_QUALIFIER static vec<3, T, Q> call(vec<3, T, Q> const& x, vec<3, T, Q> const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'cross' accepts only floating-point inputs"); + + return vec<3, T, Q>( + x.y * y.z - y.y * x.z, + x.z * y.x - y.z * x.x, + x.x * y.y - y.x * x.y); + } + }; + + template + struct compute_normalize + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'normalize' accepts only floating-point inputs"); + + return v * inversesqrt(dot(v, v)); + } + }; + + template + struct compute_faceforward + { + GLM_FUNC_QUALIFIER static vec call(vec const& N, vec const& I, vec const& Nref) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'normalize' accepts only floating-point inputs"); + + return dot(Nref, I) < static_cast(0) ? N : -N; + } + }; + + template + struct compute_reflect + { + GLM_FUNC_QUALIFIER static vec call(vec const& I, vec const& N) + { + return I - N * dot(N, I) * static_cast(2); + } + }; + + template + struct compute_refract + { + GLM_FUNC_QUALIFIER static vec call(vec const& I, vec const& N, T eta) + { + T const dotValue(dot(N, I)); + T const k(static_cast(1) - eta * eta * (static_cast(1) - dotValue * dotValue)); + vec const Result = + (k >= static_cast(0)) ? (eta * I - (eta * dotValue + std::sqrt(k)) * N) : vec(0); + return Result; + } + }; +}//namespace detail + + // length + template + GLM_FUNC_QUALIFIER genType length(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'length' accepts only floating-point inputs"); + + return abs(x); + } + + template + GLM_FUNC_QUALIFIER T length(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'length' accepts only floating-point inputs"); + + return detail::compute_length::value>::call(v); + } + + // distance + template + GLM_FUNC_QUALIFIER genType distance(genType const& p0, genType const& p1) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'distance' accepts only floating-point inputs"); + + return length(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER T distance(vec const& p0, vec const& p1) + { + return detail::compute_distance::value>::call(p0, p1); + } + + // dot + template + GLM_FUNC_QUALIFIER T dot(T x, T y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'dot' accepts only floating-point inputs"); + return x * y; + } + + template + GLM_FUNC_QUALIFIER T dot(vec const& x, vec const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'dot' accepts only floating-point inputs"); + return detail::compute_dot, T, detail::is_aligned::value>::call(x, y); + } + + // cross + template + GLM_FUNC_QUALIFIER vec<3, T, Q> cross(vec<3, T, Q> const& x, vec<3, T, Q> const& y) + { + return detail::compute_cross::value>::call(x, y); + } +/* + // normalize + template + GLM_FUNC_QUALIFIER genType normalize(genType const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'normalize' accepts only floating-point inputs"); + + return x < genType(0) ? genType(-1) : genType(1); + } +*/ + template + GLM_FUNC_QUALIFIER vec normalize(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'normalize' accepts only floating-point inputs"); + + return detail::compute_normalize::value>::call(x); + } + + // faceforward + template + GLM_FUNC_QUALIFIER genType faceforward(genType const& N, genType const& I, genType const& Nref) + { + return dot(Nref, I) < static_cast(0) ? N : -N; + } + + template + GLM_FUNC_QUALIFIER vec faceforward(vec const& N, vec const& I, vec const& Nref) + { + return detail::compute_faceforward::value>::call(N, I, Nref); + } + + // reflect + template + GLM_FUNC_QUALIFIER genType reflect(genType const& I, genType const& N) + { + return I - N * dot(N, I) * genType(2); + } + + template + GLM_FUNC_QUALIFIER vec reflect(vec const& I, vec const& N) + { + return detail::compute_reflect::value>::call(I, N); + } + + // refract + template + GLM_FUNC_QUALIFIER genType refract(genType const& I, genType const& N, genType eta) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'refract' accepts only floating-point inputs"); + genType const dotValue(dot(N, I)); + genType const k(static_cast(1) - eta * eta * (static_cast(1) - dotValue * dotValue)); + return (eta * I - (eta * dotValue + sqrt(k)) * N) * static_cast(k >= static_cast(0)); + } + + template + GLM_FUNC_QUALIFIER vec refract(vec const& I, vec const& N, T eta) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'refract' accepts only floating-point inputs"); + return detail::compute_refract::value>::call(I, N, eta); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_geometric_simd.inl" +#endif diff --git a/dep/glm/detail/func_geometric_simd.inl b/dep/glm/detail/func_geometric_simd.inl new file mode 100644 index 0000000..2076dae --- /dev/null +++ b/dep/glm/detail/func_geometric_simd.inl @@ -0,0 +1,163 @@ +/// @ref core +/// @file glm/detail/func_geometric_simd.inl + +#include "../simd/geometric.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ + template + struct compute_length<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& v) + { + return _mm_cvtss_f32(glm_vec4_length(v.data)); + } + }; + + template + struct compute_distance<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& p0, vec<4, float, Q> const& p1) + { + return _mm_cvtss_f32(glm_vec4_distance(p0.data, p1.data)); + } + }; + + template + struct compute_dot, float, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& x, vec<4, float, Q> const& y) + { + return _mm_cvtss_f32(glm_vec1_dot(x.data, y.data)); + } + }; + + template + struct compute_cross + { + GLM_FUNC_QUALIFIER static vec<3, float, Q> call(vec<3, float, Q> const& a, vec<3, float, Q> const& b) + { + __m128 const set0 = _mm_set_ps(0.0f, a.z, a.y, a.x); + __m128 const set1 = _mm_set_ps(0.0f, b.z, b.y, b.x); + __m128 const xpd0 = glm_vec4_cross(set0, set1); + + vec<4, float, Q> Result; + Result.data = xpd0; + return vec<3, float, Q>(Result); + } + }; + + template + struct compute_normalize<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + vec<4, float, Q> Result; + Result.data = glm_vec4_normalize(v.data); + return Result; + } + }; + + template + struct compute_faceforward<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& N, vec<4, float, Q> const& I, vec<4, float, Q> const& Nref) + { + vec<4, float, Q> Result; + Result.data = glm_vec4_faceforward(N.data, I.data, Nref.data); + return Result; + } + }; + + template + struct compute_reflect<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& I, vec<4, float, Q> const& N) + { + vec<4, float, Q> Result; + Result.data = glm_vec4_reflect(I.data, N.data); + return Result; + } + }; + + template + struct compute_refract<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& I, vec<4, float, Q> const& N, float eta) + { + vec<4, float, Q> Result; + Result.data = glm_vec4_refract(I.data, N.data, _mm_set1_ps(eta)); + return Result; + } + }; +}//namespace detail +}//namespace glm + +#elif GLM_ARCH & GLM_ARCH_NEON_BIT +namespace glm{ +namespace detail +{ + template + struct compute_length<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& v) + { + return sqrt(compute_dot, float, true>::call(v, v)); + } + }; + + template + struct compute_distance<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& p0, vec<4, float, Q> const& p1) + { + return compute_length<4, float, Q, true>::call(p1 - p0); + } + }; + + + template + struct compute_dot, float, true> + { + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& x, vec<4, float, Q> const& y) + { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + float32x4_t v = vmulq_f32(x.data, y.data); + return vaddvq_f32(v); +#else // Armv7a with Neon + float32x4_t p = vmulq_f32(x.data, y.data); + float32x2_t v = vpadd_f32(vget_low_f32(p), vget_high_f32(p)); + v = vpadd_f32(v, v); + return vget_lane_f32(v, 0); +#endif + } + }; + + template + struct compute_normalize<4, float, Q, true> + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) + { + float32x4_t p = vmulq_f32(v.data, v.data); +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + p = vpaddq_f32(p, p); + p = vpaddq_f32(p, p); +#else + float32x2_t t = vpadd_f32(vget_low_f32(p), vget_high_f32(p)); + t = vpadd_f32(t, t); + p = vcombine_f32(t, t); +#endif + + float32x4_t vd = vrsqrteq_f32(p); + vec<4, float, Q> Result; + Result.data = vmulq_f32(v.data, vd); + return Result; + } + }; +}//namespace detail +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/dep/glm/detail/func_integer.inl b/dep/glm/detail/func_integer.inl new file mode 100644 index 0000000..091e1e0 --- /dev/null +++ b/dep/glm/detail/func_integer.inl @@ -0,0 +1,372 @@ +/// @ref core + +#include "_vectorize.hpp" +#if(GLM_ARCH & GLM_ARCH_X86 && GLM_COMPILER & GLM_COMPILER_VC) +# include +# pragma intrinsic(_BitScanReverse) +#endif//(GLM_ARCH & GLM_ARCH_X86 && GLM_COMPILER & GLM_COMPILER_VC) +#include + +#if !GLM_HAS_EXTENDED_INTEGER_TYPE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic ignored "-Wlong-long" +# endif +# if (GLM_COMPILER & GLM_COMPILER_CLANG) +# pragma clang diagnostic ignored "-Wc++11-long-long" +# endif +#endif + +namespace glm{ +namespace detail +{ + template + GLM_FUNC_QUALIFIER T mask(T Bits) + { + return Bits >= static_cast(sizeof(T) * 8) ? ~static_cast(0) : (static_cast(1) << Bits) - static_cast(1); + } + + template + struct compute_bitfieldReverseStep + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T, T) + { + return v; + } + }; + + template + struct compute_bitfieldReverseStep + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T Mask, T Shift) + { + return (v & Mask) << Shift | (v & (~Mask)) >> Shift; + } + }; + + template + struct compute_bitfieldBitCountStep + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T, T) + { + return v; + } + }; + + template + struct compute_bitfieldBitCountStep + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T Mask, T Shift) + { + return (v & Mask) + ((v >> Shift) & Mask); + } + }; + + template + struct compute_findLSB + { + GLM_FUNC_QUALIFIER static int call(genIUType Value) + { + if(Value == 0) + return -1; + + return glm::bitCount(~Value & (Value - static_cast(1))); + } + }; + +# if GLM_HAS_BITSCAN_WINDOWS + template + struct compute_findLSB + { + GLM_FUNC_QUALIFIER static int call(genIUType Value) + { + unsigned long Result(0); + unsigned char IsNotNull = _BitScanForward(&Result, *reinterpret_cast(&Value)); + return IsNotNull ? int(Result) : -1; + } + }; + +# if !((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_MODEL == GLM_MODEL_32)) + template + struct compute_findLSB + { + GLM_FUNC_QUALIFIER static int call(genIUType Value) + { + unsigned long Result(0); + unsigned char IsNotNull = _BitScanForward64(&Result, *reinterpret_cast(&Value)); + return IsNotNull ? int(Result) : -1; + } + }; +# endif +# endif//GLM_HAS_BITSCAN_WINDOWS + + template + struct compute_findMSB_step_vec + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, T Shift) + { + return x | (x >> Shift); + } + }; + + template + struct compute_findMSB_step_vec + { + GLM_FUNC_QUALIFIER static vec call(vec const& x, T) + { + return x; + } + }; + + template + struct compute_findMSB_vec + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + vec x(v); + x = compute_findMSB_step_vec= 8>::call(x, static_cast( 1)); + x = compute_findMSB_step_vec= 8>::call(x, static_cast( 2)); + x = compute_findMSB_step_vec= 8>::call(x, static_cast( 4)); + x = compute_findMSB_step_vec= 16>::call(x, static_cast( 8)); + x = compute_findMSB_step_vec= 32>::call(x, static_cast(16)); + x = compute_findMSB_step_vec= 64>::call(x, static_cast(32)); + return vec(sizeof(T) * 8 - 1) - glm::bitCount(~x); + } + }; + +# if GLM_HAS_BITSCAN_WINDOWS + template + GLM_FUNC_QUALIFIER int compute_findMSB_32(genIUType Value) + { + unsigned long Result(0); + unsigned char IsNotNull = _BitScanReverse(&Result, *reinterpret_cast(&Value)); + return IsNotNull ? int(Result) : -1; + } + + template + struct compute_findMSB_vec + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(compute_findMSB_32, x); + } + }; + +# if !((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_MODEL == GLM_MODEL_32)) + template + GLM_FUNC_QUALIFIER int compute_findMSB_64(genIUType Value) + { + unsigned long Result(0); + unsigned char IsNotNull = _BitScanReverse64(&Result, *reinterpret_cast(&Value)); + return IsNotNull ? int(Result) : -1; + } + + template + struct compute_findMSB_vec + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + return detail::functor1::call(compute_findMSB_64, x); + } + }; +# endif +# endif//GLM_HAS_BITSCAN_WINDOWS +}//namespace detail + + // uaddCarry + GLM_FUNC_QUALIFIER uint uaddCarry(uint const& x, uint const& y, uint & Carry) + { + detail::uint64 const Value64(static_cast(x) + static_cast(y)); + detail::uint64 const Max32((static_cast(1) << static_cast(32)) - static_cast(1)); + Carry = Value64 > Max32 ? 1u : 0u; + return static_cast(Value64 % (Max32 + static_cast(1))); + } + + template + GLM_FUNC_QUALIFIER vec uaddCarry(vec const& x, vec const& y, vec& Carry) + { + vec Value64(vec(x) + vec(y)); + vec Max32((static_cast(1) << static_cast(32)) - static_cast(1)); + Carry = mix(vec(0), vec(1), greaterThan(Value64, Max32)); + return vec(Value64 % (Max32 + static_cast(1))); + } + + // usubBorrow + GLM_FUNC_QUALIFIER uint usubBorrow(uint const& x, uint const& y, uint & Borrow) + { + Borrow = x >= y ? static_cast(0) : static_cast(1); + if(y >= x) + return y - x; + else + return static_cast((static_cast(1) << static_cast(32)) + (static_cast(y) - static_cast(x))); + } + + template + GLM_FUNC_QUALIFIER vec usubBorrow(vec const& x, vec const& y, vec& Borrow) + { + Borrow = mix(vec(1), vec(0), greaterThanEqual(x, y)); + vec const YgeX(y - x); + vec const XgeY(vec((static_cast(1) << static_cast(32)) + (vec(y) - vec(x)))); + return mix(XgeY, YgeX, greaterThanEqual(y, x)); + } + + // umulExtended + GLM_FUNC_QUALIFIER void umulExtended(uint const& x, uint const& y, uint & msb, uint & lsb) + { + detail::uint64 Value64 = static_cast(x) * static_cast(y); + msb = static_cast(Value64 >> static_cast(32)); + lsb = static_cast(Value64); + } + + template + GLM_FUNC_QUALIFIER void umulExtended(vec const& x, vec const& y, vec& msb, vec& lsb) + { + vec Value64(vec(x) * vec(y)); + msb = vec(Value64 >> static_cast(32)); + lsb = vec(Value64); + } + + // imulExtended + GLM_FUNC_QUALIFIER void imulExtended(int x, int y, int& msb, int& lsb) + { + detail::int64 Value64 = static_cast(x) * static_cast(y); + msb = static_cast(Value64 >> static_cast(32)); + lsb = static_cast(Value64); + } + + template + GLM_FUNC_QUALIFIER void imulExtended(vec const& x, vec const& y, vec& msb, vec& lsb) + { + vec Value64(vec(x) * vec(y)); + lsb = vec(Value64 & static_cast(0xFFFFFFFF)); + msb = vec((Value64 >> static_cast(32)) & static_cast(0xFFFFFFFF)); + } + + // bitfieldExtract + template + GLM_FUNC_QUALIFIER genIUType bitfieldExtract(genIUType Value, int Offset, int Bits) + { + return bitfieldExtract(vec<1, genIUType>(Value), Offset, Bits).x; + } + + template + GLM_FUNC_QUALIFIER vec bitfieldExtract(vec const& Value, int Offset, int Bits) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldExtract' only accept integer inputs"); + + return (Value >> static_cast(Offset)) & static_cast(detail::mask(Bits)); + } + + // bitfieldInsert + template + GLM_FUNC_QUALIFIER genIUType bitfieldInsert(genIUType const& Base, genIUType const& Insert, int Offset, int Bits) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldInsert' only accept integer values"); + + return bitfieldInsert(vec<1, genIUType>(Base), vec<1, genIUType>(Insert), Offset, Bits).x; + } + + template + GLM_FUNC_QUALIFIER vec bitfieldInsert(vec const& Base, vec const& Insert, int Offset, int Bits) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldInsert' only accept integer values"); + + T const Mask = static_cast(detail::mask(Bits) << Offset); + return (Base & ~Mask) | ((Insert << static_cast(Offset)) & Mask); + } + + // bitfieldReverse + template + GLM_FUNC_QUALIFIER genIUType bitfieldReverse(genIUType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldReverse' only accept integer values"); + + return bitfieldReverse(glm::vec<1, genIUType, glm::defaultp>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec bitfieldReverse(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldReverse' only accept integer values"); + + vec x(v); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 2>::call(x, static_cast(0x5555555555555555ull), static_cast( 1)); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 4>::call(x, static_cast(0x3333333333333333ull), static_cast( 2)); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 8>::call(x, static_cast(0x0F0F0F0F0F0F0F0Full), static_cast( 4)); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 16>::call(x, static_cast(0x00FF00FF00FF00FFull), static_cast( 8)); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 32>::call(x, static_cast(0x0000FFFF0000FFFFull), static_cast(16)); + x = detail::compute_bitfieldReverseStep::value, sizeof(T) * 8>= 64>::call(x, static_cast(0x00000000FFFFFFFFull), static_cast(32)); + return x; + } + + // bitCount + template + GLM_FUNC_QUALIFIER int bitCount(genIUType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitCount' only accept integer values"); + + return bitCount(glm::vec<1, genIUType, glm::defaultp>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec bitCount(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitCount' only accept integer values"); + +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable : 4310) //cast truncates constant value +# endif + + vec::type, Q> x(*reinterpret_cast::type, Q> const *>(&v)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 2>::call(x, typename detail::make_unsigned::type(0x5555555555555555ull), typename detail::make_unsigned::type( 1)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 4>::call(x, typename detail::make_unsigned::type(0x3333333333333333ull), typename detail::make_unsigned::type( 2)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 8>::call(x, typename detail::make_unsigned::type(0x0F0F0F0F0F0F0F0Full), typename detail::make_unsigned::type( 4)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 16>::call(x, typename detail::make_unsigned::type(0x00FF00FF00FF00FFull), typename detail::make_unsigned::type( 8)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 32>::call(x, typename detail::make_unsigned::type(0x0000FFFF0000FFFFull), typename detail::make_unsigned::type(16)); + x = detail::compute_bitfieldBitCountStep::type, Q, detail::is_aligned::value, sizeof(T) * 8>= 64>::call(x, typename detail::make_unsigned::type(0x00000000FFFFFFFFull), typename detail::make_unsigned::type(32)); + return vec(x); + +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif + } + + // findLSB + template + GLM_FUNC_QUALIFIER int findLSB(genIUType Value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findLSB' only accept integer values"); + + return detail::compute_findLSB::call(Value); + } + + template + GLM_FUNC_QUALIFIER vec findLSB(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findLSB' only accept integer values"); + + return detail::functor1::call(findLSB, x); + } + + // findMSB + template + GLM_FUNC_QUALIFIER int findMSB(genIUType v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findMSB' only accept integer values"); + + return findMSB(vec<1, genIUType>(v)).x; + } + + template + GLM_FUNC_QUALIFIER vec findMSB(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findMSB' only accept integer values"); + + return detail::compute_findMSB_vec::call(v); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_integer_simd.inl" +#endif + diff --git a/dep/glm/detail/func_integer_simd.inl b/dep/glm/detail/func_integer_simd.inl new file mode 100644 index 0000000..8be6c9c --- /dev/null +++ b/dep/glm/detail/func_integer_simd.inl @@ -0,0 +1,65 @@ +#include "../simd/integer.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ + template + struct compute_bitfieldReverseStep<4, uint, Q, true, true> + { + GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& v, uint Mask, uint Shift) + { + __m128i const set0 = v.data; + + __m128i const set1 = _mm_set1_epi32(static_cast(Mask)); + __m128i const and1 = _mm_and_si128(set0, set1); + __m128i const sft1 = _mm_slli_epi32(and1, Shift); + + __m128i const set2 = _mm_andnot_si128(set0, _mm_set1_epi32(-1)); + __m128i const and2 = _mm_and_si128(set0, set2); + __m128i const sft2 = _mm_srai_epi32(and2, Shift); + + __m128i const or0 = _mm_or_si128(sft1, sft2); + + return or0; + } + }; + + template + struct compute_bitfieldBitCountStep<4, uint, Q, true, true> + { + GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& v, uint Mask, uint Shift) + { + __m128i const set0 = v.data; + + __m128i const set1 = _mm_set1_epi32(static_cast(Mask)); + __m128i const and0 = _mm_and_si128(set0, set1); + __m128i const sft0 = _mm_slli_epi32(set0, Shift); + __m128i const and1 = _mm_and_si128(sft0, set1); + __m128i const add0 = _mm_add_epi32(and0, and1); + + return add0; + } + }; +}//namespace detail + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template<> + GLM_FUNC_QUALIFIER int bitCount(uint x) + { + return _mm_popcnt_u32(x); + } + +# if(GLM_MODEL == GLM_MODEL_64) + template<> + GLM_FUNC_QUALIFIER int bitCount(detail::uint64 x) + { + return static_cast(_mm_popcnt_u64(x)); + } +# endif//GLM_MODEL +# endif//GLM_ARCH + +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/dep/glm/detail/func_matrix.inl b/dep/glm/detail/func_matrix.inl new file mode 100644 index 0000000..d980c6d --- /dev/null +++ b/dep/glm/detail/func_matrix.inl @@ -0,0 +1,398 @@ +#include "../geometric.hpp" +#include + +namespace glm{ +namespace detail +{ + template + struct compute_matrixCompMult + { + GLM_FUNC_QUALIFIER static mat call(mat const& x, mat const& y) + { + mat Result; + for(length_t i = 0; i < Result.length(); ++i) + Result[i] = x[i] * y[i]; + return Result; + } + }; + + template + struct compute_transpose{}; + + template + struct compute_transpose<2, 2, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<2, 2, T, Q> call(mat<2, 2, T, Q> const& m) + { + mat<2, 2, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + return Result; + } + }; + + template + struct compute_transpose<2, 3, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<3, 2, T, Q> call(mat<2, 3, T, Q> const& m) + { + mat<3,2, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + return Result; + } + }; + + template + struct compute_transpose<2, 4, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<4, 2, T, Q> call(mat<2, 4, T, Q> const& m) + { + mat<4, 2, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + return Result; + } + }; + + template + struct compute_transpose<3, 2, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<2, 3, T, Q> call(mat<3, 2, T, Q> const& m) + { + mat<2, 3, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + return Result; + } + }; + + template + struct compute_transpose<3, 3, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<3, 3, T, Q> call(mat<3, 3, T, Q> const& m) + { + mat<3, 3, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + return Result; + } + }; + + template + struct compute_transpose<3, 4, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<4, 3, T, Q> call(mat<3, 4, T, Q> const& m) + { + mat<4, 3, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + Result[3][2] = m[2][3]; + return Result; + } + }; + + template + struct compute_transpose<4, 2, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<2, 4, T, Q> call(mat<4, 2, T, Q> const& m) + { + mat<2, 4, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + return Result; + } + }; + + template + struct compute_transpose<4, 3, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<3, 4, T, Q> call(mat<4, 3, T, Q> const& m) + { + mat<3, 4, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[2][3] = m[3][2]; + return Result; + } + }; + + template + struct compute_transpose<4, 4, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<4, 4, T, Q> call(mat<4, 4, T, Q> const& m) + { + mat<4, 4, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[2][3] = m[3][2]; + + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + Result[3][2] = m[2][3]; + Result[3][3] = m[3][3]; + return Result; + } + }; + + template + struct compute_determinant{}; + + template + struct compute_determinant<2, 2, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static T call(mat<2, 2, T, Q> const& m) + { + return m[0][0] * m[1][1] - m[1][0] * m[0][1]; + } + }; + + template + struct compute_determinant<3, 3, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static T call(mat<3, 3, T, Q> const& m) + { + return + + m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) + - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) + + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]); + } + }; + + template + struct compute_determinant<4, 4, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static T call(mat<4, 4, T, Q> const& m) + { + T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + + vec<4, T, Q> DetCof( + + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), + - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), + + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), + - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05)); + + return + m[0][0] * DetCof[0] + m[0][1] * DetCof[1] + + m[0][2] * DetCof[2] + m[0][3] * DetCof[3]; + } + }; + + template + struct compute_inverse{}; + + template + struct compute_inverse<2, 2, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<2, 2, T, Q> call(mat<2, 2, T, Q> const& m) + { + T OneOverDeterminant = static_cast(1) / ( + + m[0][0] * m[1][1] + - m[1][0] * m[0][1]); + + mat<2, 2, T, Q> Inverse( + + m[1][1] * OneOverDeterminant, + - m[0][1] * OneOverDeterminant, + - m[1][0] * OneOverDeterminant, + + m[0][0] * OneOverDeterminant); + + return Inverse; + } + }; + + template + struct compute_inverse<3, 3, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<3, 3, T, Q> call(mat<3, 3, T, Q> const& m) + { + T OneOverDeterminant = static_cast(1) / ( + + m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) + - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) + + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2])); + + mat<3, 3, T, Q> Inverse; + Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDeterminant; + Inverse[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDeterminant; + Inverse[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDeterminant; + Inverse[0][1] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDeterminant; + Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDeterminant; + Inverse[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDeterminant; + Inverse[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDeterminant; + Inverse[1][2] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDeterminant; + Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDeterminant; + + return Inverse; + } + }; + + template + struct compute_inverse<4, 4, T, Q, Aligned> + { + GLM_FUNC_QUALIFIER static mat<4, 4, T, Q> call(mat<4, 4, T, Q> const& m) + { + T Coef00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + T Coef02 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + T Coef03 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + T Coef04 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + T Coef06 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + T Coef07 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + T Coef08 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + T Coef10 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + T Coef11 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + T Coef12 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + T Coef14 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + T Coef15 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + T Coef16 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + T Coef18 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + T Coef19 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + T Coef20 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + T Coef22 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + T Coef23 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + vec<4, T, Q> Fac0(Coef00, Coef00, Coef02, Coef03); + vec<4, T, Q> Fac1(Coef04, Coef04, Coef06, Coef07); + vec<4, T, Q> Fac2(Coef08, Coef08, Coef10, Coef11); + vec<4, T, Q> Fac3(Coef12, Coef12, Coef14, Coef15); + vec<4, T, Q> Fac4(Coef16, Coef16, Coef18, Coef19); + vec<4, T, Q> Fac5(Coef20, Coef20, Coef22, Coef23); + + vec<4, T, Q> Vec0(m[1][0], m[0][0], m[0][0], m[0][0]); + vec<4, T, Q> Vec1(m[1][1], m[0][1], m[0][1], m[0][1]); + vec<4, T, Q> Vec2(m[1][2], m[0][2], m[0][2], m[0][2]); + vec<4, T, Q> Vec3(m[1][3], m[0][3], m[0][3], m[0][3]); + + vec<4, T, Q> Inv0(Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2); + vec<4, T, Q> Inv1(Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4); + vec<4, T, Q> Inv2(Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5); + vec<4, T, Q> Inv3(Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5); + + vec<4, T, Q> SignA(+1, -1, +1, -1); + vec<4, T, Q> SignB(-1, +1, -1, +1); + mat<4, 4, T, Q> Inverse(Inv0 * SignA, Inv1 * SignB, Inv2 * SignA, Inv3 * SignB); + + vec<4, T, Q> Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0], Inverse[3][0]); + + vec<4, T, Q> Dot0(m[0] * Row0); + T Dot1 = (Dot0.x + Dot0.y) + (Dot0.z + Dot0.w); + + T OneOverDeterminant = static_cast(1) / Dot1; + + return Inverse * OneOverDeterminant; + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER mat matrixCompMult(mat const& x, mat const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'matrixCompMult' only accept floating-point inputs"); + return detail::compute_matrixCompMult::value>::call(x, y); + } + + template + GLM_FUNC_QUALIFIER typename detail::outerProduct_trait::type outerProduct(vec const& c, vec const& r) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'outerProduct' only accept floating-point inputs"); + + typename detail::outerProduct_trait::type m; + for(length_t i = 0; i < m.length(); ++i) + m[i] = c * r[i]; + return m; + } + + template + GLM_FUNC_QUALIFIER typename mat::transpose_type transpose(mat const& m) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'transpose' only accept floating-point inputs"); + return detail::compute_transpose::value>::call(m); + } + + template + GLM_FUNC_QUALIFIER T determinant(mat const& m) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'determinant' only accept floating-point inputs"); + return detail::compute_determinant::value>::call(m); + } + + template + GLM_FUNC_QUALIFIER mat inverse(mat const& m) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE, "'inverse' only accept floating-point inputs"); + return detail::compute_inverse::value>::call(m); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_matrix_simd.inl" +#endif + diff --git a/dep/glm/detail/func_matrix_simd.inl b/dep/glm/detail/func_matrix_simd.inl new file mode 100644 index 0000000..f67ac66 --- /dev/null +++ b/dep/glm/detail/func_matrix_simd.inl @@ -0,0 +1,249 @@ +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +#include "type_mat4x4.hpp" +#include "../geometric.hpp" +#include "../simd/matrix.h" +#include + +namespace glm{ +namespace detail +{ +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE + template + struct compute_matrixCompMult<4, 4, float, Q, true> + { + GLM_STATIC_ASSERT(detail::is_aligned::value, "Specialization requires aligned"); + + GLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& x, mat<4, 4, float, Q> const& y) + { + mat<4, 4, float, Q> Result; + glm_mat4_matrixCompMult( + *static_cast(&x[0].data), + *static_cast(&y[0].data), + *static_cast(&Result[0].data)); + return Result; + } + }; +# endif + + template + struct compute_transpose<4, 4, float, Q, true> + { + GLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& m) + { + mat<4, 4, float, Q> Result; + glm_mat4_transpose(&m[0].data, &Result[0].data); + return Result; + } + }; + + template + struct compute_determinant<4, 4, float, Q, true> + { + GLM_FUNC_QUALIFIER static float call(mat<4, 4, float, Q> const& m) + { + return _mm_cvtss_f32(glm_mat4_determinant(&m[0].data)); + } + }; + + template + struct compute_inverse<4, 4, float, Q, true> + { + GLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& m) + { + mat<4, 4, float, Q> Result; + glm_mat4_inverse(&m[0].data, &Result[0].data); + return Result; + } + }; +}//namespace detail + +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE + template<> + GLM_FUNC_QUALIFIER mat<4, 4, float, aligned_lowp> outerProduct<4, 4, float, aligned_lowp>(vec<4, float, aligned_lowp> const& c, vec<4, float, aligned_lowp> const& r) + { + __m128 NativeResult[4]; + glm_mat4_outerProduct(c.data, r.data, NativeResult); + mat<4, 4, float, aligned_lowp> Result; + std::memcpy(&Result[0], &NativeResult[0], sizeof(Result)); + return Result; + } + + template<> + GLM_FUNC_QUALIFIER mat<4, 4, float, aligned_mediump> outerProduct<4, 4, float, aligned_mediump>(vec<4, float, aligned_mediump> const& c, vec<4, float, aligned_mediump> const& r) + { + __m128 NativeResult[4]; + glm_mat4_outerProduct(c.data, r.data, NativeResult); + mat<4, 4, float, aligned_mediump> Result; + std::memcpy(&Result[0], &NativeResult[0], sizeof(Result)); + return Result; + } + + template<> + GLM_FUNC_QUALIFIER mat<4, 4, float, aligned_highp> outerProduct<4, 4, float, aligned_highp>(vec<4, float, aligned_highp> const& c, vec<4, float, aligned_highp> const& r) + { + __m128 NativeResult[4]; + glm_mat4_outerProduct(c.data, r.data, NativeResult); + mat<4, 4, float, aligned_highp> Result; + std::memcpy(&Result[0], &NativeResult[0], sizeof(Result)); + return Result; + } +# endif +}//namespace glm + +#elif GLM_ARCH & GLM_ARCH_NEON_BIT + +namespace glm { +#if GLM_LANG & GLM_LANG_CXX11_FLAG + template + GLM_FUNC_QUALIFIER + typename std::enable_if::value, mat<4, 4, float, Q>>::type + operator*(mat<4, 4, float, Q> const & m1, mat<4, 4, float, Q> const & m2) + { + auto MulRow = [&](int l) { + float32x4_t const SrcA = m2[l].data; + + float32x4_t r = neon::mul_lane(m1[0].data, SrcA, 0); + r = neon::madd_lane(r, m1[1].data, SrcA, 1); + r = neon::madd_lane(r, m1[2].data, SrcA, 2); + r = neon::madd_lane(r, m1[3].data, SrcA, 3); + + return r; + }; + + mat<4, 4, float, aligned_highp> Result; + Result[0].data = MulRow(0); + Result[1].data = MulRow(1); + Result[2].data = MulRow(2); + Result[3].data = MulRow(3); + + return Result; + } +#endif // CXX11 + + template + struct detail::compute_inverse<4, 4, float, Q, true> + { + GLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& m) + { + float32x4_t const& m0 = m[0].data; + float32x4_t const& m1 = m[1].data; + float32x4_t const& m2 = m[2].data; + float32x4_t const& m3 = m[3].data; + + // m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // m[1][2] * m[3][3] - m[3][2] * m[1][3]; + // m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + float32x4_t Fac0; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 2), neon::dup_lane(m1, 2)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 3), 3, m2, 3); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 2), 3, m2, 2); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 3), neon::dup_lane(m1, 3)); + Fac0 = w0 * w1 - w2 * w3; + } + + // m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // m[1][1] * m[3][3] - m[3][1] * m[1][3]; + // m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + float32x4_t Fac1; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 1), neon::dup_lane(m1, 1)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 3), 3, m2, 3); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 1), 3, m2, 1); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 3), neon::dup_lane(m1, 3)); + Fac1 = w0 * w1 - w2 * w3; + } + + // m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // m[1][1] * m[3][2] - m[3][1] * m[1][2]; + // m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + float32x4_t Fac2; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 1), neon::dup_lane(m1, 1)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 2), 3, m2, 2); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 1), 3, m2, 1); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 2), neon::dup_lane(m1, 2)); + Fac2 = w0 * w1 - w2 * w3; + } + + // m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // m[1][0] * m[3][3] - m[3][0] * m[1][3]; + // m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + float32x4_t Fac3; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 0), neon::dup_lane(m1, 0)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 3), 3, m2, 3); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 0), 3, m2, 0); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 3), neon::dup_lane(m1, 3)); + Fac3 = w0 * w1 - w2 * w3; + } + + // m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // m[1][0] * m[3][2] - m[3][0] * m[1][2]; + // m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + float32x4_t Fac4; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 0), neon::dup_lane(m1, 0)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 2), 3, m2, 2); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 0), 3, m2, 0); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 2), neon::dup_lane(m1, 2)); + Fac4 = w0 * w1 - w2 * w3; + } + + // m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // m[1][0] * m[3][1] - m[3][0] * m[1][1]; + // m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + float32x4_t Fac5; + { + float32x4_t w0 = vcombine_f32(neon::dup_lane(m2, 0), neon::dup_lane(m1, 0)); + float32x4_t w1 = neon::copy_lane(neon::dupq_lane(m3, 1), 3, m2, 1); + float32x4_t w2 = neon::copy_lane(neon::dupq_lane(m3, 0), 3, m2, 0); + float32x4_t w3 = vcombine_f32(neon::dup_lane(m2, 1), neon::dup_lane(m1, 1)); + Fac5 = w0 * w1 - w2 * w3; + } + + float32x4_t Vec0 = neon::copy_lane(neon::dupq_lane(m0, 0), 0, m1, 0); // (m[1][0], m[0][0], m[0][0], m[0][0]); + float32x4_t Vec1 = neon::copy_lane(neon::dupq_lane(m0, 1), 0, m1, 1); // (m[1][1], m[0][1], m[0][1], m[0][1]); + float32x4_t Vec2 = neon::copy_lane(neon::dupq_lane(m0, 2), 0, m1, 2); // (m[1][2], m[0][2], m[0][2], m[0][2]); + float32x4_t Vec3 = neon::copy_lane(neon::dupq_lane(m0, 3), 0, m1, 3); // (m[1][3], m[0][3], m[0][3], m[0][3]); + + float32x4_t Inv0 = Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2; + float32x4_t Inv1 = Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4; + float32x4_t Inv2 = Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5; + float32x4_t Inv3 = Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5; + + float32x4_t r0 = float32x4_t{-1, +1, -1, +1} * Inv0; + float32x4_t r1 = float32x4_t{+1, -1, +1, -1} * Inv1; + float32x4_t r2 = float32x4_t{-1, +1, -1, +1} * Inv2; + float32x4_t r3 = float32x4_t{+1, -1, +1, -1} * Inv3; + + float32x4_t det = neon::mul_lane(r0, m0, 0); + det = neon::madd_lane(det, r1, m0, 1); + det = neon::madd_lane(det, r2, m0, 2); + det = neon::madd_lane(det, r3, m0, 3); + + float32x4_t rdet = vdupq_n_f32(1 / vgetq_lane_f32(det, 0)); + + mat<4, 4, float, Q> r; + r[0].data = vmulq_f32(r0, rdet); + r[1].data = vmulq_f32(r1, rdet); + r[2].data = vmulq_f32(r2, rdet); + r[3].data = vmulq_f32(r3, rdet); + return r; + } + }; +}//namespace glm +#endif diff --git a/dep/glm/detail/func_packing.inl b/dep/glm/detail/func_packing.inl new file mode 100644 index 0000000..234b093 --- /dev/null +++ b/dep/glm/detail/func_packing.inl @@ -0,0 +1,189 @@ +/// @ref core +/// @file glm/detail/func_packing.inl + +#include "../common.hpp" +#include "type_half.hpp" + +namespace glm +{ + GLM_FUNC_QUALIFIER uint packUnorm2x16(vec2 const& v) + { + union + { + unsigned short in[2]; + uint out; + } u; + + vec<2, unsigned short, defaultp> result(round(clamp(v, 0.0f, 1.0f) * 65535.0f)); + + u.in[0] = result[0]; + u.in[1] = result[1]; + + return u.out; + } + + GLM_FUNC_QUALIFIER vec2 unpackUnorm2x16(uint p) + { + union + { + uint in; + unsigned short out[2]; + } u; + + u.in = p; + + return vec2(u.out[0], u.out[1]) * 1.5259021896696421759365224689097e-5f; + } + + GLM_FUNC_QUALIFIER uint packSnorm2x16(vec2 const& v) + { + union + { + signed short in[2]; + uint out; + } u; + + vec<2, short, defaultp> result(round(clamp(v, -1.0f, 1.0f) * 32767.0f)); + + u.in[0] = result[0]; + u.in[1] = result[1]; + + return u.out; + } + + GLM_FUNC_QUALIFIER vec2 unpackSnorm2x16(uint p) + { + union + { + uint in; + signed short out[2]; + } u; + + u.in = p; + + return clamp(vec2(u.out[0], u.out[1]) * 3.0518509475997192297128208258309e-5f, -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint packUnorm4x8(vec4 const& v) + { + union + { + unsigned char in[4]; + uint out; + } u; + + vec<4, unsigned char, defaultp> 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; + } + + GLM_FUNC_QUALIFIER vec4 unpackUnorm4x8(uint p) + { + union + { + uint in; + unsigned char out[4]; + } u; + + u.in = p; + + return vec4(u.out[0], u.out[1], u.out[2], u.out[3]) * 0.0039215686274509803921568627451f; + } + + GLM_FUNC_QUALIFIER uint packSnorm4x8(vec4 const& v) + { + union + { + signed char in[4]; + uint out; + } u; + + vec<4, signed char, defaultp> 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; + } + + GLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint p) + { + union + { + uint in; + signed char out[4]; + } u; + + u.in = p; + + 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) + { + 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) + { + 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) + { + union + { + signed short in[2]; + uint out; + } u; + + u.in[0] = detail::toFloat16(v.x); + u.in[1] = detail::toFloat16(v.y); + + return u.out; + } + + GLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint v) + { + union + { + uint in; + signed short out[2]; + } u; + + u.in = v; + + return vec2( + detail::toFloat32(u.out[0]), + detail::toFloat32(u.out[1])); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_packing_simd.inl" +#endif + diff --git a/dep/glm/detail/func_packing_simd.inl b/dep/glm/detail/func_packing_simd.inl new file mode 100644 index 0000000..fd0fe8b --- /dev/null +++ b/dep/glm/detail/func_packing_simd.inl @@ -0,0 +1,6 @@ +namespace glm{ +namespace detail +{ + +}//namespace detail +}//namespace glm diff --git a/dep/glm/detail/func_trigonometric.inl b/dep/glm/detail/func_trigonometric.inl new file mode 100644 index 0000000..e129dce --- /dev/null +++ b/dep/glm/detail/func_trigonometric.inl @@ -0,0 +1,197 @@ +#include "_vectorize.hpp" +#include +#include + +namespace glm +{ + // radians + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType radians(genType degrees) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'radians' only accept floating-point input"); + + return degrees * static_cast(0.01745329251994329576923690768489); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec radians(vec const& v) + { + return detail::functor1::call(radians, v); + } + + // degrees + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType degrees(genType radians) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'degrees' only accept floating-point input"); + + return radians * static_cast(57.295779513082320876798154814105); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec degrees(vec const& v) + { + return detail::functor1::call(degrees, v); + } + + // sin + using ::std::sin; + + template + GLM_FUNC_QUALIFIER vec sin(vec const& v) + { + return detail::functor1::call(sin, v); + } + + // cos + using std::cos; + + template + GLM_FUNC_QUALIFIER vec cos(vec const& v) + { + return detail::functor1::call(cos, v); + } + + // tan + using std::tan; + + template + GLM_FUNC_QUALIFIER vec tan(vec const& v) + { + return detail::functor1::call(tan, v); + } + + // asin + using std::asin; + + template + GLM_FUNC_QUALIFIER vec asin(vec const& v) + { + return detail::functor1::call(asin, v); + } + + // acos + using std::acos; + + template + GLM_FUNC_QUALIFIER vec acos(vec const& v) + { + return detail::functor1::call(acos, v); + } + + // atan + template + GLM_FUNC_QUALIFIER genType atan(genType y, genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'atan' only accept floating-point input"); + + return ::std::atan2(y, x); + } + + template + GLM_FUNC_QUALIFIER vec atan(vec const& a, vec const& b) + { + return detail::functor2::call(::std::atan2, a, b); + } + + using std::atan; + + template + GLM_FUNC_QUALIFIER vec atan(vec const& v) + { + return detail::functor1::call(atan, v); + } + + // sinh + using std::sinh; + + template + GLM_FUNC_QUALIFIER vec sinh(vec const& v) + { + return detail::functor1::call(sinh, v); + } + + // cosh + using std::cosh; + + template + GLM_FUNC_QUALIFIER vec cosh(vec const& v) + { + return detail::functor1::call(cosh, v); + } + + // tanh + using std::tanh; + + template + GLM_FUNC_QUALIFIER vec tanh(vec const& v) + { + return detail::functor1::call(tanh, v); + } + + // asinh +# if GLM_HAS_CXX11_STL + using std::asinh; +# else + template + GLM_FUNC_QUALIFIER genType asinh(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'asinh' only accept floating-point input"); + + return (x < static_cast(0) ? static_cast(-1) : (x > static_cast(0) ? static_cast(1) : static_cast(0))) * log(std::abs(x) + sqrt(static_cast(1) + x * x)); + } +# endif + + template + GLM_FUNC_QUALIFIER vec asinh(vec const& v) + { + return detail::functor1::call(asinh, v); + } + + // acosh +# if GLM_HAS_CXX11_STL + using std::acosh; +# else + template + GLM_FUNC_QUALIFIER genType acosh(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acosh' only accept floating-point input"); + + if(x < static_cast(1)) + return static_cast(0); + return log(x + sqrt(x * x - static_cast(1))); + } +# endif + + template + GLM_FUNC_QUALIFIER vec acosh(vec const& v) + { + return detail::functor1::call(acosh, v); + } + + // atanh +# if GLM_HAS_CXX11_STL + using std::atanh; +# else + template + GLM_FUNC_QUALIFIER genType atanh(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'atanh' only accept floating-point input"); + + if(std::abs(x) >= static_cast(1)) + return 0; + return static_cast(0.5) * log((static_cast(1) + x) / (static_cast(1) - x)); + } +# endif + + template + GLM_FUNC_QUALIFIER vec atanh(vec const& v) + { + return detail::functor1::call(atanh, v); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_trigonometric_simd.inl" +#endif + diff --git a/dep/glm/detail/func_trigonometric_simd.inl b/dep/glm/detail/func_trigonometric_simd.inl new file mode 100644 index 0000000..e69de29 diff --git a/dep/glm/detail/func_vector_relational.inl b/dep/glm/detail/func_vector_relational.inl new file mode 100644 index 0000000..80c9e87 --- /dev/null +++ b/dep/glm/detail/func_vector_relational.inl @@ -0,0 +1,87 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec lessThan(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] < y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec lessThanEqual(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] <= y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec greaterThan(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] > y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec greaterThanEqual(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] >= y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] == y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = x[i] != y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool any(vec const& v) + { + bool Result = false; + for(length_t i = 0; i < L; ++i) + Result = Result || v[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool all(vec const& v) + { + bool Result = true; + for(length_t i = 0; i < L; ++i) + Result = Result && v[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec not_(vec const& v) + { + vec Result(true); + for(length_t i = 0; i < L; ++i) + Result[i] = !v[i]; + return Result; + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "func_vector_relational_simd.inl" +#endif diff --git a/dep/glm/detail/func_vector_relational_simd.inl b/dep/glm/detail/func_vector_relational_simd.inl new file mode 100644 index 0000000..fd0fe8b --- /dev/null +++ b/dep/glm/detail/func_vector_relational_simd.inl @@ -0,0 +1,6 @@ +namespace glm{ +namespace detail +{ + +}//namespace detail +}//namespace glm diff --git a/dep/glm/detail/glm.cpp b/dep/glm/detail/glm.cpp new file mode 100644 index 0000000..e0755bd --- /dev/null +++ b/dep/glm/detail/glm.cpp @@ -0,0 +1,263 @@ +/// @ref core +/// @file glm/glm.cpp + +#ifndef GLM_ENABLE_EXPERIMENTAL +#define GLM_ENABLE_EXPERIMENTAL +#endif +#include +#include +#include +#include +#include +#include + +namespace glm +{ +// tvec1 type explicit instantiation +template struct vec<1, uint8, lowp>; +template struct vec<1, uint16, lowp>; +template struct vec<1, uint32, lowp>; +template struct vec<1, uint64, lowp>; +template struct vec<1, int8, lowp>; +template struct vec<1, int16, lowp>; +template struct vec<1, int32, lowp>; +template struct vec<1, int64, lowp>; +template struct vec<1, float32, lowp>; +template struct vec<1, float64, lowp>; + +template struct vec<1, uint8, mediump>; +template struct vec<1, uint16, mediump>; +template struct vec<1, uint32, mediump>; +template struct vec<1, uint64, mediump>; +template struct vec<1, int8, mediump>; +template struct vec<1, int16, mediump>; +template struct vec<1, int32, mediump>; +template struct vec<1, int64, mediump>; +template struct vec<1, float32, mediump>; +template struct vec<1, float64, mediump>; + +template struct vec<1, uint8, highp>; +template struct vec<1, uint16, highp>; +template struct vec<1, uint32, highp>; +template struct vec<1, uint64, highp>; +template struct vec<1, int8, highp>; +template struct vec<1, int16, highp>; +template struct vec<1, int32, highp>; +template struct vec<1, int64, highp>; +template struct vec<1, float32, highp>; +template struct vec<1, float64, highp>; + +// tvec2 type explicit instantiation +template struct vec<2, uint8, lowp>; +template struct vec<2, uint16, lowp>; +template struct vec<2, uint32, lowp>; +template struct vec<2, uint64, lowp>; +template struct vec<2, int8, lowp>; +template struct vec<2, int16, lowp>; +template struct vec<2, int32, lowp>; +template struct vec<2, int64, lowp>; +template struct vec<2, float32, lowp>; +template struct vec<2, float64, lowp>; + +template struct vec<2, uint8, mediump>; +template struct vec<2, uint16, mediump>; +template struct vec<2, uint32, mediump>; +template struct vec<2, uint64, mediump>; +template struct vec<2, int8, mediump>; +template struct vec<2, int16, mediump>; +template struct vec<2, int32, mediump>; +template struct vec<2, int64, mediump>; +template struct vec<2, float32, mediump>; +template struct vec<2, float64, mediump>; + +template struct vec<2, uint8, highp>; +template struct vec<2, uint16, highp>; +template struct vec<2, uint32, highp>; +template struct vec<2, uint64, highp>; +template struct vec<2, int8, highp>; +template struct vec<2, int16, highp>; +template struct vec<2, int32, highp>; +template struct vec<2, int64, highp>; +template struct vec<2, float32, highp>; +template struct vec<2, float64, highp>; + +// tvec3 type explicit instantiation +template struct vec<3, uint8, lowp>; +template struct vec<3, uint16, lowp>; +template struct vec<3, uint32, lowp>; +template struct vec<3, uint64, lowp>; +template struct vec<3, int8, lowp>; +template struct vec<3, int16, lowp>; +template struct vec<3, int32, lowp>; +template struct vec<3, int64, lowp>; +template struct vec<3, float32, lowp>; +template struct vec<3, float64, lowp>; + +template struct vec<3, uint8, mediump>; +template struct vec<3, uint16, mediump>; +template struct vec<3, uint32, mediump>; +template struct vec<3, uint64, mediump>; +template struct vec<3, int8, mediump>; +template struct vec<3, int16, mediump>; +template struct vec<3, int32, mediump>; +template struct vec<3, int64, mediump>; +template struct vec<3, float32, mediump>; +template struct vec<3, float64, mediump>; + +template struct vec<3, uint8, highp>; +template struct vec<3, uint16, highp>; +template struct vec<3, uint32, highp>; +template struct vec<3, uint64, highp>; +template struct vec<3, int8, highp>; +template struct vec<3, int16, highp>; +template struct vec<3, int32, highp>; +template struct vec<3, int64, highp>; +template struct vec<3, float32, highp>; +template struct vec<3, float64, highp>; + +// tvec4 type explicit instantiation +template struct vec<4, uint8, lowp>; +template struct vec<4, uint16, lowp>; +template struct vec<4, uint32, lowp>; +template struct vec<4, uint64, lowp>; +template struct vec<4, int8, lowp>; +template struct vec<4, int16, lowp>; +template struct vec<4, int32, lowp>; +template struct vec<4, int64, lowp>; +template struct vec<4, float32, lowp>; +template struct vec<4, float64, lowp>; + +template struct vec<4, uint8, mediump>; +template struct vec<4, uint16, mediump>; +template struct vec<4, uint32, mediump>; +template struct vec<4, uint64, mediump>; +template struct vec<4, int8, mediump>; +template struct vec<4, int16, mediump>; +template struct vec<4, int32, mediump>; +template struct vec<4, int64, mediump>; +template struct vec<4, float32, mediump>; +template struct vec<4, float64, mediump>; + +template struct vec<4, uint8, highp>; +template struct vec<4, uint16, highp>; +template struct vec<4, uint32, highp>; +template struct vec<4, uint64, highp>; +template struct vec<4, int8, highp>; +template struct vec<4, int16, highp>; +template struct vec<4, int32, highp>; +template struct vec<4, int64, highp>; +template struct vec<4, float32, highp>; +template struct vec<4, float64, highp>; + +// tmat2x2 type explicit instantiation +template struct mat<2, 2, float32, lowp>; +template struct mat<2, 2, float64, lowp>; + +template struct mat<2, 2, float32, mediump>; +template struct mat<2, 2, float64, mediump>; + +template struct mat<2, 2, float32, highp>; +template struct mat<2, 2, float64, highp>; + +// tmat2x3 type explicit instantiation +template struct mat<2, 3, float32, lowp>; +template struct mat<2, 3, float64, lowp>; + +template struct mat<2, 3, float32, mediump>; +template struct mat<2, 3, float64, mediump>; + +template struct mat<2, 3, float32, highp>; +template struct mat<2, 3, float64, highp>; + +// tmat2x4 type explicit instantiation +template struct mat<2, 4, float32, lowp>; +template struct mat<2, 4, float64, lowp>; + +template struct mat<2, 4, float32, mediump>; +template struct mat<2, 4, float64, mediump>; + +template struct mat<2, 4, float32, highp>; +template struct mat<2, 4, float64, highp>; + +// tmat3x2 type explicit instantiation +template struct mat<3, 2, float32, lowp>; +template struct mat<3, 2, float64, lowp>; + +template struct mat<3, 2, float32, mediump>; +template struct mat<3, 2, float64, mediump>; + +template struct mat<3, 2, float32, highp>; +template struct mat<3, 2, float64, highp>; + +// tmat3x3 type explicit instantiation +template struct mat<3, 3, float32, lowp>; +template struct mat<3, 3, float64, lowp>; + +template struct mat<3, 3, float32, mediump>; +template struct mat<3, 3, float64, mediump>; + +template struct mat<3, 3, float32, highp>; +template struct mat<3, 3, float64, highp>; + +// tmat3x4 type explicit instantiation +template struct mat<3, 4, float32, lowp>; +template struct mat<3, 4, float64, lowp>; + +template struct mat<3, 4, float32, mediump>; +template struct mat<3, 4, float64, mediump>; + +template struct mat<3, 4, float32, highp>; +template struct mat<3, 4, float64, highp>; + +// tmat4x2 type explicit instantiation +template struct mat<4, 2, float32, lowp>; +template struct mat<4, 2, float64, lowp>; + +template struct mat<4, 2, float32, mediump>; +template struct mat<4, 2, float64, mediump>; + +template struct mat<4, 2, float32, highp>; +template struct mat<4, 2, float64, highp>; + +// tmat4x3 type explicit instantiation +template struct mat<4, 3, float32, lowp>; +template struct mat<4, 3, float64, lowp>; + +template struct mat<4, 3, float32, mediump>; +template struct mat<4, 3, float64, mediump>; + +template struct mat<4, 3, float32, highp>; +template struct mat<4, 3, float64, highp>; + +// tmat4x4 type explicit instantiation +template struct mat<4, 4, float32, lowp>; +template struct mat<4, 4, float64, lowp>; + +template struct mat<4, 4, float32, mediump>; +template struct mat<4, 4, float64, mediump>; + +template struct mat<4, 4, float32, highp>; +template struct mat<4, 4, float64, highp>; + +// tquat type explicit instantiation +template struct qua; +template struct qua; + +template struct qua; +template struct qua; + +template struct qua; +template struct qua; + +//tdualquat type explicit instantiation +template struct tdualquat; +template struct tdualquat; + +template struct tdualquat; +template struct tdualquat; + +template struct tdualquat; +template struct tdualquat; + +}//namespace glm + diff --git a/dep/glm/detail/qualifier.hpp b/dep/glm/detail/qualifier.hpp new file mode 100644 index 0000000..b6c9df0 --- /dev/null +++ b/dep/glm/detail/qualifier.hpp @@ -0,0 +1,230 @@ +#pragma once + +#include "setup.hpp" + +namespace glm +{ + /// Qualify GLM types in term of alignment (packed, aligned) and precision in term of ULPs (lowp, mediump, highp) + enum qualifier + { + packed_highp, ///< Typed data is tightly packed in memory and operations are executed with high precision in term of ULPs + packed_mediump, ///< Typed data is tightly packed in memory and operations are executed with medium precision in term of ULPs for higher performance + packed_lowp, ///< Typed data is tightly packed in memory and operations are executed with low precision in term of ULPs to maximize performance + +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE + aligned_highp, ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs + aligned_mediump, ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs for higher performance + aligned_lowp, // ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs to maximize performance + aligned = aligned_highp, ///< By default aligned qualifier is also high precision +# endif + + highp = packed_highp, ///< By default highp qualifier is also packed + mediump = packed_mediump, ///< By default mediump qualifier is also packed + lowp = packed_lowp, ///< By default lowp qualifier is also packed + packed = packed_highp, ///< By default packed qualifier is also high precision + +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE && defined(GLM_FORCE_DEFAULT_ALIGNED_GENTYPES) + defaultp = aligned_highp +# else + defaultp = highp +# endif + }; + + typedef qualifier precision; + + template struct vec; + template struct mat; + template struct qua; + +# if GLM_HAS_TEMPLATE_ALIASES + template using tvec1 = vec<1, T, Q>; + template using tvec2 = vec<2, T, Q>; + template using tvec3 = vec<3, T, Q>; + template using tvec4 = vec<4, T, Q>; + template using tmat2x2 = mat<2, 2, T, Q>; + template using tmat2x3 = mat<2, 3, T, Q>; + template using tmat2x4 = mat<2, 4, T, Q>; + template using tmat3x2 = mat<3, 2, T, Q>; + template using tmat3x3 = mat<3, 3, T, Q>; + template using tmat3x4 = mat<3, 4, T, Q>; + template using tmat4x2 = mat<4, 2, T, Q>; + template using tmat4x3 = mat<4, 3, T, Q>; + template using tmat4x4 = mat<4, 4, T, Q>; + template using tquat = qua; +# endif + +namespace detail +{ + template + struct is_aligned + { + static const bool value = false; + }; + +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE + template<> + struct is_aligned + { + static const bool value = true; + }; + + template<> + struct is_aligned + { + static const bool value = true; + }; + + template<> + struct is_aligned + { + static const bool value = true; + }; +# endif + + template + struct storage + { + typedef struct type { + T data[L]; + } type; + }; + +# if GLM_HAS_ALIGNOF + template + struct storage + { + typedef struct alignas(L * sizeof(T)) type { + T data[L]; + } type; + }; + + template + struct storage<3, T, true> + { + typedef struct alignas(4 * sizeof(T)) type { + T data[4]; + } type; + }; +# endif + +# if GLM_ARCH & GLM_ARCH_SSE2_BIT + template<> + struct storage<4, float, true> + { + typedef glm_f32vec4 type; + }; + + template<> + struct storage<4, int, true> + { + typedef glm_i32vec4 type; + }; + + template<> + struct storage<4, unsigned int, true> + { + typedef glm_u32vec4 type; + }; + + template<> + struct storage<2, double, true> + { + typedef glm_f64vec2 type; + }; + + template<> + struct storage<2, detail::int64, true> + { + typedef glm_i64vec2 type; + }; + + template<> + struct storage<2, detail::uint64, true> + { + typedef glm_u64vec2 type; + }; +# endif + +# if (GLM_ARCH & GLM_ARCH_AVX_BIT) + template<> + struct storage<4, double, true> + { + typedef glm_f64vec4 type; + }; +# endif + +# if (GLM_ARCH & GLM_ARCH_AVX2_BIT) + template<> + struct storage<4, detail::int64, true> + { + typedef glm_i64vec4 type; + }; + + template<> + struct storage<4, detail::uint64, true> + { + typedef glm_u64vec4 type; + }; +# endif + +# if GLM_ARCH & GLM_ARCH_NEON_BIT + template<> + struct storage<4, float, true> + { + typedef glm_f32vec4 type; + }; + + template<> + struct storage<4, int, true> + { + typedef glm_i32vec4 type; + }; + + template<> + struct storage<4, unsigned int, true> + { + typedef glm_u32vec4 type; + }; +# endif + + enum genTypeEnum + { + GENTYPE_VEC, + GENTYPE_MAT, + GENTYPE_QUAT + }; + + template + struct genTypeTrait + {}; + + template + struct genTypeTrait > + { + static const genTypeEnum GENTYPE = GENTYPE_MAT; + }; + + template + struct init_gentype + { + }; + + template + struct init_gentype + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genType identity() + { + return genType(1, 0, 0, 0); + } + }; + + template + struct init_gentype + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genType identity() + { + return genType(1); + } + }; +}//namespace detail +}//namespace glm diff --git a/dep/glm/detail/setup.hpp b/dep/glm/detail/setup.hpp new file mode 100644 index 0000000..2c01e02 --- /dev/null +++ b/dep/glm/detail/setup.hpp @@ -0,0 +1,1135 @@ +#ifndef GLM_SETUP_INCLUDED + +#include +#include + +#define GLM_VERSION_MAJOR 0 +#define GLM_VERSION_MINOR 9 +#define GLM_VERSION_PATCH 9 +#define GLM_VERSION_REVISION 8 +#define GLM_VERSION 998 +#define GLM_VERSION_MESSAGE "GLM: version 0.9.9.8" + +#define GLM_SETUP_INCLUDED GLM_VERSION + +/////////////////////////////////////////////////////////////////////////////////// +// Active states + +#define GLM_DISABLE 0 +#define GLM_ENABLE 1 + +/////////////////////////////////////////////////////////////////////////////////// +// Messages + +#if defined(GLM_FORCE_MESSAGES) +# define GLM_MESSAGES GLM_ENABLE +#else +# define GLM_MESSAGES GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Detect the platform + +#include "../simd/platform.h" + +/////////////////////////////////////////////////////////////////////////////////// +// Build model + +#if defined(_M_ARM64) || defined(__LP64__) || defined(_M_X64) || defined(__ppc64__) || defined(__x86_64__) +# define GLM_MODEL GLM_MODEL_64 +#elif defined(__i386__) || defined(__ppc__) || defined(__ILP32__) || defined(_M_ARM) +# define GLM_MODEL GLM_MODEL_32 +#else +# define GLM_MODEL GLM_MODEL_32 +#endif// + +#if !defined(GLM_MODEL) && GLM_COMPILER != 0 +# error "GLM_MODEL undefined, your compiler may not be supported by GLM. Add #define GLM_MODEL 0 to ignore this message." +#endif//GLM_MODEL + +/////////////////////////////////////////////////////////////////////////////////// +// C++ Version + +// User defines: GLM_FORCE_CXX98, GLM_FORCE_CXX03, GLM_FORCE_CXX11, GLM_FORCE_CXX14, GLM_FORCE_CXX17, GLM_FORCE_CXX2A + +#define GLM_LANG_CXX98_FLAG (1 << 1) +#define GLM_LANG_CXX03_FLAG (1 << 2) +#define GLM_LANG_CXX0X_FLAG (1 << 3) +#define GLM_LANG_CXX11_FLAG (1 << 4) +#define GLM_LANG_CXX14_FLAG (1 << 5) +#define GLM_LANG_CXX17_FLAG (1 << 6) +#define GLM_LANG_CXX2A_FLAG (1 << 7) +#define GLM_LANG_CXXMS_FLAG (1 << 8) +#define GLM_LANG_CXXGNU_FLAG (1 << 9) + +#define GLM_LANG_CXX98 GLM_LANG_CXX98_FLAG +#define GLM_LANG_CXX03 (GLM_LANG_CXX98 | GLM_LANG_CXX03_FLAG) +#define GLM_LANG_CXX0X (GLM_LANG_CXX03 | GLM_LANG_CXX0X_FLAG) +#define GLM_LANG_CXX11 (GLM_LANG_CXX0X | GLM_LANG_CXX11_FLAG) +#define GLM_LANG_CXX14 (GLM_LANG_CXX11 | GLM_LANG_CXX14_FLAG) +#define GLM_LANG_CXX17 (GLM_LANG_CXX14 | GLM_LANG_CXX17_FLAG) +#define GLM_LANG_CXX2A (GLM_LANG_CXX17 | GLM_LANG_CXX2A_FLAG) +#define GLM_LANG_CXXMS GLM_LANG_CXXMS_FLAG +#define GLM_LANG_CXXGNU GLM_LANG_CXXGNU_FLAG + +#if (defined(_MSC_EXTENSIONS)) +# define GLM_LANG_EXT GLM_LANG_CXXMS_FLAG +#elif ((GLM_COMPILER & (GLM_COMPILER_CLANG | GLM_COMPILER_GCC)) && (GLM_ARCH & GLM_ARCH_SIMD_BIT)) +# define GLM_LANG_EXT GLM_LANG_CXXMS_FLAG +#else +# define GLM_LANG_EXT 0 +#endif + +#if (defined(GLM_FORCE_CXX_UNKNOWN)) +# define GLM_LANG 0 +#elif defined(GLM_FORCE_CXX2A) +# define GLM_LANG (GLM_LANG_CXX2A | GLM_LANG_EXT) +# define GLM_LANG_STL11_FORCED +#elif defined(GLM_FORCE_CXX17) +# define GLM_LANG (GLM_LANG_CXX17 | GLM_LANG_EXT) +# define GLM_LANG_STL11_FORCED +#elif defined(GLM_FORCE_CXX14) +# define GLM_LANG (GLM_LANG_CXX14 | GLM_LANG_EXT) +# define GLM_LANG_STL11_FORCED +#elif defined(GLM_FORCE_CXX11) +# define GLM_LANG (GLM_LANG_CXX11 | GLM_LANG_EXT) +# define GLM_LANG_STL11_FORCED +#elif defined(GLM_FORCE_CXX03) +# define GLM_LANG (GLM_LANG_CXX03 | GLM_LANG_EXT) +#elif defined(GLM_FORCE_CXX98) +# define GLM_LANG (GLM_LANG_CXX98 | GLM_LANG_EXT) +#else +# if GLM_COMPILER & GLM_COMPILER_VC && defined(_MSVC_LANG) +# if GLM_COMPILER >= GLM_COMPILER_VC15_7 +# define GLM_LANG_PLATFORM _MSVC_LANG +# elif GLM_COMPILER >= GLM_COMPILER_VC15 +# if _MSVC_LANG > 201402L +# define GLM_LANG_PLATFORM 201402L +# else +# define GLM_LANG_PLATFORM _MSVC_LANG +# endif +# else +# define GLM_LANG_PLATFORM 0 +# endif +# else +# define GLM_LANG_PLATFORM 0 +# endif + +# if __cplusplus > 201703L || GLM_LANG_PLATFORM > 201703L +# define GLM_LANG (GLM_LANG_CXX2A | GLM_LANG_EXT) +# elif __cplusplus == 201703L || GLM_LANG_PLATFORM == 201703L +# define GLM_LANG (GLM_LANG_CXX17 | GLM_LANG_EXT) +# elif __cplusplus == 201402L || __cplusplus == 201500L || GLM_LANG_PLATFORM == 201402L +# define GLM_LANG (GLM_LANG_CXX14 | GLM_LANG_EXT) +# elif __cplusplus == 201103L || GLM_LANG_PLATFORM == 201103L +# define GLM_LANG (GLM_LANG_CXX11 | GLM_LANG_EXT) +# elif defined(__INTEL_CXX11_MODE__) || defined(_MSC_VER) || defined(__GXX_EXPERIMENTAL_CXX0X__) +# define GLM_LANG (GLM_LANG_CXX0X | GLM_LANG_EXT) +# elif __cplusplus == 199711L +# define GLM_LANG (GLM_LANG_CXX98 | GLM_LANG_EXT) +# else +# define GLM_LANG (0 | GLM_LANG_EXT) +# endif +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Has of C++ features + +// http://clang.llvm.org/cxx_status.html +// http://gcc.gnu.org/projects/cxx0x.html +// http://msdn.microsoft.com/en-us/library/vstudio/hh567368(v=vs.120).aspx + +// Android has multiple STLs but C++11 STL detection doesn't always work #284 #564 +#if GLM_PLATFORM == GLM_PLATFORM_ANDROID && !defined(GLM_LANG_STL11_FORCED) +# define GLM_HAS_CXX11_STL 0 +#elif GLM_COMPILER & GLM_COMPILER_CLANG +# if (defined(_LIBCPP_VERSION) || (GLM_LANG & GLM_LANG_CXX11_FLAG) || defined(GLM_LANG_STL11_FORCED)) +# define GLM_HAS_CXX11_STL 1 +# else +# define GLM_HAS_CXX11_STL 0 +# endif +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_CXX11_STL 1 +#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_VC12)) || \ + ((GLM_PLATFORM != GLM_PLATFORM_WINDOWS) && (GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL15)))) +#endif + +// N1720 +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_STATIC_ASSERT __has_feature(cxx_static_assert) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_STATIC_ASSERT 1 +#else +# define GLM_HAS_STATIC_ASSERT ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC)))) +#endif + +// N1988 +#if GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_EXTENDED_INTEGER_TYPE 1 +#else +# define GLM_HAS_EXTENDED_INTEGER_TYPE (\ + ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC)) || \ + ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CUDA)) || \ + ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CLANG))) +#endif + +// N2672 Initializer lists http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_INITIALIZER_LISTS __has_feature(cxx_generalized_initializers) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_INITIALIZER_LISTS 1 +#else +# define GLM_HAS_INITIALIZER_LISTS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)) || \ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL14)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2544 Unrestricted unions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_UNRESTRICTED_UNIONS 1 +#else +# define GLM_HAS_UNRESTRICTED_UNIONS (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + (GLM_COMPILER & GLM_COMPILER_VC) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA))) +#endif + +// N2346 +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_DEFAULTED_FUNCTIONS __has_feature(cxx_defaulted_functions) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_DEFAULTED_FUNCTIONS 1 +#else +# define GLM_HAS_DEFAULTED_FUNCTIONS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ + ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \ + (GLM_COMPILER & GLM_COMPILER_CUDA))) +#endif + +// N2118 +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_RVALUE_REFERENCES __has_feature(cxx_rvalue_references) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_RVALUE_REFERENCES 1 +#else +# define GLM_HAS_RVALUE_REFERENCES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_VC)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2437 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS __has_feature(cxx_explicit_conversions) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS 1 +#else +# define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL14)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2258 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_TEMPLATE_ALIASES __has_feature(cxx_alias_templates) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_TEMPLATE_ALIASES 1 +#else +# define GLM_HAS_TEMPLATE_ALIASES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2930 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_RANGE_FOR __has_feature(cxx_range_for) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_RANGE_FOR 1 +#else +# define GLM_HAS_RANGE_FOR ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2341 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf +#if GLM_COMPILER & GLM_COMPILER_CLANG +# define GLM_HAS_ALIGNOF __has_feature(cxx_alignas) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_ALIGNOF 1 +#else +# define GLM_HAS_ALIGNOF ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL15)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// N2235 Generalized Constant Expressions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf +// N3652 Extended Constant Expressions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3652.html +#if (GLM_ARCH & GLM_ARCH_SIMD_BIT) // Compiler SIMD intrinsics don't support constexpr... +# define GLM_HAS_CONSTEXPR 0 +#elif (GLM_COMPILER & GLM_COMPILER_CLANG) +# define GLM_HAS_CONSTEXPR __has_feature(cxx_relaxed_constexpr) +#elif (GLM_LANG & GLM_LANG_CXX14_FLAG) +# define GLM_HAS_CONSTEXPR 1 +#else +# define GLM_HAS_CONSTEXPR ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && GLM_HAS_INITIALIZER_LISTS && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL17)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)))) +#endif + +#if GLM_HAS_CONSTEXPR +# define GLM_CONSTEXPR constexpr +#else +# define GLM_CONSTEXPR +#endif + +// +#if GLM_HAS_CONSTEXPR +# if (GLM_COMPILER & GLM_COMPILER_CLANG) +# if __has_feature(cxx_if_constexpr) +# define GLM_HAS_IF_CONSTEXPR 1 +# else +# define GLM_HAS_IF_CONSTEXPR 0 +# endif +# elif (GLM_LANG & GLM_LANG_CXX17_FLAG) +# define GLM_HAS_IF_CONSTEXPR 1 +# else +# define GLM_HAS_IF_CONSTEXPR 0 +# endif +#else +# define GLM_HAS_IF_CONSTEXPR 0 +#endif + +#if GLM_HAS_IF_CONSTEXPR +# define GLM_IF_CONSTEXPR if constexpr +#else +# define GLM_IF_CONSTEXPR if +#endif + +// +#if GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_ASSIGNABLE 1 +#else +# define GLM_HAS_ASSIGNABLE ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)) || \ + ((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 +# define GLM_HAS_MAKE_SIGNED ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) +#endif + +// +#if defined(GLM_FORCE_INTRINSICS) +# define GLM_HAS_BITSCAN_WINDOWS ((GLM_PLATFORM & GLM_PLATFORM_WINDOWS) && (\ + ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14) && (GLM_ARCH & GLM_ARCH_X86_BIT)))) +#else +# define GLM_HAS_BITSCAN_WINDOWS 0 +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// OpenMP +#ifdef _OPENMP +# if GLM_COMPILER & GLM_COMPILER_GCC +# if GLM_COMPILER >= GLM_COMPILER_GCC61 +# define GLM_HAS_OPENMP 45 +# elif GLM_COMPILER >= GLM_COMPILER_GCC49 +# define GLM_HAS_OPENMP 40 +# elif GLM_COMPILER >= GLM_COMPILER_GCC47 +# define GLM_HAS_OPENMP 31 +# else +# define GLM_HAS_OPENMP 0 +# endif +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# if GLM_COMPILER >= GLM_COMPILER_CLANG38 +# define GLM_HAS_OPENMP 31 +# else +# define GLM_HAS_OPENMP 0 +# endif +# elif GLM_COMPILER & GLM_COMPILER_VC +# define GLM_HAS_OPENMP 20 +# elif GLM_COMPILER & GLM_COMPILER_INTEL +# if GLM_COMPILER >= GLM_COMPILER_INTEL16 +# define GLM_HAS_OPENMP 40 +# else +# define GLM_HAS_OPENMP 0 +# endif +# else +# define GLM_HAS_OPENMP 0 +# endif +#else +# define GLM_HAS_OPENMP 0 +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// nullptr + +#if GLM_LANG & GLM_LANG_CXX0X_FLAG +# define GLM_CONFIG_NULLPTR GLM_ENABLE +#else +# define GLM_CONFIG_NULLPTR GLM_DISABLE +#endif + +#if GLM_CONFIG_NULLPTR == GLM_ENABLE +# define GLM_NULLPTR nullptr +#else +# define GLM_NULLPTR 0 +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Static assert + +#if GLM_HAS_STATIC_ASSERT +# define GLM_STATIC_ASSERT(x, message) static_assert(x, message) +#elif GLM_COMPILER & GLM_COMPILER_VC +# define GLM_STATIC_ASSERT(x, message) typedef char __CASSERT__##__LINE__[(x) ? 1 : -1] +#else +# define GLM_STATIC_ASSERT(x, message) assert(x) +#endif//GLM_LANG + +/////////////////////////////////////////////////////////////////////////////////// +// Qualifiers + +#if GLM_COMPILER & GLM_COMPILER_CUDA +# define GLM_CUDA_FUNC_DEF __device__ __host__ +# define GLM_CUDA_FUNC_DECL __device__ __host__ +#else +# define GLM_CUDA_FUNC_DEF +# define GLM_CUDA_FUNC_DECL +#endif + +#if defined(GLM_FORCE_INLINE) +# if GLM_COMPILER & GLM_COMPILER_VC +# define GLM_INLINE __forceinline +# define GLM_NEVER_INLINE __declspec((noinline)) +# elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG) +# define GLM_INLINE inline __attribute__((__always_inline__)) +# define GLM_NEVER_INLINE __attribute__((__noinline__)) +# elif GLM_COMPILER & GLM_COMPILER_CUDA +# define GLM_INLINE __forceinline__ +# define GLM_NEVER_INLINE __noinline__ +# else +# define GLM_INLINE inline +# define GLM_NEVER_INLINE +# endif//GLM_COMPILER +#else +# define GLM_INLINE inline +# define GLM_NEVER_INLINE +#endif//defined(GLM_FORCE_INLINE) + +#define GLM_FUNC_DECL GLM_CUDA_FUNC_DECL +#define GLM_FUNC_QUALIFIER GLM_CUDA_FUNC_DEF GLM_INLINE + +/////////////////////////////////////////////////////////////////////////////////// +// Swizzle operators + +// User defines: GLM_FORCE_SWIZZLE + +#define GLM_SWIZZLE_DISABLED 0 +#define GLM_SWIZZLE_OPERATOR 1 +#define GLM_SWIZZLE_FUNCTION 2 + +#if defined(GLM_FORCE_XYZW_ONLY) +# undef GLM_FORCE_SWIZZLE +#endif + +#if defined(GLM_SWIZZLE) +# pragma message("GLM: GLM_SWIZZLE is deprecated, use GLM_FORCE_SWIZZLE instead.") +# define GLM_FORCE_SWIZZLE +#endif + +#if defined(GLM_FORCE_SWIZZLE) && (GLM_LANG & GLM_LANG_CXXMS_FLAG) +# define GLM_CONFIG_SWIZZLE GLM_SWIZZLE_OPERATOR +#elif defined(GLM_FORCE_SWIZZLE) +# define GLM_CONFIG_SWIZZLE GLM_SWIZZLE_FUNCTION +#else +# define GLM_CONFIG_SWIZZLE GLM_SWIZZLE_DISABLED +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Allows using not basic types as genType + +// #define GLM_FORCE_UNRESTRICTED_GENTYPE + +#ifdef GLM_FORCE_UNRESTRICTED_GENTYPE +# define GLM_CONFIG_UNRESTRICTED_GENTYPE GLM_ENABLE +#else +# define GLM_CONFIG_UNRESTRICTED_GENTYPE GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Clip control, define GLM_FORCE_DEPTH_ZERO_TO_ONE before including GLM +// to use a clip space between 0 to 1. +// Coordinate system, define GLM_FORCE_LEFT_HANDED before including GLM +// to use left handed coordinate system by default. + +#define GLM_CLIP_CONTROL_ZO_BIT (1 << 0) // ZERO_TO_ONE +#define GLM_CLIP_CONTROL_NO_BIT (1 << 1) // NEGATIVE_ONE_TO_ONE +#define GLM_CLIP_CONTROL_LH_BIT (1 << 2) // LEFT_HANDED, For DirectX, Metal, Vulkan +#define GLM_CLIP_CONTROL_RH_BIT (1 << 3) // RIGHT_HANDED, For OpenGL, default in GLM + +#define GLM_CLIP_CONTROL_LH_ZO (GLM_CLIP_CONTROL_LH_BIT | GLM_CLIP_CONTROL_ZO_BIT) +#define GLM_CLIP_CONTROL_LH_NO (GLM_CLIP_CONTROL_LH_BIT | GLM_CLIP_CONTROL_NO_BIT) +#define GLM_CLIP_CONTROL_RH_ZO (GLM_CLIP_CONTROL_RH_BIT | GLM_CLIP_CONTROL_ZO_BIT) +#define GLM_CLIP_CONTROL_RH_NO (GLM_CLIP_CONTROL_RH_BIT | GLM_CLIP_CONTROL_NO_BIT) + +#ifdef GLM_FORCE_DEPTH_ZERO_TO_ONE +# ifdef GLM_FORCE_LEFT_HANDED +# define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_LH_ZO +# else +# define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_RH_ZO +# endif +#else +# ifdef GLM_FORCE_LEFT_HANDED +# define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_LH_NO +# else +# define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_RH_NO +# endif +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Qualifiers + +#if (GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)) +# define GLM_DEPRECATED __declspec(deprecated) +# define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef __declspec(align(alignment)) type name +#elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG | GLM_COMPILER_INTEL) +# define GLM_DEPRECATED __attribute__((__deprecated__)) +# define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __attribute__((aligned(alignment))) +#elif GLM_COMPILER & GLM_COMPILER_CUDA +# define GLM_DEPRECATED +# define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __align__(x) +#else +# define GLM_DEPRECATED +# define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name +#endif + +/////////////////////////////////////////////////////////////////////////////////// + +#ifdef GLM_FORCE_EXPLICIT_CTOR +# define GLM_EXPLICIT explicit +#else +# define GLM_EXPLICIT +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// SYCL + +#if GLM_COMPILER==GLM_COMPILER_SYCL + +#include +#include + +namespace glm { +namespace std { + // Import SYCL's functions into the namespace glm::std to force their usages. + // It's important to use the math built-in function (sin, exp, ...) + // of SYCL instead the std ones. + using namespace cl::sycl; + + /////////////////////////////////////////////////////////////////////////////// + // Import some "harmless" std's stuffs used by glm into + // the new glm::std namespace. + template + using numeric_limits = ::std::numeric_limits; + + using ::std::size_t; + + using ::std::uint8_t; + using ::std::uint16_t; + using ::std::uint32_t; + using ::std::uint64_t; + + using ::std::int8_t; + using ::std::int16_t; + using ::std::int32_t; + using ::std::int64_t; + + using ::std::make_unsigned; + /////////////////////////////////////////////////////////////////////////////// +} //namespace std +} //namespace glm + +#endif + +/////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////// +// Length type: all length functions returns a length_t type. +// When GLM_FORCE_SIZE_T_LENGTH is defined, length_t is a typedef of size_t otherwise +// length_t is a typedef of int like GLSL defines it. + +#define GLM_LENGTH_INT 1 +#define GLM_LENGTH_SIZE_T 2 + +#ifdef GLM_FORCE_SIZE_T_LENGTH +# define GLM_CONFIG_LENGTH_TYPE GLM_LENGTH_SIZE_T +#else +# define GLM_CONFIG_LENGTH_TYPE GLM_LENGTH_INT +#endif + +namespace glm +{ + using std::size_t; +# if GLM_CONFIG_LENGTH_TYPE == GLM_LENGTH_SIZE_T + typedef size_t length_t; +# else + typedef int length_t; +# endif +}//namespace glm + +/////////////////////////////////////////////////////////////////////////////////// +// constexpr + +#if GLM_HAS_CONSTEXPR +# define GLM_CONFIG_CONSTEXP GLM_ENABLE + + namespace glm + { + template + constexpr std::size_t countof(T const (&)[N]) + { + return N; + } + }//namespace glm +# define GLM_COUNTOF(arr) glm::countof(arr) +#elif defined(_MSC_VER) +# define GLM_CONFIG_CONSTEXP GLM_DISABLE + +# define GLM_COUNTOF(arr) _countof(arr) +#else +# define GLM_CONFIG_CONSTEXP GLM_DISABLE + +# define GLM_COUNTOF(arr) sizeof(arr) / sizeof(arr[0]) +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// uint + +namespace glm{ +namespace detail +{ + template + struct is_int + { + enum test {value = 0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; +}//namespace detail + + typedef unsigned int uint; +}//namespace glm + +/////////////////////////////////////////////////////////////////////////////////// +// 64-bit int + +#if GLM_HAS_EXTENDED_INTEGER_TYPE +# include +#endif + +namespace glm{ +namespace detail +{ +# if GLM_HAS_EXTENDED_INTEGER_TYPE + typedef std::uint64_t uint64; + typedef std::int64_t int64; +# elif (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available + typedef uint64_t uint64; + typedef int64_t int64; +# elif GLM_COMPILER & GLM_COMPILER_VC + typedef unsigned __int64 uint64; + typedef signed __int64 int64; +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic ignored "-Wlong-long" + __extension__ typedef unsigned long long uint64; + __extension__ typedef signed long long int64; +# elif (GLM_COMPILER & GLM_COMPILER_CLANG) +# pragma clang diagnostic ignored "-Wc++11-long-long" + typedef unsigned long long uint64; + typedef signed long long int64; +# else//unknown compiler + typedef unsigned long long uint64; + typedef signed long long int64; +# endif +}//namespace detail +}//namespace glm + +/////////////////////////////////////////////////////////////////////////////////// +// make_unsigned + +#if GLM_HAS_MAKE_SIGNED +# include + +namespace glm{ +namespace detail +{ + using std::make_unsigned; +}//namespace detail +}//namespace glm + +#else + +namespace glm{ +namespace detail +{ + template + struct make_unsigned + {}; + + template<> + struct make_unsigned + { + typedef unsigned char type; + }; + + template<> + struct make_unsigned + { + typedef unsigned char type; + }; + + template<> + struct make_unsigned + { + typedef unsigned short type; + }; + + template<> + struct make_unsigned + { + typedef unsigned int type; + }; + + template<> + struct make_unsigned + { + typedef unsigned long type; + }; + + template<> + struct make_unsigned + { + typedef uint64 type; + }; + + template<> + struct make_unsigned + { + typedef unsigned char type; + }; + + template<> + struct make_unsigned + { + typedef unsigned short type; + }; + + template<> + struct make_unsigned + { + typedef unsigned int type; + }; + + template<> + struct make_unsigned + { + typedef unsigned long type; + }; + + template<> + struct make_unsigned + { + typedef uint64 type; + }; +}//namespace detail +}//namespace glm +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Only use x, y, z, w as vector type components + +#ifdef GLM_FORCE_XYZW_ONLY +# define GLM_CONFIG_XYZW_ONLY GLM_ENABLE +#else +# define GLM_CONFIG_XYZW_ONLY GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Configure the use of defaulted initialized types + +#define GLM_CTOR_INIT_DISABLE 0 +#define GLM_CTOR_INITIALIZER_LIST 1 +#define GLM_CTOR_INITIALISATION 2 + +#if defined(GLM_FORCE_CTOR_INIT) && GLM_HAS_INITIALIZER_LISTS +# define GLM_CONFIG_CTOR_INIT GLM_CTOR_INITIALIZER_LIST +#elif defined(GLM_FORCE_CTOR_INIT) && !GLM_HAS_INITIALIZER_LISTS +# define GLM_CONFIG_CTOR_INIT GLM_CTOR_INITIALISATION +#else +# define GLM_CONFIG_CTOR_INIT GLM_CTOR_INIT_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Use SIMD instruction sets + +#if GLM_HAS_ALIGNOF && (GLM_LANG & GLM_LANG_CXXMS_FLAG) && (GLM_ARCH & GLM_ARCH_SIMD_BIT) +# define GLM_CONFIG_SIMD GLM_ENABLE +#else +# define GLM_CONFIG_SIMD GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Configure the use of defaulted function + +#if GLM_HAS_DEFAULTED_FUNCTIONS && GLM_CONFIG_CTOR_INIT == GLM_CTOR_INIT_DISABLE +# define GLM_CONFIG_DEFAULTED_FUNCTIONS GLM_ENABLE +# define GLM_DEFAULT = default +#else +# define GLM_CONFIG_DEFAULTED_FUNCTIONS GLM_DISABLE +# define GLM_DEFAULT +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Configure the use of aligned gentypes + +#ifdef GLM_FORCE_ALIGNED // Legacy define +# define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES +#endif + +#ifdef GLM_FORCE_DEFAULT_ALIGNED_GENTYPES +# define GLM_FORCE_ALIGNED_GENTYPES +#endif + +#if GLM_HAS_ALIGNOF && (GLM_LANG & GLM_LANG_CXXMS_FLAG) && (defined(GLM_FORCE_ALIGNED_GENTYPES) || (GLM_CONFIG_SIMD == GLM_ENABLE)) +# define GLM_CONFIG_ALIGNED_GENTYPES GLM_ENABLE +#else +# define GLM_CONFIG_ALIGNED_GENTYPES GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Configure the use of anonymous structure as implementation detail + +#if ((GLM_CONFIG_SIMD == GLM_ENABLE) || (GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR) || (GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE)) +# define GLM_CONFIG_ANONYMOUS_STRUCT GLM_ENABLE +#else +# define GLM_CONFIG_ANONYMOUS_STRUCT GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Silent warnings + +#ifdef GLM_FORCE_SILENT_WARNINGS +# define GLM_SILENT_WARNINGS GLM_ENABLE +#else +# define GLM_SILENT_WARNINGS GLM_DISABLE +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Precision + +#define GLM_HIGHP 1 +#define GLM_MEDIUMP 2 +#define GLM_LOWP 3 + +#if defined(GLM_FORCE_PRECISION_HIGHP_BOOL) || defined(GLM_PRECISION_HIGHP_BOOL) +# define GLM_CONFIG_PRECISION_BOOL GLM_HIGHP +#elif defined(GLM_FORCE_PRECISION_MEDIUMP_BOOL) || defined(GLM_PRECISION_MEDIUMP_BOOL) +# define GLM_CONFIG_PRECISION_BOOL GLM_MEDIUMP +#elif defined(GLM_FORCE_PRECISION_LOWP_BOOL) || defined(GLM_PRECISION_LOWP_BOOL) +# define GLM_CONFIG_PRECISION_BOOL GLM_LOWP +#else +# define GLM_CONFIG_PRECISION_BOOL GLM_HIGHP +#endif + +#if defined(GLM_FORCE_PRECISION_HIGHP_INT) || defined(GLM_PRECISION_HIGHP_INT) +# define GLM_CONFIG_PRECISION_INT GLM_HIGHP +#elif defined(GLM_FORCE_PRECISION_MEDIUMP_INT) || defined(GLM_PRECISION_MEDIUMP_INT) +# define GLM_CONFIG_PRECISION_INT GLM_MEDIUMP +#elif defined(GLM_FORCE_PRECISION_LOWP_INT) || defined(GLM_PRECISION_LOWP_INT) +# define GLM_CONFIG_PRECISION_INT GLM_LOWP +#else +# define GLM_CONFIG_PRECISION_INT GLM_HIGHP +#endif + +#if defined(GLM_FORCE_PRECISION_HIGHP_UINT) || defined(GLM_PRECISION_HIGHP_UINT) +# define GLM_CONFIG_PRECISION_UINT GLM_HIGHP +#elif defined(GLM_FORCE_PRECISION_MEDIUMP_UINT) || defined(GLM_PRECISION_MEDIUMP_UINT) +# define GLM_CONFIG_PRECISION_UINT GLM_MEDIUMP +#elif defined(GLM_FORCE_PRECISION_LOWP_UINT) || defined(GLM_PRECISION_LOWP_UINT) +# define GLM_CONFIG_PRECISION_UINT GLM_LOWP +#else +# define GLM_CONFIG_PRECISION_UINT GLM_HIGHP +#endif + +#if defined(GLM_FORCE_PRECISION_HIGHP_FLOAT) || defined(GLM_PRECISION_HIGHP_FLOAT) +# define GLM_CONFIG_PRECISION_FLOAT GLM_HIGHP +#elif defined(GLM_FORCE_PRECISION_MEDIUMP_FLOAT) || defined(GLM_PRECISION_MEDIUMP_FLOAT) +# define GLM_CONFIG_PRECISION_FLOAT GLM_MEDIUMP +#elif defined(GLM_FORCE_PRECISION_LOWP_FLOAT) || defined(GLM_PRECISION_LOWP_FLOAT) +# define GLM_CONFIG_PRECISION_FLOAT GLM_LOWP +#else +# define GLM_CONFIG_PRECISION_FLOAT GLM_HIGHP +#endif + +#if defined(GLM_FORCE_PRECISION_HIGHP_DOUBLE) || defined(GLM_PRECISION_HIGHP_DOUBLE) +# define GLM_CONFIG_PRECISION_DOUBLE GLM_HIGHP +#elif defined(GLM_FORCE_PRECISION_MEDIUMP_DOUBLE) || defined(GLM_PRECISION_MEDIUMP_DOUBLE) +# define GLM_CONFIG_PRECISION_DOUBLE GLM_MEDIUMP +#elif defined(GLM_FORCE_PRECISION_LOWP_DOUBLE) || defined(GLM_PRECISION_LOWP_DOUBLE) +# define GLM_CONFIG_PRECISION_DOUBLE GLM_LOWP +#else +# define GLM_CONFIG_PRECISION_DOUBLE GLM_HIGHP +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// Check inclusions of different versions of GLM + +#elif ((GLM_SETUP_INCLUDED != GLM_VERSION) && !defined(GLM_FORCE_IGNORE_VERSION)) +# error "GLM error: A different version of GLM is already included. Define GLM_FORCE_IGNORE_VERSION before including GLM headers to ignore this error." +#elif GLM_SETUP_INCLUDED == GLM_VERSION + +/////////////////////////////////////////////////////////////////////////////////// +// Messages + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_MESSAGE_DISPLAYED) +# define GLM_MESSAGE_DISPLAYED +# define GLM_STR_HELPER(x) #x +# define GLM_STR(x) GLM_STR_HELPER(x) + + // Report GLM version +# pragma message (GLM_STR(GLM_VERSION_MESSAGE)) + + // Report C++ language +# if (GLM_LANG & GLM_LANG_CXX2A_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 2A with extensions") +# elif (GLM_LANG & GLM_LANG_CXX2A_FLAG) +# pragma message("GLM: C++ 2A") +# elif (GLM_LANG & GLM_LANG_CXX17_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 17 with extensions") +# elif (GLM_LANG & GLM_LANG_CXX17_FLAG) +# pragma message("GLM: C++ 17") +# elif (GLM_LANG & GLM_LANG_CXX14_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 14 with extensions") +# elif (GLM_LANG & GLM_LANG_CXX14_FLAG) +# pragma message("GLM: C++ 14") +# elif (GLM_LANG & GLM_LANG_CXX11_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 11 with extensions") +# elif (GLM_LANG & GLM_LANG_CXX11_FLAG) +# pragma message("GLM: C++ 11") +# elif (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 0x with extensions") +# elif (GLM_LANG & GLM_LANG_CXX0X_FLAG) +# pragma message("GLM: C++ 0x") +# elif (GLM_LANG & GLM_LANG_CXX03_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 03 with extensions") +# elif (GLM_LANG & GLM_LANG_CXX03_FLAG) +# pragma message("GLM: C++ 03") +# elif (GLM_LANG & GLM_LANG_CXX98_FLAG) && (GLM_LANG & GLM_LANG_EXT) +# pragma message("GLM: C++ 98 with extensions") +# elif (GLM_LANG & GLM_LANG_CXX98_FLAG) +# pragma message("GLM: C++ 98") +# else +# pragma message("GLM: C++ language undetected") +# endif//GLM_LANG + + // Report compiler detection +# if GLM_COMPILER & GLM_COMPILER_CUDA +# pragma message("GLM: CUDA compiler detected") +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma message("GLM: Visual C++ compiler detected") +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma message("GLM: Clang compiler detected") +# elif GLM_COMPILER & GLM_COMPILER_INTEL +# pragma message("GLM: Intel Compiler detected") +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma message("GLM: GCC compiler detected") +# else +# pragma message("GLM: Compiler not detected") +# endif + + // Report build target +# if (GLM_ARCH & GLM_ARCH_AVX2_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with AVX2 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_AVX2_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with AVX2 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_AVX_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with AVX instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_AVX_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with AVX instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_SSE42_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with SSE4.2 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_SSE42_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with SSE4.2 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_SSE41_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with SSE4.1 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_SSE41_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with SSE4.1 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_SSSE3_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with SSSE3 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_SSSE3_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with SSSE3 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_SSE3_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with SSE3 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_SSE3_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with SSE3 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_SSE2_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits with SSE2 instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_SSE2_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits with SSE2 instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_X86_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: x86 64 bits build target") +# elif (GLM_ARCH & GLM_ARCH_X86_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: x86 32 bits build target") + +# elif (GLM_ARCH & GLM_ARCH_NEON_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: ARM 64 bits with Neon instruction set build target") +# elif (GLM_ARCH & GLM_ARCH_NEON_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: ARM 32 bits with Neon instruction set build target") + +# elif (GLM_ARCH & GLM_ARCH_ARM_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: ARM 64 bits build target") +# elif (GLM_ARCH & GLM_ARCH_ARM_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: ARM 32 bits build target") + +# elif (GLM_ARCH & GLM_ARCH_MIPS_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: MIPS 64 bits build target") +# elif (GLM_ARCH & GLM_ARCH_MIPS_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: MIPS 32 bits build target") + +# elif (GLM_ARCH & GLM_ARCH_PPC_BIT) && (GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: PowerPC 64 bits build target") +# elif (GLM_ARCH & GLM_ARCH_PPC_BIT) && (GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: PowerPC 32 bits build target") +# else +# pragma message("GLM: Unknown build target") +# endif//GLM_ARCH + + // Report platform name +# if(GLM_PLATFORM & GLM_PLATFORM_QNXNTO) +# pragma message("GLM: QNX platform detected") +//# elif(GLM_PLATFORM & GLM_PLATFORM_IOS) +//# pragma message("GLM: iOS platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_APPLE) +# pragma message("GLM: Apple platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_WINCE) +# pragma message("GLM: WinCE platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_WINDOWS) +# pragma message("GLM: Windows platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_CHROME_NACL) +# pragma message("GLM: Native Client detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) +# pragma message("GLM: Android platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_LINUX) +# pragma message("GLM: Linux platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_UNIX) +# pragma message("GLM: UNIX platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_UNKNOWN) +# pragma message("GLM: platform unknown") +# else +# pragma message("GLM: platform not detected") +# endif + + // Report whether only xyzw component are used +# if defined GLM_FORCE_XYZW_ONLY +# pragma message("GLM: GLM_FORCE_XYZW_ONLY is defined. Only x, y, z and w component are available in vector type. This define disables swizzle operators and SIMD instruction sets.") +# endif + + // Report swizzle operator support +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +# pragma message("GLM: GLM_FORCE_SWIZZLE is defined, swizzling operators enabled.") +# elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION +# pragma message("GLM: GLM_FORCE_SWIZZLE is defined, swizzling functions enabled. Enable compiler C++ language extensions to enable swizzle operators.") +# else +# pragma message("GLM: GLM_FORCE_SWIZZLE is undefined. swizzling functions or operators are disabled.") +# endif + + // Report .length() type +# if GLM_CONFIG_LENGTH_TYPE == GLM_LENGTH_SIZE_T +# pragma message("GLM: GLM_FORCE_SIZE_T_LENGTH is defined. .length() returns a glm::length_t, a typedef of std::size_t.") +# else +# pragma message("GLM: GLM_FORCE_SIZE_T_LENGTH is undefined. .length() returns a glm::length_t, a typedef of int following GLSL.") +# endif + +# if GLM_CONFIG_UNRESTRICTED_GENTYPE == GLM_ENABLE +# pragma message("GLM: GLM_FORCE_UNRESTRICTED_GENTYPE is defined. Removes GLSL restrictions on valid function genTypes.") +# else +# pragma message("GLM: GLM_FORCE_UNRESTRICTED_GENTYPE is undefined. Follows strictly GLSL on valid function genTypes.") +# endif + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# pragma message("GLM: GLM_FORCE_SILENT_WARNINGS is defined. Ignores C++ warnings from using C++ language extensions.") +# else +# pragma message("GLM: GLM_FORCE_SILENT_WARNINGS is undefined. Shows C++ warnings from using C++ language extensions.") +# endif + +# ifdef GLM_FORCE_SINGLE_ONLY +# pragma message("GLM: GLM_FORCE_SINGLE_ONLY is defined. Using only single precision floating-point types.") +# endif + +# if defined(GLM_FORCE_ALIGNED_GENTYPES) && (GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE) +# undef GLM_FORCE_ALIGNED_GENTYPES +# pragma message("GLM: GLM_FORCE_ALIGNED_GENTYPES is defined, allowing aligned types. This prevents the use of C++ constexpr.") +# elif defined(GLM_FORCE_ALIGNED_GENTYPES) && (GLM_CONFIG_ALIGNED_GENTYPES == GLM_DISABLE) +# undef GLM_FORCE_ALIGNED_GENTYPES +# pragma message("GLM: GLM_FORCE_ALIGNED_GENTYPES is defined but is disabled. It requires C++11 and language extensions.") +# endif + +# if defined(GLM_FORCE_DEFAULT_ALIGNED_GENTYPES) +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_DISABLE +# undef GLM_FORCE_DEFAULT_ALIGNED_GENTYPES +# pragma message("GLM: GLM_FORCE_DEFAULT_ALIGNED_GENTYPES is defined but is disabled. It requires C++11 and language extensions.") +# elif GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE +# pragma message("GLM: GLM_FORCE_DEFAULT_ALIGNED_GENTYPES is defined. All gentypes (e.g. vec3) will be aligned and padded by default.") +# endif +# endif + +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT +# pragma message("GLM: GLM_FORCE_DEPTH_ZERO_TO_ONE is defined. Using zero to one depth clip space.") +# else +# pragma message("GLM: GLM_FORCE_DEPTH_ZERO_TO_ONE is undefined. Using negative one to one depth clip space.") +# endif + +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT +# pragma message("GLM: GLM_FORCE_LEFT_HANDED is defined. Using left handed coordinate system.") +# else +# pragma message("GLM: GLM_FORCE_LEFT_HANDED is undefined. Using right handed coordinate system.") +# endif +#endif//GLM_MESSAGES + +#endif//GLM_SETUP_INCLUDED diff --git a/dep/glm/detail/type_float.hpp b/dep/glm/detail/type_float.hpp new file mode 100644 index 0000000..c8037eb --- /dev/null +++ b/dep/glm/detail/type_float.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include "setup.hpp" + +#if GLM_COMPILER == GLM_COMPILER_VC12 +# pragma warning(push) +# pragma warning(disable: 4512) // assignment operator could not be generated +#endif + +namespace glm{ +namespace detail +{ + template + union float_t + {}; + + // https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ + template <> + union float_t + { + typedef int int_type; + typedef float float_type; + + GLM_CONSTEXPR float_t(float_type Num = 0.0f) : f(Num) {} + + GLM_CONSTEXPR float_t& operator=(float_t const& x) + { + f = x.f; + return *this; + } + + // Portable extraction of components. + GLM_CONSTEXPR bool negative() const { return i < 0; } + GLM_CONSTEXPR int_type mantissa() const { return i & ((1 << 23) - 1); } + GLM_CONSTEXPR int_type exponent() const { return (i >> 23) & ((1 << 8) - 1); } + + int_type i; + float_type f; + }; + + template <> + union float_t + { + typedef detail::int64 int_type; + typedef double float_type; + + GLM_CONSTEXPR float_t(float_type Num = static_cast(0)) : f(Num) {} + + GLM_CONSTEXPR float_t& operator=(float_t const& x) + { + f = x.f; + return *this; + } + + // Portable extraction of components. + GLM_CONSTEXPR bool negative() const { return i < 0; } + GLM_CONSTEXPR int_type mantissa() const { return i & ((int_type(1) << 52) - 1); } + GLM_CONSTEXPR int_type exponent() const { return (i >> 52) & ((int_type(1) << 11) - 1); } + + int_type i; + float_type f; + }; +}//namespace detail +}//namespace glm + +#if GLM_COMPILER == GLM_COMPILER_VC12 +# pragma warning(pop) +#endif diff --git a/dep/glm/detail/type_half.hpp b/dep/glm/detail/type_half.hpp new file mode 100644 index 0000000..40b8bec --- /dev/null +++ b/dep/glm/detail/type_half.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "setup.hpp" + +namespace glm{ +namespace detail +{ + typedef short hdata; + + GLM_FUNC_DECL float toFloat32(hdata value); + GLM_FUNC_DECL hdata toFloat16(float const& value); + +}//namespace detail +}//namespace glm + +#include "type_half.inl" diff --git a/dep/glm/detail/type_half.inl b/dep/glm/detail/type_half.inl new file mode 100644 index 0000000..b0723e3 --- /dev/null +++ b/dep/glm/detail/type_half.inl @@ -0,0 +1,241 @@ +namespace glm{ +namespace detail +{ + GLM_FUNC_QUALIFIER float overflow() + { + volatile float f = 1e10; + + for(int i = 0; i < 10; ++i) + f *= f; // this will overflow before the for loop terminates + return f; + } + + union uif32 + { + GLM_FUNC_QUALIFIER uif32() : + i(0) + {} + + GLM_FUNC_QUALIFIER uif32(float f_) : + f(f_) + {} + + GLM_FUNC_QUALIFIER uif32(unsigned int i_) : + i(i_) + {} + + float f; + unsigned int i; + }; + + GLM_FUNC_QUALIFIER float toFloat32(hdata value) + { + int s = (value >> 15) & 0x00000001; + int e = (value >> 10) & 0x0000001f; + int m = value & 0x000003ff; + + if(e == 0) + { + if(m == 0) + { + // + // Plus or minus zero + // + + detail::uif32 result; + result.i = static_cast(s << 31); + return result.f; + } + else + { + // + // Denormalized number -- renormalize it + // + + while(!(m & 0x00000400)) + { + m <<= 1; + e -= 1; + } + + e += 1; + m &= ~0x00000400; + } + } + else if(e == 31) + { + if(m == 0) + { + // + // Positive or negative infinity + // + + uif32 result; + result.i = static_cast((s << 31) | 0x7f800000); + return result.f; + } + else + { + // + // Nan -- preserve sign and significand bits + // + + uif32 result; + result.i = static_cast((s << 31) | 0x7f800000 | (m << 13)); + return result.f; + } + } + + // + // Normalized number + // + + e = e + (127 - 15); + m = m << 13; + + // + // Assemble s, e and m. + // + + uif32 Result; + Result.i = static_cast((s << 31) | (e << 23) | m); + return Result.f; + } + + GLM_FUNC_QUALIFIER hdata toFloat16(float const& f) + { + uif32 Entry; + Entry.f = f; + int i = static_cast(Entry.i); + + // + // Our floating point number, f, is represented by the bit + // pattern in integer i. Disassemble that bit pattern into + // the sign, s, the exponent, e, and the significand, m. + // Shift s into the position where it will go in the + // resulting half number. + // Adjust e, accounting for the different exponent bias + // of float and half (127 versus 15). + // + + int s = (i >> 16) & 0x00008000; + int e = ((i >> 23) & 0x000000ff) - (127 - 15); + int m = i & 0x007fffff; + + // + // Now reassemble s, e and m into a half: + // + + if(e <= 0) + { + if(e < -10) + { + // + // E is less than -10. The absolute value of f is + // less than half_MIN (f may be a small normalized + // float, a denormalized float or a zero). + // + // We convert f to a half zero. + // + + return hdata(s); + } + + // + // E is between -10 and 0. F is a normalized float, + // whose magnitude is less than __half_NRM_MIN. + // + // We convert f to a denormalized half. + // + + m = (m | 0x00800000) >> (1 - e); + + // + // Round to nearest, round "0.5" up. + // + // Rounding may cause the significand to overflow and make + // our number normalized. Because of the way a half's bits + // are laid out, we don't have to treat this case separately; + // the code below will handle it correctly. + // + + if(m & 0x00001000) + m += 0x00002000; + + // + // Assemble the half from s, e (zero) and m. + // + + return hdata(s | (m >> 13)); + } + else if(e == 0xff - (127 - 15)) + { + if(m == 0) + { + // + // F is an infinity; convert f to a half + // infinity with the same sign as f. + // + + return hdata(s | 0x7c00); + } + else + { + // + // F is a NAN; we produce a half NAN that preserves + // the sign bit and the 10 leftmost bits of the + // significand of f, with one exception: If the 10 + // leftmost bits are all zero, the NAN would turn + // into an infinity, so we have to set at least one + // bit in the significand. + // + + m >>= 13; + + return hdata(s | 0x7c00 | m | (m == 0)); + } + } + else + { + // + // E is greater than zero. F is a normalized float. + // We try to convert f to a normalized half. + // + + // + // Round to nearest, round "0.5" up + // + + if(m & 0x00001000) + { + m += 0x00002000; + + if(m & 0x00800000) + { + m = 0; // overflow in significand, + e += 1; // adjust exponent + } + } + + // + // Handle exponent overflow + // + + if (e > 30) + { + overflow(); // Cause a hardware floating point overflow; + + return hdata(s | 0x7c00); + // if this returns, the half becomes an + } // infinity with the same sign as f. + + // + // Assemble the half from s, e and m. + // + + return hdata(s | (e << 10) | (m >> 13)); + } + } + +}//namespace detail +}//namespace glm diff --git a/dep/glm/detail/type_mat2x2.hpp b/dep/glm/detail/type_mat2x2.hpp new file mode 100644 index 0000000..033908f --- /dev/null +++ b/dep/glm/detail/type_mat2x2.hpp @@ -0,0 +1,177 @@ +/// @ref core +/// @file glm/detail/type_mat2x2.hpp + +#pragma once + +#include "type_vec2.hpp" +#include +#include + +namespace glm +{ + template + struct mat<2, 2, T, Q> + { + typedef vec<2, T, Q> col_type; + typedef vec<2, T, Q> row_type; + typedef mat<2, 2, T, Q> type; + typedef mat<2, 2, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[2]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<2, 2, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T const& x1, T const& y1, + T const& x2, T const& y2); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v1, + col_type const& v2); + + // -- Conversions -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + U const& x1, V const& y1, + M const& x2, N const& y2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<2, U, Q> const& v1, + vec<2, V, Q> const& v2); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator=(mat<2, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator+=(mat<2, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator-=(mat<2, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator*=(mat<2, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator/=(U s); + template + GLM_FUNC_DECL mat<2, 2, T, Q> & operator/=(mat<2, 2, U, Q> const& m); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<2, 2, T, Q> & operator++ (); + GLM_FUNC_DECL mat<2, 2, T, Q> & operator-- (); + GLM_FUNC_DECL mat<2, 2, T, Q> operator++(int); + GLM_FUNC_DECL mat<2, 2, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(T scalar, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(T scalar, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(T scalar, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<2, 2, T, Q>::col_type operator*(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<2, 2, T, Q>::row_type operator*(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator/(T scalar, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<2, 2, T, Q>::col_type operator/(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<2, 2, T, Q>::row_type operator/(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); +} //namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat2x2.inl" +#endif diff --git a/dep/glm/detail/type_mat2x2.inl b/dep/glm/detail/type_mat2x2.inl new file mode 100644 index 0000000..fe5d1aa --- /dev/null +++ b/dep/glm/detail/type_mat2x2.inl @@ -0,0 +1,536 @@ +#include "../matrix.hpp" + +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0), col_type(0, 1)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0); + this->value[1] = col_type(0, 1); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 2, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{m[0], m[1]} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(T scalar) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(scalar, 0), col_type(0, scalar)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(scalar, 0); + this->value[1] = col_type(0, scalar); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat + ( + T const& x0, T const& y0, + T const& x1, T const& y1 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0), col_type(x1, y1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(col_type const& v0, col_type const& v1) +# if GLM_HAS_INITIALIZER_LISTS + : value{v0, v1} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; +# endif + } + + // -- Conversion constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat + ( + X1 const& x1, Y1 const& y1, + X2 const& x2, Y2 const& y2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(static_cast(x1), value_type(y1)), col_type(static_cast(x2), value_type(y2)) } +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(static_cast(x1), value_type(y1)); + this->value[1] = col_type(static_cast(x2), value_type(y2)); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(vec<2, V1, Q> const& v1, vec<2, V2, Q> const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); +# endif + } + + // -- mat2x2 matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 2, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 2, T, Q>::col_type const& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator=(mat<2, 2, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(U scalar) + { + this->value[0] += scalar; + this->value[1] += scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(mat<2, 2, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(U scalar) + { + this->value[0] -= scalar; + this->value[1] -= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(mat<2, 2, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(U scalar) + { + this->value[0] *= scalar; + this->value[1] *= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(mat<2, 2, U, Q> const& m) + { + return (*this = *this * m); + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(U scalar) + { + this->value[0] /= scalar; + this->value[1] /= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(mat<2, 2, U, Q> const& m) + { + return *this *= inverse(m); + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> mat<2, 2, T, Q>::operator++(int) + { + mat<2, 2, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> mat<2, 2, T, Q>::operator--(int) + { + mat<2, 2, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + -m[0], + -m[1]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m, T scalar) + { + return mat<2, 2, T, Q>( + m[0] + scalar, + m[1] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(T scalar, mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + m[0] + scalar, + m[1] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return mat<2, 2, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m, T scalar) + { + return mat<2, 2, T, Q>( + m[0] - scalar, + m[1] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(T scalar, mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + scalar - m[0], + scalar - m[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return mat<2, 2, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m, T scalar) + { + return mat<2, 2, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(T scalar, mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type operator* + ( + mat<2, 2, T, Q> const& m, + typename mat<2, 2, T, Q>::row_type const& v + ) + { + return vec<2, T, Q>( + m[0][0] * v.x + m[1][0] * v.y, + m[0][1] * v.x + m[1][1] * v.y); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::row_type operator* + ( + typename mat<2, 2, T, Q>::col_type const& v, + mat<2, 2, T, Q> const& m + ) + { + return vec<2, T, Q>( + v.x * m[0][0] + v.y * m[0][1], + v.x * m[1][0] + v.y * m[1][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return mat<2, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return mat<3, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return mat<4, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m, T scalar) + { + return mat<2, 2, T, Q>( + m[0] / scalar, + m[1] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(T scalar, mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + scalar / m[0], + scalar / m[1]); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type operator/(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v) + { + return inverse(m) * v; + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::row_type operator/(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m) + { + return v * inverse(m); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + mat<2, 2, T, Q> m1_copy(m1); + return m1_copy /= m2; + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]); + } +} //namespace glm diff --git a/dep/glm/detail/type_mat2x3.hpp b/dep/glm/detail/type_mat2x3.hpp new file mode 100644 index 0000000..d6596e4 --- /dev/null +++ b/dep/glm/detail/type_mat2x3.hpp @@ -0,0 +1,159 @@ +/// @ref core +/// @file glm/detail/type_mat2x3.hpp + +#pragma once + +#include "type_vec2.hpp" +#include "type_vec3.hpp" +#include +#include + +namespace glm +{ + template + struct mat<2, 3, T, Q> + { + typedef vec<3, T, Q> col_type; + typedef vec<2, T, Q> row_type; + typedef mat<2, 3, T, Q> type; + typedef mat<3, 2, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[2]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<2, 3, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, T z0, + T x1, T y1, T z1); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1); + + // -- Conversions -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 x1, Y1 y1, Z1 z1, + X2 x2, Y2 y2, Z2 z2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<3, U, Q> const& v1, + vec<3, V, Q> const& v2); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator=(mat<2, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator+=(mat<2, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator-=(mat<2, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<2, 3, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<2, 3, T, Q> & operator++ (); + GLM_FUNC_DECL mat<2, 3, T, Q> & operator-- (); + GLM_FUNC_DECL mat<2, 3, T, Q> operator++(int); + GLM_FUNC_DECL mat<2, 3, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(T scalar, mat<2, 3, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<2, 3, T, Q>::col_type operator*(mat<2, 3, T, Q> const& m, typename mat<2, 3, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<2, 3, T, Q>::row_type operator*(typename mat<2, 3, T, Q>::col_type const& v, mat<2, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator/(mat<2, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator/(T scalar, mat<2, 3, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat2x3.inl" +#endif diff --git a/dep/glm/detail/type_mat2x3.inl b/dep/glm/detail/type_mat2x3.inl new file mode 100644 index 0000000..5fec17e --- /dev/null +++ b/dep/glm/detail/type_mat2x3.inl @@ -0,0 +1,510 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0), col_type(0, 1, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0); + this->value[1] = col_type(0, 1, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<2, 3, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{m.value[0], m.value[1]} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m.value[0]; + this->value[1] = m.value[1]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(T scalar) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(scalar, 0, 0), col_type(0, scalar, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(scalar, 0, 0); + this->value[1] = col_type(0, scalar, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat + ( + T x0, T y0, T z0, + T x1, T y1, T z1 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0, z0), col_type(x1, y1, z1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0); + this->value[1] = col_type(x1, y1, z1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(col_type const& v0, col_type const& v1) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v0); + this->value[1] = col_type(v1); +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat + ( + X1 x1, Y1 y1, Z1 z1, + X2 x2, Y2 y2, Z2 z2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x1, y1, z1), col_type(x2, y2, z2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x1, y1, z1); + this->value[1] = col_type(x2, y2, z2); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(vec<3, V1, Q> const& v1, vec<3, V2, Q> const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<2, 3, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::col_type & mat<2, 3, T, Q>::operator[](typename mat<2, 3, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 3, T, Q>::col_type const& mat<2, 3, T, Q>::operator[](typename mat<2, 3, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator=(mat<2, 3, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator+=(mat<2, 3, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator-=(mat<2, 3, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> mat<2, 3, T, Q>::operator++(int) + { + mat<2, 3, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> mat<2, 3, T, Q>::operator--(int) + { + mat<2, 3, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m) + { + return mat<2, 3, T, Q>( + -m[0], + -m[1]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m, T scalar) + { + return mat<2, 3, T, Q>( + m[0] + scalar, + m[1] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return mat<2, 3, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m, T scalar) + { + return mat<2, 3, T, Q>( + m[0] - scalar, + m[1] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return mat<2, 3, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m, T scalar) + { + return mat<2, 3, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(T scalar, mat<2, 3, T, Q> const& m) + { + return mat<2, 3, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::col_type operator* + ( + mat<2, 3, T, Q> const& m, + typename mat<2, 3, T, Q>::row_type const& v) + { + return typename mat<2, 3, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y, + m[0][1] * v.x + m[1][1] * v.y, + m[0][2] * v.x + m[1][2] * v.y); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::row_type operator* + ( + typename mat<2, 3, T, Q>::col_type const& v, + mat<2, 3, T, Q> const& m) + { + return typename mat<2, 3, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return mat<2, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + T SrcA00 = m1[0][0]; + T SrcA01 = m1[0][1]; + T SrcA02 = m1[0][2]; + T SrcA10 = m1[1][0]; + T SrcA11 = m1[1][1]; + T SrcA12 = m1[1][2]; + + T SrcB00 = m2[0][0]; + T SrcB01 = m2[0][1]; + T SrcB10 = m2[1][0]; + T SrcB11 = m2[1][1]; + T SrcB20 = m2[2][0]; + T SrcB21 = m2[2][1]; + + mat<3, 3, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return mat<4, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1], + m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator/(mat<2, 3, T, Q> const& m, T scalar) + { + return mat<2, 3, T, Q>( + m[0] / scalar, + m[1] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator/(T scalar, mat<2, 3, T, Q> const& m) + { + return mat<2, 3, T, Q>( + scalar / m[0], + scalar / m[1]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]); + } +} //namespace glm diff --git a/dep/glm/detail/type_mat2x4.hpp b/dep/glm/detail/type_mat2x4.hpp new file mode 100644 index 0000000..ff03e21 --- /dev/null +++ b/dep/glm/detail/type_mat2x4.hpp @@ -0,0 +1,161 @@ +/// @ref core +/// @file glm/detail/type_mat2x4.hpp + +#pragma once + +#include "type_vec2.hpp" +#include "type_vec4.hpp" +#include +#include + +namespace glm +{ + template + struct mat<2, 4, T, Q> + { + typedef vec<4, T, Q> col_type; + typedef vec<2, T, Q> row_type; + typedef mat<2, 4, T, Q> type; + typedef mat<4, 2, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[2]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<2, 4, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, T z0, T w0, + T x1, T y1, T z1, T w1); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1); + + // -- Conversions -- + + template< + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 x1, Y1 y1, Z1 z1, W1 w1, + X2 x2, Y2 y2, Z2 z2, W2 w2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<4, U, Q> const& v1, + vec<4, V, Q> const& v2); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator=(mat<2, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator+=(mat<2, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator-=(mat<2, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<2, 4, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<2, 4, T, Q> & operator++ (); + GLM_FUNC_DECL mat<2, 4, T, Q> & operator-- (); + GLM_FUNC_DECL mat<2, 4, T, Q> operator++(int); + GLM_FUNC_DECL mat<2, 4, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(T scalar, mat<2, 4, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<2, 4, T, Q>::col_type operator*(mat<2, 4, T, Q> const& m, typename mat<2, 4, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<2, 4, T, Q>::row_type operator*(typename mat<2, 4, T, Q>::col_type const& v, mat<2, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<2, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator/(mat<2, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator/(T scalar, mat<2, 4, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat2x4.inl" +#endif diff --git a/dep/glm/detail/type_mat2x4.inl b/dep/glm/detail/type_mat2x4.inl new file mode 100644 index 0000000..b6d2b9d --- /dev/null +++ b/dep/glm/detail/type_mat2x4.inl @@ -0,0 +1,520 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0, 0), col_type(0, 1, 0, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0, 0); + this->value[1] = col_type(0, 1, 0, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<2, 4, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{m[0], m[1]} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(T s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0, 0, 0), col_type(0, s, 0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0, 0, 0); + this->value[1] = col_type(0, s, 0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat + ( + T x0, T y0, T z0, T w0, + T x1, T y1, T z1, T w1 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0, z0, w0), col_type(x1, y1, z1, w1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0, w0); + this->value[1] = col_type(x1, y1, z1, w1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(col_type const& v0, col_type const& v1) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat + ( + X1 x1, Y1 y1, Z1 z1, W1 w1, + X2 x2, Y2 y2, Z2 z2, W2 w2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{ + col_type(x1, y1, z1, w1), + col_type(x2, y2, z2, w2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x1, y1, z1, w1); + this->value[1] = col_type(x2, y2, z2, w2); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(vec<4, V1, Q> const& v1, vec<4, V2, Q> const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<2, 4, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 4, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::col_type & mat<2, 4, T, Q>::operator[](typename mat<2, 4, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 4, T, Q>::col_type const& mat<2, 4, T, Q>::operator[](typename mat<2, 4, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator=(mat<2, 4, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator+=(mat<2, 4, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator-=(mat<2, 4, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> & mat<2, 4, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat<2, 4, T, Q>::operator++(int) + { + mat<2, 4, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat<2, 4, T, Q>::operator--(int) + { + mat<2, 4, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m) + { + return mat<2, 4, T, Q>( + -m[0], + -m[1]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m, T scalar) + { + return mat<2, 4, T, Q>( + m[0] + scalar, + m[1] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return mat<2, 4, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m, T scalar) + { + return mat<2, 4, T, Q>( + m[0] - scalar, + m[1] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return mat<2, 4, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m, T scalar) + { + return mat<2, 4, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(T scalar, mat<2, 4, T, Q> const& m) + { + return mat<2, 4, T, Q>( + m[0] * scalar, + m[1] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::col_type operator*(mat<2, 4, T, Q> const& m, typename mat<2, 4, T, Q>::row_type const& v) + { + return typename mat<2, 4, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y, + m[0][1] * v.x + m[1][1] * v.y, + m[0][2] * v.x + m[1][2] * v.y, + m[0][3] * v.x + m[1][3] * v.y); + } + + template + GLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::row_type operator*(typename mat<2, 4, T, Q>::col_type const& v, mat<2, 4, T, Q> const& m) + { + return typename mat<2, 4, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + T SrcA00 = m1[0][0]; + T SrcA01 = m1[0][1]; + T SrcA02 = m1[0][2]; + T SrcA03 = m1[0][3]; + T SrcA10 = m1[1][0]; + T SrcA11 = m1[1][1]; + T SrcA12 = m1[1][2]; + T SrcA13 = m1[1][3]; + + T SrcB00 = m2[0][0]; + T SrcB01 = m2[0][1]; + T SrcB10 = m2[1][0]; + T SrcB11 = m2[1][1]; + T SrcB20 = m2[2][0]; + T SrcB21 = m2[2][1]; + T SrcB30 = m2[3][0]; + T SrcB31 = m2[3][1]; + + mat<4, 4, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01; + Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11; + Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21; + Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21; + Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31; + Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31; + Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31; + Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + return mat<2, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return mat<3, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1], + m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator/(mat<2, 4, T, Q> const& m, T scalar) + { + return mat<2, 4, T, Q>( + m[0] / scalar, + m[1] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator/(T scalar, mat<2, 4, T, Q> const& m) + { + return mat<2, 4, T, Q>( + scalar / m[0], + scalar / m[1]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]); + } +} //namespace glm diff --git a/dep/glm/detail/type_mat3x2.hpp b/dep/glm/detail/type_mat3x2.hpp new file mode 100644 index 0000000..e166581 --- /dev/null +++ b/dep/glm/detail/type_mat3x2.hpp @@ -0,0 +1,167 @@ +/// @ref core +/// @file glm/detail/type_mat3x2.hpp + +#pragma once + +#include "type_vec2.hpp" +#include "type_vec3.hpp" +#include +#include + +namespace glm +{ + template + struct mat<3, 2, T, Q> + { + typedef vec<2, T, Q> col_type; + typedef vec<3, T, Q> row_type; + typedef mat<3, 2, T, Q> type; + typedef mat<2, 3, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[3]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<3, 2, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, + T x1, T y1, + T x2, T y2); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2); + + // -- Conversions -- + + template< + typename X1, typename Y1, + typename X2, typename Y2, + typename X3, typename Y3> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 x1, Y1 y1, + X2 x2, Y2 y2, + X3 x3, Y3 y3); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<2, V1, Q> const& v1, + vec<2, V2, Q> const& v2, + vec<2, V3, Q> const& v3); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator=(mat<3, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator+=(mat<3, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator-=(mat<3, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<3, 2, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<3, 2, T, Q> & operator++ (); + GLM_FUNC_DECL mat<3, 2, T, Q> & operator-- (); + GLM_FUNC_DECL mat<3, 2, T, Q> operator++(int); + GLM_FUNC_DECL mat<3, 2, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(T scalar, mat<3, 2, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<3, 2, T, Q>::col_type operator*(mat<3, 2, T, Q> const& m, typename mat<3, 2, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<3, 2, T, Q>::row_type operator*(typename mat<3, 2, T, Q>::col_type const& v, mat<3, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator/(mat<3, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator/(T scalar, mat<3, 2, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); + +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat3x2.inl" +#endif diff --git a/dep/glm/detail/type_mat3x2.inl b/dep/glm/detail/type_mat3x2.inl new file mode 100644 index 0000000..b4b948b --- /dev/null +++ b/dep/glm/detail/type_mat3x2.inl @@ -0,0 +1,532 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0), col_type(0, 1), col_type(0, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0); + this->value[1] = col_type(0, 1); + this->value[2] = col_type(0, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<3, 2, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(T s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0), col_type(0, s), col_type(0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0); + this->value[1] = col_type(0, s); + this->value[2] = col_type(0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat + ( + T x0, T y0, + T x1, T y1, + T x2, T y2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0), col_type(x1, y1), col_type(x2, y2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); + this->value[2] = col_type(x2, y2); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X0, typename Y0, + typename X1, typename Y1, + typename X2, typename Y2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat + ( + X0 x0, Y0 y0, + X1 x1, Y1 y1, + X2 x2, Y2 y2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0), col_type(x1, y1), col_type(x2, y2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); + this->value[2] = col_type(x2, y2); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(vec<2, V0, Q> const& v0, vec<2, V1, Q> const& v1, vec<2, V2, Q> const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v0); + this->value[1] = col_type(v1); + this->value[2] = col_type(v2); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<3, 2, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::col_type & mat<3, 2, T, Q>::operator[](typename mat<3, 2, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<3, 2, T, Q>::col_type const& mat<3, 2, T, Q>::operator[](typename mat<3, 2, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator=(mat<3, 2, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator+=(mat<3, 2, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator-=(mat<3, 2, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> & mat<3, 2, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> mat<3, 2, T, Q>::operator++(int) + { + mat<3, 2, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> mat<3, 2, T, Q>::operator--(int) + { + mat<3, 2, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m) + { + return mat<3, 2, T, Q>( + -m[0], + -m[1], + -m[2]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m, T scalar) + { + return mat<3, 2, T, Q>( + m[0] + scalar, + m[1] + scalar, + m[2] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return mat<3, 2, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m, T scalar) + { + return mat<3, 2, T, Q>( + m[0] - scalar, + m[1] - scalar, + m[2] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return mat<3, 2, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m, T scalar) + { + return mat<3, 2, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(T scalar, mat<3, 2, T, Q> const& m) + { + return mat<3, 2, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::col_type operator*(mat<3, 2, T, Q> const& m, typename mat<3, 2, T, Q>::row_type const& v) + { + return typename mat<3, 2, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::row_type operator*(typename mat<3, 2, T, Q>::col_type const& v, mat<3, 2, T, Q> const& m) + { + return typename mat<3, 2, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1], + v.x * m[1][0] + v.y * m[1][1], + v.x * m[2][0] + v.y * m[2][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + const T SrcA00 = m1[0][0]; + const T SrcA01 = m1[0][1]; + const T SrcA10 = m1[1][0]; + const T SrcA11 = m1[1][1]; + const T SrcA20 = m1[2][0]; + const T SrcA21 = m1[2][1]; + + const T SrcB00 = m2[0][0]; + const T SrcB01 = m2[0][1]; + const T SrcB02 = m2[0][2]; + const T SrcB10 = m2[1][0]; + const T SrcB11 = m2[1][1]; + const T SrcB12 = m2[1][2]; + + mat<2, 2, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return mat<3, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return mat<4, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator/(mat<3, 2, T, Q> const& m, T scalar) + { + return mat<3, 2, T, Q>( + m[0] / scalar, + m[1] / scalar, + m[2] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator/(T scalar, mat<3, 2, T, Q> const& m) + { + return mat<3, 2, T, Q>( + scalar / m[0], + scalar / m[1], + scalar / m[2]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); + } +} //namespace glm diff --git a/dep/glm/detail/type_mat3x3.hpp b/dep/glm/detail/type_mat3x3.hpp new file mode 100644 index 0000000..3174872 --- /dev/null +++ b/dep/glm/detail/type_mat3x3.hpp @@ -0,0 +1,184 @@ +/// @ref core +/// @file glm/detail/type_mat3x3.hpp + +#pragma once + +#include "type_vec3.hpp" +#include +#include + +namespace glm +{ + template + struct mat<3, 3, T, Q> + { + typedef vec<3, T, Q> col_type; + typedef vec<3, T, Q> row_type; + typedef mat<3, 3, T, Q> type; + typedef mat<3, 3, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[3]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<3, 3, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, T z0, + T x1, T y1, T z1, + T x2, T y2, T z2); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2); + + // -- Conversions -- + + template< + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 x1, Y1 y1, Z1 z1, + X2 x2, Y2 y2, Z2 z2, + X3 x3, Y3 y3, Z3 z3); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<3, V1, Q> const& v1, + vec<3, V2, Q> const& v2, + vec<3, V3, Q> const& v3); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator=(mat<3, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator+=(mat<3, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator-=(mat<3, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator*=(mat<3, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator/=(U s); + template + GLM_FUNC_DECL mat<3, 3, T, Q> & operator/=(mat<3, 3, U, Q> const& m); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<3, 3, T, Q> & operator++(); + GLM_FUNC_DECL mat<3, 3, T, Q> & operator--(); + GLM_FUNC_DECL mat<3, 3, T, Q> operator++(int); + GLM_FUNC_DECL mat<3, 3, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(T scalar, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(T scalar, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(T scalar, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<3, 3, T, Q>::col_type operator*(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<3, 3, T, Q>::row_type operator*(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator/(T scalar, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<3, 3, T, Q>::col_type operator/(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<3, 3, T, Q>::row_type operator/(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat3x3.inl" +#endif diff --git a/dep/glm/detail/type_mat3x3.inl b/dep/glm/detail/type_mat3x3.inl new file mode 100644 index 0000000..1ddaf99 --- /dev/null +++ b/dep/glm/detail/type_mat3x3.inl @@ -0,0 +1,601 @@ +#include "../matrix.hpp" + +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0), col_type(0, 1, 0), col_type(0, 0, 1)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0); + this->value[1] = col_type(0, 1, 0); + this->value[2] = col_type(0, 0, 1); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<3, 3, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(T s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0, 0), col_type(0, s, 0), col_type(0, 0, s)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0, 0); + this->value[1] = col_type(0, s, 0); + this->value[2] = col_type(0, 0, s); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat + ( + T x0, T y0, T z0, + T x1, T y1, T z1, + T x2, T y2, T z2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0, z0), col_type(x1, y1, z1), col_type(x2, y2, z2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0); + this->value[1] = col_type(x1, y1, z1); + this->value[2] = col_type(x2, y2, z2); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v0); + this->value[1] = col_type(v1); + this->value[2] = col_type(v2); +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat + ( + X1 x1, Y1 y1, Z1 z1, + X2 x2, Y2 y2, Z2 z2, + X3 x3, Y3 y3, Z3 z3 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x1, y1, z1), col_type(x2, y2, z2), col_type(x3, y3, z3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x1, y1, z1); + this->value[1] = col_type(x2, y2, z2); + this->value[2] = col_type(x3, y3, z3); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(vec<3, V1, Q> const& v1, vec<3, V2, Q> const& v2, vec<3, V3, Q> const& v3) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2), col_type(v3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<3, 3, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type & mat<3, 3, T, Q>::operator[](typename mat<3, 3, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<3, 3, T, Q>::col_type const& mat<3, 3, T, Q>::operator[](typename mat<3, 3, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator=(mat<3, 3, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator+=(mat<3, 3, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator-=(mat<3, 3, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator*=(mat<3, 3, U, Q> const& m) + { + return (*this = *this * m); + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator/=(mat<3, 3, U, Q> const& m) + { + return *this *= inverse(m); + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat<3, 3, T, Q>::operator++(int) + { + mat<3, 3, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat<3, 3, T, Q>::operator--(int) + { + mat<3, 3, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m) + { + return mat<3, 3, T, Q>( + -m[0], + -m[1], + -m[2]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m, T scalar) + { + return mat<3, 3, T, Q>( + m[0] + scalar, + m[1] + scalar, + m[2] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(T scalar, mat<3, 3, T, Q> const& m) + { + return mat<3, 3, T, Q>( + m[0] + scalar, + m[1] + scalar, + m[2] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return mat<3, 3, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m, T scalar) + { + return mat<3, 3, T, Q>( + m[0] - scalar, + m[1] - scalar, + m[2] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(T scalar, mat<3, 3, T, Q> const& m) + { + return mat<3, 3, T, Q>( + scalar - m[0], + scalar - m[1], + scalar - m[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return mat<3, 3, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m, T scalar) + { + return mat<3, 3, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(T scalar, mat<3, 3, T, Q> const& m) + { + return mat<3, 3, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type operator*(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v) + { + return typename mat<3, 3, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z, + m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::row_type operator*(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m) + { + return typename mat<3, 3, T, Q>::row_type( + m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z, + m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z, + m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + T const SrcA00 = m1[0][0]; + T const SrcA01 = m1[0][1]; + T const SrcA02 = m1[0][2]; + T const SrcA10 = m1[1][0]; + T const SrcA11 = m1[1][1]; + T const SrcA12 = m1[1][2]; + T const SrcA20 = m1[2][0]; + T const SrcA21 = m1[2][1]; + T const SrcA22 = m1[2][2]; + + T const SrcB00 = m2[0][0]; + T const SrcB01 = m2[0][1]; + T const SrcB02 = m2[0][2]; + T const SrcB10 = m2[1][0]; + T const SrcB11 = m2[1][1]; + T const SrcB12 = m2[1][2]; + T const SrcB20 = m2[2][0]; + T const SrcB21 = m2[2][1]; + T const SrcB22 = m2[2][2]; + + mat<3, 3, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return mat<2, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return mat<4, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2], + m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m, T scalar) + { + return mat<3, 3, T, Q>( + m[0] / scalar, + m[1] / scalar, + m[2] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(T scalar, mat<3, 3, T, Q> const& m) + { + return mat<3, 3, T, Q>( + scalar / m[0], + scalar / m[1], + scalar / m[2]); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type operator/(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v) + { + return inverse(m) * v; + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::row_type operator/(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m) + { + return v * inverse(m); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + mat<3, 3, T, Q> m1_copy(m1); + return m1_copy /= m2; + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); + } +} //namespace glm diff --git a/dep/glm/detail/type_mat3x4.hpp b/dep/glm/detail/type_mat3x4.hpp new file mode 100644 index 0000000..6e40b90 --- /dev/null +++ b/dep/glm/detail/type_mat3x4.hpp @@ -0,0 +1,166 @@ +/// @ref core +/// @file glm/detail/type_mat3x4.hpp + +#pragma once + +#include "type_vec3.hpp" +#include "type_vec4.hpp" +#include +#include + +namespace glm +{ + template + struct mat<3, 4, T, Q> + { + typedef vec<4, T, Q> col_type; + typedef vec<3, T, Q> row_type; + typedef mat<3, 4, T, Q> type; + typedef mat<4, 3, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[3]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<3, 4, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, T z0, T w0, + T x1, T y1, T z1, T w1, + T x2, T y2, T z2, T w2); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2); + + // -- Conversions -- + + template< + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2, + typename X3, typename Y3, typename Z3, typename W3> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X1 x1, Y1 y1, Z1 z1, W1 w1, + X2 x2, Y2 y2, Z2 z2, W2 w2, + X3 x3, Y3 y3, Z3 z3, W3 w3); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<4, V1, Q> const& v1, + vec<4, V2, Q> const& v2, + vec<4, V3, Q> const& v3); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator=(mat<3, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator+=(mat<3, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator-=(mat<3, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<3, 4, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<3, 4, T, Q> & operator++(); + GLM_FUNC_DECL mat<3, 4, T, Q> & operator--(); + GLM_FUNC_DECL mat<3, 4, T, Q> operator++(int); + GLM_FUNC_DECL mat<3, 4, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(T scalar, mat<3, 4, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<3, 4, T, Q>::col_type operator*(mat<3, 4, T, Q> const& m, typename mat<3, 4, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<3, 4, T, Q>::row_type operator*(typename mat<3, 4, T, Q>::col_type const& v, mat<3, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<2, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<3, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator/(mat<3, 4, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator/(T scalar, mat<3, 4, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat3x4.inl" +#endif diff --git a/dep/glm/detail/type_mat3x4.inl b/dep/glm/detail/type_mat3x4.inl new file mode 100644 index 0000000..6ee416c --- /dev/null +++ b/dep/glm/detail/type_mat3x4.inl @@ -0,0 +1,578 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0, 0), col_type(0, 1, 0, 0), col_type(0, 0, 1, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0, 0); + this->value[1] = col_type(0, 1, 0, 0); + this->value[2] = col_type(0, 0, 1, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<3, 4, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(T s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0, 0, 0), col_type(0, s, 0, 0), col_type(0, 0, s, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0, 0, 0); + this->value[1] = col_type(0, s, 0, 0); + this->value[2] = col_type(0, 0, s, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat + ( + T x0, T y0, T z0, T w0, + T x1, T y1, T z1, T w1, + T x2, T y2, T z2, T w2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{ + col_type(x0, y0, z0, w0), + col_type(x1, y1, z1, w1), + col_type(x2, y2, z2, w2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0, w0); + this->value[1] = col_type(x1, y1, z1, w1); + this->value[2] = col_type(x2, y2, z2, w2); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X0, typename Y0, typename Z0, typename W0, + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat + ( + X0 x0, Y0 y0, Z0 z0, W0 w0, + X1 x1, Y1 y1, Z1 z1, W1 w1, + X2 x2, Y2 y2, Z2 z2, W2 w2 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{ + col_type(x0, y0, z0, w0), + col_type(x1, y1, z1, w1), + col_type(x2, y2, z2, w2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0, w0); + this->value[1] = col_type(x1, y1, z1, w1); + this->value[2] = col_type(x2, y2, z2, w2); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(vec<4, V1, Q> const& v0, vec<4, V2, Q> const& v1, vec<4, V3, Q> const& v2) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v0); + this->value[1] = col_type(v1); + this->value[2] = col_type(v2); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<3, 4, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(0, 0, 1, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(0, 0, 1, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(0, 0, 1, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(0, 0, 1, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(m[2], 1, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(m[2], 1, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0, 0, 1, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(m[2], 1, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(m[2], 1, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 4, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 0); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::col_type & mat<3, 4, T, Q>::operator[](typename mat<3, 4, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<3, 4, T, Q>::col_type const& mat<3, 4, T, Q>::operator[](typename mat<3, 4, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator=(mat<3, 4, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator+=(mat<3, 4, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator-=(mat<3, 4, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> & mat<3, 4, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat<3, 4, T, Q>::operator++(int) + { + mat<3, 4, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat<3, 4, T, Q>::operator--(int) + { + mat<3, 4, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m) + { + return mat<3, 4, T, Q>( + -m[0], + -m[1], + -m[2]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m, T scalar) + { + return mat<3, 4, T, Q>( + m[0] + scalar, + m[1] + scalar, + m[2] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return mat<3, 4, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m, T scalar) + { + return mat<3, 4, T, Q>( + m[0] - scalar, + m[1] - scalar, + m[2] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return mat<3, 4, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m, T scalar) + { + return mat<3, 4, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(T scalar, mat<3, 4, T, Q> const& m) + { + return mat<3, 4, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::col_type operator* + ( + mat<3, 4, T, Q> const& m, + typename mat<3, 4, T, Q>::row_type const& v + ) + { + return typename mat<3, 4, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z, + m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z, + m[0][3] * v.x + m[1][3] * v.y + m[2][3] * v.z); + } + + template + GLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::row_type operator* + ( + typename mat<3, 4, T, Q>::col_type const& v, + mat<3, 4, T, Q> const& m + ) + { + return typename mat<3, 4, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3], + v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2] + v.w * m[2][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + const T SrcA00 = m1[0][0]; + const T SrcA01 = m1[0][1]; + const T SrcA02 = m1[0][2]; + const T SrcA03 = m1[0][3]; + const T SrcA10 = m1[1][0]; + const T SrcA11 = m1[1][1]; + const T SrcA12 = m1[1][2]; + const T SrcA13 = m1[1][3]; + const T SrcA20 = m1[2][0]; + const T SrcA21 = m1[2][1]; + const T SrcA22 = m1[2][2]; + const T SrcA23 = m1[2][3]; + + const T SrcB00 = m2[0][0]; + const T SrcB01 = m2[0][1]; + const T SrcB02 = m2[0][2]; + const T SrcB10 = m2[1][0]; + const T SrcB11 = m2[1][1]; + const T SrcB12 = m2[1][2]; + const T SrcB20 = m2[2][0]; + const T SrcB21 = m2[2][1]; + const T SrcB22 = m2[2][2]; + const T SrcB30 = m2[3][0]; + const T SrcB31 = m2[3][1]; + const T SrcB32 = m2[3][2]; + + mat<4, 4, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02; + Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01 + SrcA23 * SrcB02; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12; + Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11 + SrcA23 * SrcB12; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22; + Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21 + SrcA23 * SrcB22; + Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31 + SrcA20 * SrcB32; + Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31 + SrcA21 * SrcB32; + Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31 + SrcA22 * SrcB32; + Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31 + SrcA23 * SrcB32; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<2, 3, T, Q> const& m2) + { + return mat<2, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<3, 3, T, Q> const& m2) + { + return mat<3, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2], + m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator/(mat<3, 4, T, Q> const& m, T scalar) + { + return mat<3, 4, T, Q>( + m[0] / scalar, + m[1] / scalar, + m[2] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator/(T scalar, mat<3, 4, T, Q> const& m) + { + return mat<3, 4, T, Q>( + scalar / m[0], + scalar / m[1], + scalar / m[2]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); + } +} //namespace glm diff --git a/dep/glm/detail/type_mat4x2.hpp b/dep/glm/detail/type_mat4x2.hpp new file mode 100644 index 0000000..8d34352 --- /dev/null +++ b/dep/glm/detail/type_mat4x2.hpp @@ -0,0 +1,171 @@ +/// @ref core +/// @file glm/detail/type_mat4x2.hpp + +#pragma once + +#include "type_vec2.hpp" +#include "type_vec4.hpp" +#include +#include + +namespace glm +{ + template + struct mat<4, 2, T, Q> + { + typedef vec<2, T, Q> col_type; + typedef vec<4, T, Q> row_type; + typedef mat<4, 2, T, Q> type; + typedef mat<2, 4, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[4]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 4; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<4, 2, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T x0, T y0, + T x1, T y1, + T x2, T y2, + T x3, T y3); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3); + + // -- Conversions -- + + template< + typename X0, typename Y0, + typename X1, typename Y1, + typename X2, typename Y2, + typename X3, typename Y3> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + X0 x0, Y0 y0, + X1 x1, Y1 y1, + X2 x2, Y2 y2, + X3 x3, Y3 y3); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<2, V1, Q> const& v1, + vec<2, V2, Q> const& v2, + vec<2, V3, Q> const& v3, + vec<2, V4, Q> const& v4); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator=(mat<4, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator+=(mat<4, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator-=(mat<4, 2, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<4, 2, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<4, 2, T, Q> & operator++ (); + GLM_FUNC_DECL mat<4, 2, T, Q> & operator-- (); + GLM_FUNC_DECL mat<4, 2, T, Q> operator++(int); + GLM_FUNC_DECL mat<4, 2, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(T scalar, mat<4, 2, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<4, 2, T, Q>::col_type operator*(mat<4, 2, T, Q> const& m, typename mat<4, 2, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<4, 2, T, Q>::row_type operator*(typename mat<4, 2, T, Q>::col_type const& v, mat<4, 2, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator/(mat<4, 2, T, Q> const& m, T scalar); + + template + GLM_FUNC_DECL mat<4, 2, T, Q> operator/(T scalar, mat<4, 2, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat4x2.inl" +#endif diff --git a/dep/glm/detail/type_mat4x2.inl b/dep/glm/detail/type_mat4x2.inl new file mode 100644 index 0000000..419c80c --- /dev/null +++ b/dep/glm/detail/type_mat4x2.inl @@ -0,0 +1,574 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0), col_type(0, 1), col_type(0, 0), col_type(0, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0); + this->value[1] = col_type(0, 1); + this->value[2] = col_type(0, 0); + this->value[3] = col_type(0, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<4, 2, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(T s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0), col_type(0, s), col_type(0, 0), col_type(0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0); + this->value[1] = col_type(0, s); + this->value[2] = col_type(0, 0); + this->value[3] = col_type(0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat + ( + T x0, T y0, + T x1, T y1, + T x2, T y2, + T x3, T y3 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0), col_type(x1, y1), col_type(x2, y2), col_type(x3, y3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); + this->value[2] = col_type(x2, y2); + this->value[3] = col_type(x3, y3); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2, col_type const& v3) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2), col_type(v3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + this->value[3] = v3; +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X0, typename Y0, + typename X1, typename Y1, + typename X2, typename Y2, + typename X3, typename Y3> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat + ( + X0 x0, Y0 y0, + X1 x1, Y1 y1, + X2 x2, Y2 y2, + X3 x3, Y3 y3 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0), col_type(x1, y1), col_type(x2, y2), col_type(x3, y3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); + this->value[2] = col_type(x2, y2); + this->value[3] = col_type(x3, y3); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(vec<2, V0, Q> const& v0, vec<2, V1, Q> const& v1, vec<2, V2, Q> const& v2, vec<2, V3, Q> const& v3) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2), col_type(v3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v0); + this->value[1] = col_type(v1); + this->value[2] = col_type(v2); + this->value[3] = col_type(v3); +# endif + } + + // -- Conversion -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<4, 2, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(0); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::col_type & mat<4, 2, T, Q>::operator[](typename mat<4, 2, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<4, 2, T, Q>::col_type const& mat<4, 2, T, Q>::operator[](typename mat<4, 2, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q>& mat<4, 2, T, Q>::operator=(mat<4, 2, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + this->value[3] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator+=(mat<4, 2, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + this->value[3] += m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + this->value[3] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator-=(mat<4, 2, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + this->value[3] -= m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + this->value[3] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + this->value[3] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + ++this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + --this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> mat<4, 2, T, Q>::operator++(int) + { + mat<4, 2, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> mat<4, 2, T, Q>::operator--(int) + { + mat<4, 2, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m) + { + return mat<4, 2, T, Q>( + -m[0], + -m[1], + -m[2], + -m[3]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m, T scalar) + { + return mat<4, 2, T, Q>( + m[0] + scalar, + m[1] + scalar, + m[2] + scalar, + m[3] + scalar); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return mat<4, 2, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2], + m1[3] + m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m, T scalar) + { + return mat<4, 2, T, Q>( + m[0] - scalar, + m[1] - scalar, + m[2] - scalar, + m[3] - scalar); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return mat<4, 2, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2], + m1[3] - m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m, T scalar) + { + return mat<4, 2, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar, + m[3] * scalar); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(T scalar, mat<4, 2, T, Q> const& m) + { + return mat<4, 2, T, Q>( + m[0] * scalar, + m[1] * scalar, + m[2] * scalar, + m[3] * scalar); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::col_type operator*(mat<4, 2, T, Q> const& m, typename mat<4, 2, T, Q>::row_type const& v) + { + return typename mat<4, 2, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::row_type operator*(typename mat<4, 2, T, Q>::col_type const& v, mat<4, 2, T, Q> const& m) + { + return typename mat<4, 2, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1], + v.x * m[1][0] + v.y * m[1][1], + v.x * m[2][0] + v.y * m[2][1], + v.x * m[3][0] + v.y * m[3][1]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + T const SrcA00 = m1[0][0]; + T const SrcA01 = m1[0][1]; + T const SrcA10 = m1[1][0]; + T const SrcA11 = m1[1][1]; + T const SrcA20 = m1[2][0]; + T const SrcA21 = m1[2][1]; + T const SrcA30 = m1[3][0]; + T const SrcA31 = m1[3][1]; + + T const SrcB00 = m2[0][0]; + T const SrcB01 = m2[0][1]; + T const SrcB02 = m2[0][2]; + T const SrcB03 = m2[0][3]; + T const SrcB10 = m2[1][0]; + T const SrcB11 = m2[1][1]; + T const SrcB12 = m2[1][2]; + T const SrcB13 = m2[1][3]; + + mat<2, 2, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return mat<3, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return mat<4, 2, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator/(mat<4, 2, T, Q> const& m, T scalar) + { + return mat<4, 2, T, Q>( + m[0] / scalar, + m[1] / scalar, + m[2] / scalar, + m[3] / scalar); + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator/(T scalar, mat<4, 2, T, Q> const& m) + { + return mat<4, 2, T, Q>( + scalar / m[0], + scalar / m[1], + scalar / m[2], + scalar / m[3]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); + } +} //namespace glm diff --git a/dep/glm/detail/type_mat4x3.hpp b/dep/glm/detail/type_mat4x3.hpp new file mode 100644 index 0000000..16e4270 --- /dev/null +++ b/dep/glm/detail/type_mat4x3.hpp @@ -0,0 +1,171 @@ +/// @ref core +/// @file glm/detail/type_mat4x3.hpp + +#pragma once + +#include "type_vec3.hpp" +#include "type_vec4.hpp" +#include +#include + +namespace glm +{ + template + struct mat<4, 3, T, Q> + { + typedef vec<3, T, Q> col_type; + typedef vec<4, T, Q> row_type; + typedef mat<4, 3, T, Q> type; + typedef mat<3, 4, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[4]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 4; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<4, 3, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T const& x); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T const& x0, T const& y0, T const& z0, + T const& x1, T const& y1, T const& z1, + T const& x2, T const& y2, T const& z2, + T const& x3, T const& y3, T const& z3); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3); + + // -- Conversions -- + + template< + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3, + typename X4, typename Y4, typename Z4> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + 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, + X4 const& x4, Y4 const& y4, Z4 const& z4); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<3, V1, Q> const& v1, + vec<3, V2, Q> const& v2, + vec<3, V3, Q> const& v3, + vec<3, V4, Q> const& v4); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator=(mat<4, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator+=(mat<4, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator-=(mat<4, 3, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<4, 3, T, Q> & operator/=(U s); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<4, 3, T, Q>& operator++(); + GLM_FUNC_DECL mat<4, 3, T, Q>& operator--(); + GLM_FUNC_DECL mat<4, 3, T, Q> operator++(int); + GLM_FUNC_DECL mat<4, 3, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(T const& s, mat<4, 3, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<4, 3, T, Q>::col_type operator*(mat<4, 3, T, Q> const& m, typename mat<4, 3, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<4, 3, T, Q>::row_type operator*(typename mat<4, 3, T, Q>::col_type const& v, mat<4, 3, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator/(mat<4, 3, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 3, T, Q> operator/(T const& s, mat<4, 3, T, Q> const& m); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat4x3.inl" +#endif //GLM_EXTERNAL_TEMPLATE diff --git a/dep/glm/detail/type_mat4x3.inl b/dep/glm/detail/type_mat4x3.inl new file mode 100644 index 0000000..11b1ee3 --- /dev/null +++ b/dep/glm/detail/type_mat4x3.inl @@ -0,0 +1,598 @@ +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0), col_type(0, 1, 0), col_type(0, 0, 1), col_type(0, 0, 0)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0); + this->value[1] = col_type(0, 1, 0); + this->value[2] = col_type(0, 0, 1); + this->value[3] = col_type(0, 0, 0); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<4, 3, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(T const& s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0, 0), col_type(0, s, 0), col_type(0, 0, s), col_type(0, 0, 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0, 0); + this->value[1] = col_type(0, s, 0); + this->value[2] = col_type(0, 0, s); + this->value[3] = col_type(0, 0, 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat + ( + T const& x0, T const& y0, T const& z0, + T const& x1, T const& y1, T const& z1, + T const& x2, T const& y2, T const& z2, + T const& x3, T const& y3, T const& z3 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0, z0), col_type(x1, y1, z1), col_type(x2, y2, z2), col_type(x3, y3, z3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0); + this->value[1] = col_type(x1, y1, z1); + this->value[2] = col_type(x2, y2, z2); + this->value[3] = col_type(x3, y3, z3); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2, col_type const& v3) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2), col_type(v3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + this->value[3] = v3; +# endif + } + + // -- Conversion constructors -- + + template + template< + typename X0, typename Y0, typename Z0, + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat + ( + X0 const& x0, Y0 const& y0, Z0 const& z0, + 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 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x0, y0, z0), col_type(x1, y1, z1), col_type(x2, y2, z2), col_type(x3, y3, z3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0); + this->value[1] = col_type(x1, y1, z1); + this->value[2] = col_type(x2, y2, z2); + this->value[3] = col_type(x3, y3, z3); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(vec<3, V1, Q> const& v1, vec<3, V2, Q> const& v2, vec<3, V3, Q> const& v3, vec<3, V4, Q> const& v4) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2), col_type(v3), col_type(v4)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); + this->value[3] = col_type(v4); +# endif + } + + // -- Matrix conversions -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<4, 3, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(0, 0, 1), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(0, 0, 1); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<4, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0, 0, 1); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 1), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 1); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(0, 0, 1); + this->value[3] = col_type(0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 1), col_type(m[3], 0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 1); + this->value[3] = col_type(m[3], 0); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(0); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::col_type & mat<4, 3, T, Q>::operator[](typename mat<4, 3, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<4, 3, T, Q>::col_type const& mat<4, 3, T, Q>::operator[](typename mat<4, 3, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary updatable operators -- + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q>& mat<4, 3, T, Q>::operator=(mat<4, 3, U, Q> const& m) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + this->value[3] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator+=(mat<4, 3, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + this->value[3] += m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + this->value[3] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator-=(mat<4, 3, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + this->value[3] -= m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + this->value[3] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + this->value[3] /= s; + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + ++this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + --this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> mat<4, 3, T, Q>::operator++(int) + { + mat<4, 3, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> mat<4, 3, T, Q>::operator--(int) + { + mat<4, 3, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m) + { + return mat<4, 3, T, Q>( + -m[0], + -m[1], + -m[2], + -m[3]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m, T const& s) + { + return mat<4, 3, T, Q>( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return mat<4, 3, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2], + m1[3] + m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m, T const& s) + { + return mat<4, 3, T, Q>( + m[0] - s, + m[1] - s, + m[2] - s, + m[3] - s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return mat<4, 3, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2], + m1[3] - m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m, T const& s) + { + return mat<4, 3, T, Q>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(T const& s, mat<4, 3, T, Q> const& m) + { + return mat<4, 3, T, Q>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::col_type operator* + ( + mat<4, 3, T, Q> const& m, + typename mat<4, 3, T, Q>::row_type const& v) + { + return typename mat<4, 3, T, Q>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w, + m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * v.w); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::row_type operator* + ( + typename mat<4, 3, T, Q>::col_type const& v, + mat<4, 3, T, Q> const& m) + { + return typename mat<4, 3, T, Q>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2], + v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2], + v.x * m[3][0] + v.y * m[3][1] + v.z * m[3][2]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return mat<2, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + T const SrcA00 = m1[0][0]; + T const SrcA01 = m1[0][1]; + T const SrcA02 = m1[0][2]; + T const SrcA10 = m1[1][0]; + T const SrcA11 = m1[1][1]; + T const SrcA12 = m1[1][2]; + T const SrcA20 = m1[2][0]; + T const SrcA21 = m1[2][1]; + T const SrcA22 = m1[2][2]; + T const SrcA30 = m1[3][0]; + T const SrcA31 = m1[3][1]; + T const SrcA32 = m1[3][2]; + + T const SrcB00 = m2[0][0]; + T const SrcB01 = m2[0][1]; + T const SrcB02 = m2[0][2]; + T const SrcB03 = m2[0][3]; + T const SrcB10 = m2[1][0]; + T const SrcB11 = m2[1][1]; + T const SrcB12 = m2[1][2]; + T const SrcB13 = m2[1][3]; + T const SrcB20 = m2[2][0]; + T const SrcB21 = m2[2][1]; + T const SrcB22 = m2[2][2]; + T const SrcB23 = m2[2][3]; + + mat<3, 3, T, Q> Result; + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02 + SrcA32 * SrcB03; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12 + SrcA32 * SrcB13; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22 + SrcA30 * SrcB23; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22 + SrcA31 * SrcB23; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22 + SrcA32 * SrcB23; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return mat<4, 3, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3], + m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2] + m1[3][2] * m2[3][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator/(mat<4, 3, T, Q> const& m, T const& s) + { + return mat<4, 3, T, Q>( + m[0] / s, + m[1] / s, + m[2] / s, + m[3] / s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator/(T const& s, mat<4, 3, T, Q> const& m) + { + return mat<4, 3, T, Q>( + s / m[0], + s / m[1], + s / m[2], + s / m[3]); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); + } +} //namespace glm diff --git a/dep/glm/detail/type_mat4x4.hpp b/dep/glm/detail/type_mat4x4.hpp new file mode 100644 index 0000000..3517f9f --- /dev/null +++ b/dep/glm/detail/type_mat4x4.hpp @@ -0,0 +1,189 @@ +/// @ref core +/// @file glm/detail/type_mat4x4.hpp + +#pragma once + +#include "type_vec4.hpp" +#include +#include + +namespace glm +{ + template + struct mat<4, 4, T, Q> + { + typedef vec<4, T, Q> col_type; + typedef vec<4, T, Q> row_type; + typedef mat<4, 4, T, Q> type; + typedef mat<4, 4, T, Q> transpose_type; + typedef T value_type; + + private: + col_type value[4]; + + public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;} + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR col_type const& operator[](length_type i) const; + + // -- Constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR mat() GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR mat(mat<4, 4, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR mat(T const& x); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + T const& x0, T const& y0, T const& z0, T const& w0, + T const& x1, T const& y1, T const& z1, T const& w1, + T const& x2, T const& y2, T const& z2, T const& w2, + T const& x3, T const& y3, T const& z3, T const& w3); + GLM_FUNC_DECL GLM_CONSTEXPR mat( + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3); + + // -- Conversions -- + + template< + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2, + typename X3, typename Y3, typename Z3, typename W3, + typename X4, typename Y4, typename Z4, typename W4> + GLM_FUNC_DECL GLM_CONSTEXPR mat( + 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, + X4 const& x4, Y4 const& y4, Z4 const& z4, W4 const& w4); + + template + GLM_FUNC_DECL GLM_CONSTEXPR mat( + vec<4, V1, Q> const& v1, + vec<4, V2, Q> const& v2, + vec<4, V3, Q> const& v3, + vec<4, V4, Q> const& v4); + + // -- Matrix conversions -- + + template + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 4, U, P> const& m); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR mat(mat<4, 3, T, Q> const& x); + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator=(mat<4, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator+=(U s); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator+=(mat<4, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator-=(U s); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator-=(mat<4, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator*=(U s); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator*=(mat<4, 4, U, Q> const& m); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator/=(U s); + template + GLM_FUNC_DECL mat<4, 4, T, Q> & operator/=(mat<4, 4, U, Q> const& m); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL mat<4, 4, T, Q> & operator++(); + GLM_FUNC_DECL mat<4, 4, T, Q> & operator--(); + GLM_FUNC_DECL mat<4, 4, T, Q> operator++(int); + GLM_FUNC_DECL mat<4, 4, T, Q> operator--(int); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m); + + // -- Binary operators -- + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(T const& s, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(T const& s, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(T const& s, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<4, 4, T, Q>::col_type operator*(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<4, 4, T, Q>::row_type operator*(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m, T const& s); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator/(T const& s, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL typename mat<4, 4, T, Q>::col_type operator/(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v); + + template + GLM_FUNC_DECL typename mat<4, 4, T, Q>::row_type operator/(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m); + + template + GLM_FUNC_DECL mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); + + template + GLM_FUNC_DECL bool operator!=(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat4x4.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/dep/glm/detail/type_mat4x4.inl b/dep/glm/detail/type_mat4x4.inl new file mode 100644 index 0000000..e38b87f --- /dev/null +++ b/dep/glm/detail/type_mat4x4.inl @@ -0,0 +1,706 @@ +#include "../matrix.hpp" + +namespace glm +{ + // -- Constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat() +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST + : value{col_type(1, 0, 0, 0), col_type(0, 1, 0, 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION + this->value[0] = col_type(1, 0, 0, 0); + this->value[1] = col_type(0, 1, 0, 0); + this->value[2] = col_type(0, 0, 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 4, T, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(T const& s) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(s, 0, 0, 0), col_type(0, s, 0, 0), col_type(0, 0, s, 0), col_type(0, 0, 0, s)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(s, 0, 0, 0); + this->value[1] = col_type(0, s, 0, 0); + this->value[2] = col_type(0, 0, s, 0); + this->value[3] = col_type(0, 0, 0, s); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat + ( + T const& x0, T const& y0, T const& z0, T const& w0, + T const& x1, T const& y1, T const& z1, T const& w1, + T const& x2, T const& y2, T const& z2, T const& w2, + T const& x3, T const& y3, T const& z3, T const& w3 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{ + col_type(x0, y0, z0, w0), + col_type(x1, y1, z1, w1), + col_type(x2, y2, z2, w2), + col_type(x3, y3, z3, w3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x0, y0, z0, w0); + this->value[1] = col_type(x1, y1, z1, w1); + this->value[2] = col_type(x2, y2, z2, w2); + this->value[3] = col_type(x3, y3, z3, w3); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(col_type const& v0, col_type const& v1, col_type const& v2, col_type const& v3) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v0), col_type(v1), col_type(v2), col_type(v3)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + this->value[3] = v3; +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 4, U, P> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); +# endif + } + + // -- Conversions -- + + template + template< + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2, + typename X3, typename Y3, typename Z3, typename W3, + typename X4, typename Y4, typename Z4, typename W4> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat + ( + 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, + X4 const& x4, Y4 const& y4, Z4 const& z4, W4 const& w4 + ) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(x1, y1, z1, w1), col_type(x2, y2, z2, w2), col_type(x3, y3, z3, w3), col_type(x4, y4, z4, w4)} +# endif + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 4th parameter type invalid."); + + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 5th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 6th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 7th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 8th parameter type invalid."); + + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 9th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 10th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 11th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 12th parameter type invalid."); + + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 13th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 14th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 15th parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 16th parameter type invalid."); + +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(x1, y1, z1, w1); + this->value[1] = col_type(x2, y2, z2, w2); + this->value[2] = col_type(x3, y3, z3, w3); + this->value[3] = col_type(x4, y4, z4, w4); +# endif + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(vec<4, V1, Q> const& v1, vec<4, V2, Q> const& v2, vec<4, V3, Q> const& v3, vec<4, V4, Q> const& v4) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(v1), col_type(v2), col_type(v3), col_type(v4)} +# endif + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid."); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559 || std::numeric_limits::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 4th parameter type invalid."); + +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); + this->value[3] = col_type(v4); +# endif + } + + // -- Matrix conversions -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<2, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(0, 0, 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<3, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<2, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(0, 0, 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<3, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(m[2], 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(m[2], 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<2, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = col_type(0, 0, 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 2, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0, 0); + this->value[1] = col_type(m[1], 0, 0); + this->value[2] = col_type(0, 0, 1, 0); + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<3, 4, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0, 0, 0, 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = col_type(0, 0, 0, 1); +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 3, T, Q> const& m) +# if GLM_HAS_INITIALIZER_LISTS + : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 0), col_type(m[3], 1)} +# endif + { +# if !GLM_HAS_INITIALIZER_LISTS + this->value[0] = col_type(m[0], 0); + this->value[1] = col_type(m[1], 0); + this->value[2] = col_type(m[2], 0); + this->value[3] = col_type(m[3], 1); +# endif + } + + // -- Accesses -- + + template + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type & mat<4, 4, T, Q>::operator[](typename mat<4, 4, T, Q>::length_type i) + { + assert(i < this->length()); + return this->value[i]; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<4, 4, T, Q>::col_type const& mat<4, 4, T, Q>::operator[](typename mat<4, 4, T, Q>::length_type i) const + { + assert(i < this->length()); + return this->value[i]; + } + + // -- Unary arithmetic operators -- + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator=(mat<4, 4, U, Q> const& m) + { + //memcpy could be faster + //memcpy(&this->value, &m.value, 16 * sizeof(valType)); + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator+=(U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + this->value[3] += s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator+=(mat<4, 4, U, Q> const& m) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + this->value[3] += m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator-=(U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + this->value[3] -= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator-=(mat<4, 4, U, Q> const& m) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + this->value[3] -= m[3]; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator*=(U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + this->value[3] *= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator*=(mat<4, 4, U, Q> const& m) + { + return (*this = *this * m); + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator/=(U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + this->value[3] /= s; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator/=(mat<4, 4, U, Q> const& m) + { + return *this *= inverse(m); + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator++() + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + ++this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator--() + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + --this->value[3]; + return *this; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat<4, 4, T, Q>::operator++(int) + { + mat<4, 4, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat<4, 4, T, Q>::operator--(int) + { + mat<4, 4, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary constant operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m) + { + return m; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + -m[0], + -m[1], + -m[2], + -m[3]); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m, T const& s) + { + return mat<4, 4, T, Q>( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(T const& s, mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return mat<4, 4, T, Q>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2], + m1[3] + m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m, T const& s) + { + return mat<4, 4, T, Q>( + m[0] - s, + m[1] - s, + m[2] - s, + m[3] - s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(T const& s, mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + s - m[0], + s - m[1], + s - m[2], + s - m[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return mat<4, 4, T, Q>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2], + m1[3] - m2[3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m, T const & s) + { + return mat<4, 4, T, Q>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(T const& s, mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type operator* + ( + mat<4, 4, T, Q> const& m, + typename mat<4, 4, T, Q>::row_type const& v + ) + { +/* + __m128 v0 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 v1 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(1, 1, 1, 1)); + __m128 v2 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 v3 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(m[0].data, v0); + __m128 m1 = _mm_mul_ps(m[1].data, v1); + __m128 a0 = _mm_add_ps(m0, m1); + + __m128 m2 = _mm_mul_ps(m[2].data, v2); + __m128 m3 = _mm_mul_ps(m[3].data, v3); + __m128 a1 = _mm_add_ps(m2, m3); + + __m128 a2 = _mm_add_ps(a0, a1); + + return typename mat<4, 4, T, Q>::col_type(a2); +*/ + + typename mat<4, 4, T, Q>::col_type const Mov0(v[0]); + typename mat<4, 4, T, Q>::col_type const Mov1(v[1]); + typename mat<4, 4, T, Q>::col_type const Mul0 = m[0] * Mov0; + typename mat<4, 4, T, Q>::col_type const Mul1 = m[1] * Mov1; + typename mat<4, 4, T, Q>::col_type const Add0 = Mul0 + Mul1; + typename mat<4, 4, T, Q>::col_type const Mov2(v[2]); + typename mat<4, 4, T, Q>::col_type const Mov3(v[3]); + typename mat<4, 4, T, Q>::col_type const Mul2 = m[2] * Mov2; + typename mat<4, 4, T, Q>::col_type const Mul3 = m[3] * Mov3; + typename mat<4, 4, T, Q>::col_type const Add1 = Mul2 + Mul3; + typename mat<4, 4, T, Q>::col_type const Add2 = Add0 + Add1; + return Add2; + +/* + return typename mat<4, 4, T, Q>::col_type( + m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3], + m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1] * v[3], + m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2] * v[3], + m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3] * v[3]); +*/ + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::row_type operator* + ( + typename mat<4, 4, T, Q>::col_type const& v, + mat<4, 4, T, Q> const& m + ) + { + return typename mat<4, 4, T, Q>::row_type( + m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3] * v[3], + m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3] * v[3], + m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3] * v[3], + m[3][0] * v[0] + m[3][1] * v[1] + m[3][2] * v[2] + m[3][3] * v[3]); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) + { + return mat<2, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) + { + return mat<3, 4, T, Q>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3], + m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2] + m1[3][3] * m2[2][3]); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + typename mat<4, 4, T, Q>::col_type const SrcA0 = m1[0]; + typename mat<4, 4, T, Q>::col_type const SrcA1 = m1[1]; + typename mat<4, 4, T, Q>::col_type const SrcA2 = m1[2]; + typename mat<4, 4, T, Q>::col_type const SrcA3 = m1[3]; + + typename mat<4, 4, T, Q>::col_type const SrcB0 = m2[0]; + typename mat<4, 4, T, Q>::col_type const SrcB1 = m2[1]; + typename mat<4, 4, T, Q>::col_type const SrcB2 = m2[2]; + typename mat<4, 4, T, Q>::col_type const SrcB3 = m2[3]; + + mat<4, 4, T, Q> Result; + Result[0] = SrcA0 * SrcB0[0] + SrcA1 * SrcB0[1] + SrcA2 * SrcB0[2] + SrcA3 * SrcB0[3]; + Result[1] = SrcA0 * SrcB1[0] + SrcA1 * SrcB1[1] + SrcA2 * SrcB1[2] + SrcA3 * SrcB1[3]; + Result[2] = SrcA0 * SrcB2[0] + SrcA1 * SrcB2[1] + SrcA2 * SrcB2[2] + SrcA3 * SrcB2[3]; + Result[3] = SrcA0 * SrcB3[0] + SrcA1 * SrcB3[1] + SrcA2 * SrcB3[2] + SrcA3 * SrcB3[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m, T const& s) + { + return mat<4, 4, T, Q>( + m[0] / s, + m[1] / s, + m[2] / s, + m[3] / s); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(T const& s, mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + s / m[0], + s / m[1], + s / m[2], + s / m[3]); + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type operator/(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v) + { + return inverse(m) * v; + } + + template + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::row_type operator/(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m) + { + return v * inverse(m); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + mat<4, 4, T, Q> m1_copy(m1); + return m1_copy /= m2; + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "type_mat4x4_simd.inl" +#endif diff --git a/dep/glm/detail/type_mat4x4_simd.inl b/dep/glm/detail/type_mat4x4_simd.inl new file mode 100644 index 0000000..fb3a16f --- /dev/null +++ b/dep/glm/detail/type_mat4x4_simd.inl @@ -0,0 +1,6 @@ +/// @ref core + +namespace glm +{ + +}//namespace glm diff --git a/dep/glm/detail/type_quat.hpp b/dep/glm/detail/type_quat.hpp new file mode 100644 index 0000000..0e60bc3 --- /dev/null +++ b/dep/glm/detail/type_quat.hpp @@ -0,0 +1,186 @@ +/// @ref core +/// @file glm/detail/type_quat.hpp + +#pragma once + +// Dependency: +#include "../detail/type_mat3x3.hpp" +#include "../detail/type_mat4x4.hpp" +#include "../detail/type_vec3.hpp" +#include "../detail/type_vec4.hpp" +#include "../ext/vector_relational.hpp" +#include "../ext/quaternion_relational.hpp" +#include "../gtc/constants.hpp" +#include "../gtc/matrix_transform.hpp" + +namespace glm +{ + template + struct qua + { + // -- Implementation detail -- + + typedef qua type; + typedef T value_type; + + // -- Data -- + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +# pragma clang diagnostic ignored "-Wnested-anon-types" +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +# endif +# endif + +# if GLM_LANG & GLM_LANG_CXXMS_FLAG + union + { +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + struct { T w, x, y, z; }; +# else + struct { T x, y, z, w; }; +# endif + + typename detail::storage<4, T, detail::is_aligned::value>::type data; + }; +# else +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + T w, x, y, z; +# else + T x, y, z, w; +# endif +# endif + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif +# endif + + // -- Component accesses -- + + typedef length_t length_type; + + /// Return the count of components of a quaternion + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;} + + GLM_FUNC_DECL GLM_CONSTEXPR T & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR qua() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR qua(qua const& q) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR qua(qua const& q); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR qua(T s, vec<3, T, Q> const& v); + GLM_FUNC_DECL GLM_CONSTEXPR qua(T w, T x, T y, T z); + + // -- Conversion constructors -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT qua(qua const& q); + + /// Explicit conversion operators +# if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS + GLM_FUNC_DECL explicit operator mat<3, 3, T, Q>() const; + GLM_FUNC_DECL explicit operator mat<4, 4, T, Q>() const; +# endif + + /// Create a quaternion from two normalized axis + /// + /// @param u A first normalized axis + /// @param v A second normalized axis + /// @see gtc_quaternion + /// @see http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors + GLM_FUNC_DECL qua(vec<3, T, Q> const& u, vec<3, T, Q> const& v); + + /// Build a quaternion from euler angles (pitch, yaw, roll), in radians. + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT qua(vec<3, T, Q> const& eulerAngles); + GLM_FUNC_DECL GLM_EXPLICIT qua(mat<3, 3, T, Q> const& q); + GLM_FUNC_DECL GLM_EXPLICIT qua(mat<4, 4, T, Q> const& q); + + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator=(qua const& q) GLM_DEFAULT; + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator=(qua const& q); + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator+=(qua const& q); + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator-=(qua const& q); + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator*=(qua const& q); + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator*=(U s); + template + GLM_FUNC_DECL GLM_CONSTEXPR qua& operator/=(U s); + }; + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator+(qua const& q); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator-(qua const& q); + + // -- Binary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator+(qua const& q, qua const& p); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator-(qua const& q, qua const& p); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator*(qua const& q, qua const& p); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(qua const& q, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, qua const& q); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(qua const& q, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, qua const& q); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator*(qua const& q, T const& s); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator*(T const& s, qua const& q); + + template + GLM_FUNC_DECL GLM_CONSTEXPR qua operator/(qua const& q, T const& s); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(qua const& q1, qua const& q2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(qua const& q1, qua const& q2); +} //namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_quat.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/dep/glm/detail/type_quat.inl b/dep/glm/detail/type_quat.inl new file mode 100644 index 0000000..67b9310 --- /dev/null +++ b/dep/glm/detail/type_quat.inl @@ -0,0 +1,408 @@ +#include "../trigonometric.hpp" +#include "../exponential.hpp" +#include "../ext/quaternion_geometric.hpp" +#include + +namespace glm{ +namespace detail +{ + template + struct genTypeTrait > + { + static const genTypeEnum GENTYPE = GENTYPE_QUAT; + }; + + template + struct compute_dot, T, Aligned> + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static T call(qua const& a, qua const& b) + { + vec<4, T, Q> tmp(a.w * b.w, a.x * b.x, a.y * b.y, a.z * b.z); + return (tmp.x + tmp.y) + (tmp.z + tmp.w); + } + }; + + template + struct compute_quat_add + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static qua call(qua const& q, qua const& p) + { + return qua(q.w + p.w, q.x + p.x, q.y + p.y, q.z + p.z); + } + }; + + template + struct compute_quat_sub + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static qua call(qua const& q, qua const& p) + { + return qua(q.w - p.w, q.x - p.x, q.y - p.y, q.z - p.z); + } + }; + + template + struct compute_quat_mul_scalar + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static qua call(qua const& q, T s) + { + return qua(q.w * s, q.x * s, q.y * s, q.z * s); + } + }; + + template + struct compute_quat_div_scalar + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static qua call(qua const& q, T s) + { + return qua(q.w / s, q.x / s, q.y / s, q.z / s); + } + }; + + template + struct compute_quat_mul_vec4 + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(qua const& q, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(q * vec<3, T, Q>(v), v.w); + } + }; +}//namespace detail + + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & qua::operator[](typename qua::length_type i) + { + assert(i >= 0 && i < this->length()); +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + return (&w)[i]; +# else + return (&x)[i]; +# endif + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& qua::operator[](typename qua::length_type i) const + { + assert(i >= 0 && i < this->length()); +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + return (&w)[i]; +# else + return (&x)[i]; +# endif + } + + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua() +# if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(1), x(0), y(0), z(0) +# else + : x(0), y(0), z(0), w(1) +# endif +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(qua const& q) +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(q.w), x(q.x), y(q.y), z(q.z) +# else + : x(q.x), y(q.y), z(q.z), w(q.w) +# endif + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(qua const& q) +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(q.w), x(q.x), y(q.y), z(q.z) +# else + : x(q.x), y(q.y), z(q.z), w(q.w) +# endif + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(T s, vec<3, T, Q> const& v) +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(s), x(v.x), y(v.y), z(v.z) +# else + : x(v.x), y(v.y), z(v.z), w(s) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(T _w, T _x, T _y, T _z) +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(_w), x(_x), y(_y), z(_z) +# else + : x(_x), y(_y), z(_z), w(_w) +# endif + {} + + // -- Conversion constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(qua const& q) +# ifdef GLM_FORCE_QUAT_DATA_WXYZ + : w(static_cast(q.w)), x(static_cast(q.x)), y(static_cast(q.y)), z(static_cast(q.z)) +# else + : x(static_cast(q.x)), y(static_cast(q.y)), z(static_cast(q.z)), w(static_cast(q.w)) +# endif + {} + + //template + //GLM_FUNC_QUALIFIER qua::qua + //( + // valType const& pitch, + // valType const& yaw, + // valType const& roll + //) + //{ + // vec<3, valType> eulerAngle(pitch * valType(0.5), yaw * valType(0.5), roll * valType(0.5)); + // vec<3, valType> c = glm::cos(eulerAngle * valType(0.5)); + // vec<3, valType> s = glm::sin(eulerAngle * valType(0.5)); + // + // this->w = c.x * c.y * c.z + s.x * s.y * s.z; + // this->x = s.x * c.y * c.z - c.x * s.y * s.z; + // this->y = c.x * s.y * c.z + s.x * c.y * s.z; + // this->z = c.x * c.y * s.z - s.x * s.y * c.z; + //} + + template + GLM_FUNC_QUALIFIER qua::qua(vec<3, T, Q> const& u, vec<3, T, Q> const& v) + { + T norm_u_norm_v = sqrt(dot(u, u) * dot(v, v)); + T real_part = norm_u_norm_v + dot(u, v); + vec<3, T, Q> t; + + if(real_part < static_cast(1.e-6f) * norm_u_norm_v) + { + // If u and v are exactly opposite, rotate 180 degrees + // around an arbitrary orthogonal axis. Axis normalisation + // can happen later, when we normalise the quaternion. + real_part = static_cast(0); + t = abs(u.x) > abs(u.z) ? vec<3, T, Q>(-u.y, u.x, static_cast(0)) : vec<3, T, Q>(static_cast(0), -u.z, u.y); + } + else + { + // Otherwise, build quaternion the standard way. + t = cross(u, v); + } + + *this = normalize(qua(real_part, t.x, t.y, t.z)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua::qua(vec<3, T, Q> const& eulerAngle) + { + vec<3, T, Q> c = glm::cos(eulerAngle * T(0.5)); + vec<3, T, Q> s = glm::sin(eulerAngle * T(0.5)); + + this->w = c.x * c.y * c.z + s.x * s.y * s.z; + this->x = s.x * c.y * c.z - c.x * s.y * s.z; + this->y = c.x * s.y * c.z + s.x * c.y * s.z; + this->z = c.x * c.y * s.z - s.x * s.y * c.z; + } + + template + GLM_FUNC_QUALIFIER qua::qua(mat<3, 3, T, Q> const& m) + { + *this = quat_cast(m); + } + + template + GLM_FUNC_QUALIFIER qua::qua(mat<4, 4, T, Q> const& m) + { + *this = quat_cast(m); + } + +# if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS + template + GLM_FUNC_QUALIFIER qua::operator mat<3, 3, T, Q>() const + { + return mat3_cast(*this); + } + + template + GLM_FUNC_QUALIFIER qua::operator mat<4, 4, T, Q>() const + { + return mat4_cast(*this); + } +# endif//GLM_HAS_EXPLICIT_CONVERSION_OPERATORS + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator=(qua const& q) + { + this->w = q.w; + this->x = q.x; + this->y = q.y; + this->z = q.z; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator=(qua const& q) + { + this->w = static_cast(q.w); + this->x = static_cast(q.x); + this->y = static_cast(q.y); + this->z = static_cast(q.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator+=(qua const& q) + { + return (*this = detail::compute_quat_add::value>::call(*this, qua(q))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator-=(qua const& q) + { + return (*this = detail::compute_quat_sub::value>::call(*this, qua(q))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator*=(qua const& r) + { + qua const p(*this); + qua const q(r); + + this->w = p.w * q.w - p.x * q.x - p.y * q.y - p.z * q.z; + this->x = p.w * q.x + p.x * q.w + p.y * q.z - p.z * q.y; + this->y = p.w * q.y + p.y * q.w + p.z * q.x - p.x * q.z; + this->z = p.w * q.z + p.z * q.w + p.x * q.y - p.y * q.x; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator*=(U s) + { + return (*this = detail::compute_quat_mul_scalar::value>::call(*this, static_cast(s))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua & qua::operator/=(U s) + { + return (*this = detail::compute_quat_div_scalar::value>::call(*this, static_cast(s))); + } + + // -- Unary bit operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator+(qua const& q) + { + return q; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator-(qua const& q) + { + return qua(-q.w, -q.x, -q.y, -q.z); + } + + // -- Binary operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator+(qua const& q, qua const& p) + { + return qua(q) += p; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator-(qua const& q, qua const& p) + { + return qua(q) -= p; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator*(qua const& q, qua const& p) + { + return qua(q) *= p; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(qua const& q, vec<3, T, Q> const& v) + { + vec<3, T, Q> const QuatVector(q.x, q.y, q.z); + vec<3, T, Q> const uv(glm::cross(QuatVector, v)); + vec<3, T, Q> const uuv(glm::cross(QuatVector, uv)); + + return v + ((uv * q.w) + uuv) * static_cast(2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, qua const& q) + { + return glm::inverse(q) * v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(qua const& q, vec<4, T, Q> const& v) + { + return detail::compute_quat_mul_vec4::value>::call(q, v); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, qua const& q) + { + return glm::inverse(q) * v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator*(qua const& q, T const& s) + { + return qua( + q.w * s, q.x * s, q.y * s, q.z * s); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator*(T const& s, qua const& q) + { + return q * s; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua operator/(qua const& q, T const& s) + { + return qua( + q.w / s, q.x / s, q.y / s, q.z / s); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(qua const& q1, qua const& q2) + { + return q1.x == q2.x && q1.y == q2.y && q1.z == q2.z && q1.w == q2.w; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(qua const& q1, qua const& q2) + { + return q1.x != q2.x || q1.y != q2.y || q1.z != q2.z || q1.w != q2.w; + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "type_quat_simd.inl" +#endif + diff --git a/dep/glm/detail/type_quat_simd.inl b/dep/glm/detail/type_quat_simd.inl new file mode 100644 index 0000000..3333e59 --- /dev/null +++ b/dep/glm/detail/type_quat_simd.inl @@ -0,0 +1,188 @@ +/// @ref core + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ +/* + template + struct compute_quat_mul + { + static qua call(qua const& q1, qua const& q2) + { + // SSE2 STATS: 11 shuffle, 8 mul, 8 add + // SSE4 STATS: 3 shuffle, 4 mul, 4 dpps + + __m128 const mul0 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(0, 1, 2, 3))); + __m128 const mul1 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(1, 0, 3, 2))); + __m128 const mul2 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(2, 3, 0, 1))); + __m128 const mul3 = _mm_mul_ps(q1.Data, q2.Data); + +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + __m128 const add0 = _mm_dp_ps(mul0, _mm_set_ps(1.0f, -1.0f, 1.0f, 1.0f), 0xff); + __m128 const add1 = _mm_dp_ps(mul1, _mm_set_ps(1.0f, 1.0f, 1.0f, -1.0f), 0xff); + __m128 const add2 = _mm_dp_ps(mul2, _mm_set_ps(1.0f, 1.0f, -1.0f, 1.0f), 0xff); + __m128 const add3 = _mm_dp_ps(mul3, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f), 0xff); +# else + __m128 const mul4 = _mm_mul_ps(mul0, _mm_set_ps(1.0f, -1.0f, 1.0f, 1.0f)); + __m128 const add0 = _mm_add_ps(mul0, _mm_movehl_ps(mul4, mul4)); + __m128 const add4 = _mm_add_ss(add0, _mm_shuffle_ps(add0, add0, 1)); + + __m128 const mul5 = _mm_mul_ps(mul1, _mm_set_ps(1.0f, 1.0f, 1.0f, -1.0f)); + __m128 const add1 = _mm_add_ps(mul1, _mm_movehl_ps(mul5, mul5)); + __m128 const add5 = _mm_add_ss(add1, _mm_shuffle_ps(add1, add1, 1)); + + __m128 const mul6 = _mm_mul_ps(mul2, _mm_set_ps(1.0f, 1.0f, -1.0f, 1.0f)); + __m128 const add2 = _mm_add_ps(mul6, _mm_movehl_ps(mul6, mul6)); + __m128 const add6 = _mm_add_ss(add2, _mm_shuffle_ps(add2, add2, 1)); + + __m128 const mul7 = _mm_mul_ps(mul3, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f)); + __m128 const add3 = _mm_add_ps(mul3, _mm_movehl_ps(mul7, mul7)); + __m128 const add7 = _mm_add_ss(add3, _mm_shuffle_ps(add3, add3, 1)); + #endif + + // This SIMD code is a politically correct way of doing this, but in every test I've tried it has been slower than + // the final code below. I'll keep this here for reference - maybe somebody else can do something better... + // + //__m128 xxyy = _mm_shuffle_ps(add4, add5, _MM_SHUFFLE(0, 0, 0, 0)); + //__m128 zzww = _mm_shuffle_ps(add6, add7, _MM_SHUFFLE(0, 0, 0, 0)); + // + //return _mm_shuffle_ps(xxyy, zzww, _MM_SHUFFLE(2, 0, 2, 0)); + + qua Result; + _mm_store_ss(&Result.x, add4); + _mm_store_ss(&Result.y, add5); + _mm_store_ss(&Result.z, add6); + _mm_store_ss(&Result.w, add7); + return Result; + } + }; +*/ + + template + struct compute_quat_add + { + static qua call(qua const& q, qua const& p) + { + qua Result; + Result.data = _mm_add_ps(q.data, p.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_quat_add + { + static qua call(qua const& a, qua const& b) + { + qua Result; + Result.data = _mm256_add_pd(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_quat_sub + { + static qua call(qua const& q, qua const& p) + { + vec<4, float, Q> Result; + Result.data = _mm_sub_ps(q.data, p.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_quat_sub + { + static qua call(qua const& a, qua const& b) + { + qua Result; + Result.data = _mm256_sub_pd(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_quat_mul_scalar + { + static qua call(qua const& q, float s) + { + vec<4, float, Q> Result; + Result.data = _mm_mul_ps(q.data, _mm_set_ps1(s)); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_quat_mul_scalar + { + static qua call(qua const& q, double s) + { + qua Result; + Result.data = _mm256_mul_pd(q.data, _mm_set_ps1(s)); + return Result; + } + }; +# endif + + template + struct compute_quat_div_scalar + { + static qua call(qua const& q, float s) + { + vec<4, float, Q> Result; + Result.data = _mm_div_ps(q.data, _mm_set_ps1(s)); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_quat_div_scalar + { + static qua call(qua const& q, double s) + { + qua Result; + Result.data = _mm256_div_pd(q.data, _mm_set_ps1(s)); + return Result; + } + }; +# endif + + template + struct compute_quat_mul_vec4 + { + static vec<4, float, Q> call(qua const& q, vec<4, float, Q> const& v) + { + __m128 const q_wwww = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 const q_swp0 = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 0, 2, 1)); + __m128 const q_swp1 = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 1, 0, 2)); + __m128 const v_swp0 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 0, 2, 1)); + __m128 const v_swp1 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 1, 0, 2)); + + __m128 uv = _mm_sub_ps(_mm_mul_ps(q_swp0, v_swp1), _mm_mul_ps(q_swp1, v_swp0)); + __m128 uv_swp0 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 0, 2, 1)); + __m128 uv_swp1 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 1, 0, 2)); + __m128 uuv = _mm_sub_ps(_mm_mul_ps(q_swp0, uv_swp1), _mm_mul_ps(q_swp1, uv_swp0)); + + __m128 const two = _mm_set1_ps(2.0f); + uv = _mm_mul_ps(uv, _mm_mul_ps(q_wwww, two)); + uuv = _mm_mul_ps(uuv, two); + + vec<4, float, Q> Result; + Result.data = _mm_add_ps(v.Data, _mm_add_ps(uv, uuv)); + return Result; + } + }; +}//namespace detail +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT + diff --git a/dep/glm/detail/type_vec1.hpp b/dep/glm/detail/type_vec1.hpp new file mode 100644 index 0000000..51163f1 --- /dev/null +++ b/dep/glm/detail/type_vec1.hpp @@ -0,0 +1,308 @@ +/// @ref core +/// @file glm/detail/type_vec1.hpp + +#pragma once + +#include "qualifier.hpp" +#if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +# include "_swizzle.hpp" +#elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION +# include "_swizzle_func.hpp" +#endif +#include + +namespace glm +{ + template + struct vec<1, T, Q> + { + // -- Implementation detail -- + + typedef T value_type; + typedef vec<1, T, Q> type; + typedef vec<1, bool, Q> bool_type; + + // -- Data -- + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +# pragma clang diagnostic ignored "-Wnested-anon-types" +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +# endif +# endif + +# if GLM_CONFIG_XYZW_ONLY + T x; +# elif GLM_CONFIG_ANONYMOUS_STRUCT == GLM_ENABLE + union + { + T x; + T r; + T s; + + typename detail::storage<1, T, detail::is_aligned::value>::type data; +/* +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + _GLM_SWIZZLE1_2_MEMBERS(T, Q, x) + _GLM_SWIZZLE1_2_MEMBERS(T, Q, r) + _GLM_SWIZZLE1_2_MEMBERS(T, Q, s) + _GLM_SWIZZLE1_3_MEMBERS(T, Q, x) + _GLM_SWIZZLE1_3_MEMBERS(T, Q, r) + _GLM_SWIZZLE1_3_MEMBERS(T, Q, s) + _GLM_SWIZZLE1_4_MEMBERS(T, Q, x) + _GLM_SWIZZLE1_4_MEMBERS(T, Q, r) + _GLM_SWIZZLE1_4_MEMBERS(T, Q, s) +# endif +*/ + }; +# else + union {T x, r, s;}; +/* +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION + GLM_SWIZZLE_GEN_VEC_FROM_VEC1(T, Q) +# endif +*/ +# endif + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif +# endif + + // -- Component accesses -- + + /// Return the count of components of the vector + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 1;} + + GLM_FUNC_DECL GLM_CONSTEXPR T & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec const& v) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, T, P> const& v); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(T scalar); + + // -- Conversion vector constructors -- + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<2, U, P> const& v); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<3, U, P> const& v); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<4, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<1, U, P> const& v); + + // -- Swizzle constructors -- +/* +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<1, T, Q, E0, -1,-2,-3> const& that) + { + *this = that(); + } +# endif//GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +*/ + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator=(vec const& v) GLM_DEFAULT; + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator+=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator+=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator-=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator-=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator*=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator*=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator/=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator/=(vec<1, U, Q> const& v); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator++(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator--(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator++(int); + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator--(int); + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator%=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator%=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator&=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator&=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator|=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator|=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator^=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator^=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator<<=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator<<=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator>>=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> & operator>>=(vec<1, U, Q> const& v); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v); + + // -- Binary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, T, Q> operator~(vec<1, T, Q> const& v); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec1.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/dep/glm/detail/type_vec1.inl b/dep/glm/detail/type_vec1.inl new file mode 100644 index 0000000..c5883ce --- /dev/null +++ b/dep/glm/detail/type_vec1.inl @@ -0,0 +1,551 @@ +/// @ref core + +#include "./compute_vector_relational.hpp" + +namespace glm +{ + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec() +# if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE + : x(0) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, T, Q> const& v) + : x(v.x) + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, T, P> const& v) + : x(v.x) + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(T scalar) + : x(scalar) + {} + + // -- Conversion vector constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, U, P> const& v) + : x(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<2, U, P> const& v) + : x(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<3, U, P> const& v) + : x(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<4, U, P> const& v) + : x(static_cast(v.x)) + {} + + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type) + { + return x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type) const + { + return x; + } + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, T, Q> const& v) + { + this->x = v.x; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, U, Q> const& v) + { + this->x = static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator+=(U scalar) + { + this->x += static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator+=(vec<1, U, Q> const& v) + { + this->x += static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator-=(U scalar) + { + this->x -= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator-=(vec<1, U, Q> const& v) + { + this->x -= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator*=(U scalar) + { + this->x *= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator*=(vec<1, U, Q> const& v) + { + this->x *= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator/=(U scalar) + { + this->x /= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator/=(vec<1, U, Q> const& v) + { + this->x /= static_cast(v.x); + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator++() + { + ++this->x; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator--() + { + --this->x; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> vec<1, T, Q>::operator++(int) + { + vec<1, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> vec<1, T, Q>::operator--(int) + { + vec<1, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary bit operators -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator%=(U scalar) + { + this->x %= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator%=(vec<1, U, Q> const& v) + { + this->x %= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator&=(U scalar) + { + this->x &= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator&=(vec<1, U, Q> const& v) + { + this->x &= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator|=(U scalar) + { + this->x |= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator|=(vec<1, U, Q> const& v) + { + this->x |= U(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator^=(U scalar) + { + this->x ^= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator^=(vec<1, U, Q> const& v) + { + this->x ^= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator<<=(U scalar) + { + this->x <<= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator<<=(vec<1, U, Q> const& v) + { + this->x <<= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator>>=(U scalar) + { + this->x >>= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator>>=(vec<1, U, Q> const& v) + { + this->x >>= static_cast(v.x); + return *this; + } + + // -- Unary constant operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v) + { + return v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + -v.x); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x + scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar + v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x + v2.x); + } + + //operator- + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x - scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar - v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x - v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x * scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar * v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x * v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x / scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar / v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x / v2.x); + } + + // -- Binary bit operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x % scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar % v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x % v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x & scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar & v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x & v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x | scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar | v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x | v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + v.x ^ scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + scalar ^ v.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + v1.x ^ v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + static_cast(v.x << scalar)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + static_cast(scalar << v.x)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + static_cast(v1.x << v2.x)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar) + { + return vec<1, T, Q>( + static_cast(v.x >> scalar)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + static_cast(scalar >> v.x)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<1, T, Q>( + static_cast(v1.x >> v2.x)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator~(vec<1, T, Q> const& v) + { + return vec<1, T, Q>( + ~v.x); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return detail::compute_equal::is_iec559>::call(v1.x, v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return !(v1 == v2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2) + { + return vec<1, bool, Q>(v1.x && v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2) + { + return vec<1, bool, Q>(v1.x || v2.x); + } +}//namespace glm diff --git a/dep/glm/detail/type_vec2.hpp b/dep/glm/detail/type_vec2.hpp new file mode 100644 index 0000000..52ef408 --- /dev/null +++ b/dep/glm/detail/type_vec2.hpp @@ -0,0 +1,399 @@ +/// @ref core +/// @file glm/detail/type_vec2.hpp + +#pragma once + +#include "qualifier.hpp" +#if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +# include "_swizzle.hpp" +#elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION +# include "_swizzle_func.hpp" +#endif +#include + +namespace glm +{ + template + struct vec<2, T, Q> + { + // -- Implementation detail -- + + typedef T value_type; + typedef vec<2, T, Q> type; + typedef vec<2, bool, Q> bool_type; + + // -- Data -- + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +# pragma clang diagnostic ignored "-Wnested-anon-types" +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +# endif +# endif + +# if GLM_CONFIG_XYZW_ONLY + T x, y; +# elif GLM_CONFIG_ANONYMOUS_STRUCT == GLM_ENABLE + union + { + struct{ T x, y; }; + struct{ T r, g; }; + struct{ T s, t; }; + + typename detail::storage<2, T, detail::is_aligned::value>::type data; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + GLM_SWIZZLE2_2_MEMBERS(T, Q, x, y) + GLM_SWIZZLE2_2_MEMBERS(T, Q, r, g) + GLM_SWIZZLE2_2_MEMBERS(T, Q, s, t) + GLM_SWIZZLE2_3_MEMBERS(T, Q, x, y) + GLM_SWIZZLE2_3_MEMBERS(T, Q, r, g) + GLM_SWIZZLE2_3_MEMBERS(T, Q, s, t) + GLM_SWIZZLE2_4_MEMBERS(T, Q, x, y) + GLM_SWIZZLE2_4_MEMBERS(T, Q, r, g) + GLM_SWIZZLE2_4_MEMBERS(T, Q, s, t) +# endif + }; +# else + union {T x, r, s;}; + union {T y, g, t;}; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION + GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, Q) +# endif//GLM_CONFIG_SWIZZLE +# endif + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif +# endif + + // -- Component accesses -- + + /// Return the count of components of the vector + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 2;} + + GLM_FUNC_DECL GLM_CONSTEXPR T& operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec const& v) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, T, P> const& v); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR vec(T x, T y); + + // -- Conversion constructors -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(vec<1, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A x, B y); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, Q> const& x, B y); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A x, vec<1, B, Q> const& y); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, Q> const& x, vec<1, B, Q> const& y); + + // -- Conversion vector constructors -- + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<3, U, P> const& v); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<4, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<2, U, P> const& v); + + // -- Swizzle constructors -- +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1,-1,-2> const& that) + { + *this = that(); + } +# endif//GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator=(vec const& v) GLM_DEFAULT; + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator+=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator+=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator+=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator-=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator-=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator-=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator*=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator*=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator*=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator/=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator/=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator/=(vec<2, U, Q> const& v); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator++(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator--(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator++(int); + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator--(int); + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator%=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator%=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator%=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator&=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator&=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator&=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator|=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator|=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator|=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator^=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator^=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator^=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator<<=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator<<=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator<<=(vec<2, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator>>=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator>>=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> & operator>>=(vec<2, U, Q> const& v); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v); + + // -- Binary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator*(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator*(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator/(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator/(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator%(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator%(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator&(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator&(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator|(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator|(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator^(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator^(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator<<(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator>>(T scalar, vec<2, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, T, Q> operator~(vec<2, T, Q> const& v); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, bool, Q> operator&&(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<2, bool, Q> operator||(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec2.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/dep/glm/detail/type_vec2.inl b/dep/glm/detail/type_vec2.inl new file mode 100644 index 0000000..8e65d6b --- /dev/null +++ b/dep/glm/detail/type_vec2.inl @@ -0,0 +1,913 @@ +/// @ref core + +#include "./compute_vector_relational.hpp" + +namespace glm +{ + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec() +# if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE + : x(0), y(0) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<2, T, Q> const& v) + : x(v.x), y(v.y) + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<2, T, P> const& v) + : x(v.x), y(v.y) + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(T scalar) + : x(scalar), y(scalar) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(T _x, T _y) + : x(_x), y(_y) + {} + + // -- Conversion scalar constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<1, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(A _x, B _y) + : x(static_cast(_x)) + , y(static_cast(_y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<1, A, Q> const& _x, B _y) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(A _x, vec<1, B, Q> const& _y) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<1, A, Q> const& _x, vec<1, B, Q> const& _y) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + {} + + // -- Conversion vector constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<2, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<3, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<4, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + {} + + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & vec<2, T, Q>::operator[](typename vec<2, T, Q>::length_type i) + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + } + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<2, T, Q>::operator[](typename vec<2, T, Q>::length_type i) const + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + } + } + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator=(vec<2, T, Q> const& v) + { + this->x = v.x; + this->y = v.y; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator=(vec<2, U, Q> const& v) + { + this->x = static_cast(v.x); + this->y = static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator+=(U scalar) + { + this->x += static_cast(scalar); + this->y += static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator+=(vec<1, U, Q> const& v) + { + this->x += static_cast(v.x); + this->y += static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator+=(vec<2, U, Q> const& v) + { + this->x += static_cast(v.x); + this->y += static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator-=(U scalar) + { + this->x -= static_cast(scalar); + this->y -= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator-=(vec<1, U, Q> const& v) + { + this->x -= static_cast(v.x); + this->y -= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator-=(vec<2, U, Q> const& v) + { + this->x -= static_cast(v.x); + this->y -= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator*=(U scalar) + { + this->x *= static_cast(scalar); + this->y *= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator*=(vec<1, U, Q> const& v) + { + this->x *= static_cast(v.x); + this->y *= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator*=(vec<2, U, Q> const& v) + { + this->x *= static_cast(v.x); + this->y *= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator/=(U scalar) + { + this->x /= static_cast(scalar); + this->y /= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator/=(vec<1, U, Q> const& v) + { + this->x /= static_cast(v.x); + this->y /= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator/=(vec<2, U, Q> const& v) + { + this->x /= static_cast(v.x); + this->y /= static_cast(v.y); + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator++() + { + ++this->x; + ++this->y; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator--() + { + --this->x; + --this->y; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> vec<2, T, Q>::operator++(int) + { + vec<2, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> vec<2, T, Q>::operator--(int) + { + vec<2, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary bit operators -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator%=(U scalar) + { + this->x %= static_cast(scalar); + this->y %= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator%=(vec<1, U, Q> const& v) + { + this->x %= static_cast(v.x); + this->y %= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator%=(vec<2, U, Q> const& v) + { + this->x %= static_cast(v.x); + this->y %= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator&=(U scalar) + { + this->x &= static_cast(scalar); + this->y &= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator&=(vec<1, U, Q> const& v) + { + this->x &= static_cast(v.x); + this->y &= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator&=(vec<2, U, Q> const& v) + { + this->x &= static_cast(v.x); + this->y &= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator|=(U scalar) + { + this->x |= static_cast(scalar); + this->y |= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator|=(vec<1, U, Q> const& v) + { + this->x |= static_cast(v.x); + this->y |= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator|=(vec<2, U, Q> const& v) + { + this->x |= static_cast(v.x); + this->y |= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator^=(U scalar) + { + this->x ^= static_cast(scalar); + this->y ^= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator^=(vec<1, U, Q> const& v) + { + this->x ^= static_cast(v.x); + this->y ^= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator^=(vec<2, U, Q> const& v) + { + this->x ^= static_cast(v.x); + this->y ^= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator<<=(U scalar) + { + this->x <<= static_cast(scalar); + this->y <<= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator<<=(vec<1, U, Q> const& v) + { + this->x <<= static_cast(v.x); + this->y <<= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator<<=(vec<2, U, Q> const& v) + { + this->x <<= static_cast(v.x); + this->y <<= static_cast(v.y); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator>>=(U scalar) + { + this->x >>= static_cast(scalar); + this->y >>= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator>>=(vec<1, U, Q> const& v) + { + this->x >>= static_cast(v.x); + this->y >>= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator>>=(vec<2, U, Q> const& v) + { + this->x >>= static_cast(v.x); + this->y >>= static_cast(v.y); + return *this; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v) + { + return v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + -v.x, + -v.y); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x + scalar, + v.y + scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x + v2.x, + v1.y + v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar + v.x, + scalar + v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x + v2.x, + v1.x + v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x + v2.x, + v1.y + v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x - scalar, + v.y - scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x - v2.x, + v1.y - v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar - v.x, + scalar - v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x - v2.x, + v1.x - v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x - v2.x, + v1.y - v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x * scalar, + v.y * scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x * v2.x, + v1.y * v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar * v.x, + scalar * v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x * v2.x, + v1.x * v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x * v2.x, + v1.y * v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x / scalar, + v.y / scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x / v2.x, + v1.y / v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar / v.x, + scalar / v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x / v2.x, + v1.x / v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x / v2.x, + v1.y / v2.y); + } + + // -- Binary bit operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x % scalar, + v.y % scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x % v2.x, + v1.y % v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar % v.x, + scalar % v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x % v2.x, + v1.x % v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x % v2.x, + v1.y % v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x & scalar, + v.y & scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x & v2.x, + v1.y & v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar & v.x, + scalar & v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x & v2.x, + v1.x & v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x & v2.x, + v1.y & v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x | scalar, + v.y | scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x | v2.x, + v1.y | v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar | v.x, + scalar | v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x | v2.x, + v1.x | v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x | v2.x, + v1.y | v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x ^ scalar, + v.y ^ scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x ^ v2.x, + v1.y ^ v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar ^ v.x, + scalar ^ v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x ^ v2.x, + v1.x ^ v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x ^ v2.x, + v1.y ^ v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x << scalar, + v.y << scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x << v2.x, + v1.y << v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar << v.x, + scalar << v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x << v2.x, + v1.x << v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x << v2.x, + v1.y << v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v, T scalar) + { + return vec<2, T, Q>( + v.x >> scalar, + v.y >> scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x >> v2.x, + v1.y >> v2.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(T scalar, vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + scalar >> v.x, + scalar >> v.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x >> v2.x, + v1.x >> v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return vec<2, T, Q>( + v1.x >> v2.x, + v1.y >> v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator~(vec<2, T, Q> const& v) + { + return vec<2, T, Q>( + ~v.x, + ~v.y); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return + detail::compute_equal::is_iec559>::call(v1.x, v2.x) && + detail::compute_equal::is_iec559>::call(v1.y, v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) + { + return !(v1 == v2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, bool, Q> operator&&(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2) + { + return vec<2, bool, Q>(v1.x && v2.x, v1.y && v2.y); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, bool, Q> operator||(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2) + { + return vec<2, bool, Q>(v1.x || v2.x, v1.y || v2.y); + } +}//namespace glm diff --git a/dep/glm/detail/type_vec3.hpp b/dep/glm/detail/type_vec3.hpp new file mode 100644 index 0000000..d83cde6 --- /dev/null +++ b/dep/glm/detail/type_vec3.hpp @@ -0,0 +1,432 @@ +/// @ref core +/// @file glm/detail/type_vec3.hpp + +#pragma once + +#include "qualifier.hpp" +#if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +# include "_swizzle.hpp" +#elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION +# include "_swizzle_func.hpp" +#endif +#include + +namespace glm +{ + template + struct vec<3, T, Q> + { + // -- Implementation detail -- + + typedef T value_type; + typedef vec<3, T, Q> type; + typedef vec<3, bool, Q> bool_type; + + // -- Data -- + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +# pragma clang diagnostic ignored "-Wnested-anon-types" +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +# if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE +# pragma warning(disable: 4324) // structure was padded due to alignment specifier +# endif +# endif +# endif + +# if GLM_CONFIG_XYZW_ONLY + T x, y, z; +# elif GLM_CONFIG_ANONYMOUS_STRUCT == GLM_ENABLE + union + { + struct{ T x, y, z; }; + struct{ T r, g, b; }; + struct{ T s, t, p; }; + + typename detail::storage<3, T, detail::is_aligned::value>::type data; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + GLM_SWIZZLE3_2_MEMBERS(T, Q, x, y, z) + GLM_SWIZZLE3_2_MEMBERS(T, Q, r, g, b) + GLM_SWIZZLE3_2_MEMBERS(T, Q, s, t, p) + GLM_SWIZZLE3_3_MEMBERS(T, Q, x, y, z) + GLM_SWIZZLE3_3_MEMBERS(T, Q, r, g, b) + GLM_SWIZZLE3_3_MEMBERS(T, Q, s, t, p) + GLM_SWIZZLE3_4_MEMBERS(T, Q, x, y, z) + GLM_SWIZZLE3_4_MEMBERS(T, Q, r, g, b) + GLM_SWIZZLE3_4_MEMBERS(T, Q, s, t, p) +# endif + }; +# else + union { T x, r, s; }; + union { T y, g, t; }; + union { T z, b, p; }; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION + GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, Q) +# endif//GLM_CONFIG_SWIZZLE +# endif//GLM_LANG + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif +# endif + + // -- Component accesses -- + + /// Return the count of components of the vector + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 3;} + + GLM_FUNC_DECL GLM_CONSTEXPR T & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec const& v) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<3, T, P> const& v); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR vec(T a, T b, T c); + + // -- Conversion scalar constructors -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(vec<1, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X x, Y y, Z z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, Z _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, Z _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, vec<1, Z, Q> const& _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z); + + // -- Conversion vector constructors -- + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, B _z); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<2, B, P> const& _yz); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<4, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<3, U, P> const& v); + + // -- Swizzle constructors -- +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& that) + { + *this = that(); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& scalar) + { + *this = vec(v(), scalar); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& scalar, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v) + { + *this = vec(scalar, v()); + } +# endif//GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q>& operator=(vec<3, T, Q> const& v) GLM_DEFAULT; + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator+=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator+=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator+=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator-=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator-=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator-=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator*=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator*=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator*=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator/=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator/=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator/=(vec<3, U, Q> const& v); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator++(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator--(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator++(int); + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator--(int); + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator%=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator%=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator%=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator&=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator&=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator&=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator|=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator|=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator|=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator^=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator^=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator^=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator<<=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator<<=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator<<=(vec<3, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator>>=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator>>=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> & operator>>=(vec<3, U, Q> const& v); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v); + + // -- Binary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator/(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator/(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator%(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator%(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v1, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator&(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator&(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator|(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator|(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator^(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator^(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator<<(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator>>(T scalar, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator~(vec<3, T, Q> const& v); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, bool, Q> operator&&(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<3, bool, Q> operator||(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec3.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/dep/glm/detail/type_vec3.inl b/dep/glm/detail/type_vec3.inl new file mode 100644 index 0000000..6532c9e --- /dev/null +++ b/dep/glm/detail/type_vec3.inl @@ -0,0 +1,1068 @@ +/// @ref core + +#include "compute_vector_relational.hpp" + +namespace glm +{ + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec() +# if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE + : x(0), y(0), z(0) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, T, Q> const& v) + : x(v.x), y(v.y), z(v.z) + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, T, P> const& v) + : x(v.x), y(v.y), z(v.z) + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(T scalar) + : x(scalar), y(scalar), z(scalar) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(T _x, T _y, T _z) + : x(_x), y(_y), z(_z) + {} + + // -- Conversion scalar constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.x)) + , z(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, Y _y, Z _z) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, Z _z) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, Z _z) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, Y _y, vec<1, Z, Q> const& _z) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + {} + + // -- Conversion vector constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, B _z) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(A _x, vec<2, B, P> const& _yz) + : x(static_cast(_x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz) + : x(static_cast(_x.x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + , z(static_cast(v.z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<4, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + , z(static_cast(v.z)) + {} + + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i) + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + case 2: + return z; + } + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i) const + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + case 2: + return z; + } + } + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, T, Q> const& v) + { + this->x = v.x; + this->y = v.y; + this->z = v.z; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, U, Q> const& v) + { + this->x = static_cast(v.x); + this->y = static_cast(v.y); + this->z = static_cast(v.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(U scalar) + { + this->x += static_cast(scalar); + this->y += static_cast(scalar); + this->z += static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<1, U, Q> const& v) + { + this->x += static_cast(v.x); + this->y += static_cast(v.x); + this->z += static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<3, U, Q> const& v) + { + this->x += static_cast(v.x); + this->y += static_cast(v.y); + this->z += static_cast(v.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(U scalar) + { + this->x -= static_cast(scalar); + this->y -= static_cast(scalar); + this->z -= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<1, U, Q> const& v) + { + this->x -= static_cast(v.x); + this->y -= static_cast(v.x); + this->z -= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<3, U, Q> const& v) + { + this->x -= static_cast(v.x); + this->y -= static_cast(v.y); + this->z -= static_cast(v.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(U scalar) + { + this->x *= static_cast(scalar); + this->y *= static_cast(scalar); + this->z *= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<1, U, Q> const& v) + { + this->x *= static_cast(v.x); + this->y *= static_cast(v.x); + this->z *= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<3, U, Q> const& v) + { + this->x *= static_cast(v.x); + this->y *= static_cast(v.y); + this->z *= static_cast(v.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(U v) + { + this->x /= static_cast(v); + this->y /= static_cast(v); + this->z /= static_cast(v); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<1, U, Q> const& v) + { + this->x /= static_cast(v.x); + this->y /= static_cast(v.x); + this->z /= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<3, U, Q> const& v) + { + this->x /= static_cast(v.x); + this->y /= static_cast(v.y); + this->z /= static_cast(v.z); + return *this; + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator++() + { + ++this->x; + ++this->y; + ++this->z; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator--() + { + --this->x; + --this->y; + --this->z; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> vec<3, T, Q>::operator++(int) + { + vec<3, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> vec<3, T, Q>::operator--(int) + { + vec<3, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary bit operators -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(U scalar) + { + this->x %= scalar; + this->y %= scalar; + this->z %= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<1, U, Q> const& v) + { + this->x %= v.x; + this->y %= v.x; + this->z %= v.x; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<3, U, Q> const& v) + { + this->x %= v.x; + this->y %= v.y; + this->z %= v.z; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(U scalar) + { + this->x &= scalar; + this->y &= scalar; + this->z &= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<1, U, Q> const& v) + { + this->x &= v.x; + this->y &= v.x; + this->z &= v.x; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<3, U, Q> const& v) + { + this->x &= v.x; + this->y &= v.y; + this->z &= v.z; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(U scalar) + { + this->x |= scalar; + this->y |= scalar; + this->z |= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<1, U, Q> const& v) + { + this->x |= v.x; + this->y |= v.x; + this->z |= v.x; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<3, U, Q> const& v) + { + this->x |= v.x; + this->y |= v.y; + this->z |= v.z; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(U scalar) + { + this->x ^= scalar; + this->y ^= scalar; + this->z ^= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<1, U, Q> const& v) + { + this->x ^= v.x; + this->y ^= v.x; + this->z ^= v.x; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<3, U, Q> const& v) + { + this->x ^= v.x; + this->y ^= v.y; + this->z ^= v.z; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(U scalar) + { + this->x <<= scalar; + this->y <<= scalar; + this->z <<= scalar; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<1, U, Q> const& v) + { + this->x <<= static_cast(v.x); + this->y <<= static_cast(v.x); + this->z <<= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<3, U, Q> const& v) + { + this->x <<= static_cast(v.x); + this->y <<= static_cast(v.y); + this->z <<= static_cast(v.z); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(U scalar) + { + this->x >>= static_cast(scalar); + this->y >>= static_cast(scalar); + this->z >>= static_cast(scalar); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<1, U, Q> const& v) + { + this->x >>= static_cast(v.x); + this->y >>= static_cast(v.x); + this->z >>= static_cast(v.x); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<3, U, Q> const& v) + { + this->x >>= static_cast(v.x); + this->y >>= static_cast(v.y); + this->z >>= static_cast(v.z); + return *this; + } + + // -- Unary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v) + { + return v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + -v.x, + -v.y, + -v.z); + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x + scalar, + v.y + scalar, + v.z + scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x + scalar.x, + v.y + scalar.x, + v.z + scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar + v.x, + scalar + v.y, + scalar + v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x + v.x, + scalar.x + v.y, + scalar.x + v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x + v2.x, + v1.y + v2.y, + v1.z + v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x - scalar, + v.y - scalar, + v.z - scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x - scalar.x, + v.y - scalar.x, + v.z - scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar - v.x, + scalar - v.y, + scalar - v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x - v.x, + scalar.x - v.y, + scalar.x - v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x - v2.x, + v1.y - v2.y, + v1.z - v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x * scalar, + v.y * scalar, + v.z * scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x * scalar.x, + v.y * scalar.x, + v.z * scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar * v.x, + scalar * v.y, + scalar * v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x * v.x, + scalar.x * v.y, + scalar.x * v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x * v2.x, + v1.y * v2.y, + v1.z * v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x / scalar, + v.y / scalar, + v.z / scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x / scalar.x, + v.y / scalar.x, + v.z / scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar / v.x, + scalar / v.y, + scalar / v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x / v.x, + scalar.x / v.y, + scalar.x / v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x / v2.x, + v1.y / v2.y, + v1.z / v2.z); + } + + // -- Binary bit operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x % scalar, + v.y % scalar, + v.z % scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x % scalar.x, + v.y % scalar.x, + v.z % scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar % v.x, + scalar % v.y, + scalar % v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x % v.x, + scalar.x % v.y, + scalar.x % v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x % v2.x, + v1.y % v2.y, + v1.z % v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x & scalar, + v.y & scalar, + v.z & scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x & scalar.x, + v.y & scalar.x, + v.z & scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar & v.x, + scalar & v.y, + scalar & v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x & v.x, + scalar.x & v.y, + scalar.x & v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x & v2.x, + v1.y & v2.y, + v1.z & v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x | scalar, + v.y | scalar, + v.z | scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x | scalar.x, + v.y | scalar.x, + v.z | scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar | v.x, + scalar | v.y, + scalar | v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x | v.x, + scalar.x | v.y, + scalar.x | v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x | v2.x, + v1.y | v2.y, + v1.z | v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x ^ scalar, + v.y ^ scalar, + v.z ^ scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x ^ scalar.x, + v.y ^ scalar.x, + v.z ^ scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar ^ v.x, + scalar ^ v.y, + scalar ^ v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x ^ v.x, + scalar.x ^ v.y, + scalar.x ^ v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x ^ v2.x, + v1.y ^ v2.y, + v1.z ^ v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x << scalar, + v.y << scalar, + v.z << scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x << scalar.x, + v.y << scalar.x, + v.z << scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar << v.x, + scalar << v.y, + scalar << v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x << v.x, + scalar.x << v.y, + scalar.x << v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x << v2.x, + v1.y << v2.y, + v1.z << v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v, T scalar) + { + return vec<3, T, Q>( + v.x >> scalar, + v.y >> scalar, + v.z >> scalar); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<3, T, Q>( + v.x >> scalar.x, + v.y >> scalar.x, + v.z >> scalar.x); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(T scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar >> v.x, + scalar >> v.y, + scalar >> v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + scalar.x >> v.x, + scalar.x >> v.y, + scalar.x >> v.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return vec<3, T, Q>( + v1.x >> v2.x, + v1.y >> v2.y, + v1.z >> v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator~(vec<3, T, Q> const& v) + { + return vec<3, T, Q>( + ~v.x, + ~v.y, + ~v.z); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return + detail::compute_equal::is_iec559>::call(v1.x, v2.x) && + detail::compute_equal::is_iec559>::call(v1.y, v2.y) && + detail::compute_equal::is_iec559>::call(v1.z, v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) + { + return !(v1 == v2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, bool, Q> operator&&(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2) + { + return vec<3, bool, Q>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, bool, Q> operator||(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2) + { + return vec<3, bool, Q>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z); + } +}//namespace glm diff --git a/dep/glm/detail/type_vec4.hpp b/dep/glm/detail/type_vec4.hpp new file mode 100644 index 0000000..4a36434 --- /dev/null +++ b/dep/glm/detail/type_vec4.hpp @@ -0,0 +1,505 @@ +/// @ref core +/// @file glm/detail/type_vec4.hpp + +#pragma once + +#include "qualifier.hpp" +#if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR +# include "_swizzle.hpp" +#elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION +# include "_swizzle_func.hpp" +#endif +#include + +namespace glm +{ + template + struct vec<4, T, Q> + { + // -- Implementation detail -- + + typedef T value_type; + typedef vec<4, T, Q> type; + typedef vec<4, bool, Q> bool_type; + + // -- Data -- + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +# elif GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +# pragma clang diagnostic ignored "-Wnested-anon-types" +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +# endif +# endif + +# if GLM_CONFIG_XYZW_ONLY + T x, y, z, w; +# elif GLM_CONFIG_ANONYMOUS_STRUCT == GLM_ENABLE + union + { + struct { T x, y, z, w; }; + struct { T r, g, b, a; }; + struct { T s, t, p, q; }; + + typename detail::storage<4, T, detail::is_aligned::value>::type data; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + GLM_SWIZZLE4_2_MEMBERS(T, Q, x, y, z, w) + GLM_SWIZZLE4_2_MEMBERS(T, Q, r, g, b, a) + GLM_SWIZZLE4_2_MEMBERS(T, Q, s, t, p, q) + GLM_SWIZZLE4_3_MEMBERS(T, Q, x, y, z, w) + GLM_SWIZZLE4_3_MEMBERS(T, Q, r, g, b, a) + GLM_SWIZZLE4_3_MEMBERS(T, Q, s, t, p, q) + GLM_SWIZZLE4_4_MEMBERS(T, Q, x, y, z, w) + GLM_SWIZZLE4_4_MEMBERS(T, Q, r, g, b, a) + GLM_SWIZZLE4_4_MEMBERS(T, Q, s, t, p, q) +# endif + }; +# else + union { T x, r, s; }; + union { T y, g, t; }; + union { T z, b, p; }; + union { T w, a, q; }; + +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION + GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, Q) +# endif +# endif + +# if GLM_SILENT_WARNINGS == GLM_ENABLE +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# elif GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif +# endif + + // -- Component accesses -- + + typedef length_t length_type; + + /// Return the count of components of the vector + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;} + + GLM_FUNC_DECL GLM_CONSTEXPR T & operator[](length_type i); + GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<4, T, Q> const& v) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<4, T, P> const& v); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR vec(T x, T y, T z, T w); + + // -- Conversion scalar constructors -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(vec<1, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, Z _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, Z _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, Z _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, vec<1, Z, Q> const& _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, Z _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _Y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); + + // -- Conversion vector constructors -- + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, B _z, C _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, C _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, B _z, vec<1, C, P> const& _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, vec<1, C, P> const& _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<2, B, P> const& _yz, C _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, C _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, B _y, vec<2, C, P> const& _zw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, B _y, vec<2, C, P> const& _zw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<3, A, P> const& _xyz, B _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<3, A, P> const& _xyz, vec<1, B, P> const& _w); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<3, B, P> const& _yzw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<3, B, P> const& _yzw); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<2, B, P> const& _zw); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<4, U, P> const& v); + + // -- Swizzle constructors -- +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<4, T, Q, E0, E1, E2, E3> const& that) + { + *this = that(); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, detail::_swizzle<2, T, Q, F0, F1, -1, -2> const& u) + { + *this = vec<4, T, Q>(v(), u()); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, T const& y, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v) + { + *this = vec<4, T, Q>(x, y, v()); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& w) + { + *this = vec<4, T, Q>(x, v(), w); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& z, T const& w) + { + *this = vec<4, T, Q>(v(), z, w); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v, T const& w) + { + *this = vec<4, T, Q>(v(), w); + } + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v) + { + *this = vec<4, T, Q>(x, v()); + } +# endif//GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator=(vec<4, T, Q> const& v) GLM_DEFAULT; + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(vec<4, U, Q> const& v); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator++(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator--(); + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator++(int); + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator--(int); + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(vec<4, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(U scalar); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(vec<1, U, Q> const& v); + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(vec<4, U, Q> const& v); + }; + + // -- Unary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v); + + // -- Binary operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v, T const & scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v, T const & scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, T const & scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v, T const & scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v, T scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(T scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator~(vec<4, T, Q> const& v); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, bool, Q> operator&&(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2); + + template + GLM_FUNC_DECL GLM_CONSTEXPR vec<4, bool, Q> operator||(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2); +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec4.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/dep/glm/detail/type_vec4.inl b/dep/glm/detail/type_vec4.inl new file mode 100644 index 0000000..3c212d9 --- /dev/null +++ b/dep/glm/detail/type_vec4.inl @@ -0,0 +1,1140 @@ +/// @ref core + +#include "compute_vector_relational.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_vec4_add + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); + } + }; + + template + struct compute_vec4_sub + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); + } + }; + + template + struct compute_vec4_mul + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w); + } + }; + + template + struct compute_vec4_div + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); + } + }; + + template + struct compute_vec4_mod + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x % b.x, a.y % b.y, a.z % b.z, a.w % b.w); + } + }; + + template + struct compute_vec4_and + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x & b.x, a.y & b.y, a.z & b.z, a.w & b.w); + } + }; + + template + struct compute_vec4_or + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x | b.x, a.y | b.y, a.z | b.z, a.w | b.w); + } + }; + + template + struct compute_vec4_xor + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x ^ b.x, a.y ^ b.y, a.z ^ b.z, a.w ^ b.w); + } + }; + + template + struct compute_vec4_shift_left + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x << b.x, a.y << b.y, a.z << b.z, a.w << b.w); + } + }; + + template + struct compute_vec4_shift_right + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + return vec<4, T, Q>(a.x >> b.x, a.y >> b.y, a.z >> b.z, a.w >> b.w); + } + }; + + template + struct compute_vec4_equal + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return + detail::compute_equal::is_iec559>::call(v1.x, v2.x) && + detail::compute_equal::is_iec559>::call(v1.y, v2.y) && + detail::compute_equal::is_iec559>::call(v1.z, v2.z) && + detail::compute_equal::is_iec559>::call(v1.w, v2.w); + } + }; + + template + struct compute_vec4_nequal + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return !compute_vec4_equal::value, sizeof(T) * 8, detail::is_aligned::value>::call(v1, v2); + } + }; + + template + struct compute_vec4_bitwise_not + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(vec<4, T, Q> const& v) + { + return vec<4, T, Q>(~v.x, ~v.y, ~v.z, ~v.w); + } + }; +}//namespace detail + + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec() +# if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE + : x(0), y(0), z(0), w(0) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<4, T, Q> const& v) + : x(v.x), y(v.y), z(v.z), w(v.w) + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<4, T, P> const& v) + : x(v.x), y(v.y), z(v.z), w(v.w) + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(T scalar) + : x(scalar), y(scalar), z(scalar), w(scalar) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(T _x, T _y, T _z, T _w) + : x(_x), y(_y), z(_z), w(_w) + {} + + // -- Conversion scalar constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.x)) + , z(static_cast(v.x)) + , w(static_cast(v.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, Y _y, Z _z, W _w) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, Z _z, W _w) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, Z _z, W _w) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, W _w) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, Y _y, vec<1, Z, Q> const& _z, W _w) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, W _w) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, Z _z, vec<1, W, Q> const& _w) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_z.x)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_z.x)) + , w(static_cast(_w.x)) + {} + + // -- Conversion vector constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, B _z, C _w) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, C _w) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z.x)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, B _z, vec<1, C, P> const& _w) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, vec<1, C, P> const& _w) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_z.x)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<2, B, P> const& _yz, C _w) + : x(static_cast(_x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, C _w) + : x(static_cast(_x.x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w) + : x(static_cast(_x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w) + : x(static_cast(_x.x)) + , y(static_cast(_yz.x)) + , z(static_cast(_yz.y)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, B _y, vec<2, C, P> const& _zw) + : x(static_cast(_x)) + , y(static_cast(_y)) + , z(static_cast(_zw.x)) + , w(static_cast(_zw.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, B _y, vec<2, C, P> const& _zw) + : x(static_cast(_x.x)) + , y(static_cast(_y)) + , z(static_cast(_zw.x)) + , w(static_cast(_zw.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw) + : x(static_cast(_x)) + , y(static_cast(_y.x)) + , z(static_cast(_zw.x)) + , w(static_cast(_zw.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw) + : x(static_cast(_x.x)) + , y(static_cast(_y.x)) + , z(static_cast(_zw.x)) + , w(static_cast(_zw.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<3, A, P> const& _xyz, B _w) + : x(static_cast(_xyz.x)) + , y(static_cast(_xyz.y)) + , z(static_cast(_xyz.z)) + , w(static_cast(_w)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<3, A, P> const& _xyz, vec<1, B, P> const& _w) + : x(static_cast(_xyz.x)) + , y(static_cast(_xyz.y)) + , z(static_cast(_xyz.z)) + , w(static_cast(_w.x)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<3, B, P> const& _yzw) + : x(static_cast(_x)) + , y(static_cast(_yzw.x)) + , z(static_cast(_yzw.y)) + , w(static_cast(_yzw.z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<3, B, P> const& _yzw) + : x(static_cast(_x.x)) + , y(static_cast(_yzw.x)) + , z(static_cast(_yzw.y)) + , w(static_cast(_yzw.z)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<2, B, P> const& _zw) + : x(static_cast(_xy.x)) + , y(static_cast(_xy.y)) + , z(static_cast(_zw.x)) + , w(static_cast(_zw.y)) + {} + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<4, U, P> const& v) + : x(static_cast(v.x)) + , y(static_cast(v.y)) + , z(static_cast(v.z)) + , w(static_cast(v.w)) + {} + + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T& vec<4, T, Q>::operator[](typename vec<4, T, Q>::length_type i) + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + case 2: + return z; + case 3: + return w; + } + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<4, T, Q>::operator[](typename vec<4, T, Q>::length_type i) const + { + assert(i >= 0 && i < this->length()); + switch(i) + { + default: + case 0: + return x; + case 1: + return y; + case 2: + return z; + case 3: + return w; + } + } + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>& vec<4, T, Q>::operator=(vec<4, T, Q> const& v) + { + this->x = v.x; + this->y = v.y; + this->z = v.z; + this->w = v.w; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>& vec<4, T, Q>::operator=(vec<4, U, Q> const& v) + { + this->x = static_cast(v.x); + this->y = static_cast(v.y); + this->z = static_cast(v.z); + this->w = static_cast(v.w); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator+=(U scalar) + { + return (*this = detail::compute_vec4_add::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator+=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_add::value>::call(*this, vec<4, T, Q>(v.x))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator+=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_add::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator-=(U scalar) + { + return (*this = detail::compute_vec4_sub::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator-=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_sub::value>::call(*this, vec<4, T, Q>(v.x))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator-=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_sub::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator*=(U scalar) + { + return (*this = detail::compute_vec4_mul::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator*=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_mul::value>::call(*this, vec<4, T, Q>(v.x))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator*=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_mul::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator/=(U scalar) + { + return (*this = detail::compute_vec4_div::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator/=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_div::value>::call(*this, vec<4, T, Q>(v.x))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator/=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_div::value>::call(*this, vec<4, T, Q>(v))); + } + + // -- Increment and decrement operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator++() + { + ++this->x; + ++this->y; + ++this->z; + ++this->w; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator--() + { + --this->x; + --this->y; + --this->z; + --this->w; + return *this; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> vec<4, T, Q>::operator++(int) + { + vec<4, T, Q> Result(*this); + ++*this; + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> vec<4, T, Q>::operator--(int) + { + vec<4, T, Q> Result(*this); + --*this; + return Result; + } + + // -- Unary bit operators -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator%=(U scalar) + { + return (*this = detail::compute_vec4_mod::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator%=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_mod::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator%=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_mod::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator&=(U scalar) + { + return (*this = detail::compute_vec4_and::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator&=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_and::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator&=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_and::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator|=(U scalar) + { + return (*this = detail::compute_vec4_or::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator|=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_or::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator|=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_or::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator^=(U scalar) + { + return (*this = detail::compute_vec4_xor::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator^=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_xor::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator^=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_xor::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator<<=(U scalar) + { + return (*this = detail::compute_vec4_shift_left::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator<<=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_shift_left::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator<<=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_shift_left::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator>>=(U scalar) + { + return (*this = detail::compute_vec4_shift_right::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(scalar))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator>>=(vec<1, U, Q> const& v) + { + return (*this = detail::compute_vec4_shift_right::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator>>=(vec<4, U, Q> const& v) + { + return (*this = detail::compute_vec4_shift_right::value, sizeof(T) * 8, detail::is_aligned::value>::call(*this, vec<4, T, Q>(v))); + } + + // -- Unary constant operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v) + { + return v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v) + { + return vec<4, T, Q>(0) -= v; + } + + // -- Binary arithmetic operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v, T const & scalar) + { + return vec<4, T, Q>(v) += scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) += v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(v) += scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v2) += v1; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) += v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v, T const & scalar) + { + return vec<4, T, Q>(v) -= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) -= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) -= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) -= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) -= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, T const & scalar) + { + return vec<4, T, Q>(v) *= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) *= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(v) *= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v2) *= v1; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) *= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v, T const & scalar) + { + return vec<4, T, Q>(v) /= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) /= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) /= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) /= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) /= v2; + } + + // -- Binary bit operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) %= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) %= v2.x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) %= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar.x) %= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) %= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) &= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar) + { + return vec<4, T, Q>(v) &= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) &= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) &= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) &= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) |= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) |= v2.x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) |= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) |= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) |= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) ^= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) ^= v2.x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) ^= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) ^= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) ^= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) <<= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) <<= v2.x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) <<= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) <<= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) <<= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v, T scalar) + { + return vec<4, T, Q>(v) >>= scalar; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) + { + return vec<4, T, Q>(v1) >>= v2.x; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(T scalar, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(scalar) >>= v; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1.x) >>= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return vec<4, T, Q>(v1) >>= v2; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator~(vec<4, T, Q> const& v) + { + return detail::compute_vec4_bitwise_not::value, sizeof(T) * 8, detail::is_aligned::value>::call(v); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return detail::compute_vec4_equal::value, sizeof(T) * 8, detail::is_aligned::value>::call(v1, v2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) + { + return detail::compute_vec4_nequal::value, sizeof(T) * 8, detail::is_aligned::value>::call(v1, v2); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, bool, Q> operator&&(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2) + { + return vec<4, bool, Q>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z, v1.w && v2.w); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, bool, Q> operator||(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2) + { + return vec<4, bool, Q>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z, v1.w || v2.w); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "type_vec4_simd.inl" +#endif diff --git a/dep/glm/detail/type_vec4_simd.inl b/dep/glm/detail/type_vec4_simd.inl new file mode 100644 index 0000000..29559b5 --- /dev/null +++ b/dep/glm/detail/type_vec4_simd.inl @@ -0,0 +1,775 @@ +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ +# if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + template + struct _swizzle_base1<4, float, Q, E0,E1,E2,E3, true> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<4, float, Q> operator ()() const + { + __m128 data = *reinterpret_cast<__m128 const*>(&this->_buffer); + + vec<4, float, Q> Result; +# if GLM_ARCH & GLM_ARCH_AVX_BIT + Result.data = _mm_permute_ps(data, _MM_SHUFFLE(E3, E2, E1, E0)); +# else + Result.data = _mm_shuffle_ps(data, data, _MM_SHUFFLE(E3, E2, E1, E0)); +# endif + return Result; + } + }; + + template + struct _swizzle_base1<4, int, Q, E0,E1,E2,E3, true> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<4, int, Q> operator ()() const + { + __m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer); + + vec<4, int, Q> Result; + Result.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0)); + return Result; + } + }; + + template + struct _swizzle_base1<4, uint, Q, E0,E1,E2,E3, true> : public _swizzle_base0 + { + GLM_FUNC_QUALIFIER vec<4, uint, Q> operator ()() const + { + __m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer); + + vec<4, uint, Q> Result; + Result.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0)); + return Result; + } + }; +# endif// GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR + + template + struct compute_vec4_add + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = _mm_add_ps(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_vec4_add + { + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) + { + vec<4, double, Q> Result; + Result.data = _mm256_add_pd(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_sub + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = _mm_sub_ps(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_vec4_sub + { + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) + { + vec<4, double, Q> Result; + Result.data = _mm256_sub_pd(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_mul + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = _mm_mul_ps(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_vec4_mul + { + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) + { + vec<4, double, Q> Result; + Result.data = _mm256_mul_pd(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_div + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = _mm_div_ps(a.data, b.data); + return Result; + } + }; + + # if GLM_ARCH & GLM_ARCH_AVX_BIT + template + struct compute_vec4_div + { + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) + { + vec<4, double, Q> Result; + Result.data = _mm256_div_pd(a.data, b.data); + return Result; + } + }; +# endif + + template<> + struct compute_vec4_div + { + static vec<4, float, aligned_lowp> call(vec<4, float, aligned_lowp> const& a, vec<4, float, aligned_lowp> const& b) + { + vec<4, float, aligned_lowp> Result; + Result.data = _mm_mul_ps(a.data, _mm_rcp_ps(b.data)); + return Result; + } + }; + + template + struct compute_vec4_and + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm_and_si128(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_and + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm256_and_si256(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_or + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm_or_si128(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_or + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm256_or_si256(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_xor + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm_xor_si128(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_xor + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm256_xor_si256(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_shift_left + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm_sll_epi32(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_shift_left + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm256_sll_epi64(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_shift_right + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm_srl_epi32(a.data, b.data); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_shift_right + { + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) + { + vec<4, T, Q> Result; + Result.data = _mm256_srl_epi64(a.data, b.data); + return Result; + } + }; +# endif + + template + struct compute_vec4_bitwise_not + { + static vec<4, T, Q> call(vec<4, T, Q> const& v) + { + vec<4, T, Q> Result; + Result.data = _mm_xor_si128(v.data, _mm_set1_epi32(-1)); + return Result; + } + }; + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template + struct compute_vec4_bitwise_not + { + static vec<4, T, Q> call(vec<4, T, Q> const& v) + { + vec<4, T, Q> Result; + Result.data = _mm256_xor_si256(v.data, _mm_set1_epi32(-1)); + return Result; + } + }; +# endif + + template + struct compute_vec4_equal + { + static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + return _mm_movemask_ps(_mm_cmpeq_ps(v1.data, v2.data)) != 0; + } + }; + +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + template + struct compute_vec4_equal + { + static bool call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + //return _mm_movemask_epi8(_mm_cmpeq_epi32(v1.data, v2.data)) != 0; + __m128i neq = _mm_xor_si128(v1.data, v2.data); + return _mm_test_all_zeros(neq, neq) == 0; + } + }; +# endif + + template + struct compute_vec4_nequal + { + static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + return _mm_movemask_ps(_mm_cmpneq_ps(v1.data, v2.data)) != 0; + } + }; + +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + template + struct compute_vec4_nequal + { + static bool call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + //return _mm_movemask_epi8(_mm_cmpneq_epi32(v1.data, v2.data)) != 0; + __m128i neq = _mm_xor_si128(v1.data, v2.data); + return _mm_test_all_zeros(neq, neq) != 0; + } + }; +# endif +}//namespace detail + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(float _s) : + data(_mm_set1_ps(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(float _s) : + data(_mm_set1_ps(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(float _s) : + data(_mm_set1_ps(_s)) + {} + +# if GLM_ARCH & GLM_ARCH_AVX_BIT + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, double, aligned_lowp>::vec(double _s) : + data(_mm256_set1_pd(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, double, aligned_mediump>::vec(double _s) : + data(_mm256_set1_pd(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, double, aligned_highp>::vec(double _s) : + data(_mm256_set1_pd(_s)) + {} +# endif + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_lowp>::vec(int _s) : + data(_mm_set1_epi32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_mediump>::vec(int _s) : + data(_mm_set1_epi32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_highp>::vec(int _s) : + data(_mm_set1_epi32(_s)) + {} + +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, detail::int64, aligned_lowp>::vec(detail::int64 _s) : + data(_mm256_set1_epi64x(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, detail::int64, aligned_mediump>::vec(detail::int64 _s) : + data(_mm256_set1_epi64x(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, detail::int64, aligned_highp>::vec(detail::int64 _s) : + data(_mm256_set1_epi64x(_s)) + {} +# endif + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(float _x, float _y, float _z, float _w) : + data(_mm_set_ps(_w, _z, _y, _x)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(float _x, float _y, float _z, float _w) : + data(_mm_set_ps(_w, _z, _y, _x)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(float _x, float _y, float _z, float _w) : + data(_mm_set_ps(_w, _z, _y, _x)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_lowp>::vec(int _x, int _y, int _z, int _w) : + data(_mm_set_epi32(_w, _z, _y, _x)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_mediump>::vec(int _x, int _y, int _z, int _w) : + data(_mm_set_epi32(_w, _z, _y, _x)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_highp>::vec(int _x, int _y, int _z, int _w) : + data(_mm_set_epi32(_w, _z, _y, _x)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(int _x, int _y, int _z, int _w) : + data(_mm_cvtepi32_ps(_mm_set_epi32(_w, _z, _y, _x))) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(int _x, int _y, int _z, int _w) : + data(_mm_cvtepi32_ps(_mm_set_epi32(_w, _z, _y, _x))) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(int _x, int _y, int _z, int _w) : + data(_mm_cvtepi32_ps(_mm_set_epi32(_w, _z, _y, _x))) + {} +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT + +#if GLM_ARCH & GLM_ARCH_NEON_BIT +namespace glm { +namespace detail { + + template + struct compute_vec4_add + { + static + vec<4, float, Q> + call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = vaddq_f32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_add + { + static + vec<4, uint, Q> + call(vec<4, uint, Q> const& a, vec<4, uint, Q> const& b) + { + vec<4, uint, Q> Result; + Result.data = vaddq_u32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_add + { + static + vec<4, int, Q> + call(vec<4, int, Q> const& a, vec<4, int, Q> const& b) + { + vec<4, uint, Q> Result; + Result.data = vaddq_s32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_sub + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = vsubq_f32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_sub + { + static vec<4, uint, Q> call(vec<4, uint, Q> const& a, vec<4, uint, Q> const& b) + { + vec<4, uint, Q> Result; + Result.data = vsubq_u32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_sub + { + static vec<4, int, Q> call(vec<4, int, Q> const& a, vec<4, int, Q> const& b) + { + vec<4, int, Q> Result; + Result.data = vsubq_s32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_mul + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = vmulq_f32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_mul + { + static vec<4, uint, Q> call(vec<4, uint, Q> const& a, vec<4, uint, Q> const& b) + { + vec<4, uint, Q> Result; + Result.data = vmulq_u32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_mul + { + static vec<4, int, Q> call(vec<4, int, Q> const& a, vec<4, int, Q> const& b) + { + vec<4, int, Q> Result; + Result.data = vmulq_s32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_div + { + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) + { + vec<4, float, Q> Result; + Result.data = vdivq_f32(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_equal + { + static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + uint32x4_t cmp = vceqq_f32(v1.data, v2.data); +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + cmp = vpminq_u32(cmp, cmp); + cmp = vpminq_u32(cmp, cmp); + uint32_t r = cmp[0]; +#else + uint32x2_t cmpx2 = vpmin_u32(vget_low_f32(cmp), vget_high_f32(cmp)); + cmpx2 = vpmin_u32(cmpx2, cmpx2); + uint32_t r = cmpx2[0]; +#endif + return r == ~0u; + } + }; + + template + struct compute_vec4_equal + { + static bool call(vec<4, uint, Q> const& v1, vec<4, uint, Q> const& v2) + { + uint32x4_t cmp = vceqq_u32(v1.data, v2.data); +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + cmp = vpminq_u32(cmp, cmp); + cmp = vpminq_u32(cmp, cmp); + uint32_t r = cmp[0]; +#else + uint32x2_t cmpx2 = vpmin_u32(vget_low_f32(cmp), vget_high_f32(cmp)); + cmpx2 = vpmin_u32(cmpx2, cmpx2); + uint32_t r = cmpx2[0]; +#endif + return r == ~0u; + } + }; + + template + struct compute_vec4_equal + { + static bool call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + uint32x4_t cmp = vceqq_s32(v1.data, v2.data); +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + cmp = vpminq_u32(cmp, cmp); + cmp = vpminq_u32(cmp, cmp); + uint32_t r = cmp[0]; +#else + uint32x2_t cmpx2 = vpmin_u32(vget_low_f32(cmp), vget_high_f32(cmp)); + cmpx2 = vpmin_u32(cmpx2, cmpx2); + uint32_t r = cmpx2[0]; +#endif + return r == ~0u; + } + }; + + template + struct compute_vec4_nequal + { + static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) + { + return !compute_vec4_equal::call(v1, v2); + } + }; + + template + struct compute_vec4_nequal + { + static bool call(vec<4, uint, Q> const& v1, vec<4, uint, Q> const& v2) + { + return !compute_vec4_equal::call(v1, v2); + } + }; + + template + struct compute_vec4_nequal + { + static bool call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2) + { + return !compute_vec4_equal::call(v1, v2); + } + }; + +}//namespace detail + +#if !GLM_CONFIG_XYZW_ONLY + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(float _s) : + data(vdupq_n_f32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(float _s) : + data(vdupq_n_f32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(float _s) : + data(vdupq_n_f32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_lowp>::vec(int _s) : + data(vdupq_n_s32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_mediump>::vec(int _s) : + data(vdupq_n_s32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_highp>::vec(int _s) : + data(vdupq_n_s32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, uint, aligned_lowp>::vec(uint _s) : + data(vdupq_n_u32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, uint, aligned_mediump>::vec(uint _s) : + data(vdupq_n_u32(_s)) + {} + + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, uint, aligned_highp>::vec(uint _s) : + data(vdupq_n_u32(_s)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(const vec<4, float, aligned_highp>& rhs) : + data(rhs.data) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(const vec<4, int, aligned_highp>& rhs) : + data(vcvtq_f32_s32(rhs.data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(const vec<4, uint, aligned_highp>& rhs) : + data(vcvtq_f32_u32(rhs.data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(int _x, int _y, int _z, int _w) : + data(vcvtq_f32_s32(vec<4, int, aligned_lowp>(_x, _y, _z, _w).data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(int _x, int _y, int _z, int _w) : + data(vcvtq_f32_s32(vec<4, int, aligned_mediump>(_x, _y, _z, _w).data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(int _x, int _y, int _z, int _w) : + data(vcvtq_f32_s32(vec<4, int, aligned_highp>(_x, _y, _z, _w).data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_lowp>::vec(uint _x, uint _y, uint _z, uint _w) : + data(vcvtq_f32_u32(vec<4, uint, aligned_lowp>(_x, _y, _z, _w).data)) + {} + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_mediump>::vec(uint _x, uint _y, uint _z, uint _w) : + data(vcvtq_f32_u32(vec<4, uint, aligned_mediump>(_x, _y, _z, _w).data)) + {} + + + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(uint _x, uint _y, uint _z, uint _w) : + data(vcvtq_f32_u32(vec<4, uint, aligned_highp>(_x, _y, _z, _w).data)) + {} + +#endif +}//namespace glm + +#endif diff --git a/dep/glm/exponential.hpp b/dep/glm/exponential.hpp new file mode 100644 index 0000000..f8fb886 --- /dev/null +++ b/dep/glm/exponential.hpp @@ -0,0 +1,110 @@ +/// @ref core +/// @file glm/exponential.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions +/// +/// @defgroup core_func_exponential Exponential functions +/// @ingroup core +/// +/// Provides GLSL exponential functions +/// +/// These all operate component-wise. The description is per component. +/// +/// Include to use these core features. + +#pragma once + +#include "detail/type_vec1.hpp" +#include "detail/type_vec2.hpp" +#include "detail/type_vec3.hpp" +#include "detail/type_vec4.hpp" +#include + +namespace glm +{ + /// @addtogroup core_func_exponential + /// @{ + + /// Returns 'base' raised to the power 'exponent'. + /// + /// @param base Floating point value. pow function is defined for input values of 'base' defined in the range (inf-, inf+) in the limit of the type qualifier. + /// @param exponent Floating point value representing the 'exponent'. + /// + /// @see GLSL pow man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec pow(vec const& base, vec const& exponent); + + /// Returns the natural exponentiation of x, i.e., e^x. + /// + /// @param v exp function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL exp man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec exp(vec const& v); + + /// Returns the natural logarithm of v, i.e., + /// returns the value y which satisfies the equation x = e^y. + /// Results are undefined if v <= 0. + /// + /// @param v log function is defined for input values of v defined in the range (0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL log man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec log(vec const& v); + + /// Returns 2 raised to the v power. + /// + /// @param v exp2 function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL exp2 man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec exp2(vec const& v); + + /// Returns the base 2 log of x, i.e., returns the value y, + /// which satisfies the equation x = 2 ^ y. + /// + /// @param v log2 function is defined for input values of v defined in the range (0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL log2 man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec log2(vec const& v); + + /// Returns the positive square root of v. + /// + /// @param v sqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL sqrt man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec sqrt(vec const& v); + + /// Returns the reciprocal of the positive square root of v. + /// + /// @param v inversesqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL inversesqrt man page + /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions + template + GLM_FUNC_DECL vec inversesqrt(vec const& v); + + /// @} +}//namespace glm + +#include "detail/func_exponential.inl" diff --git a/dep/glm/ext.hpp b/dep/glm/ext.hpp new file mode 100644 index 0000000..3249fb9 --- /dev/null +++ b/dep/glm/ext.hpp @@ -0,0 +1,253 @@ +/// @file glm/ext.hpp +/// +/// @ref core (Dependence) + +#include "detail/setup.hpp" + +#pragma once + +#include "glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_MESSAGE_EXT_INCLUDED_DISPLAYED) +# define GLM_MESSAGE_EXT_INCLUDED_DISPLAYED +# pragma message("GLM: All extensions included (not recommended)") +#endif//GLM_MESSAGES + +#include "./ext/matrix_clip_space.hpp" +#include "./ext/matrix_common.hpp" + +#include "./ext/matrix_double2x2.hpp" +#include "./ext/matrix_double2x2_precision.hpp" +#include "./ext/matrix_double2x3.hpp" +#include "./ext/matrix_double2x3_precision.hpp" +#include "./ext/matrix_double2x4.hpp" +#include "./ext/matrix_double2x4_precision.hpp" +#include "./ext/matrix_double3x2.hpp" +#include "./ext/matrix_double3x2_precision.hpp" +#include "./ext/matrix_double3x3.hpp" +#include "./ext/matrix_double3x3_precision.hpp" +#include "./ext/matrix_double3x4.hpp" +#include "./ext/matrix_double3x4_precision.hpp" +#include "./ext/matrix_double4x2.hpp" +#include "./ext/matrix_double4x2_precision.hpp" +#include "./ext/matrix_double4x3.hpp" +#include "./ext/matrix_double4x3_precision.hpp" +#include "./ext/matrix_double4x4.hpp" +#include "./ext/matrix_double4x4_precision.hpp" + +#include "./ext/matrix_float2x2.hpp" +#include "./ext/matrix_float2x2_precision.hpp" +#include "./ext/matrix_float2x3.hpp" +#include "./ext/matrix_float2x3_precision.hpp" +#include "./ext/matrix_float2x4.hpp" +#include "./ext/matrix_float2x4_precision.hpp" +#include "./ext/matrix_float3x2.hpp" +#include "./ext/matrix_float3x2_precision.hpp" +#include "./ext/matrix_float3x3.hpp" +#include "./ext/matrix_float3x3_precision.hpp" +#include "./ext/matrix_float3x4.hpp" +#include "./ext/matrix_float3x4_precision.hpp" +#include "./ext/matrix_float4x2.hpp" +#include "./ext/matrix_float4x2_precision.hpp" +#include "./ext/matrix_float4x3.hpp" +#include "./ext/matrix_float4x3_precision.hpp" +#include "./ext/matrix_float4x4.hpp" +#include "./ext/matrix_float4x4_precision.hpp" + +#include "./ext/matrix_int2x2.hpp" +#include "./ext/matrix_int2x2_sized.hpp" +#include "./ext/matrix_int2x3.hpp" +#include "./ext/matrix_int2x3_sized.hpp" +#include "./ext/matrix_int2x4.hpp" +#include "./ext/matrix_int2x4_sized.hpp" +#include "./ext/matrix_int3x2.hpp" +#include "./ext/matrix_int3x2_sized.hpp" +#include "./ext/matrix_int3x3.hpp" +#include "./ext/matrix_int3x3_sized.hpp" +#include "./ext/matrix_int3x4.hpp" +#include "./ext/matrix_int3x4_sized.hpp" +#include "./ext/matrix_int4x2.hpp" +#include "./ext/matrix_int4x2_sized.hpp" +#include "./ext/matrix_int4x3.hpp" +#include "./ext/matrix_int4x3_sized.hpp" +#include "./ext/matrix_int4x4.hpp" +#include "./ext/matrix_int4x4_sized.hpp" + +#include "./ext/matrix_uint2x2.hpp" +#include "./ext/matrix_uint2x2_sized.hpp" +#include "./ext/matrix_uint2x3.hpp" +#include "./ext/matrix_uint2x3_sized.hpp" +#include "./ext/matrix_uint2x4.hpp" +#include "./ext/matrix_uint2x4_sized.hpp" +#include "./ext/matrix_uint3x2.hpp" +#include "./ext/matrix_uint3x2_sized.hpp" +#include "./ext/matrix_uint3x3.hpp" +#include "./ext/matrix_uint3x3_sized.hpp" +#include "./ext/matrix_uint3x4.hpp" +#include "./ext/matrix_uint3x4_sized.hpp" +#include "./ext/matrix_uint4x2.hpp" +#include "./ext/matrix_uint4x2_sized.hpp" +#include "./ext/matrix_uint4x3.hpp" +#include "./ext/matrix_uint4x3_sized.hpp" +#include "./ext/matrix_uint4x4.hpp" +#include "./ext/matrix_uint4x4_sized.hpp" + +#include "./ext/matrix_projection.hpp" +#include "./ext/matrix_relational.hpp" +#include "./ext/matrix_transform.hpp" + +#include "./ext/quaternion_common.hpp" +#include "./ext/quaternion_double.hpp" +#include "./ext/quaternion_double_precision.hpp" +#include "./ext/quaternion_float.hpp" +#include "./ext/quaternion_float_precision.hpp" +#include "./ext/quaternion_exponential.hpp" +#include "./ext/quaternion_geometric.hpp" +#include "./ext/quaternion_relational.hpp" +#include "./ext/quaternion_transform.hpp" +#include "./ext/quaternion_trigonometric.hpp" + +#include "./ext/scalar_common.hpp" +#include "./ext/scalar_constants.hpp" +#include "./ext/scalar_integer.hpp" +#include "./ext/scalar_packing.hpp" +#include "./ext/scalar_relational.hpp" +#include "./ext/scalar_ulp.hpp" + +#include "./ext/scalar_int_sized.hpp" +#include "./ext/scalar_uint_sized.hpp" + +#include "./ext/vector_common.hpp" +#include "./ext/vector_integer.hpp" +#include "./ext/vector_packing.hpp" +#include "./ext/vector_relational.hpp" +#include "./ext/vector_ulp.hpp" + +#include "./ext/vector_bool1.hpp" +#include "./ext/vector_bool1_precision.hpp" +#include "./ext/vector_bool2.hpp" +#include "./ext/vector_bool2_precision.hpp" +#include "./ext/vector_bool3.hpp" +#include "./ext/vector_bool3_precision.hpp" +#include "./ext/vector_bool4.hpp" +#include "./ext/vector_bool4_precision.hpp" + +#include "./ext/vector_double1.hpp" +#include "./ext/vector_double1_precision.hpp" +#include "./ext/vector_double2.hpp" +#include "./ext/vector_double2_precision.hpp" +#include "./ext/vector_double3.hpp" +#include "./ext/vector_double3_precision.hpp" +#include "./ext/vector_double4.hpp" +#include "./ext/vector_double4_precision.hpp" + +#include "./ext/vector_float1.hpp" +#include "./ext/vector_float1_precision.hpp" +#include "./ext/vector_float2.hpp" +#include "./ext/vector_float2_precision.hpp" +#include "./ext/vector_float3.hpp" +#include "./ext/vector_float3_precision.hpp" +#include "./ext/vector_float4.hpp" +#include "./ext/vector_float4_precision.hpp" + +#include "./ext/vector_int1.hpp" +#include "./ext/vector_int1_sized.hpp" +#include "./ext/vector_int2.hpp" +#include "./ext/vector_int2_sized.hpp" +#include "./ext/vector_int3.hpp" +#include "./ext/vector_int3_sized.hpp" +#include "./ext/vector_int4.hpp" +#include "./ext/vector_int4_sized.hpp" + +#include "./ext/vector_uint1.hpp" +#include "./ext/vector_uint1_sized.hpp" +#include "./ext/vector_uint2.hpp" +#include "./ext/vector_uint2_sized.hpp" +#include "./ext/vector_uint3.hpp" +#include "./ext/vector_uint3_sized.hpp" +#include "./ext/vector_uint4.hpp" +#include "./ext/vector_uint4_sized.hpp" + +#include "./gtc/bitfield.hpp" +#include "./gtc/color_space.hpp" +#include "./gtc/constants.hpp" +#include "./gtc/epsilon.hpp" +#include "./gtc/integer.hpp" +#include "./gtc/matrix_access.hpp" +#include "./gtc/matrix_integer.hpp" +#include "./gtc/matrix_inverse.hpp" +#include "./gtc/matrix_transform.hpp" +#include "./gtc/noise.hpp" +#include "./gtc/packing.hpp" +#include "./gtc/quaternion.hpp" +#include "./gtc/random.hpp" +#include "./gtc/reciprocal.hpp" +#include "./gtc/round.hpp" +#include "./gtc/type_precision.hpp" +#include "./gtc/type_ptr.hpp" +#include "./gtc/ulp.hpp" +#include "./gtc/vec1.hpp" +#if GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE +# include "./gtc/type_aligned.hpp" +#endif + +#ifdef GLM_ENABLE_EXPERIMENTAL +#include "./gtx/associated_min_max.hpp" +#include "./gtx/bit.hpp" +#include "./gtx/closest_point.hpp" +#include "./gtx/color_encoding.hpp" +#include "./gtx/color_space.hpp" +#include "./gtx/color_space_YCoCg.hpp" +#include "./gtx/compatibility.hpp" +#include "./gtx/component_wise.hpp" +#include "./gtx/dual_quaternion.hpp" +#include "./gtx/euler_angles.hpp" +#include "./gtx/extend.hpp" +#include "./gtx/extended_min_max.hpp" +#include "./gtx/fast_exponential.hpp" +#include "./gtx/fast_square_root.hpp" +#include "./gtx/fast_trigonometry.hpp" +#include "./gtx/functions.hpp" +#include "./gtx/gradient_paint.hpp" +#include "./gtx/handed_coordinate_space.hpp" +#include "./gtx/integer.hpp" +#include "./gtx/intersect.hpp" +#include "./gtx/log_base.hpp" +#include "./gtx/matrix_cross_product.hpp" +#include "./gtx/matrix_interpolation.hpp" +#include "./gtx/matrix_major_storage.hpp" +#include "./gtx/matrix_operation.hpp" +#include "./gtx/matrix_query.hpp" +#include "./gtx/mixed_product.hpp" +#include "./gtx/norm.hpp" +#include "./gtx/normal.hpp" +#include "./gtx/normalize_dot.hpp" +#include "./gtx/number_precision.hpp" +#include "./gtx/optimum_pow.hpp" +#include "./gtx/orthonormalize.hpp" +#include "./gtx/perpendicular.hpp" +#include "./gtx/polar_coordinates.hpp" +#include "./gtx/projection.hpp" +#include "./gtx/quaternion.hpp" +#include "./gtx/raw_data.hpp" +#include "./gtx/rotate_vector.hpp" +#include "./gtx/spline.hpp" +#include "./gtx/std_based_type.hpp" +#if !(GLM_COMPILER & GLM_COMPILER_CUDA) +# include "./gtx/string_cast.hpp" +#endif +#include "./gtx/transform.hpp" +#include "./gtx/transform2.hpp" +#include "./gtx/vec_swizzle.hpp" +#include "./gtx/vector_angle.hpp" +#include "./gtx/vector_query.hpp" +#include "./gtx/wrap.hpp" + +#if GLM_HAS_TEMPLATE_ALIASES +# include "./gtx/scalar_multiplication.hpp" +#endif + +#if GLM_HAS_RANGE_FOR +# include "./gtx/range.hpp" +#endif +#endif//GLM_ENABLE_EXPERIMENTAL diff --git a/dep/glm/ext/matrix_clip_space.hpp b/dep/glm/ext/matrix_clip_space.hpp new file mode 100644 index 0000000..c3874f2 --- /dev/null +++ b/dep/glm/ext/matrix_clip_space.hpp @@ -0,0 +1,522 @@ +/// @ref ext_matrix_clip_space +/// @file glm/ext/matrix_clip_space.hpp +/// +/// @defgroup ext_matrix_clip_space GLM_EXT_matrix_clip_space +/// @ingroup ext +/// +/// Defines functions that generate clip space transformation matrices. +/// +/// The matrices generated by this extension use standard OpenGL fixed-function +/// conventions. For example, the lookAt function generates a transform from world +/// space into the specific eye space that the projective matrix functions +/// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility +/// specifications defines the particular layout of this eye space. +/// +/// Include to use the features of this extension. +/// +/// @see ext_matrix_transform +/// @see ext_matrix_projection + +#pragma once + +// Dependencies +#include "../ext/scalar_constants.hpp" +#include "../geometric.hpp" +#include "../trigonometric.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_clip_space extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_clip_space + /// @{ + + /// Creates a matrix for projecting two-dimensional coordinates onto the screen. + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top, T const& zNear, T const& zFar) + /// @see gluOrtho2D man page + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> ortho( + T left, T right, T bottom, T top); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH_ZO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH_NO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH_ZO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH_NO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoZO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoNO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using right-handed coordinates. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @tparam T A floating-point scalar type + /// + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + /// @see glOrtho man page + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> ortho( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a left handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH_ZO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a left handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH_NO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a right handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH_ZO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a right handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH_NO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a frustum matrix using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumZO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a frustum matrix using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumNO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a left handed frustum matrix. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a right handed frustum matrix. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a frustum matrix with default handedness, using the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @tparam T A floating-point scalar type + /// @see glFrustum man page + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustum( + T left, T right, T bottom, T top, T near, T far); + + + /// Creates a matrix for a right handed, symetric perspective-view frustum. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH_ZO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a right handed, symetric perspective-view frustum. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH_NO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a left handed, symetric perspective-view frustum. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH_ZO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a left handed, symetric perspective-view frustum. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH_NO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a symetric perspective-view frustum using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveZO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a symetric perspective-view frustum using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveNO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a right handed, symetric perspective-view frustum. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a left handed, symetric perspective-view frustum. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a symetric perspective-view frustum based on the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @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). + /// + /// @tparam T A floating-point scalar type + /// @see gluPerspective man page + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspective( + T fovy, T aspect, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH_ZO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH_NO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH_ZO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH_NO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovZO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovNO( + T fov, T width, T height, T near, T far); + + /// Builds a right handed perspective projection matrix based on a field of view. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH( + T fov, T width, T height, T near, T far); + + /// Builds a left handed perspective projection matrix based on a field of view. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view and the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFov( + T fov, T width, T height, T near, T far); + + /// Creates a matrix for a left handed, symmetric perspective-view frustum with far plane at infinite. + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspectiveLH( + T fovy, T aspect, T near); + + /// Creates a matrix for a right handed, symmetric perspective-view frustum with far plane at infinite. + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspectiveRH( + T fovy, T aspect, T near); + + /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite with default handedness. + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspective( + T fovy, T aspect, T near); + + /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping. + /// + /// @param fovy Specifies the field of view angle, in degrees, 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). + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> tweakedInfinitePerspective( + T fovy, T aspect, T near); + + /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping. + /// + /// @param fovy Specifies the field of view angle, in degrees, 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 ep Epsilon + /// + /// @tparam T A floating-point scalar type + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> tweakedInfinitePerspective( + T fovy, T aspect, T near, T ep); + + /// @} +}//namespace glm + +#include "matrix_clip_space.inl" diff --git a/dep/glm/ext/matrix_clip_space.inl b/dep/glm/ext/matrix_clip_space.inl new file mode 100644 index 0000000..7e4df33 --- /dev/null +++ b/dep/glm/ext/matrix_clip_space.inl @@ -0,0 +1,555 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> ortho(T left, T right, T bottom, T top) + { + mat<4, 4, T, defaultp> Result(static_cast(1)); + Result[0][0] = static_cast(2) / (right - left); + Result[1][1] = static_cast(2) / (top - bottom); + Result[2][2] = - static_cast(1); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH_ZO(T left, T right, T bottom, T top, T zNear, T zFar) + { + mat<4, 4, T, defaultp> Result(1); + Result[0][0] = static_cast(2) / (right - left); + Result[1][1] = static_cast(2) / (top - bottom); + Result[2][2] = static_cast(1) / (zFar - zNear); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - zNear / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH_NO(T left, T right, T bottom, T top, T zNear, T zFar) + { + mat<4, 4, T, defaultp> Result(1); + Result[0][0] = static_cast(2) / (right - left); + Result[1][1] = static_cast(2) / (top - bottom); + Result[2][2] = static_cast(2) / (zFar - zNear); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - (zFar + zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH_ZO(T left, T right, T bottom, T top, T zNear, T zFar) + { + mat<4, 4, T, defaultp> Result(1); + Result[0][0] = static_cast(2) / (right - left); + Result[1][1] = static_cast(2) / (top - bottom); + Result[2][2] = - static_cast(1) / (zFar - zNear); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - zNear / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH_NO(T left, T right, T bottom, T top, T zNear, T zFar) + { + mat<4, 4, T, defaultp> Result(1); + Result[0][0] = static_cast(2) / (right - left); + Result[1][1] = static_cast(2) / (top - bottom); + Result[2][2] = - static_cast(2) / (zFar - zNear); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - (zFar + zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoZO(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return orthoLH_ZO(left, right, bottom, top, zNear, zFar); +# else + return orthoRH_ZO(left, right, bottom, top, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoNO(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return orthoLH_NO(left, right, bottom, top, zNear, zFar); +# else + return orthoRH_NO(left, right, bottom, top, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return orthoLH_ZO(left, right, bottom, top, zNear, zFar); +# else + return orthoLH_NO(left, right, bottom, top, zNear, zFar); +# endif + + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return orthoRH_ZO(left, right, bottom, top, zNear, zFar); +# else + return orthoRH_NO(left, right, bottom, top, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> ortho(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_ZO + return orthoLH_ZO(left, right, bottom, top, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_NO + return orthoLH_NO(left, right, bottom, top, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_ZO + return orthoRH_ZO(left, right, bottom, top, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_NO + return orthoRH_NO(left, right, bottom, top, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH_ZO(T left, T right, T bottom, T top, T nearVal, T farVal) + { + mat<4, 4, T, defaultp> Result(0); + Result[0][0] = (static_cast(2) * nearVal) / (right - left); + Result[1][1] = (static_cast(2) * nearVal) / (top - bottom); + Result[2][0] = (right + left) / (right - left); + Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = farVal / (farVal - nearVal); + Result[2][3] = static_cast(1); + Result[3][2] = -(farVal * nearVal) / (farVal - nearVal); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH_NO(T left, T right, T bottom, T top, T nearVal, T farVal) + { + mat<4, 4, T, defaultp> Result(0); + Result[0][0] = (static_cast(2) * nearVal) / (right - left); + Result[1][1] = (static_cast(2) * nearVal) / (top - bottom); + Result[2][0] = (right + left) / (right - left); + Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = (farVal + nearVal) / (farVal - nearVal); + Result[2][3] = static_cast(1); + Result[3][2] = - (static_cast(2) * farVal * nearVal) / (farVal - nearVal); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH_ZO(T left, T right, T bottom, T top, T nearVal, T farVal) + { + mat<4, 4, T, defaultp> Result(0); + Result[0][0] = (static_cast(2) * nearVal) / (right - left); + Result[1][1] = (static_cast(2) * nearVal) / (top - bottom); + Result[2][0] = (right + left) / (right - left); + Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = farVal / (nearVal - farVal); + Result[2][3] = static_cast(-1); + Result[3][2] = -(farVal * nearVal) / (farVal - nearVal); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH_NO(T left, T right, T bottom, T top, T nearVal, T farVal) + { + mat<4, 4, T, defaultp> Result(0); + Result[0][0] = (static_cast(2) * nearVal) / (right - left); + Result[1][1] = (static_cast(2) * nearVal) / (top - bottom); + Result[2][0] = (right + left) / (right - left); + Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = - (farVal + nearVal) / (farVal - nearVal); + Result[2][3] = static_cast(-1); + Result[3][2] = - (static_cast(2) * farVal * nearVal) / (farVal - nearVal); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumZO(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return frustumLH_ZO(left, right, bottom, top, nearVal, farVal); +# else + return frustumRH_ZO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumNO(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return frustumLH_NO(left, right, bottom, top, nearVal, farVal); +# else + return frustumRH_NO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return frustumLH_ZO(left, right, bottom, top, nearVal, farVal); +# else + return frustumLH_NO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return frustumRH_ZO(left, right, bottom, top, nearVal, farVal); +# else + return frustumRH_NO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustum(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_ZO + return frustumLH_ZO(left, right, bottom, top, nearVal, farVal); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_NO + return frustumLH_NO(left, right, bottom, top, nearVal, farVal); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_ZO + return frustumRH_ZO(left, right, bottom, top, nearVal, farVal); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_NO + return frustumRH_NO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH_ZO(T fovy, T aspect, T zNear, T zFar) + { + assert(abs(aspect - std::numeric_limits::epsilon()) > static_cast(0)); + + T const tanHalfFovy = tan(fovy / static_cast(2)); + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = static_cast(1) / (aspect * tanHalfFovy); + Result[1][1] = static_cast(1) / (tanHalfFovy); + Result[2][2] = zFar / (zNear - zFar); + Result[2][3] = - static_cast(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH_NO(T fovy, T aspect, T zNear, T zFar) + { + assert(abs(aspect - std::numeric_limits::epsilon()) > static_cast(0)); + + T const tanHalfFovy = tan(fovy / static_cast(2)); + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = static_cast(1) / (aspect * tanHalfFovy); + Result[1][1] = static_cast(1) / (tanHalfFovy); + Result[2][2] = - (zFar + zNear) / (zFar - zNear); + Result[2][3] = - static_cast(1); + Result[3][2] = - (static_cast(2) * zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH_ZO(T fovy, T aspect, T zNear, T zFar) + { + assert(abs(aspect - std::numeric_limits::epsilon()) > static_cast(0)); + + T const tanHalfFovy = tan(fovy / static_cast(2)); + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = static_cast(1) / (aspect * tanHalfFovy); + Result[1][1] = static_cast(1) / (tanHalfFovy); + Result[2][2] = zFar / (zFar - zNear); + Result[2][3] = static_cast(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH_NO(T fovy, T aspect, T zNear, T zFar) + { + assert(abs(aspect - std::numeric_limits::epsilon()) > static_cast(0)); + + T const tanHalfFovy = tan(fovy / static_cast(2)); + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = static_cast(1) / (aspect * tanHalfFovy); + Result[1][1] = static_cast(1) / (tanHalfFovy); + Result[2][2] = (zFar + zNear) / (zFar - zNear); + Result[2][3] = static_cast(1); + Result[3][2] = - (static_cast(2) * zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveZO(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return perspectiveLH_ZO(fovy, aspect, zNear, zFar); +# else + return perspectiveRH_ZO(fovy, aspect, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveNO(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return perspectiveLH_NO(fovy, aspect, zNear, zFar); +# else + return perspectiveRH_NO(fovy, aspect, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return perspectiveLH_ZO(fovy, aspect, zNear, zFar); +# else + return perspectiveLH_NO(fovy, aspect, zNear, zFar); +# endif + + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return perspectiveRH_ZO(fovy, aspect, zNear, zFar); +# else + return perspectiveRH_NO(fovy, aspect, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspective(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_ZO + return perspectiveLH_ZO(fovy, aspect, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_NO + return perspectiveLH_NO(fovy, aspect, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_ZO + return perspectiveRH_ZO(fovy, aspect, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_NO + return perspectiveRH_NO(fovy, aspect, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH_ZO(T fov, T width, T height, T zNear, T zFar) + { + assert(width > static_cast(0)); + assert(height > static_cast(0)); + assert(fov > static_cast(0)); + + T const rad = fov; + T const h = glm::cos(static_cast(0.5) * rad) / glm::sin(static_cast(0.5) * rad); + T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = w; + Result[1][1] = h; + Result[2][2] = zFar / (zNear - zFar); + Result[2][3] = - static_cast(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH_NO(T fov, T width, T height, T zNear, T zFar) + { + assert(width > static_cast(0)); + assert(height > static_cast(0)); + assert(fov > static_cast(0)); + + T const rad = fov; + T const h = glm::cos(static_cast(0.5) * rad) / glm::sin(static_cast(0.5) * rad); + T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = w; + Result[1][1] = h; + Result[2][2] = - (zFar + zNear) / (zFar - zNear); + Result[2][3] = - static_cast(1); + Result[3][2] = - (static_cast(2) * zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH_ZO(T fov, T width, T height, T zNear, T zFar) + { + assert(width > static_cast(0)); + assert(height > static_cast(0)); + assert(fov > static_cast(0)); + + T const rad = fov; + T const h = glm::cos(static_cast(0.5) * rad) / glm::sin(static_cast(0.5) * rad); + T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = w; + Result[1][1] = h; + Result[2][2] = zFar / (zFar - zNear); + Result[2][3] = static_cast(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH_NO(T fov, T width, T height, T zNear, T zFar) + { + assert(width > static_cast(0)); + assert(height > static_cast(0)); + assert(fov > static_cast(0)); + + T const rad = fov; + T const h = glm::cos(static_cast(0.5) * rad) / glm::sin(static_cast(0.5) * rad); + T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = w; + Result[1][1] = h; + Result[2][2] = (zFar + zNear) / (zFar - zNear); + Result[2][3] = static_cast(1); + Result[3][2] = - (static_cast(2) * zFar * zNear) / (zFar - zNear); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovZO(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return perspectiveFovLH_ZO(fov, width, height, zNear, zFar); +# else + return perspectiveFovRH_ZO(fov, width, height, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovNO(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return perspectiveFovLH_NO(fov, width, height, zNear, zFar); +# else + return perspectiveFovRH_NO(fov, width, height, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return perspectiveFovLH_ZO(fov, width, height, zNear, zFar); +# else + return perspectiveFovLH_NO(fov, width, height, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return perspectiveFovRH_ZO(fov, width, height, zNear, zFar); +# else + return perspectiveFovRH_NO(fov, width, height, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFov(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_ZO + return perspectiveFovLH_ZO(fov, width, height, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_LH_NO + return perspectiveFovLH_NO(fov, width, height, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_ZO + return perspectiveFovRH_ZO(fov, width, height, zNear, zFar); +# elif GLM_CONFIG_CLIP_CONTROL == GLM_CLIP_CONTROL_RH_NO + return perspectiveFovRH_NO(fov, width, height, zNear, zFar); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspectiveRH(T fovy, T aspect, T zNear) + { + T const range = tan(fovy / static_cast(2)) * zNear; + T const left = -range * aspect; + T const right = range * aspect; + T const bottom = -range; + T const top = range; + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = (static_cast(2) * zNear) / (right - left); + Result[1][1] = (static_cast(2) * zNear) / (top - bottom); + Result[2][2] = - static_cast(1); + Result[2][3] = - static_cast(1); + Result[3][2] = - static_cast(2) * zNear; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspectiveLH(T fovy, T aspect, T zNear) + { + T const range = tan(fovy / static_cast(2)) * zNear; + T const left = -range * aspect; + T const right = range * aspect; + T const bottom = -range; + T const top = range; + + mat<4, 4, T, defaultp> Result(T(0)); + Result[0][0] = (static_cast(2) * zNear) / (right - left); + Result[1][1] = (static_cast(2) * zNear) / (top - bottom); + Result[2][2] = static_cast(1); + Result[2][3] = static_cast(1); + Result[3][2] = - static_cast(2) * zNear; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspective(T fovy, T aspect, T zNear) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return infinitePerspectiveLH(fovy, aspect, zNear); +# else + return infinitePerspectiveRH(fovy, aspect, zNear); +# endif + } + + // Infinite projection matrix: http://www.terathon.com/gdc07_lengyel.pdf + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear, T ep) + { + T const range = tan(fovy / static_cast(2)) * zNear; + T const left = -range * aspect; + T const right = range * aspect; + T const bottom = -range; + T const top = range; + + mat<4, 4, T, defaultp> Result(static_cast(0)); + Result[0][0] = (static_cast(2) * zNear) / (right - left); + Result[1][1] = (static_cast(2) * zNear) / (top - bottom); + Result[2][2] = ep - static_cast(1); + Result[2][3] = static_cast(-1); + Result[3][2] = (ep - static_cast(2)) * zNear; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear) + { + return tweakedInfinitePerspective(fovy, aspect, zNear, epsilon()); + } +}//namespace glm diff --git a/dep/glm/ext/matrix_common.hpp b/dep/glm/ext/matrix_common.hpp new file mode 100644 index 0000000..05c3799 --- /dev/null +++ b/dep/glm/ext/matrix_common.hpp @@ -0,0 +1,36 @@ +/// @ref ext_matrix_common +/// @file glm/ext/matrix_common.hpp +/// +/// @defgroup ext_matrix_common GLM_EXT_matrix_common +/// @ingroup ext +/// +/// Defines functions for common matrix operations. +/// +/// Include to use the features of this extension. +/// +/// @see ext_matrix_common + +#pragma once + +#include "../detail/qualifier.hpp" +#include "../detail/_fixes.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_transform extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_common + /// @{ + + template + GLM_FUNC_DECL mat mix(mat const& x, mat const& y, mat const& a); + + template + GLM_FUNC_DECL mat mix(mat const& x, mat const& y, U a); + + /// @} +}//namespace glm + +#include "matrix_common.inl" diff --git a/dep/glm/ext/matrix_common.inl b/dep/glm/ext/matrix_common.inl new file mode 100644 index 0000000..9d50848 --- /dev/null +++ b/dep/glm/ext/matrix_common.inl @@ -0,0 +1,16 @@ +#include "../matrix.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat mix(mat const& x, mat const& y, U a) + { + return mat(x) * (static_cast(1) - a) + mat(y) * a; + } + + template + GLM_FUNC_QUALIFIER mat mix(mat const& x, mat const& y, mat const& a) + { + return matrixCompMult(mat(x), static_cast(1) - a) + matrixCompMult(mat(y), a); + } +}//namespace glm diff --git a/dep/glm/ext/matrix_double2x2.hpp b/dep/glm/ext/matrix_double2x2.hpp new file mode 100644 index 0000000..94dca54 --- /dev/null +++ b/dep/glm/ext/matrix_double2x2.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_double2x2.hpp + +#pragma once +#include "../detail/type_mat2x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 2 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 2, double, defaultp> dmat2x2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 2, double, defaultp> dmat2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double2x2_precision.hpp b/dep/glm/ext/matrix_double2x2_precision.hpp new file mode 100644 index 0000000..9e2c174 --- /dev/null +++ b/dep/glm/ext/matrix_double2x2_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_double2x2_precision.hpp + +#pragma once +#include "../detail/type_mat2x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, lowp> lowp_dmat2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, mediump> mediump_dmat2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, highp> highp_dmat2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, lowp> lowp_dmat2x2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, mediump> mediump_dmat2x2; + + /// 2 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, double, highp> highp_dmat2x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double2x3.hpp b/dep/glm/ext/matrix_double2x3.hpp new file mode 100644 index 0000000..bfef87a --- /dev/null +++ b/dep/glm/ext/matrix_double2x3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double2x3.hpp + +#pragma once +#include "../detail/type_mat2x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 3 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 3, double, defaultp> dmat2x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double2x3_precision.hpp b/dep/glm/ext/matrix_double2x3_precision.hpp new file mode 100644 index 0000000..098fb60 --- /dev/null +++ b/dep/glm/ext/matrix_double2x3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double2x3_precision.hpp + +#pragma once +#include "../detail/type_mat2x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 3 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, double, lowp> lowp_dmat2x3; + + /// 2 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, double, mediump> mediump_dmat2x3; + + /// 2 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, double, highp> highp_dmat2x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double2x4.hpp b/dep/glm/ext/matrix_double2x4.hpp new file mode 100644 index 0000000..499284b --- /dev/null +++ b/dep/glm/ext/matrix_double2x4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double2x4.hpp + +#pragma once +#include "../detail/type_mat2x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 4 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 4, double, defaultp> dmat2x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double2x4_precision.hpp b/dep/glm/ext/matrix_double2x4_precision.hpp new file mode 100644 index 0000000..9b61ebc --- /dev/null +++ b/dep/glm/ext/matrix_double2x4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double2x4_precision.hpp + +#pragma once +#include "../detail/type_mat2x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 4 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, double, lowp> lowp_dmat2x4; + + /// 2 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, double, mediump> mediump_dmat2x4; + + /// 2 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, double, highp> highp_dmat2x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double3x2.hpp b/dep/glm/ext/matrix_double3x2.hpp new file mode 100644 index 0000000..dd23f36 --- /dev/null +++ b/dep/glm/ext/matrix_double3x2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double3x2.hpp + +#pragma once +#include "../detail/type_mat3x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 3 columns of 2 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 2, double, defaultp> dmat3x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double3x2_precision.hpp b/dep/glm/ext/matrix_double3x2_precision.hpp new file mode 100644 index 0000000..068d9e9 --- /dev/null +++ b/dep/glm/ext/matrix_double3x2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double3x2_precision.hpp + +#pragma once +#include "../detail/type_mat3x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 2 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, double, lowp> lowp_dmat3x2; + + /// 3 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, double, mediump> mediump_dmat3x2; + + /// 3 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, double, highp> highp_dmat3x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double3x3.hpp b/dep/glm/ext/matrix_double3x3.hpp new file mode 100644 index 0000000..53572b7 --- /dev/null +++ b/dep/glm/ext/matrix_double3x3.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_double3x3.hpp + +#pragma once +#include "../detail/type_mat3x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 3 columns of 3 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 3, double, defaultp> dmat3x3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 3, double, defaultp> dmat3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double3x3_precision.hpp b/dep/glm/ext/matrix_double3x3_precision.hpp new file mode 100644 index 0000000..8691e78 --- /dev/null +++ b/dep/glm/ext/matrix_double3x3_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_double3x3_precision.hpp + +#pragma once +#include "../detail/type_mat3x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, lowp> lowp_dmat3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, mediump> mediump_dmat3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, highp> highp_dmat3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, lowp> lowp_dmat3x3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, mediump> mediump_dmat3x3; + + /// 3 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, double, highp> highp_dmat3x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double3x4.hpp b/dep/glm/ext/matrix_double3x4.hpp new file mode 100644 index 0000000..c572d63 --- /dev/null +++ b/dep/glm/ext/matrix_double3x4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double3x4.hpp + +#pragma once +#include "../detail/type_mat3x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 3 columns of 4 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 4, double, defaultp> dmat3x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double3x4_precision.hpp b/dep/glm/ext/matrix_double3x4_precision.hpp new file mode 100644 index 0000000..f040217 --- /dev/null +++ b/dep/glm/ext/matrix_double3x4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double3x4_precision.hpp + +#pragma once +#include "../detail/type_mat3x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 4 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, double, lowp> lowp_dmat3x4; + + /// 3 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, double, mediump> mediump_dmat3x4; + + /// 3 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, double, highp> highp_dmat3x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double4x2.hpp b/dep/glm/ext/matrix_double4x2.hpp new file mode 100644 index 0000000..9b229f4 --- /dev/null +++ b/dep/glm/ext/matrix_double4x2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double4x2.hpp + +#pragma once +#include "../detail/type_mat4x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 4 columns of 2 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 2, double, defaultp> dmat4x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double4x2_precision.hpp b/dep/glm/ext/matrix_double4x2_precision.hpp new file mode 100644 index 0000000..6ad18ba --- /dev/null +++ b/dep/glm/ext/matrix_double4x2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double4x2_precision.hpp + +#pragma once +#include "../detail/type_mat4x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 2 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, double, lowp> lowp_dmat4x2; + + /// 4 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, double, mediump> mediump_dmat4x2; + + /// 4 columns of 2 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, double, highp> highp_dmat4x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double4x3.hpp b/dep/glm/ext/matrix_double4x3.hpp new file mode 100644 index 0000000..dca4cf9 --- /dev/null +++ b/dep/glm/ext/matrix_double4x3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_double4x3.hpp + +#pragma once +#include "../detail/type_mat4x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 4 columns of 3 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 3, double, defaultp> dmat4x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double4x3_precision.hpp b/dep/glm/ext/matrix_double4x3_precision.hpp new file mode 100644 index 0000000..f7371de --- /dev/null +++ b/dep/glm/ext/matrix_double4x3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_double4x3_precision.hpp + +#pragma once +#include "../detail/type_mat4x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 3 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, double, lowp> lowp_dmat4x3; + + /// 4 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, double, mediump> mediump_dmat4x3; + + /// 4 columns of 3 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, double, highp> highp_dmat4x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double4x4.hpp b/dep/glm/ext/matrix_double4x4.hpp new file mode 100644 index 0000000..81e1bf6 --- /dev/null +++ b/dep/glm/ext/matrix_double4x4.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_double4x4.hpp + +#pragma once +#include "../detail/type_mat4x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 4 columns of 4 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 4, double, defaultp> dmat4x4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 4, double, defaultp> dmat4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_double4x4_precision.hpp b/dep/glm/ext/matrix_double4x4_precision.hpp new file mode 100644 index 0000000..4c36a84 --- /dev/null +++ b/dep/glm/ext/matrix_double4x4_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_double4x4_precision.hpp + +#pragma once +#include "../detail/type_mat4x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, lowp> lowp_dmat4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, mediump> mediump_dmat4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, highp> highp_dmat4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, lowp> lowp_dmat4x4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, mediump> mediump_dmat4x4; + + /// 4 columns of 4 components matrix of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, double, highp> highp_dmat4x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float2x2.hpp b/dep/glm/ext/matrix_float2x2.hpp new file mode 100644 index 0000000..53df921 --- /dev/null +++ b/dep/glm/ext/matrix_float2x2.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_float2x2.hpp + +#pragma once +#include "../detail/type_mat2x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 2 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 2, float, defaultp> mat2x2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 2, float, defaultp> mat2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float2x2_precision.hpp b/dep/glm/ext/matrix_float2x2_precision.hpp new file mode 100644 index 0000000..898b6db --- /dev/null +++ b/dep/glm/ext/matrix_float2x2_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_float2x2_precision.hpp + +#pragma once +#include "../detail/type_mat2x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, lowp> lowp_mat2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, mediump> mediump_mat2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, highp> highp_mat2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, lowp> lowp_mat2x2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, mediump> mediump_mat2x2; + + /// 2 columns of 2 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 2, float, highp> highp_mat2x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float2x3.hpp b/dep/glm/ext/matrix_float2x3.hpp new file mode 100644 index 0000000..6f68822 --- /dev/null +++ b/dep/glm/ext/matrix_float2x3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float2x3.hpp + +#pragma once +#include "../detail/type_mat2x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 3 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 3, float, defaultp> mat2x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float2x3_precision.hpp b/dep/glm/ext/matrix_float2x3_precision.hpp new file mode 100644 index 0000000..50c1032 --- /dev/null +++ b/dep/glm/ext/matrix_float2x3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float2x3_precision.hpp + +#pragma once +#include "../detail/type_mat2x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 3 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, float, lowp> lowp_mat2x3; + + /// 2 columns of 3 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, float, mediump> mediump_mat2x3; + + /// 2 columns of 3 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 3, float, highp> highp_mat2x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float2x4.hpp b/dep/glm/ext/matrix_float2x4.hpp new file mode 100644 index 0000000..30f30de --- /dev/null +++ b/dep/glm/ext/matrix_float2x4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float2x4.hpp + +#pragma once +#include "../detail/type_mat2x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 2 columns of 4 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<2, 4, float, defaultp> mat2x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float2x4_precision.hpp b/dep/glm/ext/matrix_float2x4_precision.hpp new file mode 100644 index 0000000..079d638 --- /dev/null +++ b/dep/glm/ext/matrix_float2x4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float2x4_precision.hpp + +#pragma once +#include "../detail/type_mat2x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 2 columns of 4 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, float, lowp> lowp_mat2x4; + + /// 2 columns of 4 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, float, mediump> mediump_mat2x4; + + /// 2 columns of 4 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<2, 4, float, highp> highp_mat2x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float3x2.hpp b/dep/glm/ext/matrix_float3x2.hpp new file mode 100644 index 0000000..d39dd2f --- /dev/null +++ b/dep/glm/ext/matrix_float3x2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float3x2.hpp + +#pragma once +#include "../detail/type_mat3x2.hpp" + +namespace glm +{ + /// @addtogroup core + /// @{ + + /// 3 columns of 2 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 2, float, defaultp> mat3x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float3x2_precision.hpp b/dep/glm/ext/matrix_float3x2_precision.hpp new file mode 100644 index 0000000..8572c2a --- /dev/null +++ b/dep/glm/ext/matrix_float3x2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float3x2_precision.hpp + +#pragma once +#include "../detail/type_mat3x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 2 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, float, lowp> lowp_mat3x2; + + /// 3 columns of 2 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, float, mediump> mediump_mat3x2; + + /// 3 columns of 2 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 2, float, highp> highp_mat3x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float3x3.hpp b/dep/glm/ext/matrix_float3x3.hpp new file mode 100644 index 0000000..177d809 --- /dev/null +++ b/dep/glm/ext/matrix_float3x3.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_float3x3.hpp + +#pragma once +#include "../detail/type_mat3x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 3 columns of 3 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 3, float, defaultp> mat3x3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 3, float, defaultp> mat3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float3x3_precision.hpp b/dep/glm/ext/matrix_float3x3_precision.hpp new file mode 100644 index 0000000..8a900c1 --- /dev/null +++ b/dep/glm/ext/matrix_float3x3_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_float3x3_precision.hpp + +#pragma once +#include "../detail/type_mat3x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, lowp> lowp_mat3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, mediump> mediump_mat3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, highp> highp_mat3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, lowp> lowp_mat3x3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, mediump> mediump_mat3x3; + + /// 3 columns of 3 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 3, float, highp> highp_mat3x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float3x4.hpp b/dep/glm/ext/matrix_float3x4.hpp new file mode 100644 index 0000000..64b8459 --- /dev/null +++ b/dep/glm/ext/matrix_float3x4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float3x4.hpp + +#pragma once +#include "../detail/type_mat3x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 3 columns of 4 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<3, 4, float, defaultp> mat3x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float3x4_precision.hpp b/dep/glm/ext/matrix_float3x4_precision.hpp new file mode 100644 index 0000000..bc36bf1 --- /dev/null +++ b/dep/glm/ext/matrix_float3x4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float3x4_precision.hpp + +#pragma once +#include "../detail/type_mat3x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 3 columns of 4 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, float, lowp> lowp_mat3x4; + + /// 3 columns of 4 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, float, mediump> mediump_mat3x4; + + /// 3 columns of 4 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<3, 4, float, highp> highp_mat3x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float4x2.hpp b/dep/glm/ext/matrix_float4x2.hpp new file mode 100644 index 0000000..1ed5227 --- /dev/null +++ b/dep/glm/ext/matrix_float4x2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float4x2.hpp + +#pragma once +#include "../detail/type_mat4x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 4 columns of 2 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 2, float, defaultp> mat4x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float4x2_precision.hpp b/dep/glm/ext/matrix_float4x2_precision.hpp new file mode 100644 index 0000000..88fd069 --- /dev/null +++ b/dep/glm/ext/matrix_float4x2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float2x2_precision.hpp + +#pragma once +#include "../detail/type_mat2x2.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 2 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, float, lowp> lowp_mat4x2; + + /// 4 columns of 2 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, float, mediump> mediump_mat4x2; + + /// 4 columns of 2 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 2, float, highp> highp_mat4x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float4x3.hpp b/dep/glm/ext/matrix_float4x3.hpp new file mode 100644 index 0000000..5dbe765 --- /dev/null +++ b/dep/glm/ext/matrix_float4x3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/matrix_float4x3.hpp + +#pragma once +#include "../detail/type_mat4x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix + /// @{ + + /// 4 columns of 3 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 3, float, defaultp> mat4x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float4x3_precision.hpp b/dep/glm/ext/matrix_float4x3_precision.hpp new file mode 100644 index 0000000..846ed4f --- /dev/null +++ b/dep/glm/ext/matrix_float4x3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/matrix_float4x3_precision.hpp + +#pragma once +#include "../detail/type_mat4x3.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 3 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, float, lowp> lowp_mat4x3; + + /// 4 columns of 3 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, float, mediump> mediump_mat4x3; + + /// 4 columns of 3 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 3, float, highp> highp_mat4x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float4x4.hpp b/dep/glm/ext/matrix_float4x4.hpp new file mode 100644 index 0000000..5ba111d --- /dev/null +++ b/dep/glm/ext/matrix_float4x4.hpp @@ -0,0 +1,23 @@ +/// @ref core +/// @file glm/ext/matrix_float4x4.hpp + +#pragma once +#include "../detail/type_mat4x4.hpp" + +namespace glm +{ + /// @ingroup core_matrix + /// @{ + + /// 4 columns of 4 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 4, float, defaultp> mat4x4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + typedef mat<4, 4, float, defaultp> mat4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_float4x4_precision.hpp b/dep/glm/ext/matrix_float4x4_precision.hpp new file mode 100644 index 0000000..597149b --- /dev/null +++ b/dep/glm/ext/matrix_float4x4_precision.hpp @@ -0,0 +1,49 @@ +/// @ref core +/// @file glm/ext/matrix_float4x4_precision.hpp + +#pragma once +#include "../detail/type_mat4x4.hpp" + +namespace glm +{ + /// @addtogroup core_matrix_precision + /// @{ + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, lowp> lowp_mat4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, mediump> mediump_mat4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, highp> highp_mat4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, lowp> lowp_mat4x4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, mediump> mediump_mat4x4; + + /// 4 columns of 4 components matrix of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see GLSL 4.20.8 specification, section 4.1.6 Matrices + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef mat<4, 4, float, highp> highp_mat4x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int2x2.hpp b/dep/glm/ext/matrix_int2x2.hpp new file mode 100644 index 0000000..c6aa068 --- /dev/null +++ b/dep/glm/ext/matrix_int2x2.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_int2x2 +/// @file glm/ext/matrix_int2x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x2 GLM_EXT_matrix_int2x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x2 + /// @{ + + /// Signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2 + typedef mat<2, 2, int, defaultp> imat2x2; + + /// Signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2 + typedef mat<2, 2, int, defaultp> imat2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int2x2_sized.hpp b/dep/glm/ext/matrix_int2x2_sized.hpp new file mode 100644 index 0000000..70c0c21 --- /dev/null +++ b/dep/glm/ext/matrix_int2x2_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_int2x2_sized +/// @file glm/ext/matrix_int2x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x2_sized GLM_EXT_matrix_int2x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x2.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x2_sized + /// @{ + + /// 8 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int8, defaultp> i8mat2x2; + + /// 16 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int16, defaultp> i16mat2x2; + + /// 32 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int32, defaultp> i32mat2x2; + + /// 64 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int64, defaultp> i64mat2x2; + + + /// 8 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int8, defaultp> i8mat2; + + /// 16 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int16, defaultp> i16mat2; + + /// 32 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int32, defaultp> i32mat2; + + /// 64 bit signed integer 2x2 matrix. + /// + /// @see ext_matrix_int2x2_sized + typedef mat<2, 2, int64, defaultp> i64mat2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int2x3.hpp b/dep/glm/ext/matrix_int2x3.hpp new file mode 100644 index 0000000..aee415c --- /dev/null +++ b/dep/glm/ext/matrix_int2x3.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int2x3 +/// @file glm/ext/matrix_int2x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x3 GLM_EXT_matrix_int2x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x3 + /// @{ + + /// Signed integer 2x3 matrix. + /// + /// @see ext_matrix_int2x3 + typedef mat<2, 3, int, defaultp> imat2x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int2x3_sized.hpp b/dep/glm/ext/matrix_int2x3_sized.hpp new file mode 100644 index 0000000..b5526fe --- /dev/null +++ b/dep/glm/ext/matrix_int2x3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int2x3_sized +/// @file glm/ext/matrix_int2x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x3_sized GLM_EXT_matrix_int2x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x3.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x3_sized + /// @{ + + /// 8 bit signed integer 2x3 matrix. + /// + /// @see ext_matrix_int2x3_sized + typedef mat<2, 3, int8, defaultp> i8mat2x3; + + /// 16 bit signed integer 2x3 matrix. + /// + /// @see ext_matrix_int2x3_sized + typedef mat<2, 3, int16, defaultp> i16mat2x3; + + /// 32 bit signed integer 2x3 matrix. + /// + /// @see ext_matrix_int2x3_sized + typedef mat<2, 3, int32, defaultp> i32mat2x3; + + /// 64 bit signed integer 2x3 matrix. + /// + /// @see ext_matrix_int2x3_sized + typedef mat<2, 3, int64, defaultp> i64mat2x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int2x4.hpp b/dep/glm/ext/matrix_int2x4.hpp new file mode 100644 index 0000000..4f36331 --- /dev/null +++ b/dep/glm/ext/matrix_int2x4.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int2x4 +/// @file glm/ext/matrix_int2x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x4 GLM_EXT_matrix_int2x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x4 + /// @{ + + /// Signed integer 2x4 matrix. + /// + /// @see ext_matrix_int2x4 + typedef mat<2, 4, int, defaultp> imat2x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int2x4_sized.hpp b/dep/glm/ext/matrix_int2x4_sized.hpp new file mode 100644 index 0000000..a66a5e7 --- /dev/null +++ b/dep/glm/ext/matrix_int2x4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int2x4_sized +/// @file glm/ext/matrix_int2x4_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x4_sized GLM_EXT_matrix_int2x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x4.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int2x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int2x4_sized + /// @{ + + /// 8 bit signed integer 2x4 matrix. + /// + /// @see ext_matrix_int2x4_sized + typedef mat<2, 4, int8, defaultp> i8mat2x4; + + /// 16 bit signed integer 2x4 matrix. + /// + /// @see ext_matrix_int2x4_sized + typedef mat<2, 4, int16, defaultp> i16mat2x4; + + /// 32 bit signed integer 2x4 matrix. + /// + /// @see ext_matrix_int2x4_sized + typedef mat<2, 4, int32, defaultp> i32mat2x4; + + /// 64 bit signed integer 2x4 matrix. + /// + /// @see ext_matrix_int2x4_sized + typedef mat<2, 4, int64, defaultp> i64mat2x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int3x2.hpp b/dep/glm/ext/matrix_int3x2.hpp new file mode 100644 index 0000000..3bd563b --- /dev/null +++ b/dep/glm/ext/matrix_int3x2.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int3x2 +/// @file glm/ext/matrix_int3x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x2 GLM_EXT_matrix_int3x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x2 + /// @{ + + /// Signed integer 3x2 matrix. + /// + /// @see ext_matrix_int3x2 + typedef mat<3, 2, int, defaultp> imat3x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int3x2_sized.hpp b/dep/glm/ext/matrix_int3x2_sized.hpp new file mode 100644 index 0000000..7e34c52 --- /dev/null +++ b/dep/glm/ext/matrix_int3x2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int3x2_sized +/// @file glm/ext/matrix_int3x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x2_sized GLM_EXT_matrix_int3x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x2.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x2_sized + /// @{ + + /// 8 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_int3x2_sized + typedef mat<3, 2, int8, defaultp> i8mat3x2; + + /// 16 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_int3x2_sized + typedef mat<3, 2, int16, defaultp> i16mat3x2; + + /// 32 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_int3x2_sized + typedef mat<3, 2, int32, defaultp> i32mat3x2; + + /// 64 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_int3x2_sized + typedef mat<3, 2, int64, defaultp> i64mat3x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int3x3.hpp b/dep/glm/ext/matrix_int3x3.hpp new file mode 100644 index 0000000..287488d --- /dev/null +++ b/dep/glm/ext/matrix_int3x3.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_int3x3 +/// @file glm/ext/matrix_int3x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x3 GLM_EXT_matrix_int3x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x3 + /// @{ + + /// Signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3 + typedef mat<3, 3, int, defaultp> imat3x3; + + /// Signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3 + typedef mat<3, 3, int, defaultp> imat3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int3x3_sized.hpp b/dep/glm/ext/matrix_int3x3_sized.hpp new file mode 100644 index 0000000..577e305 --- /dev/null +++ b/dep/glm/ext/matrix_int3x3_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_int3x3_sized +/// @file glm/ext/matrix_int3x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x3_sized GLM_EXT_matrix_int3x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x3.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x3_sized + /// @{ + + /// 8 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int8, defaultp> i8mat3x3; + + /// 16 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int16, defaultp> i16mat3x3; + + /// 32 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int32, defaultp> i32mat3x3; + + /// 64 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int64, defaultp> i64mat3x3; + + + /// 8 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int8, defaultp> i8mat3; + + /// 16 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int16, defaultp> i16mat3; + + /// 32 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int32, defaultp> i32mat3; + + /// 64 bit signed integer 3x3 matrix. + /// + /// @see ext_matrix_int3x3_sized + typedef mat<3, 3, int64, defaultp> i64mat3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int3x4.hpp b/dep/glm/ext/matrix_int3x4.hpp new file mode 100644 index 0000000..08e534d --- /dev/null +++ b/dep/glm/ext/matrix_int3x4.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int3x4 +/// @file glm/ext/matrix_int3x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x4 GLM_EXT_matrix_int3x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x4 + /// @{ + + /// Signed integer 3x4 matrix. + /// + /// @see ext_matrix_int3x4 + typedef mat<3, 4, int, defaultp> imat3x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int3x4_sized.hpp b/dep/glm/ext/matrix_int3x4_sized.hpp new file mode 100644 index 0000000..692c48c --- /dev/null +++ b/dep/glm/ext/matrix_int3x4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int3x4_sized +/// @file glm/ext/matrix_int3x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x4_sized GLM_EXT_matrix_int3x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x4.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int3x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int3x4_sized + /// @{ + + /// 8 bit signed integer 3x4 matrix. + /// + /// @see ext_matrix_int3x4_sized + typedef mat<3, 4, int8, defaultp> i8mat3x4; + + /// 16 bit signed integer 3x4 matrix. + /// + /// @see ext_matrix_int3x4_sized + typedef mat<3, 4, int16, defaultp> i16mat3x4; + + /// 32 bit signed integer 3x4 matrix. + /// + /// @see ext_matrix_int3x4_sized + typedef mat<3, 4, int32, defaultp> i32mat3x4; + + /// 64 bit signed integer 3x4 matrix. + /// + /// @see ext_matrix_int3x4_sized + typedef mat<3, 4, int64, defaultp> i64mat3x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int4x2.hpp b/dep/glm/ext/matrix_int4x2.hpp new file mode 100644 index 0000000..f756ef2 --- /dev/null +++ b/dep/glm/ext/matrix_int4x2.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int4x2 +/// @file glm/ext/matrix_int4x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x2 GLM_EXT_matrix_int4x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x2 + /// @{ + + /// Signed integer 4x2 matrix. + /// + /// @see ext_matrix_int4x2 + typedef mat<4, 2, int, defaultp> imat4x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int4x2_sized.hpp b/dep/glm/ext/matrix_int4x2_sized.hpp new file mode 100644 index 0000000..63a99d6 --- /dev/null +++ b/dep/glm/ext/matrix_int4x2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int4x2_sized +/// @file glm/ext/matrix_int4x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x2_sized GLM_EXT_matrix_int4x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x2.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x2_sized + /// @{ + + /// 8 bit signed integer 4x2 matrix. + /// + /// @see ext_matrix_int4x2_sized + typedef mat<4, 2, int8, defaultp> i8mat4x2; + + /// 16 bit signed integer 4x2 matrix. + /// + /// @see ext_matrix_int4x2_sized + typedef mat<4, 2, int16, defaultp> i16mat4x2; + + /// 32 bit signed integer 4x2 matrix. + /// + /// @see ext_matrix_int4x2_sized + typedef mat<4, 2, int32, defaultp> i32mat4x2; + + /// 64 bit signed integer 4x2 matrix. + /// + /// @see ext_matrix_int4x2_sized + typedef mat<4, 2, int64, defaultp> i64mat4x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int4x3.hpp b/dep/glm/ext/matrix_int4x3.hpp new file mode 100644 index 0000000..d5d97a7 --- /dev/null +++ b/dep/glm/ext/matrix_int4x3.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_int4x3 +/// @file glm/ext/matrix_int4x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x3 GLM_EXT_matrix_int4x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x3 + /// @{ + + /// Signed integer 4x3 matrix. + /// + /// @see ext_matrix_int4x3 + typedef mat<4, 3, int, defaultp> imat4x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int4x3_sized.hpp b/dep/glm/ext/matrix_int4x3_sized.hpp new file mode 100644 index 0000000..55078fa --- /dev/null +++ b/dep/glm/ext/matrix_int4x3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_int4x3_sized +/// @file glm/ext/matrix_int4x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x3_sized GLM_EXT_matrix_int4x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x3.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x3_sized + /// @{ + + /// 8 bit signed integer 4x3 matrix. + /// + /// @see ext_matrix_int4x3_sized + typedef mat<4, 3, int8, defaultp> i8mat4x3; + + /// 16 bit signed integer 4x3 matrix. + /// + /// @see ext_matrix_int4x3_sized + typedef mat<4, 3, int16, defaultp> i16mat4x3; + + /// 32 bit signed integer 4x3 matrix. + /// + /// @see ext_matrix_int4x3_sized + typedef mat<4, 3, int32, defaultp> i32mat4x3; + + /// 64 bit signed integer 4x3 matrix. + /// + /// @see ext_matrix_int4x3_sized + typedef mat<4, 3, int64, defaultp> i64mat4x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int4x4.hpp b/dep/glm/ext/matrix_int4x4.hpp new file mode 100644 index 0000000..e17cff1 --- /dev/null +++ b/dep/glm/ext/matrix_int4x4.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_int4x4 +/// @file glm/ext/matrix_int4x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x4 GLM_EXT_matrix_int4x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x4 + /// @{ + + /// Signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4 + typedef mat<4, 4, int, defaultp> imat4x4; + + /// Signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4 + typedef mat<4, 4, int, defaultp> imat4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_int4x4_sized.hpp b/dep/glm/ext/matrix_int4x4_sized.hpp new file mode 100644 index 0000000..4a11203 --- /dev/null +++ b/dep/glm/ext/matrix_int4x4_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_int4x4_sized +/// @file glm/ext/matrix_int4x4_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int4x4_sized GLM_EXT_matrix_int4x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x4.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_int4x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_int4x4_sized + /// @{ + + /// 8 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int8, defaultp> i8mat4x4; + + /// 16 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int16, defaultp> i16mat4x4; + + /// 32 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int32, defaultp> i32mat4x4; + + /// 64 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int64, defaultp> i64mat4x4; + + + /// 8 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int8, defaultp> i8mat4; + + /// 16 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int16, defaultp> i16mat4; + + /// 32 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int32, defaultp> i32mat4; + + /// 64 bit signed integer 4x4 matrix. + /// + /// @see ext_matrix_int4x4_sized + typedef mat<4, 4, int64, defaultp> i64mat4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_projection.hpp b/dep/glm/ext/matrix_projection.hpp new file mode 100644 index 0000000..51fd01b --- /dev/null +++ b/dep/glm/ext/matrix_projection.hpp @@ -0,0 +1,149 @@ +/// @ref ext_matrix_projection +/// @file glm/ext/matrix_projection.hpp +/// +/// @defgroup ext_matrix_projection GLM_EXT_matrix_projection +/// @ingroup ext +/// +/// Functions that generate common projection transformation matrices. +/// +/// The matrices generated by this extension use standard OpenGL fixed-function +/// conventions. For example, the lookAt function generates a transform from world +/// space into the specific eye space that the projective matrix functions +/// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility +/// specifications defines the particular layout of this eye space. +/// +/// Include to use the features of this extension. +/// +/// @see ext_matrix_transform +/// @see ext_matrix_clip_space + +#pragma once + +// Dependencies +#include "../gtc/constants.hpp" +#include "../geometric.hpp" +#include "../trigonometric.hpp" +#include "../matrix.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_projection extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_projection + /// @{ + + /// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param obj Specify the object coordinates. + /// @param model Specifies the current modelview matrix + /// @param proj Specifies the current projection matrix + /// @param viewport Specifies the current viewport + /// @return Return the computed window coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluProject man page + template + GLM_FUNC_DECL vec<3, T, Q> projectZO( + vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param obj Specify the object coordinates. + /// @param model Specifies the current modelview matrix + /// @param proj Specifies the current projection matrix + /// @param viewport Specifies the current viewport + /// @return Return the computed window coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluProject man page + template + GLM_FUNC_DECL vec<3, T, Q> projectNO( + vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates using default near and far clip planes definition. + /// To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @param obj Specify the object coordinates. + /// @param model Specifies the current modelview matrix + /// @param proj Specifies the current projection matrix + /// @param viewport Specifies the current viewport + /// @return Return the computed window coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluProject man page + template + GLM_FUNC_DECL vec<3, T, Q> project( + vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param win Specify the window coordinates to be mapped. + /// @param model Specifies the modelview matrix + /// @param proj Specifies the projection matrix + /// @param viewport Specifies the viewport + /// @return Returns the computed object coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluUnProject man page + template + GLM_FUNC_DECL vec<3, T, Q> unProjectZO( + vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param win Specify the window coordinates to be mapped. + /// @param model Specifies the modelview matrix + /// @param proj Specifies the projection matrix + /// @param viewport Specifies the viewport + /// @return Returns the computed object coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluUnProject man page + template + GLM_FUNC_DECL vec<3, T, Q> unProjectNO( + vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates using default near and far clip planes definition. + /// To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @param win Specify the window coordinates to be mapped. + /// @param model Specifies the modelview matrix + /// @param proj Specifies the projection matrix + /// @param viewport Specifies the viewport + /// @return Returns the computed object coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluUnProject man page + template + GLM_FUNC_DECL vec<3, T, Q> unProject( + vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Define a picking region + /// + /// @param center Specify the center of a picking region in window coordinates. + /// @param delta Specify the width and height, respectively, of the picking region in window coordinates. + /// @param viewport Rendering viewport + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// + /// @see gluPickMatrix man page + template + GLM_FUNC_DECL mat<4, 4, T, Q> pickMatrix( + vec<2, T, Q> const& center, vec<2, T, Q> const& delta, vec<4, U, Q> const& viewport); + + /// @} +}//namespace glm + +#include "matrix_projection.inl" diff --git a/dep/glm/ext/matrix_projection.inl b/dep/glm/ext/matrix_projection.inl new file mode 100644 index 0000000..2f2c196 --- /dev/null +++ b/dep/glm/ext/matrix_projection.inl @@ -0,0 +1,106 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> projectZO(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { + vec<4, T, Q> tmp = vec<4, T, Q>(obj, static_cast(1)); + tmp = model * tmp; + tmp = proj * tmp; + + tmp /= tmp.w; + tmp.x = tmp.x * static_cast(0.5) + static_cast(0.5); + tmp.y = tmp.y * static_cast(0.5) + static_cast(0.5); + + tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]); + tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]); + + return vec<3, T, Q>(tmp); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> projectNO(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { + vec<4, T, Q> tmp = vec<4, T, Q>(obj, static_cast(1)); + tmp = model * tmp; + tmp = proj * tmp; + + tmp /= tmp.w; + tmp = tmp * static_cast(0.5) + static_cast(0.5); + tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]); + tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]); + + return vec<3, T, Q>(tmp); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> project(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return projectZO(obj, model, proj, viewport); +# else + return projectNO(obj, model, proj, viewport); +# endif + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> unProjectZO(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { + mat<4, 4, T, Q> Inverse = inverse(proj * model); + + vec<4, T, Q> tmp = vec<4, T, Q>(win, T(1)); + tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]); + tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]); + tmp.x = tmp.x * static_cast(2) - static_cast(1); + tmp.y = tmp.y * static_cast(2) - static_cast(1); + + vec<4, T, Q> obj = Inverse * tmp; + obj /= obj.w; + + return vec<3, T, Q>(obj); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> unProjectNO(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { + mat<4, 4, T, Q> Inverse = inverse(proj * model); + + vec<4, T, Q> tmp = vec<4, T, Q>(win, T(1)); + tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]); + tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]); + tmp = tmp * static_cast(2) - static_cast(1); + + vec<4, T, Q> obj = Inverse * tmp; + obj /= obj.w; + + return vec<3, T, Q>(obj); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> unProject(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT + return unProjectZO(win, model, proj, viewport); +# else + return unProjectNO(win, model, proj, viewport); +# endif + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> pickMatrix(vec<2, T, Q> const& center, vec<2, T, Q> const& delta, vec<4, U, Q> const& viewport) + { + assert(delta.x > static_cast(0) && delta.y > static_cast(0)); + mat<4, 4, T, Q> Result(static_cast(1)); + + if(!(delta.x > static_cast(0) && delta.y > static_cast(0))) + return Result; // Error + + vec<3, T, Q> Temp( + (static_cast(viewport[2]) - static_cast(2) * (center.x - static_cast(viewport[0]))) / delta.x, + (static_cast(viewport[3]) - static_cast(2) * (center.y - static_cast(viewport[1]))) / delta.y, + static_cast(0)); + + // Translate and scale the picked region to the entire window + Result = translate(Result, Temp); + return scale(Result, vec<3, T, Q>(static_cast(viewport[2]) / delta.x, static_cast(viewport[3]) / delta.y, static_cast(1))); + } +}//namespace glm diff --git a/dep/glm/ext/matrix_relational.hpp b/dep/glm/ext/matrix_relational.hpp new file mode 100644 index 0000000..20023ad --- /dev/null +++ b/dep/glm/ext/matrix_relational.hpp @@ -0,0 +1,132 @@ +/// @ref ext_matrix_relational +/// @file glm/ext/matrix_relational.hpp +/// +/// @defgroup ext_matrix_relational GLM_EXT_matrix_relational +/// @ingroup ext +/// +/// Exposes comparison functions for matrix types that take a user defined epsilon values. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_relational +/// @see ext_scalar_relational +/// @see ext_quaternion_relational + +#pragma once + +// Dependencies +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_relational extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_relational + /// @{ + + /// Perform a component-wise equal-to comparison of two matrices. + /// Return a boolean vector which components value is True if this expression is satisfied per column of the matrices. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(mat const& x, mat const& y); + + /// Perform a component-wise not-equal-to comparison of two matrices. + /// Return a boolean vector which components value is True if this expression is satisfied per column of the matrices. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(mat const& x, mat const& y, T epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(mat const& x, mat const& y, vec const& epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, T epsilon); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, vec const& epsilon); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(mat const& x, mat const& y, int ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(mat const& x, mat const& y, vec const& ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is not satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, int ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is not satisfied. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number of columns of the matrix + /// @tparam R Integer between 1 and 4 included that qualify the number of rows of the matrix + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, vec const& ULPs); + + /// @} +}//namespace glm + +#include "matrix_relational.inl" diff --git a/dep/glm/ext/matrix_relational.inl b/dep/glm/ext/matrix_relational.inl new file mode 100644 index 0000000..b2b8753 --- /dev/null +++ b/dep/glm/ext/matrix_relational.inl @@ -0,0 +1,82 @@ +/// @ref ext_vector_relational +/// @file glm/ext/vector_relational.inl + +// Dependency: +#include "../ext/vector_relational.hpp" +#include "../common.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(mat const& a, mat const& b) + { + return equal(a, b, static_cast(0)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(mat const& a, mat const& b, T Epsilon) + { + return equal(a, b, vec(Epsilon)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(mat const& a, mat const& b, vec const& Epsilon) + { + vec Result(true); + for(length_t i = 0; i < C; ++i) + Result[i] = all(equal(a[i], b[i], Epsilon[i])); + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y) + { + return notEqual(x, y, static_cast(0)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, T Epsilon) + { + return notEqual(x, y, vec(Epsilon)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(mat const& a, mat const& b, vec const& Epsilon) + { + vec Result(true); + for(length_t i = 0; i < C; ++i) + Result[i] = any(notEqual(a[i], b[i], Epsilon[i])); + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(mat const& a, mat const& b, int MaxULPs) + { + return equal(a, b, vec(MaxULPs)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(mat const& a, mat const& b, vec const& MaxULPs) + { + vec Result(true); + for(length_t i = 0; i < C; ++i) + Result[i] = all(equal(a[i], b[i], MaxULPs[i])); + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(mat const& x, mat const& y, int MaxULPs) + { + return notEqual(x, y, vec(MaxULPs)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(mat const& a, mat const& b, vec const& MaxULPs) + { + vec Result(true); + for(length_t i = 0; i < C; ++i) + Result[i] = any(notEqual(a[i], b[i], MaxULPs[i])); + return Result; + } + +}//namespace glm diff --git a/dep/glm/ext/matrix_transform.hpp b/dep/glm/ext/matrix_transform.hpp new file mode 100644 index 0000000..cbd187e --- /dev/null +++ b/dep/glm/ext/matrix_transform.hpp @@ -0,0 +1,144 @@ +/// @ref ext_matrix_transform +/// @file glm/ext/matrix_transform.hpp +/// +/// @defgroup ext_matrix_transform GLM_EXT_matrix_transform +/// @ingroup ext +/// +/// Defines functions that generate common transformation matrices. +/// +/// The matrices generated by this extension use standard OpenGL fixed-function +/// conventions. For example, the lookAt function generates a transform from world +/// space into the specific eye space that the projective matrix functions +/// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility +/// specifications defines the particular layout of this eye space. +/// +/// Include to use the features of this extension. +/// +/// @see ext_matrix_projection +/// @see ext_matrix_clip_space + +#pragma once + +// Dependencies +#include "../gtc/constants.hpp" +#include "../geometric.hpp" +#include "../trigonometric.hpp" +#include "../matrix.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_transform extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_transform + /// @{ + + /// Builds an identity matrix. + template + GLM_FUNC_DECL GLM_CONSTEXPR genType identity(); + + /// Builds a translation 4 * 4 matrix created from a vector of 3 components. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param v Coordinates of a translation vector. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @code + /// #include + /// #include + /// ... + /// glm::mat4 m = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f)); + /// // m[0][0] == 1.0f, m[0][1] == 0.0f, m[0][2] == 0.0f, m[0][3] == 0.0f + /// // m[1][0] == 0.0f, m[1][1] == 1.0f, m[1][2] == 0.0f, m[1][3] == 0.0f + /// // m[2][0] == 0.0f, m[2][1] == 0.0f, m[2][2] == 1.0f, m[2][3] == 0.0f + /// // m[3][0] == 1.0f, m[3][1] == 1.0f, m[3][2] == 1.0f, m[3][3] == 1.0f + /// @endcode + /// + /// @see - translate(mat<4, 4, T, Q> const& m, T x, T y, T z) + /// @see - translate(vec<3, T, Q> const& v) + /// @see glTranslate man page + template + GLM_FUNC_DECL mat<4, 4, T, Q> translate( + mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v); + + /// Builds a rotation 4 * 4 matrix created from an axis vector and an angle. + /// + /// @param m Input matrix multiplied by this rotation matrix. + /// @param angle Rotation angle expressed in radians. + /// @param axis Rotation axis, recommended to be normalized. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - rotate(mat<4, 4, T, Q> const& m, T angle, T x, T y, T z) + /// @see - rotate(T angle, vec<3, T, Q> const& v) + /// @see glRotate man page + template + GLM_FUNC_DECL mat<4, 4, T, Q> rotate( + mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& axis); + + /// Builds a scale 4 * 4 matrix created from 3 scalars. + /// + /// @param m Input matrix multiplied by this scale matrix. + /// @param v Ratio of scaling for each axis. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - scale(mat<4, 4, T, Q> const& m, T x, T y, T z) + /// @see - scale(vec<3, T, Q> const& v) + /// @see glScale man page + template + GLM_FUNC_DECL mat<4, 4, T, Q> scale( + mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v); + + /// Build a right handed look at view matrix. + /// + /// @param eye Position of the camera + /// @param center Position where the camera is looking at + /// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1) + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) + template + GLM_FUNC_DECL mat<4, 4, T, Q> lookAtRH( + vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up); + + /// Build a left handed look at view matrix. + /// + /// @param eye Position of the camera + /// @param center Position where the camera is looking at + /// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1) + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) + template + GLM_FUNC_DECL mat<4, 4, T, Q> lookAtLH( + vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up); + + /// Build a look at view matrix based on the default handedness. + /// + /// @param eye Position of the camera + /// @param center Position where the camera is looking at + /// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1) + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) + /// @see gluLookAt man page + template + GLM_FUNC_DECL mat<4, 4, T, Q> lookAt( + vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up); + + /// @} +}//namespace glm + +#include "matrix_transform.inl" diff --git a/dep/glm/ext/matrix_transform.inl b/dep/glm/ext/matrix_transform.inl new file mode 100644 index 0000000..a415157 --- /dev/null +++ b/dep/glm/ext/matrix_transform.inl @@ -0,0 +1,152 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType identity() + { + return detail::init_gentype::GENTYPE>::identity(); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v) + { + mat<4, 4, T, Q> Result(m); + Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate(mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& v) + { + T const a = angle; + T const c = cos(a); + T const s = sin(a); + + vec<3, T, Q> axis(normalize(v)); + vec<3, T, Q> temp((T(1) - c) * axis); + + mat<4, 4, T, Q> Rotate; + Rotate[0][0] = c + temp[0] * axis[0]; + Rotate[0][1] = temp[0] * axis[1] + s * axis[2]; + Rotate[0][2] = temp[0] * axis[2] - s * axis[1]; + + Rotate[1][0] = temp[1] * axis[0] - s * axis[2]; + Rotate[1][1] = c + temp[1] * axis[1]; + Rotate[1][2] = temp[1] * axis[2] + s * axis[0]; + + Rotate[2][0] = temp[2] * axis[0] + s * axis[1]; + Rotate[2][1] = temp[2] * axis[1] - s * axis[0]; + Rotate[2][2] = c + temp[2] * axis[2]; + + mat<4, 4, T, Q> Result; + Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; + Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; + Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2]; + Result[3] = m[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate_slow(mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& v) + { + T const a = angle; + T const c = cos(a); + T const s = sin(a); + mat<4, 4, T, Q> Result; + + vec<3, T, Q> axis = normalize(v); + + Result[0][0] = c + (static_cast(1) - c) * axis.x * axis.x; + Result[0][1] = (static_cast(1) - c) * axis.x * axis.y + s * axis.z; + Result[0][2] = (static_cast(1) - c) * axis.x * axis.z - s * axis.y; + Result[0][3] = static_cast(0); + + Result[1][0] = (static_cast(1) - c) * axis.y * axis.x - s * axis.z; + Result[1][1] = c + (static_cast(1) - c) * axis.y * axis.y; + Result[1][2] = (static_cast(1) - c) * axis.y * axis.z + s * axis.x; + Result[1][3] = static_cast(0); + + Result[2][0] = (static_cast(1) - c) * axis.z * axis.x + s * axis.y; + Result[2][1] = (static_cast(1) - c) * axis.z * axis.y - s * axis.x; + Result[2][2] = c + (static_cast(1) - c) * axis.z * axis.z; + Result[2][3] = static_cast(0); + + Result[3] = vec<4, T, Q>(0, 0, 0, 1); + return m * Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v) + { + mat<4, 4, T, Q> Result; + Result[0] = m[0] * v[0]; + Result[1] = m[1] * v[1]; + Result[2] = m[2] * v[2]; + Result[3] = m[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale_slow(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v) + { + mat<4, 4, T, Q> Result(T(1)); + Result[0][0] = v.x; + Result[1][1] = v.y; + Result[2][2] = v.z; + return m * Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtRH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up) + { + vec<3, T, Q> const f(normalize(center - eye)); + vec<3, T, Q> const s(normalize(cross(f, up))); + vec<3, T, Q> const u(cross(s, f)); + + mat<4, 4, T, Q> Result(1); + Result[0][0] = s.x; + Result[1][0] = s.y; + Result[2][0] = s.z; + Result[0][1] = u.x; + Result[1][1] = u.y; + Result[2][1] = u.z; + Result[0][2] =-f.x; + Result[1][2] =-f.y; + Result[2][2] =-f.z; + Result[3][0] =-dot(s, eye); + Result[3][1] =-dot(u, eye); + Result[3][2] = dot(f, eye); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtLH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up) + { + vec<3, T, Q> const f(normalize(center - eye)); + vec<3, T, Q> const s(normalize(cross(up, f))); + vec<3, T, Q> const u(cross(f, s)); + + mat<4, 4, T, Q> Result(1); + Result[0][0] = s.x; + Result[1][0] = s.y; + Result[2][0] = s.z; + Result[0][1] = u.x; + Result[1][1] = u.y; + Result[2][1] = u.z; + Result[0][2] = f.x; + Result[1][2] = f.y; + Result[2][2] = f.z; + Result[3][0] = -dot(s, eye); + Result[3][1] = -dot(u, eye); + Result[3][2] = -dot(f, eye); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAt(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up) + { + GLM_IF_CONSTEXPR(GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT) + return lookAtLH(eye, center, up); + else + return lookAtRH(eye, center, up); + } +}//namespace glm diff --git a/dep/glm/ext/matrix_uint2x2.hpp b/dep/glm/ext/matrix_uint2x2.hpp new file mode 100644 index 0000000..034771a --- /dev/null +++ b/dep/glm/ext/matrix_uint2x2.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_uint2x2 +/// @file glm/ext/matrix_uint2x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint2x2 GLM_EXT_matrix_uint2x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x2 + /// @{ + + /// Unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2 + typedef mat<2, 2, uint, defaultp> umat2x2; + + /// Unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2 + typedef mat<2, 2, uint, defaultp> umat2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint2x2_sized.hpp b/dep/glm/ext/matrix_uint2x2_sized.hpp new file mode 100644 index 0000000..4555324 --- /dev/null +++ b/dep/glm/ext/matrix_uint2x2_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_uint2x2_sized +/// @file glm/ext/matrix_uint2x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint2x2_sized GLM_EXT_matrix_uint2x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x2.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x2_sized + /// @{ + + /// 8 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint8, defaultp> u8mat2x2; + + /// 16 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint16, defaultp> u16mat2x2; + + /// 32 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint32, defaultp> u32mat2x2; + + /// 64 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint64, defaultp> u64mat2x2; + + + /// 8 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint8, defaultp> u8mat2; + + /// 16 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint16, defaultp> u16mat2; + + /// 32 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint32, defaultp> u32mat2; + + /// 64 bit unsigned integer 2x2 matrix. + /// + /// @see ext_matrix_uint2x2_sized + typedef mat<2, 2, uint64, defaultp> u64mat2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint2x3.hpp b/dep/glm/ext/matrix_uint2x3.hpp new file mode 100644 index 0000000..7de62f6 --- /dev/null +++ b/dep/glm/ext/matrix_uint2x3.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint2x3 +/// @file glm/ext/matrix_uint2x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int2x3 GLM_EXT_matrix_uint2x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x3 + /// @{ + + /// Unsigned integer 2x3 matrix. + /// + /// @see ext_matrix_uint2x3 + typedef mat<2, 3, uint, defaultp> umat2x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint2x3_sized.hpp b/dep/glm/ext/matrix_uint2x3_sized.hpp new file mode 100644 index 0000000..db7939c --- /dev/null +++ b/dep/glm/ext/matrix_uint2x3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint2x3_sized +/// @file glm/ext/matrix_uint2x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint2x3_sized GLM_EXT_matrix_uint2x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x3.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x3_sized + /// @{ + + /// 8 bit unsigned integer 2x3 matrix. + /// + /// @see ext_matrix_uint2x3_sized + typedef mat<2, 3, uint8, defaultp> u8mat2x3; + + /// 16 bit unsigned integer 2x3 matrix. + /// + /// @see ext_matrix_uint2x3_sized + typedef mat<2, 3, uint16, defaultp> u16mat2x3; + + /// 32 bit unsigned integer 2x3 matrix. + /// + /// @see ext_matrix_uint2x3_sized + typedef mat<2, 3, uint32, defaultp> u32mat2x3; + + /// 64 bit unsigned integer 2x3 matrix. + /// + /// @see ext_matrix_uint2x3_sized + typedef mat<2, 3, uint64, defaultp> u64mat2x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint2x4.hpp b/dep/glm/ext/matrix_uint2x4.hpp new file mode 100644 index 0000000..0f99350 --- /dev/null +++ b/dep/glm/ext/matrix_uint2x4.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint2x4 +/// @file glm/ext/matrix_uint2x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint2x4 GLM_EXT_matrix_int2x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x4 + /// @{ + + /// Unsigned integer 2x4 matrix. + /// + /// @see ext_matrix_uint2x4 + typedef mat<2, 4, uint, defaultp> umat2x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint2x4_sized.hpp b/dep/glm/ext/matrix_uint2x4_sized.hpp new file mode 100644 index 0000000..5cb8e54 --- /dev/null +++ b/dep/glm/ext/matrix_uint2x4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint2x4_sized +/// @file glm/ext/matrixu_uint2x4_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint2x4_sized GLM_EXT_matrix_uint2x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x4.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint2x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint2x4_sized + /// @{ + + /// 8 bit unsigned integer 2x4 matrix. + /// + /// @see ext_matrix_uint2x4_sized + typedef mat<2, 4, uint8, defaultp> u8mat2x4; + + /// 16 bit unsigned integer 2x4 matrix. + /// + /// @see ext_matrix_uint2x4_sized + typedef mat<2, 4, uint16, defaultp> u16mat2x4; + + /// 32 bit unsigned integer 2x4 matrix. + /// + /// @see ext_matrix_uint2x4_sized + typedef mat<2, 4, uint32, defaultp> u32mat2x4; + + /// 64 bit unsigned integer 2x4 matrix. + /// + /// @see ext_matrix_uint2x4_sized + typedef mat<2, 4, uint64, defaultp> u64mat2x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint3x2.hpp b/dep/glm/ext/matrix_uint3x2.hpp new file mode 100644 index 0000000..47f4873 --- /dev/null +++ b/dep/glm/ext/matrix_uint3x2.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint3x2 +/// @file glm/ext/matrix_uint3x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_int3x2 GLM_EXT_matrix_uint3x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x2 + /// @{ + + /// Unsigned integer 3x2 matrix. + /// + /// @see ext_matrix_uint3x2 + typedef mat<3, 2, uint, defaultp> umat3x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint3x2_sized.hpp b/dep/glm/ext/matrix_uint3x2_sized.hpp new file mode 100644 index 0000000..c81af8f --- /dev/null +++ b/dep/glm/ext/matrix_uint3x2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint3x2_sized +/// @file glm/ext/matrix_uint3x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint3x2_sized GLM_EXT_matrix_uint3x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x2.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x2_sized + /// @{ + + /// 8 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_uint3x2_sized + typedef mat<3, 2, uint8, defaultp> u8mat3x2; + + /// 16 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_uint3x2_sized + typedef mat<3, 2, uint16, defaultp> u16mat3x2; + + /// 32 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_uint3x2_sized + typedef mat<3, 2, uint32, defaultp> u32mat3x2; + + /// 64 bit signed integer 3x2 matrix. + /// + /// @see ext_matrix_uint3x2_sized + typedef mat<3, 2, uint64, defaultp> u64mat3x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint3x3.hpp b/dep/glm/ext/matrix_uint3x3.hpp new file mode 100644 index 0000000..1004c0d --- /dev/null +++ b/dep/glm/ext/matrix_uint3x3.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_uint3x3 +/// @file glm/ext/matrix_uint3x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint3x3 GLM_EXT_matrix_uint3x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x3 + /// @{ + + /// Unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3 + typedef mat<3, 3, uint, defaultp> umat3x3; + + /// Unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3 + typedef mat<3, 3, uint, defaultp> umat3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint3x3_sized.hpp b/dep/glm/ext/matrix_uint3x3_sized.hpp new file mode 100644 index 0000000..41a8be7 --- /dev/null +++ b/dep/glm/ext/matrix_uint3x3_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_uint3x3_sized +/// @file glm/ext/matrix_uint3x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint3x3_sized GLM_EXT_matrix_uint3x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x3.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x3_sized + /// @{ + + /// 8 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint8, defaultp> u8mat3x3; + + /// 16 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint16, defaultp> u16mat3x3; + + /// 32 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint32, defaultp> u32mat3x3; + + /// 64 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint64, defaultp> u64mat3x3; + + + /// 8 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint8, defaultp> u8mat3; + + /// 16 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint16, defaultp> u16mat3; + + /// 32 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint32, defaultp> u32mat3; + + /// 64 bit unsigned integer 3x3 matrix. + /// + /// @see ext_matrix_uint3x3_sized + typedef mat<3, 3, uint64, defaultp> u64mat3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint3x4.hpp b/dep/glm/ext/matrix_uint3x4.hpp new file mode 100644 index 0000000..c6dd78c --- /dev/null +++ b/dep/glm/ext/matrix_uint3x4.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint3x4 +/// @file glm/ext/matrix_uint3x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint3x4 GLM_EXT_matrix_uint3x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x4 + /// @{ + + /// Signed integer 3x4 matrix. + /// + /// @see ext_matrix_uint3x4 + typedef mat<3, 4, uint, defaultp> umat3x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint3x4_sized.hpp b/dep/glm/ext/matrix_uint3x4_sized.hpp new file mode 100644 index 0000000..2ce28ad --- /dev/null +++ b/dep/glm/ext/matrix_uint3x4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint3x4_sized +/// @file glm/ext/matrix_uint3x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint3x4_sized GLM_EXT_matrix_uint3x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat3x4.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint3x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint3x4_sized + /// @{ + + /// 8 bit unsigned integer 3x4 matrix. + /// + /// @see ext_matrix_uint3x4_sized + typedef mat<3, 4, uint8, defaultp> u8mat3x4; + + /// 16 bit unsigned integer 3x4 matrix. + /// + /// @see ext_matrix_uint3x4_sized + typedef mat<3, 4, uint16, defaultp> u16mat3x4; + + /// 32 bit unsigned integer 3x4 matrix. + /// + /// @see ext_matrix_uint3x4_sized + typedef mat<3, 4, uint32, defaultp> u32mat3x4; + + /// 64 bit unsigned integer 3x4 matrix. + /// + /// @see ext_matrix_uint3x4_sized + typedef mat<3, 4, uint64, defaultp> u64mat3x4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint4x2.hpp b/dep/glm/ext/matrix_uint4x2.hpp new file mode 100644 index 0000000..0446f57 --- /dev/null +++ b/dep/glm/ext/matrix_uint4x2.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint4x2 +/// @file glm/ext/matrix_uint4x2.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x2 GLM_EXT_matrix_uint4x2 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x2 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x2 + /// @{ + + /// Unsigned integer 4x2 matrix. + /// + /// @see ext_matrix_uint4x2 + typedef mat<4, 2, uint, defaultp> umat4x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint4x2_sized.hpp b/dep/glm/ext/matrix_uint4x2_sized.hpp new file mode 100644 index 0000000..57a66bf --- /dev/null +++ b/dep/glm/ext/matrix_uint4x2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint4x2_sized +/// @file glm/ext/matrix_uint4x2_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x2_sized GLM_EXT_matrix_uint4x2_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x2.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x2_sized + /// @{ + + /// 8 bit unsigned integer 4x2 matrix. + /// + /// @see ext_matrix_uint4x2_sized + typedef mat<4, 2, uint8, defaultp> u8mat4x2; + + /// 16 bit unsigned integer 4x2 matrix. + /// + /// @see ext_matrix_uint4x2_sized + typedef mat<4, 2, uint16, defaultp> u16mat4x2; + + /// 32 bit unsigned integer 4x2 matrix. + /// + /// @see ext_matrix_uint4x2_sized + typedef mat<4, 2, uint32, defaultp> u32mat4x2; + + /// 64 bit unsigned integer 4x2 matrix. + /// + /// @see ext_matrix_uint4x2_sized + typedef mat<4, 2, uint64, defaultp> u64mat4x2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint4x3.hpp b/dep/glm/ext/matrix_uint4x3.hpp new file mode 100644 index 0000000..54c24e4 --- /dev/null +++ b/dep/glm/ext/matrix_uint4x3.hpp @@ -0,0 +1,33 @@ +/// @ref ext_matrix_uint4x3 +/// @file glm/ext/matrix_uint4x3.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x3 GLM_EXT_matrix_uint4x3 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x3.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x3 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x3 + /// @{ + + /// Unsigned integer 4x3 matrix. + /// + /// @see ext_matrix_uint4x3 + typedef mat<4, 3, uint, defaultp> umat4x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint4x3_sized.hpp b/dep/glm/ext/matrix_uint4x3_sized.hpp new file mode 100644 index 0000000..2e61124 --- /dev/null +++ b/dep/glm/ext/matrix_uint4x3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_matrix_uint4x3_sized +/// @file glm/ext/matrix_uint4x3_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x3_sized GLM_EXT_matrix_uint4x3_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x3.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x3_sized + /// @{ + + /// 8 bit unsigned integer 4x3 matrix. + /// + /// @see ext_matrix_uint4x3_sized + typedef mat<4, 3, uint8, defaultp> u8mat4x3; + + /// 16 bit unsigned integer 4x3 matrix. + /// + /// @see ext_matrix_uint4x3_sized + typedef mat<4, 3, uint16, defaultp> u16mat4x3; + + /// 32 bit unsigned integer 4x3 matrix. + /// + /// @see ext_matrix_uint4x3_sized + typedef mat<4, 3, uint32, defaultp> u32mat4x3; + + /// 64 bit unsigned integer 4x3 matrix. + /// + /// @see ext_matrix_uint4x3_sized + typedef mat<4, 3, uint64, defaultp> u64mat4x3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint4x4.hpp b/dep/glm/ext/matrix_uint4x4.hpp new file mode 100644 index 0000000..5cc8455 --- /dev/null +++ b/dep/glm/ext/matrix_uint4x4.hpp @@ -0,0 +1,38 @@ +/// @ref ext_matrix_uint4x4 +/// @file glm/ext/matrix_uint4x4.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x4 GLM_EXT_matrix_uint4x4 +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x4 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x4 + /// @{ + + /// Unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4 + typedef mat<4, 4, uint, defaultp> umat4x4; + + /// Unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4 + typedef mat<4, 4, uint, defaultp> umat4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/matrix_uint4x4_sized.hpp b/dep/glm/ext/matrix_uint4x4_sized.hpp new file mode 100644 index 0000000..bb10bd2 --- /dev/null +++ b/dep/glm/ext/matrix_uint4x4_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_matrix_uint4x4_sized +/// @file glm/ext/matrix_uint4x4_sized.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_matrix_uint4x4_sized GLM_EXT_matrix_uint4x4_sized +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat4x4.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_matrix_uint4x4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_matrix_uint4x4_sized + /// @{ + + /// 8 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint8, defaultp> u8mat4x4; + + /// 16 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint16, defaultp> u16mat4x4; + + /// 32 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint32, defaultp> u32mat4x4; + + /// 64 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint64, defaultp> u64mat4x4; + + + /// 8 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint8, defaultp> u8mat4; + + /// 16 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint16, defaultp> u16mat4; + + /// 32 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint32, defaultp> u32mat4; + + /// 64 bit unsigned integer 4x4 matrix. + /// + /// @see ext_matrix_uint4x4_sized + typedef mat<4, 4, uint64, defaultp> u64mat4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/quaternion_common.hpp b/dep/glm/ext/quaternion_common.hpp new file mode 100644 index 0000000..f519d55 --- /dev/null +++ b/dep/glm/ext/quaternion_common.hpp @@ -0,0 +1,135 @@ +/// @ref ext_quaternion_common +/// @file glm/ext/quaternion_common.hpp +/// +/// @defgroup ext_quaternion_common GLM_EXT_quaternion_common +/// @ingroup ext +/// +/// Provides common functions for quaternion types +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_common +/// @see ext_vector_common +/// @see ext_quaternion_float +/// @see ext_quaternion_double +/// @see ext_quaternion_exponential +/// @see ext_quaternion_geometric +/// @see ext_quaternion_relational +/// @see ext_quaternion_trigonometric +/// @see ext_quaternion_transform + +#pragma once + +// Dependency: +#include "../ext/scalar_constants.hpp" +#include "../ext/quaternion_geometric.hpp" +#include "../common.hpp" +#include "../trigonometric.hpp" +#include "../exponential.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_common extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_common + /// @{ + + /// 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 A floating-point scalar type + /// @tparam Q A value from qualifier enum + /// + /// @see - slerp(qua const& x, qua const& y, T const& a) + template + GLM_FUNC_DECL qua mix(qua const& x, qua const& y, T a); + + /// 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 A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua lerp(qua const& x, qua const& y, T 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 A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua slerp(qua const& x, qua const& y, T a); + + /// Spherical linear interpolation of two quaternions with multiple spins over rotation axis. + /// The interpolation always take the short path when the spin count is positive and long path + /// when count is negative. 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]. + /// @param k Additional spin count. If Value is negative interpolation will be on "long" path. + /// + /// @tparam T A floating-point scalar type + /// @tparam S An integer scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua slerp(qua const& x, qua const& y, T a, S k); + + /// Returns the q conjugate. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua conjugate(qua const& q); + + /// Returns the q inverse. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua inverse(qua const& q); + + /// Returns true if x holds a NaN (not a number) + /// representation in the underlying implementation's set of + /// floating point representations. Returns false otherwise, + /// including for implementations with no NaN + /// representations. + /// + /// /!\ When using compiler fast math, this function may fail. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> isnan(qua const& x); + + /// Returns true if x holds a positive infinity or negative + /// infinity representation in the underlying implementation's + /// set of floating point representations. Returns false + /// otherwise, including for implementations with no infinity + /// representations. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> isinf(qua const& x); + + /// @} +} //namespace glm + +#include "quaternion_common.inl" diff --git a/dep/glm/ext/quaternion_common.inl b/dep/glm/ext/quaternion_common.inl new file mode 100644 index 0000000..0e4a3bb --- /dev/null +++ b/dep/glm/ext/quaternion_common.inl @@ -0,0 +1,144 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER qua mix(qua const& x, qua const& y, T a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'mix' only accept floating-point inputs"); + + T const cosTheta = dot(x, y); + + // Perform a linear interpolation when cosTheta is close to 1 to avoid side effect of sin(angle) becoming a zero denominator + if(cosTheta > static_cast(1) - epsilon()) + { + // Linear interpolation + return qua( + mix(x.w, y.w, a), + mix(x.x, y.x, a), + mix(x.y, y.y, a), + mix(x.z, y.z, a)); + } + else + { + // Essential Mathematics, page 467 + T angle = acos(cosTheta); + return (sin((static_cast(1) - a) * angle) * x + sin(a * angle) * y) / sin(angle); + } + } + + template + GLM_FUNC_QUALIFIER qua lerp(qua const& x, qua const& y, T a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'lerp' only accept floating-point inputs"); + + // Lerp is only defined in [0, 1] + assert(a >= static_cast(0)); + assert(a <= static_cast(1)); + + return x * (static_cast(1) - a) + (y * a); + } + + template + GLM_FUNC_QUALIFIER qua slerp(qua const& x, qua const& y, T a) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'slerp' only accept floating-point inputs"); + + qua z = y; + + T cosTheta = dot(x, y); + + // If cosTheta < 0, the interpolation will take the long way around the sphere. + // To fix this, one quat must be negated. + if(cosTheta < static_cast(0)) + { + z = -y; + cosTheta = -cosTheta; + } + + // Perform a linear interpolation when cosTheta is close to 1 to avoid side effect of sin(angle) becoming a zero denominator + if(cosTheta > static_cast(1) - epsilon()) + { + // Linear interpolation + return qua( + mix(x.w, z.w, a), + mix(x.x, z.x, a), + mix(x.y, z.y, a), + mix(x.z, z.z, a)); + } + else + { + // Essential Mathematics, page 467 + T angle = acos(cosTheta); + return (sin((static_cast(1) - a) * angle) * x + sin(a * angle) * z) / sin(angle); + } + } + + template + GLM_FUNC_QUALIFIER qua slerp(qua const& x, qua const& y, T a, S k) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'slerp' only accept floating-point inputs"); + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'slerp' only accept integer for spin count"); + + qua z = y; + + T cosTheta = dot(x, y); + + // If cosTheta < 0, the interpolation will take the long way around the sphere. + // To fix this, one quat must be negated. + if (cosTheta < static_cast(0)) + { + z = -y; + cosTheta = -cosTheta; + } + + // Perform a linear interpolation when cosTheta is close to 1 to avoid side effect of sin(angle) becoming a zero denominator + if (cosTheta > static_cast(1) - epsilon()) + { + // Linear interpolation + return qua( + mix(x.w, z.w, a), + mix(x.x, z.x, a), + mix(x.y, z.y, a), + mix(x.z, z.z, a)); + } + else + { + // Graphics Gems III, page 96 + T angle = acos(cosTheta); + T phi = angle + k * glm::pi(); + return (sin(angle - a * phi)* x + sin(a * phi) * z) / sin(angle); + } + } + + template + GLM_FUNC_QUALIFIER qua conjugate(qua const& q) + { + return qua(q.w, -q.x, -q.y, -q.z); + } + + template + GLM_FUNC_QUALIFIER qua inverse(qua const& q) + { + return conjugate(q) / dot(q, q); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> isnan(qua const& q) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isnan' only accept floating-point inputs"); + + return vec<4, bool, Q>(isnan(q.x), isnan(q.y), isnan(q.z), isnan(q.w)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> isinf(qua const& q) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isinf' only accept floating-point inputs"); + + return vec<4, bool, Q>(isinf(q.x), isinf(q.y), isinf(q.z), isinf(q.w)); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "quaternion_common_simd.inl" +#endif + diff --git a/dep/glm/ext/quaternion_common_simd.inl b/dep/glm/ext/quaternion_common_simd.inl new file mode 100644 index 0000000..ddfc8a4 --- /dev/null +++ b/dep/glm/ext/quaternion_common_simd.inl @@ -0,0 +1,18 @@ +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +namespace glm{ +namespace detail +{ + template + struct compute_dot, float, true> + { + static GLM_FUNC_QUALIFIER float call(qua const& x, qua const& y) + { + return _mm_cvtss_f32(glm_vec1_dot(x.data, y.data)); + } + }; +}//namespace detail +}//namespace glm + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT + diff --git a/dep/glm/ext/quaternion_double.hpp b/dep/glm/ext/quaternion_double.hpp new file mode 100644 index 0000000..63b24de --- /dev/null +++ b/dep/glm/ext/quaternion_double.hpp @@ -0,0 +1,39 @@ +/// @ref ext_quaternion_double +/// @file glm/ext/quaternion_double.hpp +/// +/// @defgroup ext_quaternion_double GLM_EXT_quaternion_double +/// @ingroup ext +/// +/// Exposes double-precision floating point quaternion type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_quaternion_float +/// @see ext_quaternion_double_precision +/// @see ext_quaternion_common +/// @see ext_quaternion_exponential +/// @see ext_quaternion_geometric +/// @see ext_quaternion_relational +/// @see ext_quaternion_transform +/// @see ext_quaternion_trigonometric + +#pragma once + +// Dependency: +#include "../detail/type_quat.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_double extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_double + /// @{ + + /// Quaternion of double-precision floating-point numbers. + typedef qua dquat; + + /// @} +} //namespace glm + diff --git a/dep/glm/ext/quaternion_double_precision.hpp b/dep/glm/ext/quaternion_double_precision.hpp new file mode 100644 index 0000000..8aa24a1 --- /dev/null +++ b/dep/glm/ext/quaternion_double_precision.hpp @@ -0,0 +1,42 @@ +/// @ref ext_quaternion_double_precision +/// @file glm/ext/quaternion_double_precision.hpp +/// +/// @defgroup ext_quaternion_double_precision GLM_EXT_quaternion_double_precision +/// @ingroup ext +/// +/// Exposes double-precision floating point quaternion type with various precision in term of ULPs. +/// +/// Include to use the features of this extension. + +#pragma once + +// Dependency: +#include "../detail/type_quat.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_double_precision extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_double_precision + /// @{ + + /// Quaternion of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see ext_quaternion_double_precision + typedef qua lowp_dquat; + + /// Quaternion of medium double-qualifier floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see ext_quaternion_double_precision + typedef qua mediump_dquat; + + /// Quaternion of high double-qualifier floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see ext_quaternion_double_precision + typedef qua highp_dquat; + + /// @} +} //namespace glm + diff --git a/dep/glm/ext/quaternion_exponential.hpp b/dep/glm/ext/quaternion_exponential.hpp new file mode 100644 index 0000000..affe297 --- /dev/null +++ b/dep/glm/ext/quaternion_exponential.hpp @@ -0,0 +1,63 @@ +/// @ref ext_quaternion_exponential +/// @file glm/ext/quaternion_exponential.hpp +/// +/// @defgroup ext_quaternion_exponential GLM_EXT_quaternion_exponential +/// @ingroup ext +/// +/// Provides exponential functions for quaternion types +/// +/// Include to use the features of this extension. +/// +/// @see core_exponential +/// @see ext_quaternion_float +/// @see ext_quaternion_double + +#pragma once + +// Dependency: +#include "../common.hpp" +#include "../trigonometric.hpp" +#include "../geometric.hpp" +#include "../ext/scalar_constants.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_exponential extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_transform + /// @{ + + /// Returns a exponential of a quaternion. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua exp(qua const& q); + + /// Returns a logarithm of a quaternion + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua log(qua const& q); + + /// Returns a quaternion raised to a power. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua pow(qua const& q, T y); + + /// Returns the square root of a quaternion + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua sqrt(qua const& q); + + /// @} +} //namespace glm + +#include "quaternion_exponential.inl" diff --git a/dep/glm/ext/quaternion_exponential.inl b/dep/glm/ext/quaternion_exponential.inl new file mode 100644 index 0000000..8456c00 --- /dev/null +++ b/dep/glm/ext/quaternion_exponential.inl @@ -0,0 +1,85 @@ +#include "scalar_constants.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER qua exp(qua const& q) + { + vec<3, T, Q> u(q.x, q.y, q.z); + T const Angle = glm::length(u); + if (Angle < epsilon()) + return qua(); + + vec<3, T, Q> const v(u / Angle); + return qua(cos(Angle), sin(Angle) * v); + } + + template + GLM_FUNC_QUALIFIER qua log(qua const& q) + { + vec<3, T, Q> u(q.x, q.y, q.z); + T Vec3Len = length(u); + + if (Vec3Len < epsilon()) + { + if(q.w > static_cast(0)) + return qua(log(q.w), static_cast(0), static_cast(0), static_cast(0)); + else if(q.w < static_cast(0)) + return qua(log(-q.w), pi(), static_cast(0), static_cast(0)); + else + return qua(std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity()); + } + else + { + T t = atan(Vec3Len, T(q.w)) / Vec3Len; + T QuatLen2 = Vec3Len * Vec3Len + q.w * q.w; + return qua(static_cast(0.5) * log(QuatLen2), t * q.x, t * q.y, t * q.z); + } + } + + template + GLM_FUNC_QUALIFIER qua pow(qua const& x, T 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 qua(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); + + T Angle; + if(abs(x.w / magnitude) > cos_one_over_two()) + { + //Scalar component is close to 1; using it to recover angle would lose precision + //Instead, we use the non-scalar components since sin() is accurate around 0 + + //Prevent a division by 0 error later on + T VectorMagnitude = x.x * x.x + x.y * x.y + x.z * x.z; + if (glm::abs(VectorMagnitude - static_cast(0)) < glm::epsilon()) { + //Equivalent to raising a real number to a power + return qua(pow(x.w, y), 0, 0, 0); + } + + Angle = asin(sqrt(VectorMagnitude) / magnitude); + } + else + { + //Scalar component is small, shouldn't cause loss of precision + Angle = acos(x.w / magnitude); + } + + T NewAngle = Angle * y; + T Div = sin(NewAngle) / sin(Angle); + T Mag = pow(magnitude, y - static_cast(1)); + return qua(cos(NewAngle) * magnitude * Mag, x.x * Div * Mag, x.y * Div * Mag, x.z * Div * Mag); + } + + template + GLM_FUNC_QUALIFIER qua sqrt(qua const& x) + { + return pow(x, static_cast(0.5)); + } +}//namespace glm + + diff --git a/dep/glm/ext/quaternion_float.hpp b/dep/glm/ext/quaternion_float.hpp new file mode 100644 index 0000000..ca42a60 --- /dev/null +++ b/dep/glm/ext/quaternion_float.hpp @@ -0,0 +1,39 @@ +/// @ref ext_quaternion_float +/// @file glm/ext/quaternion_float.hpp +/// +/// @defgroup ext_quaternion_float GLM_EXT_quaternion_float +/// @ingroup ext +/// +/// Exposes single-precision floating point quaternion type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_quaternion_double +/// @see ext_quaternion_float_precision +/// @see ext_quaternion_common +/// @see ext_quaternion_exponential +/// @see ext_quaternion_geometric +/// @see ext_quaternion_relational +/// @see ext_quaternion_transform +/// @see ext_quaternion_trigonometric + +#pragma once + +// Dependency: +#include "../detail/type_quat.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_float extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_float + /// @{ + + /// Quaternion of single-precision floating-point numbers. + typedef qua quat; + + /// @} +} //namespace glm + diff --git a/dep/glm/ext/quaternion_float_precision.hpp b/dep/glm/ext/quaternion_float_precision.hpp new file mode 100644 index 0000000..f9e4f5c --- /dev/null +++ b/dep/glm/ext/quaternion_float_precision.hpp @@ -0,0 +1,36 @@ +/// @ref ext_quaternion_float_precision +/// @file glm/ext/quaternion_float_precision.hpp +/// +/// @defgroup ext_quaternion_float_precision GLM_EXT_quaternion_float_precision +/// @ingroup ext +/// +/// Exposes single-precision floating point quaternion type with various precision in term of ULPs. +/// +/// Include to use the features of this extension. + +#pragma once + +// Dependency: +#include "../detail/type_quat.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_float_precision extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_float_precision + /// @{ + + /// Quaternion of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef qua lowp_quat; + + /// Quaternion of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef qua mediump_quat; + + /// Quaternion of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef qua highp_quat; + + /// @} +} //namespace glm + diff --git a/dep/glm/ext/quaternion_geometric.hpp b/dep/glm/ext/quaternion_geometric.hpp new file mode 100644 index 0000000..6d98bbe --- /dev/null +++ b/dep/glm/ext/quaternion_geometric.hpp @@ -0,0 +1,70 @@ +/// @ref ext_quaternion_geometric +/// @file glm/ext/quaternion_geometric.hpp +/// +/// @defgroup ext_quaternion_geometric GLM_EXT_quaternion_geometric +/// @ingroup ext +/// +/// Provides geometric functions for quaternion types +/// +/// Include to use the features of this extension. +/// +/// @see core_geometric +/// @see ext_quaternion_float +/// @see ext_quaternion_double + +#pragma once + +// Dependency: +#include "../geometric.hpp" +#include "../exponential.hpp" +#include "../ext/vector_relational.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_geometric extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_geometric + /// @{ + + /// Returns the norm of a quaternions + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_geometric + template + GLM_FUNC_DECL T length(qua const& q); + + /// Returns the normalized quaternion. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_geometric + template + GLM_FUNC_DECL qua normalize(qua const& q); + + /// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ... + /// + /// @tparam T Floating-point scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_geometric + template + GLM_FUNC_DECL T dot(qua const& x, qua const& y); + + /// Compute a cross product. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_geometric + template + GLM_FUNC_QUALIFIER qua cross(qua const& q1, qua const& q2); + + /// @} +} //namespace glm + +#include "quaternion_geometric.inl" diff --git a/dep/glm/ext/quaternion_geometric.inl b/dep/glm/ext/quaternion_geometric.inl new file mode 100644 index 0000000..e155ac5 --- /dev/null +++ b/dep/glm/ext/quaternion_geometric.inl @@ -0,0 +1,36 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER T dot(qua const& x, qua const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'dot' accepts only floating-point inputs"); + return detail::compute_dot, T, detail::is_aligned::value>::call(x, y); + } + + template + GLM_FUNC_QUALIFIER T length(qua const& q) + { + return glm::sqrt(dot(q, q)); + } + + template + GLM_FUNC_QUALIFIER qua normalize(qua const& q) + { + T len = length(q); + if(len <= static_cast(0)) // Problem + return qua(static_cast(1), static_cast(0), static_cast(0), static_cast(0)); + T oneOverLen = static_cast(1) / len; + return qua(q.w * oneOverLen, q.x * oneOverLen, q.y * oneOverLen, q.z * oneOverLen); + } + + template + GLM_FUNC_QUALIFIER qua cross(qua const& q1, qua const& q2) + { + return qua( + q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z, + q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y, + q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z, + q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x); + } +}//namespace glm + diff --git a/dep/glm/ext/quaternion_relational.hpp b/dep/glm/ext/quaternion_relational.hpp new file mode 100644 index 0000000..7aa121d --- /dev/null +++ b/dep/glm/ext/quaternion_relational.hpp @@ -0,0 +1,62 @@ +/// @ref ext_quaternion_relational +/// @file glm/ext/quaternion_relational.hpp +/// +/// @defgroup ext_quaternion_relational GLM_EXT_quaternion_relational +/// @ingroup ext +/// +/// Exposes comparison functions for quaternion types that take a user defined epsilon values. +/// +/// Include to use the features of this extension. +/// +/// @see core_vector_relational +/// @see ext_vector_relational +/// @see ext_matrix_relational +/// @see ext_quaternion_float +/// @see ext_quaternion_double + +#pragma once + +// Dependency: +#include "../vector_relational.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_relational extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_relational + /// @{ + + /// Returns the component-wise comparison of result x == y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> equal(qua const& x, qua const& y); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> equal(qua const& x, qua const& y, T epsilon); + + /// Returns the component-wise comparison of result x != y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> notEqual(qua const& x, qua const& y); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL vec<4, bool, Q> notEqual(qua const& x, qua const& y, T epsilon); + + /// @} +} //namespace glm + +#include "quaternion_relational.inl" diff --git a/dep/glm/ext/quaternion_relational.inl b/dep/glm/ext/quaternion_relational.inl new file mode 100644 index 0000000..b1713e9 --- /dev/null +++ b/dep/glm/ext/quaternion_relational.inl @@ -0,0 +1,35 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> equal(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] == y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> equal(qua const& x, qua const& y, T epsilon) + { + vec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); + return lessThan(abs(v), vec<4, T, Q>(epsilon)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> notEqual(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] != y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> notEqual(qua const& x, qua const& y, T epsilon) + { + vec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); + return greaterThanEqual(abs(v), vec<4, T, Q>(epsilon)); + } +}//namespace glm + diff --git a/dep/glm/ext/quaternion_transform.hpp b/dep/glm/ext/quaternion_transform.hpp new file mode 100644 index 0000000..a9cc5c2 --- /dev/null +++ b/dep/glm/ext/quaternion_transform.hpp @@ -0,0 +1,47 @@ +/// @ref ext_quaternion_transform +/// @file glm/ext/quaternion_transform.hpp +/// +/// @defgroup ext_quaternion_transform GLM_EXT_quaternion_transform +/// @ingroup ext +/// +/// Provides transformation functions for quaternion types +/// +/// Include to use the features of this extension. +/// +/// @see ext_quaternion_float +/// @see ext_quaternion_double +/// @see ext_quaternion_exponential +/// @see ext_quaternion_geometric +/// @see ext_quaternion_relational +/// @see ext_quaternion_trigonometric + +#pragma once + +// Dependency: +#include "../common.hpp" +#include "../trigonometric.hpp" +#include "../geometric.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_transform extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_transform + /// @{ + + /// Rotates a quaternion from a vector of 3 components axis and an angle. + /// + /// @param q Source orientation + /// @param angle Angle expressed in radians. + /// @param axis Axis of the rotation + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL qua rotate(qua const& q, T const& angle, vec<3, T, Q> const& axis); + /// @} +} //namespace glm + +#include "quaternion_transform.inl" diff --git a/dep/glm/ext/quaternion_transform.inl b/dep/glm/ext/quaternion_transform.inl new file mode 100644 index 0000000..b87ecb6 --- /dev/null +++ b/dep/glm/ext/quaternion_transform.inl @@ -0,0 +1,24 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER qua rotate(qua const& q, T const& angle, vec<3, T, Q> const& v) + { + vec<3, T, Q> Tmp = v; + + // Axis of rotation must be normalised + T len = glm::length(Tmp); + if(abs(len - static_cast(1)) > static_cast(0.001)) + { + T oneOverLen = static_cast(1) / len; + Tmp.x *= oneOverLen; + Tmp.y *= oneOverLen; + Tmp.z *= oneOverLen; + } + + T const AngleRad(angle); + T const Sin = sin(AngleRad * static_cast(0.5)); + + return q * qua(cos(AngleRad * static_cast(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin); + } +}//namespace glm + diff --git a/dep/glm/ext/quaternion_trigonometric.hpp b/dep/glm/ext/quaternion_trigonometric.hpp new file mode 100644 index 0000000..76cea27 --- /dev/null +++ b/dep/glm/ext/quaternion_trigonometric.hpp @@ -0,0 +1,63 @@ +/// @ref ext_quaternion_trigonometric +/// @file glm/ext/quaternion_trigonometric.hpp +/// +/// @defgroup ext_quaternion_trigonometric GLM_EXT_quaternion_trigonometric +/// @ingroup ext +/// +/// Provides trigonometric functions for quaternion types +/// +/// Include to use the features of this extension. +/// +/// @see ext_quaternion_float +/// @see ext_quaternion_double +/// @see ext_quaternion_exponential +/// @see ext_quaternion_geometric +/// @see ext_quaternion_relational +/// @see ext_quaternion_transform + +#pragma once + +// Dependency: +#include "../trigonometric.hpp" +#include "../exponential.hpp" +#include "scalar_constants.hpp" +#include "vector_relational.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_quaternion_trigonometric extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_quaternion_trigonometric + /// @{ + + /// Returns the quaternion rotation angle. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL T angle(qua const& x); + + /// Returns the q rotation axis. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL vec<3, T, Q> axis(qua const& x); + + /// 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. + /// + /// @tparam T A floating-point scalar type + /// @tparam Q A value from qualifier enum + template + GLM_FUNC_DECL qua angleAxis(T const& angle, vec<3, T, Q> const& axis); + + /// @} +} //namespace glm + +#include "quaternion_trigonometric.inl" diff --git a/dep/glm/ext/quaternion_trigonometric.inl b/dep/glm/ext/quaternion_trigonometric.inl new file mode 100644 index 0000000..06b7c4c --- /dev/null +++ b/dep/glm/ext/quaternion_trigonometric.inl @@ -0,0 +1,34 @@ +#include "scalar_constants.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T angle(qua const& x) + { + if (abs(x.w) > cos_one_over_two()) + { + return asin(sqrt(x.x * x.x + x.y * x.y + x.z * x.z)) * static_cast(2); + } + + return acos(x.w) * static_cast(2); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> axis(qua const& x) + { + T const tmp1 = static_cast(1) - x.w * x.w; + if(tmp1 <= static_cast(0)) + return vec<3, T, Q>(0, 0, 1); + T const tmp2 = static_cast(1) / sqrt(tmp1); + return vec<3, T, Q>(x.x * tmp2, x.y * tmp2, x.z * tmp2); + } + + template + GLM_FUNC_QUALIFIER qua angleAxis(T const& angle, vec<3, T, Q> const& v) + { + T const a(angle); + T const s = glm::sin(a * static_cast(0.5)); + + return qua(glm::cos(a * static_cast(0.5)), v * s); + } +}//namespace glm diff --git a/dep/glm/ext/scalar_common.hpp b/dep/glm/ext/scalar_common.hpp new file mode 100644 index 0000000..aa5a180 --- /dev/null +++ b/dep/glm/ext/scalar_common.hpp @@ -0,0 +1,157 @@ +/// @ref ext_scalar_common +/// @file glm/ext/scalar_common.hpp +/// +/// @defgroup ext_scalar_common GLM_EXT_scalar_common +/// @ingroup ext +/// +/// Exposes min and max functions for 3 to 4 scalar parameters. +/// +/// Include to use the features of this extension. +/// +/// @see core_func_common +/// @see ext_vector_common + +#pragma once + +// Dependency: +#include "../common.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_common extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_scalar_common + /// @{ + + /// Returns the minimum component-wise values of 3 inputs + /// + /// @tparam T A floating-point scalar type. + /// + /// @see ext_scalar_common + template + GLM_FUNC_DECL T min(T a, T b, T c); + + /// Returns the minimum component-wise values of 4 inputs + /// + /// @tparam T A floating-point scalar type. + /// + /// @see ext_scalar_common + template + GLM_FUNC_DECL T min(T a, T b, T c, T d); + + /// Returns the maximum component-wise values of 3 inputs + /// + /// @tparam T A floating-point scalar type. + /// + /// @see ext_scalar_common + template + GLM_FUNC_DECL T max(T a, T b, T c); + + /// Returns the maximum component-wise values of 4 inputs + /// + /// @tparam T A floating-point scalar type. + /// + /// @see ext_scalar_common + template + GLM_FUNC_DECL T max(T a, T b, T c, T d); + + /// Returns the minimum component-wise values of 2 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmin documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmin(T a, T b); + + /// Returns the minimum component-wise values of 3 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmin documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmin(T a, T b, T c); + + /// Returns the minimum component-wise values of 4 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmin documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmin(T a, T b, T c, T d); + + /// Returns the maximum component-wise values of 2 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmax documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmax(T a, T b); + + /// Returns the maximum component-wise values of 3 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmax documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmax(T a, T b, T C); + + /// Returns the maximum component-wise values of 4 inputs. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam T A floating-point scalar type. + /// + /// @see std::fmax documentation + /// @see ext_scalar_common + template + GLM_FUNC_DECL T fmax(T a, T b, T C, T D); + + /// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam genType Floating-point scalar types. + /// + /// @see ext_scalar_common + template + GLM_FUNC_DECL genType fclamp(genType x, genType minVal, genType maxVal); + + /// Simulate GL_CLAMP OpenGL wrap mode + /// + /// @tparam genType Floating-point scalar types. + /// + /// @see ext_scalar_common extension. + template + GLM_FUNC_DECL genType clamp(genType const& Texcoord); + + /// Simulate GL_REPEAT OpenGL wrap mode + /// + /// @tparam genType Floating-point scalar types. + /// + /// @see ext_scalar_common extension. + template + GLM_FUNC_DECL genType repeat(genType const& Texcoord); + + /// Simulate GL_MIRRORED_REPEAT OpenGL wrap mode + /// + /// @tparam genType Floating-point scalar types. + /// + /// @see ext_scalar_common extension. + template + GLM_FUNC_DECL genType mirrorClamp(genType const& Texcoord); + + /// Simulate GL_MIRROR_REPEAT OpenGL wrap mode + /// + /// @tparam genType Floating-point scalar types. + /// + /// @see ext_scalar_common extension. + template + GLM_FUNC_DECL genType mirrorRepeat(genType const& Texcoord); + + /// @} +}//namespace glm + +#include "scalar_common.inl" diff --git a/dep/glm/ext/scalar_common.inl b/dep/glm/ext/scalar_common.inl new file mode 100644 index 0000000..7d9207a --- /dev/null +++ b/dep/glm/ext/scalar_common.inl @@ -0,0 +1,152 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER T min(T a, T b, T c) + { + return glm::min(glm::min(a, b), c); + } + + template + GLM_FUNC_QUALIFIER T min(T a, T b, T c, T d) + { + return glm::min(glm::min(a, b), glm::min(c, d)); + } + + template + GLM_FUNC_QUALIFIER T max(T a, T b, T c) + { + return glm::max(glm::max(a, b), c); + } + + template + GLM_FUNC_QUALIFIER T max(T a, T b, T c, T d) + { + return glm::max(glm::max(a, b), glm::max(c, d)); + } + +# if GLM_HAS_CXX11_STL + using std::fmin; +# else + template + GLM_FUNC_QUALIFIER T fmin(T a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point input"); + + if (isnan(a)) + return b; + return min(a, b); + } +# endif + + template + GLM_FUNC_QUALIFIER T fmin(T a, T b, T c) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point input"); + + if (isnan(a)) + return fmin(b, c); + if (isnan(b)) + return fmin(a, c); + if (isnan(c)) + return min(a, b); + return min(a, b, c); + } + + template + GLM_FUNC_QUALIFIER T fmin(T a, T b, T c, T d) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point input"); + + if (isnan(a)) + return fmin(b, c, d); + if (isnan(b)) + return min(a, fmin(c, d)); + if (isnan(c)) + return fmin(min(a, b), d); + if (isnan(d)) + return min(a, b, c); + return min(a, b, c, d); + } + + +# if GLM_HAS_CXX11_STL + using std::fmax; +# else + template + GLM_FUNC_QUALIFIER T fmax(T a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point input"); + + if (isnan(a)) + return b; + return max(a, b); + } +# endif + + template + GLM_FUNC_QUALIFIER T fmax(T a, T b, T c) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point input"); + + if (isnan(a)) + return fmax(b, c); + if (isnan(b)) + return fmax(a, c); + if (isnan(c)) + return max(a, b); + return max(a, b, c); + } + + template + GLM_FUNC_QUALIFIER T fmax(T a, T b, T c, T d) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point input"); + + if (isnan(a)) + return fmax(b, c, d); + if (isnan(b)) + return max(a, fmax(c, d)); + if (isnan(c)) + return fmax(max(a, b), d); + if (isnan(d)) + return max(a, b, c); + return max(a, b, c, d); + } + + // fclamp + template + GLM_FUNC_QUALIFIER genType fclamp(genType x, genType minVal, genType maxVal) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fclamp' only accept floating-point or integer inputs"); + return fmin(fmax(x, minVal), maxVal); + } + + template + GLM_FUNC_QUALIFIER genType clamp(genType const& Texcoord) + { + return glm::clamp(Texcoord, static_cast(0), static_cast(1)); + } + + template + GLM_FUNC_QUALIFIER genType repeat(genType const& Texcoord) + { + return glm::fract(Texcoord); + } + + template + GLM_FUNC_QUALIFIER genType mirrorClamp(genType const& Texcoord) + { + return glm::fract(glm::abs(Texcoord)); + } + + template + GLM_FUNC_QUALIFIER genType mirrorRepeat(genType const& Texcoord) + { + genType const Abs = glm::abs(Texcoord); + genType const Clamp = glm::mod(glm::floor(Abs), static_cast(2)); + genType const Floor = glm::floor(Abs); + genType const Rest = Abs - Floor; + genType const Mirror = Clamp + Rest; + return mix(Rest, static_cast(1) - Rest, Mirror >= static_cast(1)); + } +}//namespace glm diff --git a/dep/glm/ext/scalar_constants.hpp b/dep/glm/ext/scalar_constants.hpp new file mode 100644 index 0000000..74e210d --- /dev/null +++ b/dep/glm/ext/scalar_constants.hpp @@ -0,0 +1,40 @@ +/// @ref ext_scalar_constants +/// @file glm/ext/scalar_constants.hpp +/// +/// @defgroup ext_scalar_constants GLM_EXT_scalar_constants +/// @ingroup ext +/// +/// Provides a list of constants and precomputed useful values. +/// +/// Include to use the features of this extension. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_constants extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_scalar_constants + /// @{ + + /// Return the epsilon constant for floating point types. + template + GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon(); + + /// Return the pi constant for floating point types. + template + GLM_FUNC_DECL GLM_CONSTEXPR genType pi(); + + /// Return the value of cos(1 / 2) for floating point types. + template + GLM_FUNC_DECL GLM_CONSTEXPR genType cos_one_over_two(); + + /// @} +} //namespace glm + +#include "scalar_constants.inl" diff --git a/dep/glm/ext/scalar_constants.inl b/dep/glm/ext/scalar_constants.inl new file mode 100644 index 0000000..b475adf --- /dev/null +++ b/dep/glm/ext/scalar_constants.inl @@ -0,0 +1,24 @@ +#include + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType epsilon() + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'epsilon' only accepts floating-point inputs"); + return std::numeric_limits::epsilon(); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType pi() + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'pi' only accepts floating-point inputs"); + return static_cast(3.14159265358979323846264338327950288); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType cos_one_over_two() + { + return genType(0.877582561890372716130286068203503191); + } +} //namespace glm diff --git a/dep/glm/ext/scalar_int_sized.hpp b/dep/glm/ext/scalar_int_sized.hpp new file mode 100644 index 0000000..8e9c511 --- /dev/null +++ b/dep/glm/ext/scalar_int_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_scalar_int_sized +/// @file glm/ext/scalar_int_sized.hpp +/// +/// @defgroup ext_scalar_int_sized GLM_EXT_scalar_int_sized +/// @ingroup ext +/// +/// Exposes sized signed integer scalar types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_uint_sized + +#pragma once + +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_int_sized extension included") +#endif + +namespace glm{ +namespace detail +{ +# if GLM_HAS_EXTENDED_INTEGER_TYPE + typedef std::int8_t int8; + typedef std::int16_t int16; + typedef std::int32_t int32; +# else + typedef signed char int8; + typedef signed short int16; + typedef signed int int32; +#endif// + + template<> + struct is_int + { + enum test {value = ~0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; +}//namespace detail + + + /// @addtogroup ext_scalar_int_sized + /// @{ + + /// 8 bit signed integer type. + typedef detail::int8 int8; + + /// 16 bit signed integer type. + typedef detail::int16 int16; + + /// 32 bit signed integer type. + typedef detail::int32 int32; + + /// 64 bit signed integer type. + typedef detail::int64 int64; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/scalar_integer.hpp b/dep/glm/ext/scalar_integer.hpp new file mode 100644 index 0000000..a2ca8a2 --- /dev/null +++ b/dep/glm/ext/scalar_integer.hpp @@ -0,0 +1,92 @@ +/// @ref ext_scalar_integer +/// @file glm/ext/scalar_integer.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_scalar_integer GLM_EXT_scalar_integer +/// @ingroup ext +/// +/// Include to use the features of this extension. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_vectorize.hpp" +#include "../detail/type_float.hpp" +#include "../vector_relational.hpp" +#include "../common.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_integer extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_scalar_integer + /// @{ + + /// Return true if the value is a power of two number. + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL bool isPowerOfTwo(genIUType v); + + /// Return the power of two number which value is just higher the input value, + /// round up to a power of two. + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL genIUType nextPowerOfTwo(genIUType v); + + /// Return the power of two number which value is just lower the input value, + /// round down to a power of two. + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL genIUType prevPowerOfTwo(genIUType v); + + /// Return true if the 'Value' is a multiple of 'Multiple'. + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL bool isMultiple(genIUType v, genIUType Multiple); + + /// Higher multiple number of Source. + /// + /// @tparam genIUType Integer scalar or vector types. + /// + /// @param v Source value to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL genIUType nextMultiple(genIUType v, genIUType Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam genIUType Integer scalar or vector types. + /// + /// @param v Source value to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL genIUType prevMultiple(genIUType v, genIUType Multiple); + + /// Returns the bit number of the Nth significant bit set to + /// 1 in the binary representation of value. + /// If value bitcount is less than the Nth significant bit, -1 will be returned. + /// + /// @tparam genIUType Signed or unsigned integer scalar types. + /// + /// @see ext_scalar_integer + template + GLM_FUNC_DECL int findNSB(genIUType x, int significantBitCount); + + /// @} +} //namespace glm + +#include "scalar_integer.inl" diff --git a/dep/glm/ext/scalar_integer.inl b/dep/glm/ext/scalar_integer.inl new file mode 100644 index 0000000..efba960 --- /dev/null +++ b/dep/glm/ext/scalar_integer.inl @@ -0,0 +1,243 @@ +#include "../integer.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_ceilShift + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T) + { + return v; + } + }; + + template + struct compute_ceilShift + { + GLM_FUNC_QUALIFIER static vec call(vec const& v, T Shift) + { + return v | (v >> Shift); + } + }; + + template + struct compute_ceilPowerOfTwo + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + GLM_STATIC_ASSERT(!std::numeric_limits::is_iec559, "'ceilPowerOfTwo' only accept integer scalar or vector inputs"); + + vec const Sign(sign(x)); + + vec v(abs(x)); + + v = v - static_cast(1); + v = v | (v >> static_cast(1)); + v = v | (v >> static_cast(2)); + v = v | (v >> static_cast(4)); + v = compute_ceilShift= 2>::call(v, 8); + v = compute_ceilShift= 4>::call(v, 16); + v = compute_ceilShift= 8>::call(v, 32); + return (v + static_cast(1)) * Sign; + } + }; + + template + struct compute_ceilPowerOfTwo + { + GLM_FUNC_QUALIFIER static vec call(vec const& x) + { + GLM_STATIC_ASSERT(!std::numeric_limits::is_iec559, "'ceilPowerOfTwo' only accept integer scalar or vector inputs"); + + vec v(x); + + v = v - static_cast(1); + v = v | (v >> static_cast(1)); + v = v | (v >> static_cast(2)); + v = v | (v >> static_cast(4)); + v = compute_ceilShift= 2>::call(v, 8); + v = compute_ceilShift= 4>::call(v, 16); + v = compute_ceilShift= 8>::call(v, 32); + return v + static_cast(1); + } + }; + + template + struct compute_ceilMultiple{}; + + template<> + struct compute_ceilMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if(Source > genType(0)) + return Source + (Multiple - std::fmod(Source, Multiple)); + else + return Source + std::fmod(-Source, Multiple); + } + }; + + template<> + struct compute_ceilMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + genType Tmp = Source - genType(1); + return Tmp + (Multiple - (Tmp % Multiple)); + } + }; + + template<> + struct compute_ceilMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + assert(Multiple > genType(0)); + if(Source > genType(0)) + { + genType Tmp = Source - genType(1); + return Tmp + (Multiple - (Tmp % Multiple)); + } + else + return Source + (-Source % Multiple); + } + }; + + template + struct compute_floorMultiple{}; + + template<> + struct compute_floorMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if(Source >= genType(0)) + return Source - std::fmod(Source, Multiple); + else + return Source - std::fmod(Source, Multiple) - Multiple; + } + }; + + template<> + struct compute_floorMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if(Source >= genType(0)) + return Source - Source % Multiple; + else + { + genType Tmp = Source + genType(1); + return Tmp - Tmp % Multiple - Multiple; + } + } + }; + + template<> + struct compute_floorMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if(Source >= genType(0)) + return Source - Source % Multiple; + else + { + genType Tmp = Source + genType(1); + return Tmp - Tmp % Multiple - Multiple; + } + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER bool isPowerOfTwo(genIUType Value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'isPowerOfTwo' only accept integer inputs"); + + genIUType const Result = glm::abs(Value); + return !(Result & (Result - 1)); + } + + template + GLM_FUNC_QUALIFIER genIUType nextPowerOfTwo(genIUType value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'nextPowerOfTwo' only accept integer inputs"); + + return detail::compute_ceilPowerOfTwo<1, genIUType, defaultp, std::numeric_limits::is_signed>::call(vec<1, genIUType, defaultp>(value)).x; + } + + template + GLM_FUNC_QUALIFIER genIUType prevPowerOfTwo(genIUType value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'prevPowerOfTwo' only accept integer inputs"); + + return isPowerOfTwo(value) ? value : static_cast(static_cast(1) << static_cast(findMSB(value))); + } + + template + GLM_FUNC_QUALIFIER bool isMultiple(genIUType Value, genIUType Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'isMultiple' only accept integer inputs"); + + return isMultiple(vec<1, genIUType>(Value), vec<1, genIUType>(Multiple)).x; + } + + template + GLM_FUNC_QUALIFIER genIUType nextMultiple(genIUType Source, genIUType Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'nextMultiple' only accept integer inputs"); + + return detail::compute_ceilMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER genIUType prevMultiple(genIUType Source, genIUType Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'prevMultiple' only accept integer inputs"); + + return detail::compute_floorMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER int findNSB(genIUType x, int significantBitCount) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findNSB' only accept integer inputs"); + + if(bitCount(x) < significantBitCount) + return -1; + + genIUType const One = static_cast(1); + int bitPos = 0; + + genIUType key = x; + int nBitCount = significantBitCount; + int Step = sizeof(x) * 8 / 2; + while (key > One) + { + genIUType Mask = static_cast((One << Step) - One); + genIUType currentKey = key & Mask; + int currentBitCount = bitCount(currentKey); + if (nBitCount > currentBitCount) + { + nBitCount -= currentBitCount; + bitPos += Step; + key >>= static_cast(Step); + } + else + { + key = key & Mask; + } + + Step >>= 1; + } + + return static_cast(bitPos); + } +}//namespace glm diff --git a/dep/glm/ext/scalar_packing.hpp b/dep/glm/ext/scalar_packing.hpp new file mode 100644 index 0000000..18b85b7 --- /dev/null +++ b/dep/glm/ext/scalar_packing.hpp @@ -0,0 +1,32 @@ +/// @ref ext_scalar_packing +/// @file glm/ext/scalar_packing.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_scalar_packing GLM_EXT_scalar_packing +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// This extension provides a set of function to convert scalar values to packed +/// formats. + +#pragma once + +// Dependency: +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_packing extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_scalar_packing + /// @{ + + + /// @} +}// namespace glm + +#include "scalar_packing.inl" diff --git a/dep/glm/ext/scalar_packing.inl b/dep/glm/ext/scalar_packing.inl new file mode 100644 index 0000000..e69de29 diff --git a/dep/glm/ext/scalar_relational.hpp b/dep/glm/ext/scalar_relational.hpp new file mode 100644 index 0000000..3076a5e --- /dev/null +++ b/dep/glm/ext/scalar_relational.hpp @@ -0,0 +1,65 @@ +/// @ref ext_scalar_relational +/// @file glm/ext/scalar_relational.hpp +/// +/// @defgroup ext_scalar_relational GLM_EXT_scalar_relational +/// @ingroup ext +/// +/// Exposes comparison functions for scalar types that take a user defined epsilon values. +/// +/// Include to use the features of this extension. +/// +/// @see core_vector_relational +/// @see ext_vector_relational +/// @see ext_matrix_relational + +#pragma once + +// Dependencies +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_relational extension included") +#endif + +namespace glm +{ + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam genType Floating-point or integer scalar types + template + GLM_FUNC_DECL GLM_CONSTEXPR bool equal(genType const& x, genType const& y, genType const& epsilon); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam genType Floating-point or integer scalar types + template + GLM_FUNC_DECL GLM_CONSTEXPR bool notEqual(genType const& x, genType const& y, genType const& epsilon); + + /// Returns the component-wise comparison between two scalars in term of ULPs. + /// True if this expression is satisfied. + /// + /// @param x First operand. + /// @param y Second operand. + /// @param ULPs Maximum difference in ULPs between the two operators to consider them equal. + /// + /// @tparam genType Floating-point or integer scalar types + template + GLM_FUNC_DECL GLM_CONSTEXPR bool equal(genType const& x, genType const& y, int ULPs); + + /// Returns the component-wise comparison between two scalars in term of ULPs. + /// True if this expression is not satisfied. + /// + /// @param x First operand. + /// @param y Second operand. + /// @param ULPs Maximum difference in ULPs between the two operators to consider them not equal. + /// + /// @tparam genType Floating-point or integer scalar types + template + GLM_FUNC_DECL GLM_CONSTEXPR bool notEqual(genType const& x, genType const& y, int ULPs); + + /// @} +}//namespace glm + +#include "scalar_relational.inl" diff --git a/dep/glm/ext/scalar_relational.inl b/dep/glm/ext/scalar_relational.inl new file mode 100644 index 0000000..c85583e --- /dev/null +++ b/dep/glm/ext/scalar_relational.inl @@ -0,0 +1,40 @@ +#include "../common.hpp" +#include "../ext/scalar_int_sized.hpp" +#include "../ext/scalar_uint_sized.hpp" +#include "../detail/type_float.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool equal(genType const& x, genType const& y, genType const& epsilon) + { + return abs(x - y) <= epsilon; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool notEqual(genType const& x, genType const& y, genType const& epsilon) + { + return abs(x - y) > epsilon; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool equal(genType const& x, genType const& y, int MaxULPs) + { + detail::float_t const a(x); + detail::float_t const b(y); + + // Different signs means they do not match. + if(a.negative() != b.negative()) + return false; + + // Find the difference in ULPs. + typename detail::float_t::int_type const DiffULPs = abs(a.i - b.i); + return DiffULPs <= MaxULPs; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool notEqual(genType const& x, genType const& y, int ULPs) + { + return !equal(x, y, ULPs); + } +}//namespace glm diff --git a/dep/glm/ext/scalar_uint_sized.hpp b/dep/glm/ext/scalar_uint_sized.hpp new file mode 100644 index 0000000..fd5267f --- /dev/null +++ b/dep/glm/ext/scalar_uint_sized.hpp @@ -0,0 +1,70 @@ +/// @ref ext_scalar_uint_sized +/// @file glm/ext/scalar_uint_sized.hpp +/// +/// @defgroup ext_scalar_uint_sized GLM_EXT_scalar_uint_sized +/// @ingroup ext +/// +/// Exposes sized unsigned integer scalar types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_int_sized + +#pragma once + +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_uint_sized extension included") +#endif + +namespace glm{ +namespace detail +{ +# if GLM_HAS_EXTENDED_INTEGER_TYPE + typedef std::uint8_t uint8; + typedef std::uint16_t uint16; + typedef std::uint32_t uint32; +# else + typedef unsigned char uint8; + typedef unsigned short uint16; + typedef unsigned int uint32; +#endif + + template<> + struct is_int + { + enum test {value = ~0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; + + template<> + struct is_int + { + enum test {value = ~0}; + }; +}//namespace detail + + + /// @addtogroup ext_scalar_uint_sized + /// @{ + + /// 8 bit unsigned integer type. + typedef detail::uint8 uint8; + + /// 16 bit unsigned integer type. + typedef detail::uint16 uint16; + + /// 32 bit unsigned integer type. + typedef detail::uint32 uint32; + + /// 64 bit unsigned integer type. + typedef detail::uint64 uint64; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/scalar_ulp.hpp b/dep/glm/ext/scalar_ulp.hpp new file mode 100644 index 0000000..941ada3 --- /dev/null +++ b/dep/glm/ext/scalar_ulp.hpp @@ -0,0 +1,74 @@ +/// @ref ext_scalar_ulp +/// @file glm/ext/scalar_ulp.hpp +/// +/// @defgroup ext_scalar_ulp GLM_EXT_scalar_ulp +/// @ingroup ext +/// +/// Allow the measurement of the accuracy of a function against a reference +/// implementation. This extension works on floating-point data and provide results +/// in ULP. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_ulp +/// @see ext_scalar_relational + +#pragma once + +// Dependencies +#include "../ext/scalar_int_sized.hpp" +#include "../common.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_scalar_ulp extension included") +#endif + +namespace glm +{ + /// Return the next ULP value(s) after the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL genType nextFloat(genType x); + + /// Return the previous ULP value(s) before the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL genType prevFloat(genType x); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL genType nextFloat(genType x, int ULPs); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL genType prevFloat(genType x, int ULPs); + + /// Return the distance in the number of ULP between 2 single-precision floating-point scalars. + /// + /// @see ext_scalar_ulp + GLM_FUNC_DECL int floatDistance(float x, float y); + + /// Return the distance in the number of ULP between 2 double-precision floating-point scalars. + /// + /// @see ext_scalar_ulp + GLM_FUNC_DECL int64 floatDistance(double x, double y); + + /// @} +}//namespace glm + +#include "scalar_ulp.inl" diff --git a/dep/glm/ext/scalar_ulp.inl b/dep/glm/ext/scalar_ulp.inl new file mode 100644 index 0000000..308df15 --- /dev/null +++ b/dep/glm/ext/scalar_ulp.inl @@ -0,0 +1,284 @@ +/// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +/// +/// Developed at SunPro, a Sun Microsystems, Inc. business. +/// Permission to use, copy, modify, and distribute this +/// software is freely granted, provided that this notice +/// is preserved. + +#include "../detail/type_float.hpp" +#include "../ext/scalar_constants.hpp" +#include +#include + +#if(GLM_COMPILER & GLM_COMPILER_VC) +# pragma warning(push) +# pragma warning(disable : 4127) +#endif + +typedef union +{ + float value; + /* FIXME: Assumes 32 bit int. */ + unsigned int word; +} ieee_float_shape_type; + +typedef union +{ + double value; + struct + { + int lsw; + int msw; + } parts; +} ieee_double_shape_type; + +#define GLM_EXTRACT_WORDS(ix0,ix1,d) \ + do { \ + ieee_double_shape_type ew_u; \ + ew_u.value = (d); \ + (ix0) = ew_u.parts.msw; \ + (ix1) = ew_u.parts.lsw; \ + } while (0) + +#define GLM_GET_FLOAT_WORD(i,d) \ + do { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } while (0) + +#define GLM_SET_FLOAT_WORD(d,i) \ + do { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } while (0) + +#define GLM_INSERT_WORDS(d,ix0,ix1) \ + do { \ + ieee_double_shape_type iw_u; \ + iw_u.parts.msw = (ix0); \ + iw_u.parts.lsw = (ix1); \ + (d) = iw_u.value; \ + } while (0) + +namespace glm{ +namespace detail +{ + GLM_FUNC_QUALIFIER float nextafterf(float x, float y) + { + volatile float t; + int hx, hy, ix, iy; + + GLM_GET_FLOAT_WORD(hx, x); + GLM_GET_FLOAT_WORD(hy, y); + ix = hx & 0x7fffffff; // |x| + iy = hy & 0x7fffffff; // |y| + + if((ix > 0x7f800000) || // x is nan + (iy > 0x7f800000)) // y is nan + return x + y; + if(abs(y - x) <= epsilon()) + return y; // x=y, return y + if(ix == 0) + { // x == 0 + GLM_SET_FLOAT_WORD(x, (hy & 0x80000000) | 1);// return +-minsubnormal + t = x * x; + if(abs(t - x) <= epsilon()) + return t; + else + return x; // raise underflow flag + } + if(hx >= 0) + { // x > 0 + if(hx > hy) // x > y, x -= ulp + hx -= 1; + else // x < y, x += ulp + hx += 1; + } + else + { // x < 0 + if(hy >= 0 || hx > hy) // x < y, x -= ulp + hx -= 1; + else // x > y, x += ulp + hx += 1; + } + hy = hx & 0x7f800000; + if(hy >= 0x7f800000) + return x + x; // overflow + if(hy < 0x00800000) // underflow + { + t = x * x; + if(abs(t - x) > epsilon()) + { // raise underflow flag + GLM_SET_FLOAT_WORD(y, hx); + return y; + } + } + GLM_SET_FLOAT_WORD(x, hx); + return x; + } + + GLM_FUNC_QUALIFIER double nextafter(double x, double y) + { + volatile double t; + int hx, hy, ix, iy; + unsigned int lx, ly; + + GLM_EXTRACT_WORDS(hx, lx, x); + GLM_EXTRACT_WORDS(hy, ly, y); + ix = hx & 0x7fffffff; // |x| + iy = hy & 0x7fffffff; // |y| + + if(((ix >= 0x7ff00000) && ((ix - 0x7ff00000) | lx) != 0) || // x is nan + ((iy >= 0x7ff00000) && ((iy - 0x7ff00000) | ly) != 0)) // y is nan + return x + y; + if(abs(y - x) <= epsilon()) + return y; // x=y, return y + if((ix | lx) == 0) + { // x == 0 + GLM_INSERT_WORDS(x, hy & 0x80000000, 1); // return +-minsubnormal + t = x * x; + if(abs(t - x) <= epsilon()) + return t; + else + return x; // raise underflow flag + } + if(hx >= 0) { // x > 0 + if(hx > hy || ((hx == hy) && (lx > ly))) { // x > y, x -= ulp + if(lx == 0) hx -= 1; + lx -= 1; + } + else { // x < y, x += ulp + lx += 1; + if(lx == 0) hx += 1; + } + } + else { // x < 0 + if(hy >= 0 || hx > hy || ((hx == hy) && (lx > ly))){// x < y, x -= ulp + if(lx == 0) hx -= 1; + lx -= 1; + } + else { // x > y, x += ulp + lx += 1; + if(lx == 0) hx += 1; + } + } + hy = hx & 0x7ff00000; + if(hy >= 0x7ff00000) + return x + x; // overflow + if(hy < 0x00100000) + { // underflow + t = x * x; + if(abs(t - x) > epsilon()) + { // raise underflow flag + GLM_INSERT_WORDS(y, hx, lx); + return y; + } + } + GLM_INSERT_WORDS(x, hx, lx); + return x; + } +}//namespace detail +}//namespace glm + +#if(GLM_COMPILER & GLM_COMPILER_VC) +# pragma warning(pop) +#endif + +namespace glm +{ + template<> + GLM_FUNC_QUALIFIER float nextFloat(float x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::max()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafterf(x, FLT_MAX); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafterf(x, FLT_MAX); +# else + return nextafterf(x, FLT_MAX); +# endif + } + + template<> + GLM_FUNC_QUALIFIER double nextFloat(double x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::max()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafter(x, std::numeric_limits::max()); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafter(x, DBL_MAX); +# else + return nextafter(x, DBL_MAX); +# endif + } + + template + GLM_FUNC_QUALIFIER T nextFloat(T x, int ULPs) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'next_float' only accept floating-point input"); + assert(ULPs >= 0); + + T temp = x; + for(int i = 0; i < ULPs; ++i) + temp = nextFloat(temp); + return temp; + } + + GLM_FUNC_QUALIFIER float prevFloat(float x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::min()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafterf(x, FLT_MIN); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafterf(x, FLT_MIN); +# else + return nextafterf(x, FLT_MIN); +# endif + } + + GLM_FUNC_QUALIFIER double prevFloat(double x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::min()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return _nextafter(x, DBL_MIN); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafter(x, DBL_MIN); +# else + return nextafter(x, DBL_MIN); +# endif + } + + template + GLM_FUNC_QUALIFIER T prevFloat(T x, int ULPs) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'prev_float' only accept floating-point input"); + assert(ULPs >= 0); + + T temp = x; + for(int i = 0; i < ULPs; ++i) + temp = prevFloat(temp); + return temp; + } + + GLM_FUNC_QUALIFIER int floatDistance(float x, float y) + { + detail::float_t const a(x); + detail::float_t const b(y); + + return abs(a.i - b.i); + } + + GLM_FUNC_QUALIFIER int64 floatDistance(double x, double y) + { + detail::float_t const a(x); + detail::float_t const b(y); + + return abs(a.i - b.i); + } +}//namespace glm diff --git a/dep/glm/ext/vector_bool1.hpp b/dep/glm/ext/vector_bool1.hpp new file mode 100644 index 0000000..002c320 --- /dev/null +++ b/dep/glm/ext/vector_bool1.hpp @@ -0,0 +1,30 @@ +/// @ref ext_vector_bool1 +/// @file glm/ext/vector_bool1.hpp +/// +/// @defgroup ext_vector_bool1 GLM_EXT_vector_bool1 +/// @ingroup ext +/// +/// Exposes bvec1 vector type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_bool1_precision extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_bool1 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_bool1 + /// @{ + + /// 1 components vector of boolean. + typedef vec<1, bool, defaultp> bvec1; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_bool1_precision.hpp b/dep/glm/ext/vector_bool1_precision.hpp new file mode 100644 index 0000000..e62d3cf --- /dev/null +++ b/dep/glm/ext/vector_bool1_precision.hpp @@ -0,0 +1,34 @@ +/// @ref ext_vector_bool1_precision +/// @file glm/ext/vector_bool1_precision.hpp +/// +/// @defgroup ext_vector_bool1_precision GLM_EXT_vector_bool1_precision +/// @ingroup ext +/// +/// Exposes highp_bvec1, mediump_bvec1 and lowp_bvec1 types. +/// +/// Include to use the features of this extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_bool1_precision extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_bool1_precision + /// @{ + + /// 1 component vector of bool values. + typedef vec<1, bool, highp> highp_bvec1; + + /// 1 component vector of bool values. + typedef vec<1, bool, mediump> mediump_bvec1; + + /// 1 component vector of bool values. + typedef vec<1, bool, lowp> lowp_bvec1; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_bool2.hpp b/dep/glm/ext/vector_bool2.hpp new file mode 100644 index 0000000..52288b7 --- /dev/null +++ b/dep/glm/ext/vector_bool2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_bool2.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 2 components vector of boolean. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<2, bool, defaultp> bvec2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_bool2_precision.hpp b/dep/glm/ext/vector_bool2_precision.hpp new file mode 100644 index 0000000..4370933 --- /dev/null +++ b/dep/glm/ext/vector_bool2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_bool2_precision.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 2 components vector of high qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, bool, highp> highp_bvec2; + + /// 2 components vector of medium qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, bool, mediump> mediump_bvec2; + + /// 2 components vector of low qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, bool, lowp> lowp_bvec2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_bool3.hpp b/dep/glm/ext/vector_bool3.hpp new file mode 100644 index 0000000..90a0b7e --- /dev/null +++ b/dep/glm/ext/vector_bool3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_bool3.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 3 components vector of boolean. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<3, bool, defaultp> bvec3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_bool3_precision.hpp b/dep/glm/ext/vector_bool3_precision.hpp new file mode 100644 index 0000000..89cd2d3 --- /dev/null +++ b/dep/glm/ext/vector_bool3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_bool3_precision.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 3 components vector of high qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, bool, highp> highp_bvec3; + + /// 3 components vector of medium qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, bool, mediump> mediump_bvec3; + + /// 3 components vector of low qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, bool, lowp> lowp_bvec3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_bool4.hpp b/dep/glm/ext/vector_bool4.hpp new file mode 100644 index 0000000..18aa71b --- /dev/null +++ b/dep/glm/ext/vector_bool4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_bool4.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 4 components vector of boolean. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<4, bool, defaultp> bvec4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_bool4_precision.hpp b/dep/glm/ext/vector_bool4_precision.hpp new file mode 100644 index 0000000..79786e5 --- /dev/null +++ b/dep/glm/ext/vector_bool4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_bool4_precision.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 4 components vector of high qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, bool, highp> highp_bvec4; + + /// 4 components vector of medium qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, bool, mediump> mediump_bvec4; + + /// 4 components vector of low qualifier bool numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, bool, lowp> lowp_bvec4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_common.hpp b/dep/glm/ext/vector_common.hpp new file mode 100644 index 0000000..521ec01 --- /dev/null +++ b/dep/glm/ext/vector_common.hpp @@ -0,0 +1,204 @@ +/// @ref ext_vector_common +/// @file glm/ext/vector_common.hpp +/// +/// @defgroup ext_vector_common GLM_EXT_vector_common +/// @ingroup ext +/// +/// Exposes min and max functions for 3 to 4 vector parameters. +/// +/// Include to use the features of this extension. +/// +/// @see core_common +/// @see ext_scalar_common + +#pragma once + +// Dependency: +#include "../ext/scalar_common.hpp" +#include "../common.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_common extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_common + /// @{ + + /// Return the minimum component-wise values of 3 inputs + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec min(vec const& a, vec const& b, vec const& c); + + /// Return the minimum component-wise values of 4 inputs + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec min(vec const& a, vec const& b, vec const& c, vec const& d); + + /// Return the maximum component-wise values of 3 inputs + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec max(vec const& x, vec const& y, vec const& z); + + /// Return the maximum component-wise values of 4 inputs + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec max( vec const& x, vec const& y, vec const& z, vec const& w); + + /// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmin documentation + template + GLM_FUNC_DECL vec fmin(vec const& x, T y); + + /// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmin documentation + template + GLM_FUNC_DECL vec fmin(vec const& x, vec const& y); + + /// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmin documentation + template + GLM_FUNC_DECL vec fmin(vec const& a, vec const& b, vec const& c); + + /// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmin documentation + template + GLM_FUNC_DECL vec fmin(vec const& a, vec const& b, vec const& c, vec const& d); + + /// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmax documentation + template + GLM_FUNC_DECL vec fmax(vec const& a, T b); + + /// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmax documentation + template + GLM_FUNC_DECL vec fmax(vec const& a, vec const& b); + + /// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmax documentation + template + GLM_FUNC_DECL vec fmax(vec const& a, vec const& b, vec const& c); + + /// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see std::fmax documentation + template + GLM_FUNC_DECL vec fmax(vec const& a, vec const& b, vec const& c, vec const& d); + + /// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common + template + GLM_FUNC_DECL vec fclamp(vec const& x, T minVal, T maxVal); + + /// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common + template + GLM_FUNC_DECL vec fclamp(vec const& x, vec const& minVal, vec const& maxVal); + + /// Simulate GL_CLAMP OpenGL wrap mode + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common extension. + template + GLM_FUNC_DECL vec clamp(vec const& Texcoord); + + /// Simulate GL_REPEAT OpenGL wrap mode + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common extension. + template + GLM_FUNC_DECL vec repeat(vec const& Texcoord); + + /// Simulate GL_MIRRORED_REPEAT OpenGL wrap mode + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common extension. + template + GLM_FUNC_DECL vec mirrorClamp(vec const& Texcoord); + + /// Simulate GL_MIRROR_REPEAT OpenGL wrap mode + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_common extension. + template + GLM_FUNC_DECL vec mirrorRepeat(vec const& Texcoord); + + /// @} +}//namespace glm + +#include "vector_common.inl" diff --git a/dep/glm/ext/vector_common.inl b/dep/glm/ext/vector_common.inl new file mode 100644 index 0000000..e2747be --- /dev/null +++ b/dep/glm/ext/vector_common.inl @@ -0,0 +1,129 @@ +#include "../detail/_vectorize.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec min(vec const& x, vec const& y, vec const& z) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'min' only accept floating-point or integer inputs"); + return glm::min(glm::min(x, y), z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec min(vec const& x, vec const& y, vec const& z, vec const& w) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'min' only accept floating-point or integer inputs"); + return glm::min(glm::min(x, y), glm::min(z, w)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec max(vec const& x, vec const& y, vec const& z) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'max' only accept floating-point or integer inputs"); + return glm::max(glm::max(x, y), z); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec max(vec const& x, vec const& y, vec const& z, vec const& w) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'max' only accept floating-point or integer inputs"); + return glm::max(glm::max(x, y), glm::max(z, w)); + } + + template + GLM_FUNC_QUALIFIER vec fmin(vec const& a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point inputs"); + return detail::functor2::call(fmin, a, vec(b)); + } + + template + GLM_FUNC_QUALIFIER vec fmin(vec const& a, vec const& b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point inputs"); + return detail::functor2::call(fmin, a, b); + } + + template + GLM_FUNC_QUALIFIER vec fmin(vec const& a, vec const& b, vec const& c) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point inputs"); + return fmin(fmin(a, b), c); + } + + template + GLM_FUNC_QUALIFIER vec fmin(vec const& a, vec const& b, vec const& c, vec const& d) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmin' only accept floating-point inputs"); + return fmin(fmin(a, b), fmin(c, d)); + } + + template + GLM_FUNC_QUALIFIER vec fmax(vec const& a, T b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point inputs"); + return detail::functor2::call(fmax, a, vec(b)); + } + + template + GLM_FUNC_QUALIFIER vec fmax(vec const& a, vec const& b) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point inputs"); + return detail::functor2::call(fmax, a, b); + } + + template + GLM_FUNC_QUALIFIER vec fmax(vec const& a, vec const& b, vec const& c) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point inputs"); + return fmax(fmax(a, b), c); + } + + template + GLM_FUNC_QUALIFIER vec fmax(vec const& a, vec const& b, vec const& c, vec const& d) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fmax' only accept floating-point inputs"); + return fmax(fmax(a, b), fmax(c, d)); + } + + template + GLM_FUNC_QUALIFIER vec fclamp(vec const& x, T minVal, T maxVal) + { + return fmin(fmax(x, vec(minVal)), vec(maxVal)); + } + + template + GLM_FUNC_QUALIFIER vec fclamp(vec const& x, vec const& minVal, vec const& maxVal) + { + return fmin(fmax(x, minVal), maxVal); + } + + template + GLM_FUNC_QUALIFIER vec clamp(vec const& Texcoord) + { + return glm::clamp(Texcoord, vec(0), vec(1)); + } + + template + GLM_FUNC_QUALIFIER vec repeat(vec const& Texcoord) + { + return glm::fract(Texcoord); + } + + template + GLM_FUNC_QUALIFIER vec mirrorClamp(vec const& Texcoord) + { + return glm::fract(glm::abs(Texcoord)); + } + + template + GLM_FUNC_QUALIFIER vec mirrorRepeat(vec const& Texcoord) + { + vec const Abs = glm::abs(Texcoord); + vec const Clamp = glm::mod(glm::floor(Abs), vec(2)); + vec const Floor = glm::floor(Abs); + vec const Rest = Abs - Floor; + vec const Mirror = Clamp + Rest; + return mix(Rest, vec(1) - Rest, glm::greaterThanEqual(Mirror, vec(1))); + } +}//namespace glm diff --git a/dep/glm/ext/vector_double1.hpp b/dep/glm/ext/vector_double1.hpp new file mode 100644 index 0000000..3882667 --- /dev/null +++ b/dep/glm/ext/vector_double1.hpp @@ -0,0 +1,31 @@ +/// @ref ext_vector_double1 +/// @file glm/ext/vector_double1.hpp +/// +/// @defgroup ext_vector_double1 GLM_EXT_vector_double1 +/// @ingroup ext +/// +/// Exposes double-precision floating point vector type with one component. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_double1_precision extension. +/// @see ext_vector_float1 extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_double1 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_double1 + /// @{ + + /// 1 components vector of double-precision floating-point numbers. + typedef vec<1, double, defaultp> dvec1; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_double1_precision.hpp b/dep/glm/ext/vector_double1_precision.hpp new file mode 100644 index 0000000..1d47195 --- /dev/null +++ b/dep/glm/ext/vector_double1_precision.hpp @@ -0,0 +1,36 @@ +/// @ref ext_vector_double1_precision +/// @file glm/ext/vector_double1_precision.hpp +/// +/// @defgroup ext_vector_double1_precision GLM_EXT_vector_double1_precision +/// @ingroup ext +/// +/// Exposes highp_dvec1, mediump_dvec1 and lowp_dvec1 types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_double1 + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_double1_precision extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_double1_precision + /// @{ + + /// 1 component vector of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, double, highp> highp_dvec1; + + /// 1 component vector of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, double, mediump> mediump_dvec1; + + /// 1 component vector of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, double, lowp> lowp_dvec1; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_double2.hpp b/dep/glm/ext/vector_double2.hpp new file mode 100644 index 0000000..60e3577 --- /dev/null +++ b/dep/glm/ext/vector_double2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_double2.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 2 components vector of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<2, double, defaultp> dvec2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_double2_precision.hpp b/dep/glm/ext/vector_double2_precision.hpp new file mode 100644 index 0000000..fa53940 --- /dev/null +++ b/dep/glm/ext/vector_double2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_double2_precision.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 2 components vector of high double-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, double, highp> highp_dvec2; + + /// 2 components vector of medium double-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, double, mediump> mediump_dvec2; + + /// 2 components vector of low double-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, double, lowp> lowp_dvec2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_double3.hpp b/dep/glm/ext/vector_double3.hpp new file mode 100644 index 0000000..6dfe4c6 --- /dev/null +++ b/dep/glm/ext/vector_double3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_double3.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 3 components vector of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<3, double, defaultp> dvec3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_double3_precision.hpp b/dep/glm/ext/vector_double3_precision.hpp new file mode 100644 index 0000000..a8cfa37 --- /dev/null +++ b/dep/glm/ext/vector_double3_precision.hpp @@ -0,0 +1,34 @@ +/// @ref core +/// @file glm/ext/vector_double3_precision.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 3 components vector of high double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, double, highp> highp_dvec3; + + /// 3 components vector of medium double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, double, mediump> mediump_dvec3; + + /// 3 components vector of low double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, double, lowp> lowp_dvec3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_double4.hpp b/dep/glm/ext/vector_double4.hpp new file mode 100644 index 0000000..87f225f --- /dev/null +++ b/dep/glm/ext/vector_double4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_double4.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 4 components vector of double-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<4, double, defaultp> dvec4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_double4_precision.hpp b/dep/glm/ext/vector_double4_precision.hpp new file mode 100644 index 0000000..09cafa1 --- /dev/null +++ b/dep/glm/ext/vector_double4_precision.hpp @@ -0,0 +1,35 @@ +/// @ref core +/// @file glm/ext/vector_double4_precision.hpp + +#pragma once +#include "../detail/setup.hpp" +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 4 components vector of high double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, double, highp> highp_dvec4; + + /// 4 components vector of medium double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, double, mediump> mediump_dvec4; + + /// 4 components vector of low double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, double, lowp> lowp_dvec4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_float1.hpp b/dep/glm/ext/vector_float1.hpp new file mode 100644 index 0000000..28acc2c --- /dev/null +++ b/dep/glm/ext/vector_float1.hpp @@ -0,0 +1,31 @@ +/// @ref ext_vector_float1 +/// @file glm/ext/vector_float1.hpp +/// +/// @defgroup ext_vector_float1 GLM_EXT_vector_float1 +/// @ingroup ext +/// +/// Exposes single-precision floating point vector type with one component. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_float1_precision extension. +/// @see ext_vector_double1 extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_float1 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_float1 + /// @{ + + /// 1 components vector of single-precision floating-point numbers. + typedef vec<1, float, defaultp> vec1; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_float1_precision.hpp b/dep/glm/ext/vector_float1_precision.hpp new file mode 100644 index 0000000..6e8dad8 --- /dev/null +++ b/dep/glm/ext/vector_float1_precision.hpp @@ -0,0 +1,36 @@ +/// @ref ext_vector_float1_precision +/// @file glm/ext/vector_float1_precision.hpp +/// +/// @defgroup ext_vector_float1_precision GLM_EXT_vector_float1_precision +/// @ingroup ext +/// +/// Exposes highp_vec1, mediump_vec1 and lowp_vec1 types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_float1 extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_float1_precision extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_float1_precision + /// @{ + + /// 1 component vector of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, float, highp> highp_vec1; + + /// 1 component vector of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, float, mediump> mediump_vec1; + + /// 1 component vector of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, float, lowp> lowp_vec1; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_float2.hpp b/dep/glm/ext/vector_float2.hpp new file mode 100644 index 0000000..d31545d --- /dev/null +++ b/dep/glm/ext/vector_float2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_float2.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 2 components vector of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<2, float, defaultp> vec2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_float2_precision.hpp b/dep/glm/ext/vector_float2_precision.hpp new file mode 100644 index 0000000..23c0820 --- /dev/null +++ b/dep/glm/ext/vector_float2_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_float2_precision.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 2 components vector of high single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, float, highp> highp_vec2; + + /// 2 components vector of medium single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, float, mediump> mediump_vec2; + + /// 2 components vector of low single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<2, float, lowp> lowp_vec2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_float3.hpp b/dep/glm/ext/vector_float3.hpp new file mode 100644 index 0000000..cd79a62 --- /dev/null +++ b/dep/glm/ext/vector_float3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_float3.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 3 components vector of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<3, float, defaultp> vec3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_float3_precision.hpp b/dep/glm/ext/vector_float3_precision.hpp new file mode 100644 index 0000000..be640b5 --- /dev/null +++ b/dep/glm/ext/vector_float3_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_float3_precision.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 3 components vector of high single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, float, highp> highp_vec3; + + /// 3 components vector of medium single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, float, mediump> mediump_vec3; + + /// 3 components vector of low single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<3, float, lowp> lowp_vec3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_float4.hpp b/dep/glm/ext/vector_float4.hpp new file mode 100644 index 0000000..d84adcc --- /dev/null +++ b/dep/glm/ext/vector_float4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_float4.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 4 components vector of single-precision floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<4, float, defaultp> vec4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_float4_precision.hpp b/dep/glm/ext/vector_float4_precision.hpp new file mode 100644 index 0000000..aede838 --- /dev/null +++ b/dep/glm/ext/vector_float4_precision.hpp @@ -0,0 +1,31 @@ +/// @ref core +/// @file glm/ext/vector_float4_precision.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector_precision + /// @{ + + /// 4 components vector of high single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, float, highp> highp_vec4; + + /// 4 components vector of medium single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, float, mediump> mediump_vec4; + + /// 4 components vector of low single-qualifier floating-point numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + /// @see GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier + typedef vec<4, float, lowp> lowp_vec4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_int1.hpp b/dep/glm/ext/vector_int1.hpp new file mode 100644 index 0000000..dc86038 --- /dev/null +++ b/dep/glm/ext/vector_int1.hpp @@ -0,0 +1,32 @@ +/// @ref ext_vector_int1 +/// @file glm/ext/vector_int1.hpp +/// +/// @defgroup ext_vector_int1 GLM_EXT_vector_int1 +/// @ingroup ext +/// +/// Exposes ivec1 vector type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_uint1 extension. +/// @see ext_vector_int1_precision extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_int1 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_int1 + /// @{ + + /// 1 component vector of signed integer numbers. + typedef vec<1, int, defaultp> ivec1; + + /// @} +}//namespace glm + diff --git a/dep/glm/ext/vector_int1_sized.hpp b/dep/glm/ext/vector_int1_sized.hpp new file mode 100644 index 0000000..de0d4cf --- /dev/null +++ b/dep/glm/ext/vector_int1_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_int1_sized +/// @file glm/ext/vector_int1_sized.hpp +/// +/// @defgroup ext_vector_int1_sized GLM_EXT_vector_int1_sized +/// @ingroup ext +/// +/// Exposes sized signed integer vector types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_int_sized +/// @see ext_vector_uint1_sized + +#pragma once + +#include "../ext/vector_int1.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_int1_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_int1_sized + /// @{ + + /// 8 bit signed integer vector of 1 component type. + /// + /// @see ext_vector_int1_sized + typedef vec<1, int8, defaultp> i8vec1; + + /// 16 bit signed integer vector of 1 component type. + /// + /// @see ext_vector_int1_sized + typedef vec<1, int16, defaultp> i16vec1; + + /// 32 bit signed integer vector of 1 component type. + /// + /// @see ext_vector_int1_sized + typedef vec<1, int32, defaultp> i32vec1; + + /// 64 bit signed integer vector of 1 component type. + /// + /// @see ext_vector_int1_sized + typedef vec<1, int64, defaultp> i64vec1; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_int2.hpp b/dep/glm/ext/vector_int2.hpp new file mode 100644 index 0000000..aef803e --- /dev/null +++ b/dep/glm/ext/vector_int2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_int2.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 2 components vector of signed integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<2, int, defaultp> ivec2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_int2_sized.hpp b/dep/glm/ext/vector_int2_sized.hpp new file mode 100644 index 0000000..1fd57ee --- /dev/null +++ b/dep/glm/ext/vector_int2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_int2_sized +/// @file glm/ext/vector_int2_sized.hpp +/// +/// @defgroup ext_vector_int2_sized GLM_EXT_vector_int2_sized +/// @ingroup ext +/// +/// Exposes sized signed integer vector of 2 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_int_sized +/// @see ext_vector_uint2_sized + +#pragma once + +#include "../ext/vector_int2.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_int2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_int2_sized + /// @{ + + /// 8 bit signed integer vector of 2 components type. + /// + /// @see ext_vector_int2_sized + typedef vec<2, int8, defaultp> i8vec2; + + /// 16 bit signed integer vector of 2 components type. + /// + /// @see ext_vector_int2_sized + typedef vec<2, int16, defaultp> i16vec2; + + /// 32 bit signed integer vector of 2 components type. + /// + /// @see ext_vector_int2_sized + typedef vec<2, int32, defaultp> i32vec2; + + /// 64 bit signed integer vector of 2 components type. + /// + /// @see ext_vector_int2_sized + typedef vec<2, int64, defaultp> i64vec2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_int3.hpp b/dep/glm/ext/vector_int3.hpp new file mode 100644 index 0000000..4767e61 --- /dev/null +++ b/dep/glm/ext/vector_int3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_int3.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 3 components vector of signed integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<3, int, defaultp> ivec3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_int3_sized.hpp b/dep/glm/ext/vector_int3_sized.hpp new file mode 100644 index 0000000..085a3fe --- /dev/null +++ b/dep/glm/ext/vector_int3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_int3_sized +/// @file glm/ext/vector_int3_sized.hpp +/// +/// @defgroup ext_vector_int3_sized GLM_EXT_vector_int3_sized +/// @ingroup ext +/// +/// Exposes sized signed integer vector of 3 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_int_sized +/// @see ext_vector_uint3_sized + +#pragma once + +#include "../ext/vector_int3.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_int3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_int3_sized + /// @{ + + /// 8 bit signed integer vector of 3 components type. + /// + /// @see ext_vector_int3_sized + typedef vec<3, int8, defaultp> i8vec3; + + /// 16 bit signed integer vector of 3 components type. + /// + /// @see ext_vector_int3_sized + typedef vec<3, int16, defaultp> i16vec3; + + /// 32 bit signed integer vector of 3 components type. + /// + /// @see ext_vector_int3_sized + typedef vec<3, int32, defaultp> i32vec3; + + /// 64 bit signed integer vector of 3 components type. + /// + /// @see ext_vector_int3_sized + typedef vec<3, int64, defaultp> i64vec3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_int4.hpp b/dep/glm/ext/vector_int4.hpp new file mode 100644 index 0000000..bb23adf --- /dev/null +++ b/dep/glm/ext/vector_int4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_int4.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 4 components vector of signed integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<4, int, defaultp> ivec4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_int4_sized.hpp b/dep/glm/ext/vector_int4_sized.hpp new file mode 100644 index 0000000..c63d465 --- /dev/null +++ b/dep/glm/ext/vector_int4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_int4_sized +/// @file glm/ext/vector_int4_sized.hpp +/// +/// @defgroup ext_vector_int4_sized GLM_EXT_vector_int4_sized +/// @ingroup ext +/// +/// Exposes sized signed integer vector of 4 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_int_sized +/// @see ext_vector_uint4_sized + +#pragma once + +#include "../ext/vector_int4.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_int4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_int4_sized + /// @{ + + /// 8 bit signed integer vector of 4 components type. + /// + /// @see ext_vector_int4_sized + typedef vec<4, int8, defaultp> i8vec4; + + /// 16 bit signed integer vector of 4 components type. + /// + /// @see ext_vector_int4_sized + typedef vec<4, int16, defaultp> i16vec4; + + /// 32 bit signed integer vector of 4 components type. + /// + /// @see ext_vector_int4_sized + typedef vec<4, int32, defaultp> i32vec4; + + /// 64 bit signed integer vector of 4 components type. + /// + /// @see ext_vector_int4_sized + typedef vec<4, int64, defaultp> i64vec4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_integer.hpp b/dep/glm/ext/vector_integer.hpp new file mode 100644 index 0000000..1304dd8 --- /dev/null +++ b/dep/glm/ext/vector_integer.hpp @@ -0,0 +1,149 @@ +/// @ref ext_vector_integer +/// @file glm/ext/vector_integer.hpp +/// +/// @see core (dependence) +/// @see ext_vector_integer (dependence) +/// +/// @defgroup ext_vector_integer GLM_EXT_vector_integer +/// @ingroup ext +/// +/// Include to use the features of this extension. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_vectorize.hpp" +#include "../vector_relational.hpp" +#include "../common.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_integer extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_integer + /// @{ + + /// Return true if the value is a power of two number. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec isPowerOfTwo(vec const& v); + + /// Return the power of two number which value is just higher the input value, + /// round up to a power of two. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec nextPowerOfTwo(vec const& v); + + /// Return the power of two number which value is just lower the input value, + /// round down to a power of two. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec prevPowerOfTwo(vec const& v); + + /// Return true if the 'Value' is a multiple of 'Multiple'. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec isMultiple(vec const& v, T Multiple); + + /// Return true if the 'Value' is a multiple of 'Multiple'. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec isMultiple(vec const& v, vec const& Multiple); + + /// Higher multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec nextMultiple(vec const& v, T Multiple); + + /// Higher multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec nextMultiple(vec const& v, vec const& Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec prevMultiple(vec const& v, T Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed or unsigned integer scalar types. + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec prevMultiple(vec const& v, vec const& Multiple); + + /// Returns the bit number of the Nth significant bit set to + /// 1 in the binary representation of value. + /// If value bitcount is less than the Nth significant bit, -1 will be returned. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar types. + /// + /// @see ext_vector_integer + template + GLM_FUNC_DECL vec findNSB(vec const& Source, vec SignificantBitCount); + + /// @} +} //namespace glm + +#include "vector_integer.inl" diff --git a/dep/glm/ext/vector_integer.inl b/dep/glm/ext/vector_integer.inl new file mode 100644 index 0000000..939ff5e --- /dev/null +++ b/dep/glm/ext/vector_integer.inl @@ -0,0 +1,85 @@ +#include "scalar_integer.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec isPowerOfTwo(vec const& Value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'isPowerOfTwo' only accept integer inputs"); + + vec const Result(abs(Value)); + return equal(Result & (Result - vec(1)), vec(0)); + } + + template + GLM_FUNC_QUALIFIER vec nextPowerOfTwo(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'nextPowerOfTwo' only accept integer inputs"); + + return detail::compute_ceilPowerOfTwo::is_signed>::call(v); + } + + template + GLM_FUNC_QUALIFIER vec prevPowerOfTwo(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'prevPowerOfTwo' only accept integer inputs"); + + return detail::functor1::call(prevPowerOfTwo, v); + } + + template + GLM_FUNC_QUALIFIER vec isMultiple(vec const& Value, T Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'isMultiple' only accept integer inputs"); + + return (Value % Multiple) == vec(0); + } + + template + GLM_FUNC_QUALIFIER vec isMultiple(vec const& Value, vec const& Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'isMultiple' only accept integer inputs"); + + return (Value % Multiple) == vec(0); + } + + template + GLM_FUNC_QUALIFIER vec nextMultiple(vec const& Source, T Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'nextMultiple' only accept integer inputs"); + + return detail::functor2::call(nextMultiple, Source, vec(Multiple)); + } + + template + GLM_FUNC_QUALIFIER vec nextMultiple(vec const& Source, vec const& Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'nextMultiple' only accept integer inputs"); + + return detail::functor2::call(nextMultiple, Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER vec prevMultiple(vec const& Source, T Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'prevMultiple' only accept integer inputs"); + + return detail::functor2::call(prevMultiple, Source, vec(Multiple)); + } + + template + GLM_FUNC_QUALIFIER vec prevMultiple(vec const& Source, vec const& Multiple) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'prevMultiple' only accept integer inputs"); + + return detail::functor2::call(prevMultiple, Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER vec findNSB(vec const& Source, vec SignificantBitCount) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findNSB' only accept integer inputs"); + + return detail::functor2_vec_int::call(findNSB, Source, SignificantBitCount); + } +}//namespace glm diff --git a/dep/glm/ext/vector_packing.hpp b/dep/glm/ext/vector_packing.hpp new file mode 100644 index 0000000..76e5d0c --- /dev/null +++ b/dep/glm/ext/vector_packing.hpp @@ -0,0 +1,32 @@ +/// @ref ext_vector_packing +/// @file glm/ext/vector_packing.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_vector_packing GLM_EXT_vector_packing +/// @ingroup ext +/// +/// Include to use the features of this extension. +/// +/// This extension provides a set of function to convert vectors to packed +/// formats. + +#pragma once + +// Dependency: +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_packing extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_packing + /// @{ + + + /// @} +}// namespace glm + +#include "vector_packing.inl" diff --git a/dep/glm/ext/vector_packing.inl b/dep/glm/ext/vector_packing.inl new file mode 100644 index 0000000..e69de29 diff --git a/dep/glm/ext/vector_relational.hpp b/dep/glm/ext/vector_relational.hpp new file mode 100644 index 0000000..1c2367d --- /dev/null +++ b/dep/glm/ext/vector_relational.hpp @@ -0,0 +1,107 @@ +/// @ref ext_vector_relational +/// @file glm/ext/vector_relational.hpp +/// +/// @see core (dependence) +/// @see ext_scalar_integer (dependence) +/// +/// @defgroup ext_vector_relational GLM_EXT_vector_relational +/// @ingroup ext +/// +/// Exposes comparison functions for vector types that take a user defined epsilon values. +/// +/// Include to use the features of this extension. +/// +/// @see core_vector_relational +/// @see ext_scalar_relational +/// @see ext_matrix_relational + +#pragma once + +// Dependencies +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_relational extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_relational + /// @{ + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(vec const& x, vec const& y, T epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(vec const& x, vec const& y, vec const& epsilon); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, T epsilon); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, vec const& epsilon); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(vec const& x, vec const& y, int ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(vec const& x, vec const& y, vec const& ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is not satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, int ULPs); + + /// Returns the component-wise comparison between two vectors in term of ULPs. + /// True if this expression is not satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, vec const& ULPs); + + /// @} +}//namespace glm + +#include "vector_relational.inl" diff --git a/dep/glm/ext/vector_relational.inl b/dep/glm/ext/vector_relational.inl new file mode 100644 index 0000000..7a39ab5 --- /dev/null +++ b/dep/glm/ext/vector_relational.inl @@ -0,0 +1,75 @@ +#include "../vector_relational.hpp" +#include "../common.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/type_float.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, T Epsilon) + { + return equal(x, y, vec(Epsilon)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, vec const& Epsilon) + { + return lessThanEqual(abs(x - y), Epsilon); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, T Epsilon) + { + return notEqual(x, y, vec(Epsilon)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, vec const& Epsilon) + { + return greaterThan(abs(x - y), Epsilon); + } + + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, int MaxULPs) + { + return equal(x, y, vec(MaxULPs)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec equal(vec const& x, vec const& y, vec const& MaxULPs) + { + vec Result(false); + for(length_t i = 0; i < L; ++i) + { + detail::float_t const a(x[i]); + detail::float_t const b(y[i]); + + // Different signs means they do not match. + if(a.negative() != b.negative()) + { + // Check for equality to make sure +0==-0 + Result[i] = a.mantissa() == b.mantissa() && a.exponent() == b.exponent(); + } + else + { + // Find the difference in ULPs. + typename detail::float_t::int_type const DiffULPs = abs(a.i - b.i); + Result[i] = DiffULPs <= MaxULPs[i]; + } + } + return Result; + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, int MaxULPs) + { + return notEqual(x, y, vec(MaxULPs)); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y, vec const& MaxULPs) + { + return not_(equal(x, y, MaxULPs)); + } +}//namespace glm diff --git a/dep/glm/ext/vector_uint1.hpp b/dep/glm/ext/vector_uint1.hpp new file mode 100644 index 0000000..eb8a704 --- /dev/null +++ b/dep/glm/ext/vector_uint1.hpp @@ -0,0 +1,32 @@ +/// @ref ext_vector_uint1 +/// @file glm/ext/vector_uint1.hpp +/// +/// @defgroup ext_vector_uint1 GLM_EXT_vector_uint1 +/// @ingroup ext +/// +/// Exposes uvec1 vector type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_vector_int1 extension. +/// @see ext_vector_uint1_precision extension. + +#pragma once + +#include "../detail/type_vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_uint1 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_uint1 + /// @{ + + /// 1 component vector of unsigned integer numbers. + typedef vec<1, unsigned int, defaultp> uvec1; + + /// @} +}//namespace glm + diff --git a/dep/glm/ext/vector_uint1_sized.hpp b/dep/glm/ext/vector_uint1_sized.hpp new file mode 100644 index 0000000..2a938bb --- /dev/null +++ b/dep/glm/ext/vector_uint1_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_uint1_sized +/// @file glm/ext/vector_uint1_sized.hpp +/// +/// @defgroup ext_vector_uint1_sized GLM_EXT_vector_uint1_sized +/// @ingroup ext +/// +/// Exposes sized unsigned integer vector types. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_uint_sized +/// @see ext_vector_int1_sized + +#pragma once + +#include "../ext/vector_uint1.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_uint1_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_uint1_sized + /// @{ + + /// 8 bit unsigned integer vector of 1 component type. + /// + /// @see ext_vector_uint1_sized + typedef vec<1, uint8, defaultp> u8vec1; + + /// 16 bit unsigned integer vector of 1 component type. + /// + /// @see ext_vector_uint1_sized + typedef vec<1, uint16, defaultp> u16vec1; + + /// 32 bit unsigned integer vector of 1 component type. + /// + /// @see ext_vector_uint1_sized + typedef vec<1, uint32, defaultp> u32vec1; + + /// 64 bit unsigned integer vector of 1 component type. + /// + /// @see ext_vector_uint1_sized + typedef vec<1, uint64, defaultp> u64vec1; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_uint2.hpp b/dep/glm/ext/vector_uint2.hpp new file mode 100644 index 0000000..03c00f5 --- /dev/null +++ b/dep/glm/ext/vector_uint2.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_uint2.hpp + +#pragma once +#include "../detail/type_vec2.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 2 components vector of unsigned integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<2, unsigned int, defaultp> uvec2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_uint2_sized.hpp b/dep/glm/ext/vector_uint2_sized.hpp new file mode 100644 index 0000000..620fdc6 --- /dev/null +++ b/dep/glm/ext/vector_uint2_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_uint2_sized +/// @file glm/ext/vector_uint2_sized.hpp +/// +/// @defgroup ext_vector_uint2_sized GLM_EXT_vector_uint2_sized +/// @ingroup ext +/// +/// Exposes sized unsigned integer vector of 2 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_uint_sized +/// @see ext_vector_int2_sized + +#pragma once + +#include "../ext/vector_uint2.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_uint2_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_uint2_sized + /// @{ + + /// 8 bit unsigned integer vector of 2 components type. + /// + /// @see ext_vector_uint2_sized + typedef vec<2, uint8, defaultp> u8vec2; + + /// 16 bit unsigned integer vector of 2 components type. + /// + /// @see ext_vector_uint2_sized + typedef vec<2, uint16, defaultp> u16vec2; + + /// 32 bit unsigned integer vector of 2 components type. + /// + /// @see ext_vector_uint2_sized + typedef vec<2, uint32, defaultp> u32vec2; + + /// 64 bit unsigned integer vector of 2 components type. + /// + /// @see ext_vector_uint2_sized + typedef vec<2, uint64, defaultp> u64vec2; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_uint3.hpp b/dep/glm/ext/vector_uint3.hpp new file mode 100644 index 0000000..f5b41c4 --- /dev/null +++ b/dep/glm/ext/vector_uint3.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_uint3.hpp + +#pragma once +#include "../detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 3 components vector of unsigned integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<3, unsigned int, defaultp> uvec3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_uint3_sized.hpp b/dep/glm/ext/vector_uint3_sized.hpp new file mode 100644 index 0000000..6f96b98 --- /dev/null +++ b/dep/glm/ext/vector_uint3_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_uint3_sized +/// @file glm/ext/vector_uint3_sized.hpp +/// +/// @defgroup ext_vector_uint3_sized GLM_EXT_vector_uint3_sized +/// @ingroup ext +/// +/// Exposes sized unsigned integer vector of 3 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_uint_sized +/// @see ext_vector_int3_sized + +#pragma once + +#include "../ext/vector_uint3.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_uint3_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_uint3_sized + /// @{ + + /// 8 bit unsigned integer vector of 3 components type. + /// + /// @see ext_vector_uint3_sized + typedef vec<3, uint8, defaultp> u8vec3; + + /// 16 bit unsigned integer vector of 3 components type. + /// + /// @see ext_vector_uint3_sized + typedef vec<3, uint16, defaultp> u16vec3; + + /// 32 bit unsigned integer vector of 3 components type. + /// + /// @see ext_vector_uint3_sized + typedef vec<3, uint32, defaultp> u32vec3; + + /// 64 bit unsigned integer vector of 3 components type. + /// + /// @see ext_vector_uint3_sized + typedef vec<3, uint64, defaultp> u64vec3; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_uint4.hpp b/dep/glm/ext/vector_uint4.hpp new file mode 100644 index 0000000..32ced58 --- /dev/null +++ b/dep/glm/ext/vector_uint4.hpp @@ -0,0 +1,18 @@ +/// @ref core +/// @file glm/ext/vector_uint4.hpp + +#pragma once +#include "../detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_vector + /// @{ + + /// 4 components vector of unsigned integer numbers. + /// + /// @see GLSL 4.20.8 specification, section 4.1.5 Vectors + typedef vec<4, unsigned int, defaultp> uvec4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_uint4_sized.hpp b/dep/glm/ext/vector_uint4_sized.hpp new file mode 100644 index 0000000..da992ea --- /dev/null +++ b/dep/glm/ext/vector_uint4_sized.hpp @@ -0,0 +1,49 @@ +/// @ref ext_vector_uint4_sized +/// @file glm/ext/vector_uint4_sized.hpp +/// +/// @defgroup ext_vector_uint4_sized GLM_EXT_vector_uint4_sized +/// @ingroup ext +/// +/// Exposes sized unsigned integer vector of 4 components type. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_uint_sized +/// @see ext_vector_int4_sized + +#pragma once + +#include "../ext/vector_uint4.hpp" +#include "../ext/scalar_uint_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_uint4_sized extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_uint4_sized + /// @{ + + /// 8 bit unsigned integer vector of 4 components type. + /// + /// @see ext_vector_uint4_sized + typedef vec<4, uint8, defaultp> u8vec4; + + /// 16 bit unsigned integer vector of 4 components type. + /// + /// @see ext_vector_uint4_sized + typedef vec<4, uint16, defaultp> u16vec4; + + /// 32 bit unsigned integer vector of 4 components type. + /// + /// @see ext_vector_uint4_sized + typedef vec<4, uint32, defaultp> u32vec4; + + /// 64 bit unsigned integer vector of 4 components type. + /// + /// @see ext_vector_uint4_sized + typedef vec<4, uint64, defaultp> u64vec4; + + /// @} +}//namespace glm diff --git a/dep/glm/ext/vector_ulp.hpp b/dep/glm/ext/vector_ulp.hpp new file mode 100644 index 0000000..6210396 --- /dev/null +++ b/dep/glm/ext/vector_ulp.hpp @@ -0,0 +1,109 @@ +/// @ref ext_vector_ulp +/// @file glm/ext/vector_ulp.hpp +/// +/// @defgroup ext_vector_ulp GLM_EXT_vector_ulp +/// @ingroup ext +/// +/// Allow the measurement of the accuracy of a function against a reference +/// implementation. This extension works on floating-point data and provide results +/// in ULP. +/// +/// Include to use the features of this extension. +/// +/// @see ext_scalar_ulp +/// @see ext_scalar_relational +/// @see ext_vector_relational + +#pragma once + +// Dependencies +#include "../ext/scalar_ulp.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_ulp extension included") +#endif + +namespace glm +{ + /// Return the next ULP value(s) after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec nextFloat(vec const& x); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec nextFloat(vec const& x, int ULPs); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec nextFloat(vec const& x, vec const& ULPs); + + /// Return the previous ULP value(s) before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec prevFloat(vec const& x); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec prevFloat(vec const& x, int ULPs); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec prevFloat(vec const& x, vec const& ULPs); + + /// Return the distance in the number of ULP between 2 single-precision floating-point scalars. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec floatDistance(vec const& x, vec const& y); + + /// Return the distance in the number of ULP between 2 double-precision floating-point scalars. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see ext_scalar_ulp + template + GLM_FUNC_DECL vec floatDistance(vec const& x, vec const& y); + + /// @} +}//namespace glm + +#include "vector_ulp.inl" diff --git a/dep/glm/ext/vector_ulp.inl b/dep/glm/ext/vector_ulp.inl new file mode 100644 index 0000000..91565ce --- /dev/null +++ b/dep/glm/ext/vector_ulp.inl @@ -0,0 +1,74 @@ +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec nextFloat(vec const& x) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = nextFloat(x[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec nextFloat(vec const& x, int ULPs) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = nextFloat(x[i], ULPs); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec nextFloat(vec const& x, vec const& ULPs) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = nextFloat(x[i], ULPs[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prevFloat(vec const& x) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prevFloat(x[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prevFloat(vec const& x, int ULPs) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prevFloat(x[i], ULPs); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prevFloat(vec const& x, vec const& ULPs) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prevFloat(x[i], ULPs[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec floatDistance(vec const& x, vec const& y) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = floatDistance(x[i], y[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec floatDistance(vec const& x, vec const& y) + { + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = floatDistance(x[i], y[i]); + return Result; + } +}//namespace glm diff --git a/dep/glm/fwd.hpp b/dep/glm/fwd.hpp new file mode 100644 index 0000000..89177f4 --- /dev/null +++ b/dep/glm/fwd.hpp @@ -0,0 +1,1233 @@ +#pragma once + +#include "detail/qualifier.hpp" + +namespace glm +{ +#if GLM_HAS_EXTENDED_INTEGER_TYPE + typedef std::int8_t int8; + typedef std::int16_t int16; + typedef std::int32_t int32; + typedef std::int64_t int64; + + typedef std::uint8_t uint8; + typedef std::uint16_t uint16; + typedef std::uint32_t uint32; + typedef std::uint64_t uint64; +#else + typedef signed char int8; + typedef signed short int16; + typedef signed int int32; + typedef detail::int64 int64; + + typedef unsigned char uint8; + typedef unsigned short uint16; + typedef unsigned int uint32; + typedef detail::uint64 uint64; +#endif + + // Scalar int + + typedef int8 lowp_i8; + typedef int8 mediump_i8; + typedef int8 highp_i8; + typedef int8 i8; + + typedef int8 lowp_int8; + typedef int8 mediump_int8; + typedef int8 highp_int8; + + typedef int8 lowp_int8_t; + typedef int8 mediump_int8_t; + typedef int8 highp_int8_t; + typedef int8 int8_t; + + typedef int16 lowp_i16; + typedef int16 mediump_i16; + typedef int16 highp_i16; + typedef int16 i16; + + typedef int16 lowp_int16; + typedef int16 mediump_int16; + typedef int16 highp_int16; + + typedef int16 lowp_int16_t; + typedef int16 mediump_int16_t; + typedef int16 highp_int16_t; + typedef int16 int16_t; + + typedef int32 lowp_i32; + typedef int32 mediump_i32; + typedef int32 highp_i32; + typedef int32 i32; + + typedef int32 lowp_int32; + typedef int32 mediump_int32; + typedef int32 highp_int32; + + typedef int32 lowp_int32_t; + typedef int32 mediump_int32_t; + typedef int32 highp_int32_t; + typedef int32 int32_t; + + typedef int64 lowp_i64; + typedef int64 mediump_i64; + typedef int64 highp_i64; + typedef int64 i64; + + typedef int64 lowp_int64; + typedef int64 mediump_int64; + typedef int64 highp_int64; + + typedef int64 lowp_int64_t; + typedef int64 mediump_int64_t; + typedef int64 highp_int64_t; + typedef int64 int64_t; + + // Scalar uint + + typedef unsigned int uint; + + typedef uint8 lowp_u8; + typedef uint8 mediump_u8; + typedef uint8 highp_u8; + typedef uint8 u8; + + typedef uint8 lowp_uint8; + typedef uint8 mediump_uint8; + typedef uint8 highp_uint8; + + typedef uint8 lowp_uint8_t; + typedef uint8 mediump_uint8_t; + typedef uint8 highp_uint8_t; + typedef uint8 uint8_t; + + typedef uint16 lowp_u16; + typedef uint16 mediump_u16; + typedef uint16 highp_u16; + typedef uint16 u16; + + typedef uint16 lowp_uint16; + typedef uint16 mediump_uint16; + typedef uint16 highp_uint16; + + typedef uint16 lowp_uint16_t; + typedef uint16 mediump_uint16_t; + typedef uint16 highp_uint16_t; + typedef uint16 uint16_t; + + typedef uint32 lowp_u32; + typedef uint32 mediump_u32; + typedef uint32 highp_u32; + typedef uint32 u32; + + typedef uint32 lowp_uint32; + typedef uint32 mediump_uint32; + typedef uint32 highp_uint32; + + typedef uint32 lowp_uint32_t; + typedef uint32 mediump_uint32_t; + typedef uint32 highp_uint32_t; + typedef uint32 uint32_t; + + typedef uint64 lowp_u64; + typedef uint64 mediump_u64; + typedef uint64 highp_u64; + typedef uint64 u64; + + typedef uint64 lowp_uint64; + typedef uint64 mediump_uint64; + typedef uint64 highp_uint64; + + typedef uint64 lowp_uint64_t; + typedef uint64 mediump_uint64_t; + typedef uint64 highp_uint64_t; + typedef uint64 uint64_t; + + // Scalar float + + typedef float lowp_f32; + typedef float mediump_f32; + typedef float highp_f32; + typedef float f32; + + typedef float lowp_float32; + typedef float mediump_float32; + typedef float highp_float32; + typedef float float32; + + typedef float lowp_float32_t; + typedef float mediump_float32_t; + typedef float highp_float32_t; + typedef float float32_t; + + + typedef double lowp_f64; + typedef double mediump_f64; + typedef double highp_f64; + typedef double f64; + + typedef double lowp_float64; + typedef double mediump_float64; + typedef double highp_float64; + typedef double float64; + + typedef double lowp_float64_t; + typedef double mediump_float64_t; + typedef double highp_float64_t; + typedef double float64_t; + + // Vector bool + + typedef vec<1, bool, lowp> lowp_bvec1; + typedef vec<2, bool, lowp> lowp_bvec2; + typedef vec<3, bool, lowp> lowp_bvec3; + typedef vec<4, bool, lowp> lowp_bvec4; + + typedef vec<1, bool, mediump> mediump_bvec1; + typedef vec<2, bool, mediump> mediump_bvec2; + typedef vec<3, bool, mediump> mediump_bvec3; + typedef vec<4, bool, mediump> mediump_bvec4; + + typedef vec<1, bool, highp> highp_bvec1; + typedef vec<2, bool, highp> highp_bvec2; + typedef vec<3, bool, highp> highp_bvec3; + typedef vec<4, bool, highp> highp_bvec4; + + typedef vec<1, bool, defaultp> bvec1; + typedef vec<2, bool, defaultp> bvec2; + typedef vec<3, bool, defaultp> bvec3; + typedef vec<4, bool, defaultp> bvec4; + + // Vector int + + typedef vec<1, int, lowp> lowp_ivec1; + typedef vec<2, int, lowp> lowp_ivec2; + typedef vec<3, int, lowp> lowp_ivec3; + typedef vec<4, int, lowp> lowp_ivec4; + + typedef vec<1, int, mediump> mediump_ivec1; + typedef vec<2, int, mediump> mediump_ivec2; + typedef vec<3, int, mediump> mediump_ivec3; + typedef vec<4, int, mediump> mediump_ivec4; + + typedef vec<1, int, highp> highp_ivec1; + typedef vec<2, int, highp> highp_ivec2; + typedef vec<3, int, highp> highp_ivec3; + typedef vec<4, int, highp> highp_ivec4; + + typedef vec<1, int, defaultp> ivec1; + typedef vec<2, int, defaultp> ivec2; + typedef vec<3, int, defaultp> ivec3; + typedef vec<4, int, defaultp> ivec4; + + typedef vec<1, i8, lowp> lowp_i8vec1; + typedef vec<2, i8, lowp> lowp_i8vec2; + typedef vec<3, i8, lowp> lowp_i8vec3; + typedef vec<4, i8, lowp> lowp_i8vec4; + + typedef vec<1, i8, mediump> mediump_i8vec1; + typedef vec<2, i8, mediump> mediump_i8vec2; + typedef vec<3, i8, mediump> mediump_i8vec3; + typedef vec<4, i8, mediump> mediump_i8vec4; + + typedef vec<1, i8, highp> highp_i8vec1; + typedef vec<2, i8, highp> highp_i8vec2; + typedef vec<3, i8, highp> highp_i8vec3; + typedef vec<4, i8, highp> highp_i8vec4; + + typedef vec<1, i8, defaultp> i8vec1; + typedef vec<2, i8, defaultp> i8vec2; + typedef vec<3, i8, defaultp> i8vec3; + typedef vec<4, i8, defaultp> i8vec4; + + typedef vec<1, i16, lowp> lowp_i16vec1; + typedef vec<2, i16, lowp> lowp_i16vec2; + typedef vec<3, i16, lowp> lowp_i16vec3; + typedef vec<4, i16, lowp> lowp_i16vec4; + + typedef vec<1, i16, mediump> mediump_i16vec1; + typedef vec<2, i16, mediump> mediump_i16vec2; + typedef vec<3, i16, mediump> mediump_i16vec3; + typedef vec<4, i16, mediump> mediump_i16vec4; + + typedef vec<1, i16, highp> highp_i16vec1; + typedef vec<2, i16, highp> highp_i16vec2; + typedef vec<3, i16, highp> highp_i16vec3; + typedef vec<4, i16, highp> highp_i16vec4; + + typedef vec<1, i16, defaultp> i16vec1; + typedef vec<2, i16, defaultp> i16vec2; + typedef vec<3, i16, defaultp> i16vec3; + typedef vec<4, i16, defaultp> i16vec4; + + typedef vec<1, i32, lowp> lowp_i32vec1; + typedef vec<2, i32, lowp> lowp_i32vec2; + typedef vec<3, i32, lowp> lowp_i32vec3; + typedef vec<4, i32, lowp> lowp_i32vec4; + + typedef vec<1, i32, mediump> mediump_i32vec1; + typedef vec<2, i32, mediump> mediump_i32vec2; + typedef vec<3, i32, mediump> mediump_i32vec3; + typedef vec<4, i32, mediump> mediump_i32vec4; + + typedef vec<1, i32, highp> highp_i32vec1; + typedef vec<2, i32, highp> highp_i32vec2; + typedef vec<3, i32, highp> highp_i32vec3; + typedef vec<4, i32, highp> highp_i32vec4; + + typedef vec<1, i32, defaultp> i32vec1; + typedef vec<2, i32, defaultp> i32vec2; + typedef vec<3, i32, defaultp> i32vec3; + typedef vec<4, i32, defaultp> i32vec4; + + typedef vec<1, i64, lowp> lowp_i64vec1; + typedef vec<2, i64, lowp> lowp_i64vec2; + typedef vec<3, i64, lowp> lowp_i64vec3; + typedef vec<4, i64, lowp> lowp_i64vec4; + + typedef vec<1, i64, mediump> mediump_i64vec1; + typedef vec<2, i64, mediump> mediump_i64vec2; + typedef vec<3, i64, mediump> mediump_i64vec3; + typedef vec<4, i64, mediump> mediump_i64vec4; + + typedef vec<1, i64, highp> highp_i64vec1; + typedef vec<2, i64, highp> highp_i64vec2; + typedef vec<3, i64, highp> highp_i64vec3; + typedef vec<4, i64, highp> highp_i64vec4; + + typedef vec<1, i64, defaultp> i64vec1; + typedef vec<2, i64, defaultp> i64vec2; + typedef vec<3, i64, defaultp> i64vec3; + typedef vec<4, i64, defaultp> i64vec4; + + // Vector uint + + typedef vec<1, uint, lowp> lowp_uvec1; + typedef vec<2, uint, lowp> lowp_uvec2; + typedef vec<3, uint, lowp> lowp_uvec3; + typedef vec<4, uint, lowp> lowp_uvec4; + + typedef vec<1, uint, mediump> mediump_uvec1; + typedef vec<2, uint, mediump> mediump_uvec2; + typedef vec<3, uint, mediump> mediump_uvec3; + typedef vec<4, uint, mediump> mediump_uvec4; + + typedef vec<1, uint, highp> highp_uvec1; + typedef vec<2, uint, highp> highp_uvec2; + typedef vec<3, uint, highp> highp_uvec3; + typedef vec<4, uint, highp> highp_uvec4; + + typedef vec<1, uint, defaultp> uvec1; + typedef vec<2, uint, defaultp> uvec2; + typedef vec<3, uint, defaultp> uvec3; + typedef vec<4, uint, defaultp> uvec4; + + typedef vec<1, u8, lowp> lowp_u8vec1; + typedef vec<2, u8, lowp> lowp_u8vec2; + typedef vec<3, u8, lowp> lowp_u8vec3; + typedef vec<4, u8, lowp> lowp_u8vec4; + + typedef vec<1, u8, mediump> mediump_u8vec1; + typedef vec<2, u8, mediump> mediump_u8vec2; + typedef vec<3, u8, mediump> mediump_u8vec3; + typedef vec<4, u8, mediump> mediump_u8vec4; + + typedef vec<1, u8, highp> highp_u8vec1; + typedef vec<2, u8, highp> highp_u8vec2; + typedef vec<3, u8, highp> highp_u8vec3; + typedef vec<4, u8, highp> highp_u8vec4; + + typedef vec<1, u8, defaultp> u8vec1; + typedef vec<2, u8, defaultp> u8vec2; + typedef vec<3, u8, defaultp> u8vec3; + typedef vec<4, u8, defaultp> u8vec4; + + typedef vec<1, u16, lowp> lowp_u16vec1; + typedef vec<2, u16, lowp> lowp_u16vec2; + typedef vec<3, u16, lowp> lowp_u16vec3; + typedef vec<4, u16, lowp> lowp_u16vec4; + + typedef vec<1, u16, mediump> mediump_u16vec1; + typedef vec<2, u16, mediump> mediump_u16vec2; + typedef vec<3, u16, mediump> mediump_u16vec3; + typedef vec<4, u16, mediump> mediump_u16vec4; + + typedef vec<1, u16, highp> highp_u16vec1; + typedef vec<2, u16, highp> highp_u16vec2; + typedef vec<3, u16, highp> highp_u16vec3; + typedef vec<4, u16, highp> highp_u16vec4; + + typedef vec<1, u16, defaultp> u16vec1; + typedef vec<2, u16, defaultp> u16vec2; + typedef vec<3, u16, defaultp> u16vec3; + typedef vec<4, u16, defaultp> u16vec4; + + typedef vec<1, u32, lowp> lowp_u32vec1; + typedef vec<2, u32, lowp> lowp_u32vec2; + typedef vec<3, u32, lowp> lowp_u32vec3; + typedef vec<4, u32, lowp> lowp_u32vec4; + + typedef vec<1, u32, mediump> mediump_u32vec1; + typedef vec<2, u32, mediump> mediump_u32vec2; + typedef vec<3, u32, mediump> mediump_u32vec3; + typedef vec<4, u32, mediump> mediump_u32vec4; + + typedef vec<1, u32, highp> highp_u32vec1; + typedef vec<2, u32, highp> highp_u32vec2; + typedef vec<3, u32, highp> highp_u32vec3; + typedef vec<4, u32, highp> highp_u32vec4; + + typedef vec<1, u32, defaultp> u32vec1; + typedef vec<2, u32, defaultp> u32vec2; + typedef vec<3, u32, defaultp> u32vec3; + typedef vec<4, u32, defaultp> u32vec4; + + typedef vec<1, u64, lowp> lowp_u64vec1; + typedef vec<2, u64, lowp> lowp_u64vec2; + typedef vec<3, u64, lowp> lowp_u64vec3; + typedef vec<4, u64, lowp> lowp_u64vec4; + + typedef vec<1, u64, mediump> mediump_u64vec1; + typedef vec<2, u64, mediump> mediump_u64vec2; + typedef vec<3, u64, mediump> mediump_u64vec3; + typedef vec<4, u64, mediump> mediump_u64vec4; + + typedef vec<1, u64, highp> highp_u64vec1; + typedef vec<2, u64, highp> highp_u64vec2; + typedef vec<3, u64, highp> highp_u64vec3; + typedef vec<4, u64, highp> highp_u64vec4; + + typedef vec<1, u64, defaultp> u64vec1; + typedef vec<2, u64, defaultp> u64vec2; + typedef vec<3, u64, defaultp> u64vec3; + typedef vec<4, u64, defaultp> u64vec4; + + // Vector float + + typedef vec<1, float, lowp> lowp_vec1; + typedef vec<2, float, lowp> lowp_vec2; + typedef vec<3, float, lowp> lowp_vec3; + typedef vec<4, float, lowp> lowp_vec4; + + typedef vec<1, float, mediump> mediump_vec1; + typedef vec<2, float, mediump> mediump_vec2; + typedef vec<3, float, mediump> mediump_vec3; + typedef vec<4, float, mediump> mediump_vec4; + + typedef vec<1, float, highp> highp_vec1; + typedef vec<2, float, highp> highp_vec2; + typedef vec<3, float, highp> highp_vec3; + typedef vec<4, float, highp> highp_vec4; + + typedef vec<1, float, defaultp> vec1; + typedef vec<2, float, defaultp> vec2; + typedef vec<3, float, defaultp> vec3; + typedef vec<4, float, defaultp> vec4; + + typedef vec<1, float, lowp> lowp_fvec1; + typedef vec<2, float, lowp> lowp_fvec2; + typedef vec<3, float, lowp> lowp_fvec3; + typedef vec<4, float, lowp> lowp_fvec4; + + typedef vec<1, float, mediump> mediump_fvec1; + typedef vec<2, float, mediump> mediump_fvec2; + typedef vec<3, float, mediump> mediump_fvec3; + typedef vec<4, float, mediump> mediump_fvec4; + + typedef vec<1, float, highp> highp_fvec1; + typedef vec<2, float, highp> highp_fvec2; + typedef vec<3, float, highp> highp_fvec3; + typedef vec<4, float, highp> highp_fvec4; + + typedef vec<1, f32, defaultp> fvec1; + typedef vec<2, f32, defaultp> fvec2; + typedef vec<3, f32, defaultp> fvec3; + typedef vec<4, f32, defaultp> fvec4; + + typedef vec<1, f32, lowp> lowp_f32vec1; + typedef vec<2, f32, lowp> lowp_f32vec2; + typedef vec<3, f32, lowp> lowp_f32vec3; + typedef vec<4, f32, lowp> lowp_f32vec4; + + typedef vec<1, f32, mediump> mediump_f32vec1; + typedef vec<2, f32, mediump> mediump_f32vec2; + typedef vec<3, f32, mediump> mediump_f32vec3; + typedef vec<4, f32, mediump> mediump_f32vec4; + + typedef vec<1, f32, highp> highp_f32vec1; + typedef vec<2, f32, highp> highp_f32vec2; + typedef vec<3, f32, highp> highp_f32vec3; + typedef vec<4, f32, highp> highp_f32vec4; + + typedef vec<1, f32, defaultp> f32vec1; + typedef vec<2, f32, defaultp> f32vec2; + typedef vec<3, f32, defaultp> f32vec3; + typedef vec<4, f32, defaultp> f32vec4; + + typedef vec<1, f64, lowp> lowp_dvec1; + typedef vec<2, f64, lowp> lowp_dvec2; + typedef vec<3, f64, lowp> lowp_dvec3; + typedef vec<4, f64, lowp> lowp_dvec4; + + typedef vec<1, f64, mediump> mediump_dvec1; + typedef vec<2, f64, mediump> mediump_dvec2; + typedef vec<3, f64, mediump> mediump_dvec3; + typedef vec<4, f64, mediump> mediump_dvec4; + + typedef vec<1, f64, highp> highp_dvec1; + typedef vec<2, f64, highp> highp_dvec2; + typedef vec<3, f64, highp> highp_dvec3; + typedef vec<4, f64, highp> highp_dvec4; + + typedef vec<1, f64, defaultp> dvec1; + typedef vec<2, f64, defaultp> dvec2; + typedef vec<3, f64, defaultp> dvec3; + typedef vec<4, f64, defaultp> dvec4; + + typedef vec<1, f64, lowp> lowp_f64vec1; + typedef vec<2, f64, lowp> lowp_f64vec2; + typedef vec<3, f64, lowp> lowp_f64vec3; + typedef vec<4, f64, lowp> lowp_f64vec4; + + typedef vec<1, f64, mediump> mediump_f64vec1; + typedef vec<2, f64, mediump> mediump_f64vec2; + typedef vec<3, f64, mediump> mediump_f64vec3; + typedef vec<4, f64, mediump> mediump_f64vec4; + + typedef vec<1, f64, highp> highp_f64vec1; + typedef vec<2, f64, highp> highp_f64vec2; + typedef vec<3, f64, highp> highp_f64vec3; + typedef vec<4, f64, highp> highp_f64vec4; + + typedef vec<1, f64, defaultp> f64vec1; + typedef vec<2, f64, defaultp> f64vec2; + typedef vec<3, f64, defaultp> f64vec3; + typedef vec<4, f64, defaultp> f64vec4; + + // Matrix NxN + + typedef mat<2, 2, f32, lowp> lowp_mat2; + typedef mat<3, 3, f32, lowp> lowp_mat3; + typedef mat<4, 4, f32, lowp> lowp_mat4; + + typedef mat<2, 2, f32, mediump> mediump_mat2; + typedef mat<3, 3, f32, mediump> mediump_mat3; + typedef mat<4, 4, f32, mediump> mediump_mat4; + + typedef mat<2, 2, f32, highp> highp_mat2; + typedef mat<3, 3, f32, highp> highp_mat3; + typedef mat<4, 4, f32, highp> highp_mat4; + + typedef mat<2, 2, f32, defaultp> mat2; + typedef mat<3, 3, f32, defaultp> mat3; + typedef mat<4, 4, f32, defaultp> mat4; + + typedef mat<2, 2, f32, lowp> lowp_fmat2; + typedef mat<3, 3, f32, lowp> lowp_fmat3; + typedef mat<4, 4, f32, lowp> lowp_fmat4; + + typedef mat<2, 2, f32, mediump> mediump_fmat2; + typedef mat<3, 3, f32, mediump> mediump_fmat3; + typedef mat<4, 4, f32, mediump> mediump_fmat4; + + typedef mat<2, 2, f32, highp> highp_fmat2; + typedef mat<3, 3, f32, highp> highp_fmat3; + typedef mat<4, 4, f32, highp> highp_fmat4; + + typedef mat<2, 2, f32, defaultp> fmat2; + typedef mat<3, 3, f32, defaultp> fmat3; + typedef mat<4, 4, f32, defaultp> fmat4; + + typedef mat<2, 2, f32, lowp> lowp_f32mat2; + typedef mat<3, 3, f32, lowp> lowp_f32mat3; + typedef mat<4, 4, f32, lowp> lowp_f32mat4; + + typedef mat<2, 2, f32, mediump> mediump_f32mat2; + typedef mat<3, 3, f32, mediump> mediump_f32mat3; + typedef mat<4, 4, f32, mediump> mediump_f32mat4; + + typedef mat<2, 2, f32, highp> highp_f32mat2; + typedef mat<3, 3, f32, highp> highp_f32mat3; + typedef mat<4, 4, f32, highp> highp_f32mat4; + + typedef mat<2, 2, f32, defaultp> f32mat2; + typedef mat<3, 3, f32, defaultp> f32mat3; + typedef mat<4, 4, f32, defaultp> f32mat4; + + typedef mat<2, 2, f64, lowp> lowp_dmat2; + typedef mat<3, 3, f64, lowp> lowp_dmat3; + typedef mat<4, 4, f64, lowp> lowp_dmat4; + + typedef mat<2, 2, f64, mediump> mediump_dmat2; + typedef mat<3, 3, f64, mediump> mediump_dmat3; + typedef mat<4, 4, f64, mediump> mediump_dmat4; + + typedef mat<2, 2, f64, highp> highp_dmat2; + typedef mat<3, 3, f64, highp> highp_dmat3; + typedef mat<4, 4, f64, highp> highp_dmat4; + + typedef mat<2, 2, f64, defaultp> dmat2; + typedef mat<3, 3, f64, defaultp> dmat3; + typedef mat<4, 4, f64, defaultp> dmat4; + + typedef mat<2, 2, f64, lowp> lowp_f64mat2; + typedef mat<3, 3, f64, lowp> lowp_f64mat3; + typedef mat<4, 4, f64, lowp> lowp_f64mat4; + + typedef mat<2, 2, f64, mediump> mediump_f64mat2; + typedef mat<3, 3, f64, mediump> mediump_f64mat3; + typedef mat<4, 4, f64, mediump> mediump_f64mat4; + + typedef mat<2, 2, f64, highp> highp_f64mat2; + typedef mat<3, 3, f64, highp> highp_f64mat3; + typedef mat<4, 4, f64, highp> highp_f64mat4; + + typedef mat<2, 2, f64, defaultp> f64mat2; + typedef mat<3, 3, f64, defaultp> f64mat3; + typedef mat<4, 4, f64, defaultp> f64mat4; + + // Matrix MxN + + typedef mat<2, 2, f32, lowp> lowp_mat2x2; + typedef mat<2, 3, f32, lowp> lowp_mat2x3; + typedef mat<2, 4, f32, lowp> lowp_mat2x4; + typedef mat<3, 2, f32, lowp> lowp_mat3x2; + typedef mat<3, 3, f32, lowp> lowp_mat3x3; + typedef mat<3, 4, f32, lowp> lowp_mat3x4; + typedef mat<4, 2, f32, lowp> lowp_mat4x2; + typedef mat<4, 3, f32, lowp> lowp_mat4x3; + typedef mat<4, 4, f32, lowp> lowp_mat4x4; + + typedef mat<2, 2, f32, mediump> mediump_mat2x2; + typedef mat<2, 3, f32, mediump> mediump_mat2x3; + typedef mat<2, 4, f32, mediump> mediump_mat2x4; + typedef mat<3, 2, f32, mediump> mediump_mat3x2; + typedef mat<3, 3, f32, mediump> mediump_mat3x3; + typedef mat<3, 4, f32, mediump> mediump_mat3x4; + typedef mat<4, 2, f32, mediump> mediump_mat4x2; + typedef mat<4, 3, f32, mediump> mediump_mat4x3; + typedef mat<4, 4, f32, mediump> mediump_mat4x4; + + typedef mat<2, 2, f32, highp> highp_mat2x2; + typedef mat<2, 3, f32, highp> highp_mat2x3; + typedef mat<2, 4, f32, highp> highp_mat2x4; + typedef mat<3, 2, f32, highp> highp_mat3x2; + typedef mat<3, 3, f32, highp> highp_mat3x3; + typedef mat<3, 4, f32, highp> highp_mat3x4; + typedef mat<4, 2, f32, highp> highp_mat4x2; + typedef mat<4, 3, f32, highp> highp_mat4x3; + typedef mat<4, 4, f32, highp> highp_mat4x4; + + typedef mat<2, 2, f32, defaultp> mat2x2; + typedef mat<3, 2, f32, defaultp> mat3x2; + typedef mat<4, 2, f32, defaultp> mat4x2; + typedef mat<2, 3, f32, defaultp> mat2x3; + typedef mat<3, 3, f32, defaultp> mat3x3; + typedef mat<4, 3, f32, defaultp> mat4x3; + typedef mat<2, 4, f32, defaultp> mat2x4; + typedef mat<3, 4, f32, defaultp> mat3x4; + typedef mat<4, 4, f32, defaultp> mat4x4; + + typedef mat<2, 2, f32, lowp> lowp_fmat2x2; + typedef mat<2, 3, f32, lowp> lowp_fmat2x3; + typedef mat<2, 4, f32, lowp> lowp_fmat2x4; + typedef mat<3, 2, f32, lowp> lowp_fmat3x2; + typedef mat<3, 3, f32, lowp> lowp_fmat3x3; + typedef mat<3, 4, f32, lowp> lowp_fmat3x4; + typedef mat<4, 2, f32, lowp> lowp_fmat4x2; + typedef mat<4, 3, f32, lowp> lowp_fmat4x3; + typedef mat<4, 4, f32, lowp> lowp_fmat4x4; + + typedef mat<2, 2, f32, mediump> mediump_fmat2x2; + typedef mat<2, 3, f32, mediump> mediump_fmat2x3; + typedef mat<2, 4, f32, mediump> mediump_fmat2x4; + typedef mat<3, 2, f32, mediump> mediump_fmat3x2; + typedef mat<3, 3, f32, mediump> mediump_fmat3x3; + typedef mat<3, 4, f32, mediump> mediump_fmat3x4; + typedef mat<4, 2, f32, mediump> mediump_fmat4x2; + typedef mat<4, 3, f32, mediump> mediump_fmat4x3; + typedef mat<4, 4, f32, mediump> mediump_fmat4x4; + + typedef mat<2, 2, f32, highp> highp_fmat2x2; + typedef mat<2, 3, f32, highp> highp_fmat2x3; + typedef mat<2, 4, f32, highp> highp_fmat2x4; + typedef mat<3, 2, f32, highp> highp_fmat3x2; + typedef mat<3, 3, f32, highp> highp_fmat3x3; + typedef mat<3, 4, f32, highp> highp_fmat3x4; + typedef mat<4, 2, f32, highp> highp_fmat4x2; + typedef mat<4, 3, f32, highp> highp_fmat4x3; + typedef mat<4, 4, f32, highp> highp_fmat4x4; + + typedef mat<2, 2, f32, defaultp> fmat2x2; + typedef mat<3, 2, f32, defaultp> fmat3x2; + typedef mat<4, 2, f32, defaultp> fmat4x2; + typedef mat<2, 3, f32, defaultp> fmat2x3; + typedef mat<3, 3, f32, defaultp> fmat3x3; + typedef mat<4, 3, f32, defaultp> fmat4x3; + typedef mat<2, 4, f32, defaultp> fmat2x4; + typedef mat<3, 4, f32, defaultp> fmat3x4; + typedef mat<4, 4, f32, defaultp> fmat4x4; + + typedef mat<2, 2, f32, lowp> lowp_f32mat2x2; + typedef mat<2, 3, f32, lowp> lowp_f32mat2x3; + typedef mat<2, 4, f32, lowp> lowp_f32mat2x4; + typedef mat<3, 2, f32, lowp> lowp_f32mat3x2; + typedef mat<3, 3, f32, lowp> lowp_f32mat3x3; + typedef mat<3, 4, f32, lowp> lowp_f32mat3x4; + typedef mat<4, 2, f32, lowp> lowp_f32mat4x2; + typedef mat<4, 3, f32, lowp> lowp_f32mat4x3; + typedef mat<4, 4, f32, lowp> lowp_f32mat4x4; + + typedef mat<2, 2, f32, mediump> mediump_f32mat2x2; + typedef mat<2, 3, f32, mediump> mediump_f32mat2x3; + typedef mat<2, 4, f32, mediump> mediump_f32mat2x4; + typedef mat<3, 2, f32, mediump> mediump_f32mat3x2; + typedef mat<3, 3, f32, mediump> mediump_f32mat3x3; + typedef mat<3, 4, f32, mediump> mediump_f32mat3x4; + typedef mat<4, 2, f32, mediump> mediump_f32mat4x2; + typedef mat<4, 3, f32, mediump> mediump_f32mat4x3; + typedef mat<4, 4, f32, mediump> mediump_f32mat4x4; + + typedef mat<2, 2, f32, highp> highp_f32mat2x2; + typedef mat<2, 3, f32, highp> highp_f32mat2x3; + typedef mat<2, 4, f32, highp> highp_f32mat2x4; + typedef mat<3, 2, f32, highp> highp_f32mat3x2; + typedef mat<3, 3, f32, highp> highp_f32mat3x3; + typedef mat<3, 4, f32, highp> highp_f32mat3x4; + typedef mat<4, 2, f32, highp> highp_f32mat4x2; + typedef mat<4, 3, f32, highp> highp_f32mat4x3; + typedef mat<4, 4, f32, highp> highp_f32mat4x4; + + typedef mat<2, 2, f32, defaultp> f32mat2x2; + typedef mat<3, 2, f32, defaultp> f32mat3x2; + typedef mat<4, 2, f32, defaultp> f32mat4x2; + typedef mat<2, 3, f32, defaultp> f32mat2x3; + typedef mat<3, 3, f32, defaultp> f32mat3x3; + typedef mat<4, 3, f32, defaultp> f32mat4x3; + typedef mat<2, 4, f32, defaultp> f32mat2x4; + typedef mat<3, 4, f32, defaultp> f32mat3x4; + typedef mat<4, 4, f32, defaultp> f32mat4x4; + + typedef mat<2, 2, double, lowp> lowp_dmat2x2; + typedef mat<2, 3, double, lowp> lowp_dmat2x3; + typedef mat<2, 4, double, lowp> lowp_dmat2x4; + typedef mat<3, 2, double, lowp> lowp_dmat3x2; + typedef mat<3, 3, double, lowp> lowp_dmat3x3; + typedef mat<3, 4, double, lowp> lowp_dmat3x4; + typedef mat<4, 2, double, lowp> lowp_dmat4x2; + typedef mat<4, 3, double, lowp> lowp_dmat4x3; + typedef mat<4, 4, double, lowp> lowp_dmat4x4; + + typedef mat<2, 2, double, mediump> mediump_dmat2x2; + typedef mat<2, 3, double, mediump> mediump_dmat2x3; + typedef mat<2, 4, double, mediump> mediump_dmat2x4; + typedef mat<3, 2, double, mediump> mediump_dmat3x2; + typedef mat<3, 3, double, mediump> mediump_dmat3x3; + typedef mat<3, 4, double, mediump> mediump_dmat3x4; + typedef mat<4, 2, double, mediump> mediump_dmat4x2; + typedef mat<4, 3, double, mediump> mediump_dmat4x3; + typedef mat<4, 4, double, mediump> mediump_dmat4x4; + + typedef mat<2, 2, double, highp> highp_dmat2x2; + typedef mat<2, 3, double, highp> highp_dmat2x3; + typedef mat<2, 4, double, highp> highp_dmat2x4; + typedef mat<3, 2, double, highp> highp_dmat3x2; + typedef mat<3, 3, double, highp> highp_dmat3x3; + typedef mat<3, 4, double, highp> highp_dmat3x4; + typedef mat<4, 2, double, highp> highp_dmat4x2; + typedef mat<4, 3, double, highp> highp_dmat4x3; + typedef mat<4, 4, double, highp> highp_dmat4x4; + + typedef mat<2, 2, double, defaultp> dmat2x2; + typedef mat<3, 2, double, defaultp> dmat3x2; + typedef mat<4, 2, double, defaultp> dmat4x2; + typedef mat<2, 3, double, defaultp> dmat2x3; + typedef mat<3, 3, double, defaultp> dmat3x3; + typedef mat<4, 3, double, defaultp> dmat4x3; + typedef mat<2, 4, double, defaultp> dmat2x4; + typedef mat<3, 4, double, defaultp> dmat3x4; + typedef mat<4, 4, double, defaultp> dmat4x4; + + typedef mat<2, 2, f64, lowp> lowp_f64mat2x2; + typedef mat<2, 3, f64, lowp> lowp_f64mat2x3; + typedef mat<2, 4, f64, lowp> lowp_f64mat2x4; + typedef mat<3, 2, f64, lowp> lowp_f64mat3x2; + typedef mat<3, 3, f64, lowp> lowp_f64mat3x3; + typedef mat<3, 4, f64, lowp> lowp_f64mat3x4; + typedef mat<4, 2, f64, lowp> lowp_f64mat4x2; + typedef mat<4, 3, f64, lowp> lowp_f64mat4x3; + typedef mat<4, 4, f64, lowp> lowp_f64mat4x4; + + typedef mat<2, 2, f64, mediump> mediump_f64mat2x2; + typedef mat<2, 3, f64, mediump> mediump_f64mat2x3; + typedef mat<2, 4, f64, mediump> mediump_f64mat2x4; + typedef mat<3, 2, f64, mediump> mediump_f64mat3x2; + typedef mat<3, 3, f64, mediump> mediump_f64mat3x3; + typedef mat<3, 4, f64, mediump> mediump_f64mat3x4; + typedef mat<4, 2, f64, mediump> mediump_f64mat4x2; + typedef mat<4, 3, f64, mediump> mediump_f64mat4x3; + typedef mat<4, 4, f64, mediump> mediump_f64mat4x4; + + typedef mat<2, 2, f64, highp> highp_f64mat2x2; + typedef mat<2, 3, f64, highp> highp_f64mat2x3; + typedef mat<2, 4, f64, highp> highp_f64mat2x4; + typedef mat<3, 2, f64, highp> highp_f64mat3x2; + typedef mat<3, 3, f64, highp> highp_f64mat3x3; + typedef mat<3, 4, f64, highp> highp_f64mat3x4; + typedef mat<4, 2, f64, highp> highp_f64mat4x2; + typedef mat<4, 3, f64, highp> highp_f64mat4x3; + typedef mat<4, 4, f64, highp> highp_f64mat4x4; + + typedef mat<2, 2, f64, defaultp> f64mat2x2; + typedef mat<3, 2, f64, defaultp> f64mat3x2; + typedef mat<4, 2, f64, defaultp> f64mat4x2; + typedef mat<2, 3, f64, defaultp> f64mat2x3; + typedef mat<3, 3, f64, defaultp> f64mat3x3; + typedef mat<4, 3, f64, defaultp> f64mat4x3; + typedef mat<2, 4, f64, defaultp> f64mat2x4; + typedef mat<3, 4, f64, defaultp> f64mat3x4; + typedef mat<4, 4, f64, defaultp> f64mat4x4; + + // Signed integer matrix MxN + + typedef mat<2, 2, int, lowp> lowp_imat2x2; + typedef mat<2, 3, int, lowp> lowp_imat2x3; + typedef mat<2, 4, int, lowp> lowp_imat2x4; + typedef mat<3, 2, int, lowp> lowp_imat3x2; + typedef mat<3, 3, int, lowp> lowp_imat3x3; + typedef mat<3, 4, int, lowp> lowp_imat3x4; + typedef mat<4, 2, int, lowp> lowp_imat4x2; + typedef mat<4, 3, int, lowp> lowp_imat4x3; + typedef mat<4, 4, int, lowp> lowp_imat4x4; + + typedef mat<2, 2, int, mediump> mediump_imat2x2; + typedef mat<2, 3, int, mediump> mediump_imat2x3; + typedef mat<2, 4, int, mediump> mediump_imat2x4; + typedef mat<3, 2, int, mediump> mediump_imat3x2; + typedef mat<3, 3, int, mediump> mediump_imat3x3; + typedef mat<3, 4, int, mediump> mediump_imat3x4; + typedef mat<4, 2, int, mediump> mediump_imat4x2; + typedef mat<4, 3, int, mediump> mediump_imat4x3; + typedef mat<4, 4, int, mediump> mediump_imat4x4; + + typedef mat<2, 2, int, highp> highp_imat2x2; + typedef mat<2, 3, int, highp> highp_imat2x3; + typedef mat<2, 4, int, highp> highp_imat2x4; + typedef mat<3, 2, int, highp> highp_imat3x2; + typedef mat<3, 3, int, highp> highp_imat3x3; + typedef mat<3, 4, int, highp> highp_imat3x4; + typedef mat<4, 2, int, highp> highp_imat4x2; + typedef mat<4, 3, int, highp> highp_imat4x3; + typedef mat<4, 4, int, highp> highp_imat4x4; + + typedef mat<2, 2, int, defaultp> imat2x2; + typedef mat<3, 2, int, defaultp> imat3x2; + typedef mat<4, 2, int, defaultp> imat4x2; + typedef mat<2, 3, int, defaultp> imat2x3; + typedef mat<3, 3, int, defaultp> imat3x3; + typedef mat<4, 3, int, defaultp> imat4x3; + typedef mat<2, 4, int, defaultp> imat2x4; + typedef mat<3, 4, int, defaultp> imat3x4; + typedef mat<4, 4, int, defaultp> imat4x4; + + + typedef mat<2, 2, int8, lowp> lowp_i8mat2x2; + typedef mat<2, 3, int8, lowp> lowp_i8mat2x3; + typedef mat<2, 4, int8, lowp> lowp_i8mat2x4; + typedef mat<3, 2, int8, lowp> lowp_i8mat3x2; + typedef mat<3, 3, int8, lowp> lowp_i8mat3x3; + typedef mat<3, 4, int8, lowp> lowp_i8mat3x4; + typedef mat<4, 2, int8, lowp> lowp_i8mat4x2; + typedef mat<4, 3, int8, lowp> lowp_i8mat4x3; + typedef mat<4, 4, int8, lowp> lowp_i8mat4x4; + + typedef mat<2, 2, int8, mediump> mediump_i8mat2x2; + typedef mat<2, 3, int8, mediump> mediump_i8mat2x3; + typedef mat<2, 4, int8, mediump> mediump_i8mat2x4; + typedef mat<3, 2, int8, mediump> mediump_i8mat3x2; + typedef mat<3, 3, int8, mediump> mediump_i8mat3x3; + typedef mat<3, 4, int8, mediump> mediump_i8mat3x4; + typedef mat<4, 2, int8, mediump> mediump_i8mat4x2; + typedef mat<4, 3, int8, mediump> mediump_i8mat4x3; + typedef mat<4, 4, int8, mediump> mediump_i8mat4x4; + + typedef mat<2, 2, int8, highp> highp_i8mat2x2; + typedef mat<2, 3, int8, highp> highp_i8mat2x3; + typedef mat<2, 4, int8, highp> highp_i8mat2x4; + typedef mat<3, 2, int8, highp> highp_i8mat3x2; + typedef mat<3, 3, int8, highp> highp_i8mat3x3; + typedef mat<3, 4, int8, highp> highp_i8mat3x4; + typedef mat<4, 2, int8, highp> highp_i8mat4x2; + typedef mat<4, 3, int8, highp> highp_i8mat4x3; + typedef mat<4, 4, int8, highp> highp_i8mat4x4; + + typedef mat<2, 2, int8, defaultp> i8mat2x2; + typedef mat<3, 2, int8, defaultp> i8mat3x2; + typedef mat<4, 2, int8, defaultp> i8mat4x2; + typedef mat<2, 3, int8, defaultp> i8mat2x3; + typedef mat<3, 3, int8, defaultp> i8mat3x3; + typedef mat<4, 3, int8, defaultp> i8mat4x3; + typedef mat<2, 4, int8, defaultp> i8mat2x4; + typedef mat<3, 4, int8, defaultp> i8mat3x4; + typedef mat<4, 4, int8, defaultp> i8mat4x4; + + + typedef mat<2, 2, int16, lowp> lowp_i16mat2x2; + typedef mat<2, 3, int16, lowp> lowp_i16mat2x3; + typedef mat<2, 4, int16, lowp> lowp_i16mat2x4; + typedef mat<3, 2, int16, lowp> lowp_i16mat3x2; + typedef mat<3, 3, int16, lowp> lowp_i16mat3x3; + typedef mat<3, 4, int16, lowp> lowp_i16mat3x4; + typedef mat<4, 2, int16, lowp> lowp_i16mat4x2; + typedef mat<4, 3, int16, lowp> lowp_i16mat4x3; + typedef mat<4, 4, int16, lowp> lowp_i16mat4x4; + + typedef mat<2, 2, int16, mediump> mediump_i16mat2x2; + typedef mat<2, 3, int16, mediump> mediump_i16mat2x3; + typedef mat<2, 4, int16, mediump> mediump_i16mat2x4; + typedef mat<3, 2, int16, mediump> mediump_i16mat3x2; + typedef mat<3, 3, int16, mediump> mediump_i16mat3x3; + typedef mat<3, 4, int16, mediump> mediump_i16mat3x4; + typedef mat<4, 2, int16, mediump> mediump_i16mat4x2; + typedef mat<4, 3, int16, mediump> mediump_i16mat4x3; + typedef mat<4, 4, int16, mediump> mediump_i16mat4x4; + + typedef mat<2, 2, int16, highp> highp_i16mat2x2; + typedef mat<2, 3, int16, highp> highp_i16mat2x3; + typedef mat<2, 4, int16, highp> highp_i16mat2x4; + typedef mat<3, 2, int16, highp> highp_i16mat3x2; + typedef mat<3, 3, int16, highp> highp_i16mat3x3; + typedef mat<3, 4, int16, highp> highp_i16mat3x4; + typedef mat<4, 2, int16, highp> highp_i16mat4x2; + typedef mat<4, 3, int16, highp> highp_i16mat4x3; + typedef mat<4, 4, int16, highp> highp_i16mat4x4; + + typedef mat<2, 2, int16, defaultp> i16mat2x2; + typedef mat<3, 2, int16, defaultp> i16mat3x2; + typedef mat<4, 2, int16, defaultp> i16mat4x2; + typedef mat<2, 3, int16, defaultp> i16mat2x3; + typedef mat<3, 3, int16, defaultp> i16mat3x3; + typedef mat<4, 3, int16, defaultp> i16mat4x3; + typedef mat<2, 4, int16, defaultp> i16mat2x4; + typedef mat<3, 4, int16, defaultp> i16mat3x4; + typedef mat<4, 4, int16, defaultp> i16mat4x4; + + + typedef mat<2, 2, int32, lowp> lowp_i32mat2x2; + typedef mat<2, 3, int32, lowp> lowp_i32mat2x3; + typedef mat<2, 4, int32, lowp> lowp_i32mat2x4; + typedef mat<3, 2, int32, lowp> lowp_i32mat3x2; + typedef mat<3, 3, int32, lowp> lowp_i32mat3x3; + typedef mat<3, 4, int32, lowp> lowp_i32mat3x4; + typedef mat<4, 2, int32, lowp> lowp_i32mat4x2; + typedef mat<4, 3, int32, lowp> lowp_i32mat4x3; + typedef mat<4, 4, int32, lowp> lowp_i32mat4x4; + + typedef mat<2, 2, int32, mediump> mediump_i32mat2x2; + typedef mat<2, 3, int32, mediump> mediump_i32mat2x3; + typedef mat<2, 4, int32, mediump> mediump_i32mat2x4; + typedef mat<3, 2, int32, mediump> mediump_i32mat3x2; + typedef mat<3, 3, int32, mediump> mediump_i32mat3x3; + typedef mat<3, 4, int32, mediump> mediump_i32mat3x4; + typedef mat<4, 2, int32, mediump> mediump_i32mat4x2; + typedef mat<4, 3, int32, mediump> mediump_i32mat4x3; + typedef mat<4, 4, int32, mediump> mediump_i32mat4x4; + + typedef mat<2, 2, int32, highp> highp_i32mat2x2; + typedef mat<2, 3, int32, highp> highp_i32mat2x3; + typedef mat<2, 4, int32, highp> highp_i32mat2x4; + typedef mat<3, 2, int32, highp> highp_i32mat3x2; + typedef mat<3, 3, int32, highp> highp_i32mat3x3; + typedef mat<3, 4, int32, highp> highp_i32mat3x4; + typedef mat<4, 2, int32, highp> highp_i32mat4x2; + typedef mat<4, 3, int32, highp> highp_i32mat4x3; + typedef mat<4, 4, int32, highp> highp_i32mat4x4; + + typedef mat<2, 2, int32, defaultp> i32mat2x2; + typedef mat<3, 2, int32, defaultp> i32mat3x2; + typedef mat<4, 2, int32, defaultp> i32mat4x2; + typedef mat<2, 3, int32, defaultp> i32mat2x3; + typedef mat<3, 3, int32, defaultp> i32mat3x3; + typedef mat<4, 3, int32, defaultp> i32mat4x3; + typedef mat<2, 4, int32, defaultp> i32mat2x4; + typedef mat<3, 4, int32, defaultp> i32mat3x4; + typedef mat<4, 4, int32, defaultp> i32mat4x4; + + + typedef mat<2, 2, int64, lowp> lowp_i64mat2x2; + typedef mat<2, 3, int64, lowp> lowp_i64mat2x3; + typedef mat<2, 4, int64, lowp> lowp_i64mat2x4; + typedef mat<3, 2, int64, lowp> lowp_i64mat3x2; + typedef mat<3, 3, int64, lowp> lowp_i64mat3x3; + typedef mat<3, 4, int64, lowp> lowp_i64mat3x4; + typedef mat<4, 2, int64, lowp> lowp_i64mat4x2; + typedef mat<4, 3, int64, lowp> lowp_i64mat4x3; + typedef mat<4, 4, int64, lowp> lowp_i64mat4x4; + + typedef mat<2, 2, int64, mediump> mediump_i64mat2x2; + typedef mat<2, 3, int64, mediump> mediump_i64mat2x3; + typedef mat<2, 4, int64, mediump> mediump_i64mat2x4; + typedef mat<3, 2, int64, mediump> mediump_i64mat3x2; + typedef mat<3, 3, int64, mediump> mediump_i64mat3x3; + typedef mat<3, 4, int64, mediump> mediump_i64mat3x4; + typedef mat<4, 2, int64, mediump> mediump_i64mat4x2; + typedef mat<4, 3, int64, mediump> mediump_i64mat4x3; + typedef mat<4, 4, int64, mediump> mediump_i64mat4x4; + + typedef mat<2, 2, int64, highp> highp_i64mat2x2; + typedef mat<2, 3, int64, highp> highp_i64mat2x3; + typedef mat<2, 4, int64, highp> highp_i64mat2x4; + typedef mat<3, 2, int64, highp> highp_i64mat3x2; + typedef mat<3, 3, int64, highp> highp_i64mat3x3; + typedef mat<3, 4, int64, highp> highp_i64mat3x4; + typedef mat<4, 2, int64, highp> highp_i64mat4x2; + typedef mat<4, 3, int64, highp> highp_i64mat4x3; + typedef mat<4, 4, int64, highp> highp_i64mat4x4; + + typedef mat<2, 2, int64, defaultp> i64mat2x2; + typedef mat<3, 2, int64, defaultp> i64mat3x2; + typedef mat<4, 2, int64, defaultp> i64mat4x2; + typedef mat<2, 3, int64, defaultp> i64mat2x3; + typedef mat<3, 3, int64, defaultp> i64mat3x3; + typedef mat<4, 3, int64, defaultp> i64mat4x3; + typedef mat<2, 4, int64, defaultp> i64mat2x4; + typedef mat<3, 4, int64, defaultp> i64mat3x4; + typedef mat<4, 4, int64, defaultp> i64mat4x4; + + + // Unsigned integer matrix MxN + + typedef mat<2, 2, uint, lowp> lowp_umat2x2; + typedef mat<2, 3, uint, lowp> lowp_umat2x3; + typedef mat<2, 4, uint, lowp> lowp_umat2x4; + typedef mat<3, 2, uint, lowp> lowp_umat3x2; + typedef mat<3, 3, uint, lowp> lowp_umat3x3; + typedef mat<3, 4, uint, lowp> lowp_umat3x4; + typedef mat<4, 2, uint, lowp> lowp_umat4x2; + typedef mat<4, 3, uint, lowp> lowp_umat4x3; + typedef mat<4, 4, uint, lowp> lowp_umat4x4; + + typedef mat<2, 2, uint, mediump> mediump_umat2x2; + typedef mat<2, 3, uint, mediump> mediump_umat2x3; + typedef mat<2, 4, uint, mediump> mediump_umat2x4; + typedef mat<3, 2, uint, mediump> mediump_umat3x2; + typedef mat<3, 3, uint, mediump> mediump_umat3x3; + typedef mat<3, 4, uint, mediump> mediump_umat3x4; + typedef mat<4, 2, uint, mediump> mediump_umat4x2; + typedef mat<4, 3, uint, mediump> mediump_umat4x3; + typedef mat<4, 4, uint, mediump> mediump_umat4x4; + + typedef mat<2, 2, uint, highp> highp_umat2x2; + typedef mat<2, 3, uint, highp> highp_umat2x3; + typedef mat<2, 4, uint, highp> highp_umat2x4; + typedef mat<3, 2, uint, highp> highp_umat3x2; + typedef mat<3, 3, uint, highp> highp_umat3x3; + typedef mat<3, 4, uint, highp> highp_umat3x4; + typedef mat<4, 2, uint, highp> highp_umat4x2; + typedef mat<4, 3, uint, highp> highp_umat4x3; + typedef mat<4, 4, uint, highp> highp_umat4x4; + + typedef mat<2, 2, uint, defaultp> umat2x2; + typedef mat<3, 2, uint, defaultp> umat3x2; + typedef mat<4, 2, uint, defaultp> umat4x2; + typedef mat<2, 3, uint, defaultp> umat2x3; + typedef mat<3, 3, uint, defaultp> umat3x3; + typedef mat<4, 3, uint, defaultp> umat4x3; + typedef mat<2, 4, uint, defaultp> umat2x4; + typedef mat<3, 4, uint, defaultp> umat3x4; + typedef mat<4, 4, uint, defaultp> umat4x4; + + + typedef mat<2, 2, uint8, lowp> lowp_u8mat2x2; + typedef mat<2, 3, uint8, lowp> lowp_u8mat2x3; + typedef mat<2, 4, uint8, lowp> lowp_u8mat2x4; + typedef mat<3, 2, uint8, lowp> lowp_u8mat3x2; + typedef mat<3, 3, uint8, lowp> lowp_u8mat3x3; + typedef mat<3, 4, uint8, lowp> lowp_u8mat3x4; + typedef mat<4, 2, uint8, lowp> lowp_u8mat4x2; + typedef mat<4, 3, uint8, lowp> lowp_u8mat4x3; + typedef mat<4, 4, uint8, lowp> lowp_u8mat4x4; + + typedef mat<2, 2, uint8, mediump> mediump_u8mat2x2; + typedef mat<2, 3, uint8, mediump> mediump_u8mat2x3; + typedef mat<2, 4, uint8, mediump> mediump_u8mat2x4; + typedef mat<3, 2, uint8, mediump> mediump_u8mat3x2; + typedef mat<3, 3, uint8, mediump> mediump_u8mat3x3; + typedef mat<3, 4, uint8, mediump> mediump_u8mat3x4; + typedef mat<4, 2, uint8, mediump> mediump_u8mat4x2; + typedef mat<4, 3, uint8, mediump> mediump_u8mat4x3; + typedef mat<4, 4, uint8, mediump> mediump_u8mat4x4; + + typedef mat<2, 2, uint8, highp> highp_u8mat2x2; + typedef mat<2, 3, uint8, highp> highp_u8mat2x3; + typedef mat<2, 4, uint8, highp> highp_u8mat2x4; + typedef mat<3, 2, uint8, highp> highp_u8mat3x2; + typedef mat<3, 3, uint8, highp> highp_u8mat3x3; + typedef mat<3, 4, uint8, highp> highp_u8mat3x4; + typedef mat<4, 2, uint8, highp> highp_u8mat4x2; + typedef mat<4, 3, uint8, highp> highp_u8mat4x3; + typedef mat<4, 4, uint8, highp> highp_u8mat4x4; + + typedef mat<2, 2, uint8, defaultp> u8mat2x2; + typedef mat<3, 2, uint8, defaultp> u8mat3x2; + typedef mat<4, 2, uint8, defaultp> u8mat4x2; + typedef mat<2, 3, uint8, defaultp> u8mat2x3; + typedef mat<3, 3, uint8, defaultp> u8mat3x3; + typedef mat<4, 3, uint8, defaultp> u8mat4x3; + typedef mat<2, 4, uint8, defaultp> u8mat2x4; + typedef mat<3, 4, uint8, defaultp> u8mat3x4; + typedef mat<4, 4, uint8, defaultp> u8mat4x4; + + + typedef mat<2, 2, uint16, lowp> lowp_u16mat2x2; + typedef mat<2, 3, uint16, lowp> lowp_u16mat2x3; + typedef mat<2, 4, uint16, lowp> lowp_u16mat2x4; + typedef mat<3, 2, uint16, lowp> lowp_u16mat3x2; + typedef mat<3, 3, uint16, lowp> lowp_u16mat3x3; + typedef mat<3, 4, uint16, lowp> lowp_u16mat3x4; + typedef mat<4, 2, uint16, lowp> lowp_u16mat4x2; + typedef mat<4, 3, uint16, lowp> lowp_u16mat4x3; + typedef mat<4, 4, uint16, lowp> lowp_u16mat4x4; + + typedef mat<2, 2, uint16, mediump> mediump_u16mat2x2; + typedef mat<2, 3, uint16, mediump> mediump_u16mat2x3; + typedef mat<2, 4, uint16, mediump> mediump_u16mat2x4; + typedef mat<3, 2, uint16, mediump> mediump_u16mat3x2; + typedef mat<3, 3, uint16, mediump> mediump_u16mat3x3; + typedef mat<3, 4, uint16, mediump> mediump_u16mat3x4; + typedef mat<4, 2, uint16, mediump> mediump_u16mat4x2; + typedef mat<4, 3, uint16, mediump> mediump_u16mat4x3; + typedef mat<4, 4, uint16, mediump> mediump_u16mat4x4; + + typedef mat<2, 2, uint16, highp> highp_u16mat2x2; + typedef mat<2, 3, uint16, highp> highp_u16mat2x3; + typedef mat<2, 4, uint16, highp> highp_u16mat2x4; + typedef mat<3, 2, uint16, highp> highp_u16mat3x2; + typedef mat<3, 3, uint16, highp> highp_u16mat3x3; + typedef mat<3, 4, uint16, highp> highp_u16mat3x4; + typedef mat<4, 2, uint16, highp> highp_u16mat4x2; + typedef mat<4, 3, uint16, highp> highp_u16mat4x3; + typedef mat<4, 4, uint16, highp> highp_u16mat4x4; + + typedef mat<2, 2, uint16, defaultp> u16mat2x2; + typedef mat<3, 2, uint16, defaultp> u16mat3x2; + typedef mat<4, 2, uint16, defaultp> u16mat4x2; + typedef mat<2, 3, uint16, defaultp> u16mat2x3; + typedef mat<3, 3, uint16, defaultp> u16mat3x3; + typedef mat<4, 3, uint16, defaultp> u16mat4x3; + typedef mat<2, 4, uint16, defaultp> u16mat2x4; + typedef mat<3, 4, uint16, defaultp> u16mat3x4; + typedef mat<4, 4, uint16, defaultp> u16mat4x4; + + + typedef mat<2, 2, uint32, lowp> lowp_u32mat2x2; + typedef mat<2, 3, uint32, lowp> lowp_u32mat2x3; + typedef mat<2, 4, uint32, lowp> lowp_u32mat2x4; + typedef mat<3, 2, uint32, lowp> lowp_u32mat3x2; + typedef mat<3, 3, uint32, lowp> lowp_u32mat3x3; + typedef mat<3, 4, uint32, lowp> lowp_u32mat3x4; + typedef mat<4, 2, uint32, lowp> lowp_u32mat4x2; + typedef mat<4, 3, uint32, lowp> lowp_u32mat4x3; + typedef mat<4, 4, uint32, lowp> lowp_u32mat4x4; + + typedef mat<2, 2, uint32, mediump> mediump_u32mat2x2; + typedef mat<2, 3, uint32, mediump> mediump_u32mat2x3; + typedef mat<2, 4, uint32, mediump> mediump_u32mat2x4; + typedef mat<3, 2, uint32, mediump> mediump_u32mat3x2; + typedef mat<3, 3, uint32, mediump> mediump_u32mat3x3; + typedef mat<3, 4, uint32, mediump> mediump_u32mat3x4; + typedef mat<4, 2, uint32, mediump> mediump_u32mat4x2; + typedef mat<4, 3, uint32, mediump> mediump_u32mat4x3; + typedef mat<4, 4, uint32, mediump> mediump_u32mat4x4; + + typedef mat<2, 2, uint32, highp> highp_u32mat2x2; + typedef mat<2, 3, uint32, highp> highp_u32mat2x3; + typedef mat<2, 4, uint32, highp> highp_u32mat2x4; + typedef mat<3, 2, uint32, highp> highp_u32mat3x2; + typedef mat<3, 3, uint32, highp> highp_u32mat3x3; + typedef mat<3, 4, uint32, highp> highp_u32mat3x4; + typedef mat<4, 2, uint32, highp> highp_u32mat4x2; + typedef mat<4, 3, uint32, highp> highp_u32mat4x3; + typedef mat<4, 4, uint32, highp> highp_u32mat4x4; + + typedef mat<2, 2, uint32, defaultp> u32mat2x2; + typedef mat<3, 2, uint32, defaultp> u32mat3x2; + typedef mat<4, 2, uint32, defaultp> u32mat4x2; + typedef mat<2, 3, uint32, defaultp> u32mat2x3; + typedef mat<3, 3, uint32, defaultp> u32mat3x3; + typedef mat<4, 3, uint32, defaultp> u32mat4x3; + typedef mat<2, 4, uint32, defaultp> u32mat2x4; + typedef mat<3, 4, uint32, defaultp> u32mat3x4; + typedef mat<4, 4, uint32, defaultp> u32mat4x4; + + + typedef mat<2, 2, uint64, lowp> lowp_u64mat2x2; + typedef mat<2, 3, uint64, lowp> lowp_u64mat2x3; + typedef mat<2, 4, uint64, lowp> lowp_u64mat2x4; + typedef mat<3, 2, uint64, lowp> lowp_u64mat3x2; + typedef mat<3, 3, uint64, lowp> lowp_u64mat3x3; + typedef mat<3, 4, uint64, lowp> lowp_u64mat3x4; + typedef mat<4, 2, uint64, lowp> lowp_u64mat4x2; + typedef mat<4, 3, uint64, lowp> lowp_u64mat4x3; + typedef mat<4, 4, uint64, lowp> lowp_u64mat4x4; + + typedef mat<2, 2, uint64, mediump> mediump_u64mat2x2; + typedef mat<2, 3, uint64, mediump> mediump_u64mat2x3; + typedef mat<2, 4, uint64, mediump> mediump_u64mat2x4; + typedef mat<3, 2, uint64, mediump> mediump_u64mat3x2; + typedef mat<3, 3, uint64, mediump> mediump_u64mat3x3; + typedef mat<3, 4, uint64, mediump> mediump_u64mat3x4; + typedef mat<4, 2, uint64, mediump> mediump_u64mat4x2; + typedef mat<4, 3, uint64, mediump> mediump_u64mat4x3; + typedef mat<4, 4, uint64, mediump> mediump_u64mat4x4; + + typedef mat<2, 2, uint64, highp> highp_u64mat2x2; + typedef mat<2, 3, uint64, highp> highp_u64mat2x3; + typedef mat<2, 4, uint64, highp> highp_u64mat2x4; + typedef mat<3, 2, uint64, highp> highp_u64mat3x2; + typedef mat<3, 3, uint64, highp> highp_u64mat3x3; + typedef mat<3, 4, uint64, highp> highp_u64mat3x4; + typedef mat<4, 2, uint64, highp> highp_u64mat4x2; + typedef mat<4, 3, uint64, highp> highp_u64mat4x3; + typedef mat<4, 4, uint64, highp> highp_u64mat4x4; + + typedef mat<2, 2, uint64, defaultp> u64mat2x2; + typedef mat<3, 2, uint64, defaultp> u64mat3x2; + typedef mat<4, 2, uint64, defaultp> u64mat4x2; + typedef mat<2, 3, uint64, defaultp> u64mat2x3; + typedef mat<3, 3, uint64, defaultp> u64mat3x3; + typedef mat<4, 3, uint64, defaultp> u64mat4x3; + typedef mat<2, 4, uint64, defaultp> u64mat2x4; + typedef mat<3, 4, uint64, defaultp> u64mat3x4; + typedef mat<4, 4, uint64, defaultp> u64mat4x4; + + // Quaternion + + typedef qua lowp_quat; + typedef qua mediump_quat; + typedef qua highp_quat; + typedef qua quat; + + typedef qua lowp_fquat; + typedef qua mediump_fquat; + typedef qua highp_fquat; + typedef qua fquat; + + typedef qua lowp_f32quat; + typedef qua mediump_f32quat; + typedef qua highp_f32quat; + typedef qua f32quat; + + typedef qua lowp_dquat; + typedef qua mediump_dquat; + typedef qua highp_dquat; + typedef qua dquat; + + typedef qua lowp_f64quat; + typedef qua mediump_f64quat; + typedef qua highp_f64quat; + typedef qua f64quat; +}//namespace glm + + diff --git a/dep/glm/geometric.hpp b/dep/glm/geometric.hpp new file mode 100644 index 0000000..c068a3c --- /dev/null +++ b/dep/glm/geometric.hpp @@ -0,0 +1,116 @@ +/// @ref core +/// @file glm/geometric.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions +/// +/// @defgroup core_func_geometric Geometric functions +/// @ingroup core +/// +/// These operate on vectors as vectors, not component-wise. +/// +/// Include to use these core features. + +#pragma once + +#include "detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_func_geometric + /// @{ + + /// Returns the length of x, i.e., sqrt(x * x). + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL length man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL T length(vec const& x); + + /// Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL distance man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL T distance(vec const& p0, vec const& p1); + + /// Returns the dot product of x and y, i.e., result = x * y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL dot man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL T dot(vec const& x, vec const& y); + + /// Returns the cross product of x and y. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL cross man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL vec<3, T, Q> cross(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + + /// Returns a vector in the same direction as x but with length of 1. + /// According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result is undefined and generate an error. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL normalize man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL vec normalize(vec const& x); + + /// If dot(Nref, I) < 0.0, return N, otherwise, return -N. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL faceforward man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL vec faceforward( + vec const& N, + vec const& I, + vec const& Nref); + + /// For the incident vector I and surface orientation N, + /// returns the reflection direction : result = I - 2.0 * dot(N, I) * N. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL reflect man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL vec reflect( + vec const& I, + vec const& N); + + /// For the incident vector I and surface normal N, + /// and the ratio of indices of refraction eta, + /// return the refraction vector. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see GLSL refract man page + /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions + template + GLM_FUNC_DECL vec refract( + vec const& I, + vec const& N, + T eta); + + /// @} +}//namespace glm + +#include "detail/func_geometric.inl" diff --git a/dep/glm/glm.hpp b/dep/glm/glm.hpp new file mode 100644 index 0000000..8b61064 --- /dev/null +++ b/dep/glm/glm.hpp @@ -0,0 +1,136 @@ +/// @ref core +/// @file glm/glm.hpp +/// +/// @defgroup core Core features +/// +/// @brief Features that implement in C++ the GLSL specification as closely as possible. +/// +/// The GLM core consists of C++ types that mirror GLSL types and +/// C++ functions that mirror the GLSL functions. +/// +/// The best documentation for GLM Core is the current GLSL specification, +/// version 4.2 +/// (pdf file). +/// +/// GLM core functionalities require to be included to be used. +/// +/// +/// @defgroup core_vector Vector types +/// +/// Vector types of two to four components with an exhaustive set of operators. +/// +/// @ingroup core +/// +/// +/// @defgroup core_vector_precision Vector types with precision qualifiers +/// +/// @brief Vector types with precision qualifiers which may result in various precision in term of ULPs +/// +/// GLSL allows defining qualifiers for particular variables. +/// With OpenGL's GLSL, these qualifiers have no effect; they are there for compatibility, +/// with OpenGL ES's GLSL, these qualifiers do have an effect. +/// +/// C++ has no language equivalent to qualifier qualifiers. So GLM provides the next-best thing: +/// a number of typedefs that use a particular qualifier. +/// +/// None of these types make any guarantees about the actual qualifier used. +/// +/// @ingroup core +/// +/// +/// @defgroup core_matrix Matrix types +/// +/// Matrix types of with C columns and R rows where C and R are values between 2 to 4 included. +/// These types have exhaustive sets of operators. +/// +/// @ingroup core +/// +/// +/// @defgroup core_matrix_precision Matrix types with precision qualifiers +/// +/// @brief Matrix types with precision qualifiers which may result in various precision in term of ULPs +/// +/// GLSL allows defining qualifiers for particular variables. +/// With OpenGL's GLSL, these qualifiers have no effect; they are there for compatibility, +/// with OpenGL ES's GLSL, these qualifiers do have an effect. +/// +/// C++ has no language equivalent to qualifier qualifiers. So GLM provides the next-best thing: +/// a number of typedefs that use a particular qualifier. +/// +/// None of these types make any guarantees about the actual qualifier used. +/// +/// @ingroup core +/// +/// +/// @defgroup ext Stable extensions +/// +/// @brief Additional features not specified by GLSL specification. +/// +/// EXT extensions are fully tested and documented. +/// +/// Even if it's highly unrecommended, it's possible to include all the extensions at once by +/// including . Otherwise, each extension needs to be included a specific file. +/// +/// +/// @defgroup gtc Recommended extensions +/// +/// @brief Additional features not specified by GLSL specification. +/// +/// GTC extensions aim to be stable with tests and documentation. +/// +/// Even if it's highly unrecommended, it's possible to include all the extensions at once by +/// including . Otherwise, each extension needs to be included a specific file. +/// +/// +/// @defgroup gtx Experimental extensions +/// +/// @brief Experimental features not specified by GLSL specification. +/// +/// Experimental extensions are useful functions and types, but the development of +/// their API and functionality is not necessarily stable. They can change +/// substantially between versions. Backwards compatibility is not much of an issue +/// for them. +/// +/// Even if it's highly unrecommended, it's possible to include all the extensions +/// at once by including . Otherwise, each extension needs to be +/// included a specific file. +/// +/// @mainpage OpenGL Mathematics (GLM) +/// - Website: glm.g-truc.net +/// - GLM API documentation +/// - GLM Manual + +#include "detail/_fixes.hpp" + +#include "detail/setup.hpp" + +#pragma once + +#include +#include +#include +#include +#include +#include "fwd.hpp" + +#include "vec2.hpp" +#include "vec3.hpp" +#include "vec4.hpp" +#include "mat2x2.hpp" +#include "mat2x3.hpp" +#include "mat2x4.hpp" +#include "mat3x2.hpp" +#include "mat3x3.hpp" +#include "mat3x4.hpp" +#include "mat4x2.hpp" +#include "mat4x3.hpp" +#include "mat4x4.hpp" + +#include "trigonometric.hpp" +#include "exponential.hpp" +#include "common.hpp" +#include "packing.hpp" +#include "geometric.hpp" +#include "matrix.hpp" +#include "vector_relational.hpp" +#include "integer.hpp" diff --git a/dep/glm/gtc/bitfield.hpp b/dep/glm/gtc/bitfield.hpp new file mode 100644 index 0000000..084fbe7 --- /dev/null +++ b/dep/glm/gtc/bitfield.hpp @@ -0,0 +1,266 @@ +/// @ref gtc_bitfield +/// @file glm/gtc/bitfield.hpp +/// +/// @see core (dependence) +/// @see gtc_bitfield (dependence) +/// +/// @defgroup gtc_bitfield GLM_GTC_bitfield +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Allow to perform bit operations on integer values + +#include "../detail/setup.hpp" + +#pragma once + +// Dependencies +#include "../ext/scalar_int_sized.hpp" +#include "../ext/scalar_uint_sized.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_vectorize.hpp" +#include "type_precision.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_bitfield extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_bitfield + /// @{ + + /// Build a mask of 'count' bits + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL genIUType mask(genIUType Bits); + + /// Build a mask of 'count' bits + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL vec mask(vec const& v); + + /// Rotate all bits to the right. All the bits dropped in the right side are inserted back on the left side. + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL genIUType bitfieldRotateRight(genIUType In, int Shift); + + /// Rotate all bits to the right. All the bits dropped in the right side are inserted back on the left side. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL vec bitfieldRotateRight(vec const& In, int Shift); + + /// Rotate all bits to the left. All the bits dropped in the left side are inserted back on the right side. + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL genIUType bitfieldRotateLeft(genIUType In, int Shift); + + /// Rotate all bits to the left. All the bits dropped in the left side are inserted back on the right side. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL vec bitfieldRotateLeft(vec const& In, int Shift); + + /// Set to 1 a range of bits. + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL genIUType bitfieldFillOne(genIUType Value, int FirstBit, int BitCount); + + /// Set to 1 a range of bits. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL vec bitfieldFillOne(vec const& Value, int FirstBit, int BitCount); + + /// Set to 0 a range of bits. + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL genIUType bitfieldFillZero(genIUType Value, int FirstBit, int BitCount); + + /// Set to 0 a range of bits. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_bitfield + template + GLM_FUNC_DECL vec bitfieldFillZero(vec const& Value, int FirstBit, int BitCount); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int16 bitfieldInterleave(int8 x, int8 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint16 bitfieldInterleave(uint8 x, uint8 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of v.x followed by the first bit of v.y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint16 bitfieldInterleave(u8vec2 const& v); + + /// Deinterleaves the bits of x. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL glm::u8vec2 bitfieldDeinterleave(glm::uint16 x); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int32 bitfieldInterleave(int16 x, int16 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint32 bitfieldInterleave(uint16 x, uint16 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of v.x followed by the first bit of v.y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint32 bitfieldInterleave(u16vec2 const& v); + + /// Deinterleaves the bits of x. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL glm::u16vec2 bitfieldDeinterleave(glm::uint32 x); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of x followed by the first bit of y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y); + + /// Interleaves the bits of x and y. + /// The first bit is the first bit of v.x followed by the first bit of v.y. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint64 bitfieldInterleave(u32vec2 const& v); + + /// Deinterleaves the bits of x. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL glm::u32vec2 bitfieldDeinterleave(glm::uint64 x); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y, int32 z); + + /// Interleaves the bits of x, y and z. + /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y, uint32 z); + + /// Interleaves the bits of x, y, z and w. + /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z, int8 w); + + /// Interleaves the bits of x, y, z and w. + /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w); + + /// Interleaves the bits of x, y, z and w. + /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z, int16 w); + + /// Interleaves the bits of x, y, z and w. + /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. + /// The other bits are interleaved following the previous sequence. + /// + /// @see gtc_bitfield + GLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w); + + /// @} +} //namespace glm + +#include "bitfield.inl" diff --git a/dep/glm/gtc/bitfield.inl b/dep/glm/gtc/bitfield.inl new file mode 100644 index 0000000..06cf188 --- /dev/null +++ b/dep/glm/gtc/bitfield.inl @@ -0,0 +1,626 @@ +/// @ref gtc_bitfield + +#include "../simd/integer.h" + +namespace glm{ +namespace detail +{ + template + GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y); + + template + GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z); + + template + GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z, PARAM w); + + template<> + GLM_FUNC_QUALIFIER glm::uint16 bitfieldInterleave(glm::uint8 x, glm::uint8 y) + { + glm::uint16 REG1(x); + glm::uint16 REG2(y); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0x0F0F); + REG2 = ((REG2 << 4) | REG2) & static_cast(0x0F0F); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x3333); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x3333); + + REG1 = ((REG1 << 1) | REG1) & static_cast(0x5555); + REG2 = ((REG2 << 1) | REG2) & static_cast(0x5555); + + return REG1 | static_cast(REG2 << 1); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint16 x, glm::uint16 y) + { + glm::uint32 REG1(x); + glm::uint32 REG2(y); + + REG1 = ((REG1 << 8) | REG1) & static_cast(0x00FF00FF); + REG2 = ((REG2 << 8) | REG2) & static_cast(0x00FF00FF); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0x0F0F0F0F); + REG2 = ((REG2 << 4) | REG2) & static_cast(0x0F0F0F0F); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x33333333); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x33333333); + + REG1 = ((REG1 << 1) | REG1) & static_cast(0x55555555); + REG2 = ((REG2 << 1) | REG2) & static_cast(0x55555555); + + return REG1 | (REG2 << 1); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x, glm::uint32 y) + { + glm::uint64 REG1(x); + glm::uint64 REG2(y); + + REG1 = ((REG1 << 16) | REG1) & static_cast(0x0000FFFF0000FFFFull); + REG2 = ((REG2 << 16) | REG2) & static_cast(0x0000FFFF0000FFFFull); + + REG1 = ((REG1 << 8) | REG1) & static_cast(0x00FF00FF00FF00FFull); + REG2 = ((REG2 << 8) | REG2) & static_cast(0x00FF00FF00FF00FFull); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0x0F0F0F0F0F0F0F0Full); + REG2 = ((REG2 << 4) | REG2) & static_cast(0x0F0F0F0F0F0F0F0Full); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x3333333333333333ull); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x3333333333333333ull); + + REG1 = ((REG1 << 1) | REG1) & static_cast(0x5555555555555555ull); + REG2 = ((REG2 << 1) | REG2) & static_cast(0x5555555555555555ull); + + return REG1 | (REG2 << 1); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y, glm::uint8 z) + { + glm::uint32 REG1(x); + glm::uint32 REG2(y); + glm::uint32 REG3(z); + + REG1 = ((REG1 << 16) | REG1) & static_cast(0xFF0000FFu); + REG2 = ((REG2 << 16) | REG2) & static_cast(0xFF0000FFu); + REG3 = ((REG3 << 16) | REG3) & static_cast(0xFF0000FFu); + + REG1 = ((REG1 << 8) | REG1) & static_cast(0x0F00F00Fu); + REG2 = ((REG2 << 8) | REG2) & static_cast(0x0F00F00Fu); + REG3 = ((REG3 << 8) | REG3) & static_cast(0x0F00F00Fu); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0xC30C30C3u); + REG2 = ((REG2 << 4) | REG2) & static_cast(0xC30C30C3u); + REG3 = ((REG3 << 4) | REG3) & static_cast(0xC30C30C3u); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x49249249u); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x49249249u); + REG3 = ((REG3 << 2) | REG3) & static_cast(0x49249249u); + + return REG1 | (REG2 << 1) | (REG3 << 2); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y, glm::uint16 z) + { + glm::uint64 REG1(x); + glm::uint64 REG2(y); + glm::uint64 REG3(z); + + REG1 = ((REG1 << 32) | REG1) & static_cast(0xFFFF00000000FFFFull); + REG2 = ((REG2 << 32) | REG2) & static_cast(0xFFFF00000000FFFFull); + REG3 = ((REG3 << 32) | REG3) & static_cast(0xFFFF00000000FFFFull); + + REG1 = ((REG1 << 16) | REG1) & static_cast(0x00FF0000FF0000FFull); + REG2 = ((REG2 << 16) | REG2) & static_cast(0x00FF0000FF0000FFull); + REG3 = ((REG3 << 16) | REG3) & static_cast(0x00FF0000FF0000FFull); + + REG1 = ((REG1 << 8) | REG1) & static_cast(0xF00F00F00F00F00Full); + REG2 = ((REG2 << 8) | REG2) & static_cast(0xF00F00F00F00F00Full); + REG3 = ((REG3 << 8) | REG3) & static_cast(0xF00F00F00F00F00Full); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0x30C30C30C30C30C3ull); + REG2 = ((REG2 << 4) | REG2) & static_cast(0x30C30C30C30C30C3ull); + REG3 = ((REG3 << 4) | REG3) & static_cast(0x30C30C30C30C30C3ull); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x9249249249249249ull); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x9249249249249249ull); + REG3 = ((REG3 << 2) | REG3) & static_cast(0x9249249249249249ull); + + return REG1 | (REG2 << 1) | (REG3 << 2); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x, glm::uint32 y, glm::uint32 z) + { + glm::uint64 REG1(x); + glm::uint64 REG2(y); + glm::uint64 REG3(z); + + REG1 = ((REG1 << 32) | REG1) & static_cast(0xFFFF00000000FFFFull); + REG2 = ((REG2 << 32) | REG2) & static_cast(0xFFFF00000000FFFFull); + REG3 = ((REG3 << 32) | REG3) & static_cast(0xFFFF00000000FFFFull); + + REG1 = ((REG1 << 16) | REG1) & static_cast(0x00FF0000FF0000FFull); + REG2 = ((REG2 << 16) | REG2) & static_cast(0x00FF0000FF0000FFull); + REG3 = ((REG3 << 16) | REG3) & static_cast(0x00FF0000FF0000FFull); + + REG1 = ((REG1 << 8) | REG1) & static_cast(0xF00F00F00F00F00Full); + REG2 = ((REG2 << 8) | REG2) & static_cast(0xF00F00F00F00F00Full); + REG3 = ((REG3 << 8) | REG3) & static_cast(0xF00F00F00F00F00Full); + + REG1 = ((REG1 << 4) | REG1) & static_cast(0x30C30C30C30C30C3ull); + REG2 = ((REG2 << 4) | REG2) & static_cast(0x30C30C30C30C30C3ull); + REG3 = ((REG3 << 4) | REG3) & static_cast(0x30C30C30C30C30C3ull); + + REG1 = ((REG1 << 2) | REG1) & static_cast(0x9249249249249249ull); + REG2 = ((REG2 << 2) | REG2) & static_cast(0x9249249249249249ull); + REG3 = ((REG3 << 2) | REG3) & static_cast(0x9249249249249249ull); + + return REG1 | (REG2 << 1) | (REG3 << 2); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y, glm::uint8 z, glm::uint8 w) + { + glm::uint32 REG1(x); + glm::uint32 REG2(y); + glm::uint32 REG3(z); + glm::uint32 REG4(w); + + REG1 = ((REG1 << 12) | REG1) & static_cast(0x000F000Fu); + REG2 = ((REG2 << 12) | REG2) & static_cast(0x000F000Fu); + REG3 = ((REG3 << 12) | REG3) & static_cast(0x000F000Fu); + REG4 = ((REG4 << 12) | REG4) & static_cast(0x000F000Fu); + + REG1 = ((REG1 << 6) | REG1) & static_cast(0x03030303u); + REG2 = ((REG2 << 6) | REG2) & static_cast(0x03030303u); + REG3 = ((REG3 << 6) | REG3) & static_cast(0x03030303u); + REG4 = ((REG4 << 6) | REG4) & static_cast(0x03030303u); + + REG1 = ((REG1 << 3) | REG1) & static_cast(0x11111111u); + REG2 = ((REG2 << 3) | REG2) & static_cast(0x11111111u); + REG3 = ((REG3 << 3) | REG3) & static_cast(0x11111111u); + REG4 = ((REG4 << 3) | REG4) & static_cast(0x11111111u); + + return REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3); + } + + template<> + GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y, glm::uint16 z, glm::uint16 w) + { + glm::uint64 REG1(x); + glm::uint64 REG2(y); + glm::uint64 REG3(z); + glm::uint64 REG4(w); + + REG1 = ((REG1 << 24) | REG1) & static_cast(0x000000FF000000FFull); + REG2 = ((REG2 << 24) | REG2) & static_cast(0x000000FF000000FFull); + REG3 = ((REG3 << 24) | REG3) & static_cast(0x000000FF000000FFull); + REG4 = ((REG4 << 24) | REG4) & static_cast(0x000000FF000000FFull); + + REG1 = ((REG1 << 12) | REG1) & static_cast(0x000F000F000F000Full); + REG2 = ((REG2 << 12) | REG2) & static_cast(0x000F000F000F000Full); + REG3 = ((REG3 << 12) | REG3) & static_cast(0x000F000F000F000Full); + REG4 = ((REG4 << 12) | REG4) & static_cast(0x000F000F000F000Full); + + REG1 = ((REG1 << 6) | REG1) & static_cast(0x0303030303030303ull); + REG2 = ((REG2 << 6) | REG2) & static_cast(0x0303030303030303ull); + REG3 = ((REG3 << 6) | REG3) & static_cast(0x0303030303030303ull); + REG4 = ((REG4 << 6) | REG4) & static_cast(0x0303030303030303ull); + + REG1 = ((REG1 << 3) | REG1) & static_cast(0x1111111111111111ull); + REG2 = ((REG2 << 3) | REG2) & static_cast(0x1111111111111111ull); + REG3 = ((REG3 << 3) | REG3) & static_cast(0x1111111111111111ull); + REG4 = ((REG4 << 3) | REG4) & static_cast(0x1111111111111111ull); + + return REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3); + } +}//namespace detail + + template + GLM_FUNC_QUALIFIER genIUType mask(genIUType Bits) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'mask' accepts only integer values"); + + return Bits >= sizeof(genIUType) * 8 ? ~static_cast(0) : (static_cast(1) << Bits) - static_cast(1); + } + + template + GLM_FUNC_QUALIFIER vec mask(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'mask' accepts only integer values"); + + return detail::functor1::call(mask, v); + } + + template + GLM_FUNC_QUALIFIER genIType bitfieldRotateRight(genIType In, int Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldRotateRight' accepts only integer values"); + + int const BitSize = static_cast(sizeof(genIType) * 8); + return (In << static_cast(Shift)) | (In >> static_cast(BitSize - Shift)); + } + + template + GLM_FUNC_QUALIFIER vec bitfieldRotateRight(vec const& In, int Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldRotateRight' accepts only integer values"); + + int const BitSize = static_cast(sizeof(T) * 8); + return (In << static_cast(Shift)) | (In >> static_cast(BitSize - Shift)); + } + + template + GLM_FUNC_QUALIFIER genIType bitfieldRotateLeft(genIType In, int Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldRotateLeft' accepts only integer values"); + + int const BitSize = static_cast(sizeof(genIType) * 8); + return (In >> static_cast(Shift)) | (In << static_cast(BitSize - Shift)); + } + + template + GLM_FUNC_QUALIFIER vec bitfieldRotateLeft(vec const& In, int Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldRotateLeft' accepts only integer values"); + + int const BitSize = static_cast(sizeof(T) * 8); + return (In >> static_cast(Shift)) | (In << static_cast(BitSize - Shift)); + } + + template + GLM_FUNC_QUALIFIER genIUType bitfieldFillOne(genIUType Value, int FirstBit, int BitCount) + { + return Value | static_cast(mask(BitCount) << FirstBit); + } + + template + GLM_FUNC_QUALIFIER vec bitfieldFillOne(vec const& Value, int FirstBit, int BitCount) + { + return Value | static_cast(mask(BitCount) << FirstBit); + } + + template + GLM_FUNC_QUALIFIER genIUType bitfieldFillZero(genIUType Value, int FirstBit, int BitCount) + { + return Value & static_cast(~(mask(BitCount) << FirstBit)); + } + + template + GLM_FUNC_QUALIFIER vec bitfieldFillZero(vec const& Value, int FirstBit, int BitCount) + { + return Value & static_cast(~(mask(BitCount) << FirstBit)); + } + + GLM_FUNC_QUALIFIER int16 bitfieldInterleave(int8 x, int8 y) + { + union sign8 + { + int8 i; + uint8 u; + } sign_x, sign_y; + + union sign16 + { + int16 i; + uint16 u; + } result; + + sign_x.i = x; + sign_y.i = y; + result.u = bitfieldInterleave(sign_x.u, sign_y.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint16 bitfieldInterleave(uint8 x, uint8 y) + { + return detail::bitfieldInterleave(x, y); + } + + GLM_FUNC_QUALIFIER uint16 bitfieldInterleave(u8vec2 const& v) + { + return detail::bitfieldInterleave(v.x, v.y); + } + + GLM_FUNC_QUALIFIER u8vec2 bitfieldDeinterleave(glm::uint16 x) + { + uint16 REG1(x); + uint16 REG2(x >>= 1); + + REG1 = REG1 & static_cast(0x5555); + REG2 = REG2 & static_cast(0x5555); + + REG1 = ((REG1 >> 1) | REG1) & static_cast(0x3333); + REG2 = ((REG2 >> 1) | REG2) & static_cast(0x3333); + + REG1 = ((REG1 >> 2) | REG1) & static_cast(0x0F0F); + REG2 = ((REG2 >> 2) | REG2) & static_cast(0x0F0F); + + REG1 = ((REG1 >> 4) | REG1) & static_cast(0x00FF); + REG2 = ((REG2 >> 4) | REG2) & static_cast(0x00FF); + + REG1 = ((REG1 >> 8) | REG1) & static_cast(0xFFFF); + REG2 = ((REG2 >> 8) | REG2) & static_cast(0xFFFF); + + return glm::u8vec2(REG1, REG2); + } + + GLM_FUNC_QUALIFIER int32 bitfieldInterleave(int16 x, int16 y) + { + union sign16 + { + int16 i; + uint16 u; + } sign_x, sign_y; + + union sign32 + { + int32 i; + uint32 u; + } result; + + sign_x.i = x; + sign_y.i = y; + result.u = bitfieldInterleave(sign_x.u, sign_y.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint16 x, uint16 y) + { + return detail::bitfieldInterleave(x, y); + } + + GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(u16vec2 const& v) + { + return detail::bitfieldInterleave(v.x, v.y); + } + + GLM_FUNC_QUALIFIER glm::u16vec2 bitfieldDeinterleave(glm::uint32 x) + { + glm::uint32 REG1(x); + glm::uint32 REG2(x >>= 1); + + REG1 = REG1 & static_cast(0x55555555); + REG2 = REG2 & static_cast(0x55555555); + + REG1 = ((REG1 >> 1) | REG1) & static_cast(0x33333333); + REG2 = ((REG2 >> 1) | REG2) & static_cast(0x33333333); + + REG1 = ((REG1 >> 2) | REG1) & static_cast(0x0F0F0F0F); + REG2 = ((REG2 >> 2) | REG2) & static_cast(0x0F0F0F0F); + + REG1 = ((REG1 >> 4) | REG1) & static_cast(0x00FF00FF); + REG2 = ((REG2 >> 4) | REG2) & static_cast(0x00FF00FF); + + REG1 = ((REG1 >> 8) | REG1) & static_cast(0x0000FFFF); + REG2 = ((REG2 >> 8) | REG2) & static_cast(0x0000FFFF); + + return glm::u16vec2(REG1, REG2); + } + + GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int32 x, int32 y) + { + union sign32 + { + int32 i; + uint32 u; + } sign_x, sign_y; + + union sign64 + { + int64 i; + uint64 u; + } result; + + sign_x.i = x; + sign_y.i = y; + result.u = bitfieldInterleave(sign_x.u, sign_y.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint32 x, uint32 y) + { + return detail::bitfieldInterleave(x, y); + } + + GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(u32vec2 const& v) + { + return detail::bitfieldInterleave(v.x, v.y); + } + + GLM_FUNC_QUALIFIER glm::u32vec2 bitfieldDeinterleave(glm::uint64 x) + { + glm::uint64 REG1(x); + glm::uint64 REG2(x >>= 1); + + REG1 = REG1 & static_cast(0x5555555555555555ull); + REG2 = REG2 & static_cast(0x5555555555555555ull); + + REG1 = ((REG1 >> 1) | REG1) & static_cast(0x3333333333333333ull); + REG2 = ((REG2 >> 1) | REG2) & static_cast(0x3333333333333333ull); + + REG1 = ((REG1 >> 2) | REG1) & static_cast(0x0F0F0F0F0F0F0F0Full); + REG2 = ((REG2 >> 2) | REG2) & static_cast(0x0F0F0F0F0F0F0F0Full); + + REG1 = ((REG1 >> 4) | REG1) & static_cast(0x00FF00FF00FF00FFull); + REG2 = ((REG2 >> 4) | REG2) & static_cast(0x00FF00FF00FF00FFull); + + REG1 = ((REG1 >> 8) | REG1) & static_cast(0x0000FFFF0000FFFFull); + REG2 = ((REG2 >> 8) | REG2) & static_cast(0x0000FFFF0000FFFFull); + + REG1 = ((REG1 >> 16) | REG1) & static_cast(0x00000000FFFFFFFFull); + REG2 = ((REG2 >> 16) | REG2) & static_cast(0x00000000FFFFFFFFull); + + return glm::u32vec2(REG1, REG2); + } + + GLM_FUNC_QUALIFIER int32 bitfieldInterleave(int8 x, int8 y, int8 z) + { + union sign8 + { + int8 i; + uint8 u; + } sign_x, sign_y, sign_z; + + union sign32 + { + int32 i; + uint32 u; + } result; + + sign_x.i = x; + sign_y.i = y; + sign_z.i = z; + result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z) + { + return detail::bitfieldInterleave(x, y, z); + } + + GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(u8vec3 const& v) + { + return detail::bitfieldInterleave(v.x, v.y, v.z); + } + + GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int16 x, int16 y, int16 z) + { + union sign16 + { + int16 i; + uint16 u; + } sign_x, sign_y, sign_z; + + union sign64 + { + int64 i; + uint64 u; + } result; + + sign_x.i = x; + sign_y.i = y; + sign_z.i = z; + result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z) + { + return detail::bitfieldInterleave(x, y, z); + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(u16vec3 const& v) + { + return detail::bitfieldInterleave(v.x, v.y, v.z); + } + + GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int32 x, int32 y, int32 z) + { + union sign16 + { + int32 i; + uint32 u; + } sign_x, sign_y, sign_z; + + union sign64 + { + int64 i; + uint64 u; + } result; + + sign_x.i = x; + sign_y.i = y; + sign_z.i = z; + result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint32 x, uint32 y, uint32 z) + { + return detail::bitfieldInterleave(x, y, z); + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(u32vec3 const& v) + { + return detail::bitfieldInterleave(v.x, v.y, v.z); + } + + GLM_FUNC_QUALIFIER int32 bitfieldInterleave(int8 x, int8 y, int8 z, int8 w) + { + union sign8 + { + int8 i; + uint8 u; + } sign_x, sign_y, sign_z, sign_w; + + union sign32 + { + int32 i; + uint32 u; + } result; + + sign_x.i = x; + sign_y.i = y; + sign_z.i = z; + sign_w.i = w; + result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u, sign_w.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w) + { + return detail::bitfieldInterleave(x, y, z, w); + } + + GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(u8vec4 const& v) + { + return detail::bitfieldInterleave(v.x, v.y, v.z, v.w); + } + + GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int16 x, int16 y, int16 z, int16 w) + { + union sign16 + { + int16 i; + uint16 u; + } sign_x, sign_y, sign_z, sign_w; + + union sign64 + { + int64 i; + uint64 u; + } result; + + sign_x.i = x; + sign_y.i = y; + sign_z.i = z; + sign_w.i = w; + result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u, sign_w.u); + + return result.i; + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w) + { + return detail::bitfieldInterleave(x, y, z, w); + } + + GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(u16vec4 const& v) + { + return detail::bitfieldInterleave(v.x, v.y, v.z, v.w); + } +}//namespace glm diff --git a/dep/glm/gtc/color_space.hpp b/dep/glm/gtc/color_space.hpp new file mode 100644 index 0000000..cffd9f0 --- /dev/null +++ b/dep/glm/gtc/color_space.hpp @@ -0,0 +1,56 @@ +/// @ref gtc_color_space +/// @file glm/gtc/color_space.hpp +/// +/// @see core (dependence) +/// @see gtc_color_space (dependence) +/// +/// @defgroup gtc_color_space GLM_GTC_color_space +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../exponential.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_color_space extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_color_space + /// @{ + + /// Convert a linear color to sRGB color using a standard gamma correction. + /// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template + GLM_FUNC_DECL vec convertLinearToSRGB(vec const& ColorLinear); + + /// Convert a linear color to sRGB color using a custom gamma correction. + /// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template + GLM_FUNC_DECL vec convertLinearToSRGB(vec const& ColorLinear, T Gamma); + + /// Convert a sRGB color to linear color using a standard gamma correction. + /// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template + GLM_FUNC_DECL vec convertSRGBToLinear(vec const& ColorSRGB); + + /// Convert a sRGB color to linear color using a custom gamma correction. + // IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template + GLM_FUNC_DECL vec convertSRGBToLinear(vec const& ColorSRGB, T Gamma); + + /// @} +} //namespace glm + +#include "color_space.inl" diff --git a/dep/glm/gtc/color_space.inl b/dep/glm/gtc/color_space.inl new file mode 100644 index 0000000..2a90004 --- /dev/null +++ b/dep/glm/gtc/color_space.inl @@ -0,0 +1,84 @@ +/// @ref gtc_color_space + +namespace glm{ +namespace detail +{ + template + struct compute_rgbToSrgb + { + GLM_FUNC_QUALIFIER static vec call(vec const& ColorRGB, T GammaCorrection) + { + vec const ClampedColor(clamp(ColorRGB, static_cast(0), static_cast(1))); + + return mix( + pow(ClampedColor, vec(GammaCorrection)) * static_cast(1.055) - static_cast(0.055), + ClampedColor * static_cast(12.92), + lessThan(ClampedColor, vec(static_cast(0.0031308)))); + } + }; + + template + struct compute_rgbToSrgb<4, T, Q> + { + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& ColorRGB, T GammaCorrection) + { + return vec<4, T, Q>(compute_rgbToSrgb<3, T, Q>::call(vec<3, T, Q>(ColorRGB), GammaCorrection), ColorRGB.w); + } + }; + + template + struct compute_srgbToRgb + { + GLM_FUNC_QUALIFIER static vec call(vec const& ColorSRGB, T Gamma) + { + return mix( + pow((ColorSRGB + static_cast(0.055)) * static_cast(0.94786729857819905213270142180095), vec(Gamma)), + ColorSRGB * static_cast(0.07739938080495356037151702786378), + lessThanEqual(ColorSRGB, vec(static_cast(0.04045)))); + } + }; + + template + struct compute_srgbToRgb<4, T, Q> + { + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& ColorSRGB, T Gamma) + { + return vec<4, T, Q>(compute_srgbToRgb<3, T, Q>::call(vec<3, T, Q>(ColorSRGB), Gamma), ColorSRGB.w); + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER vec convertLinearToSRGB(vec const& ColorLinear) + { + return detail::compute_rgbToSrgb::call(ColorLinear, static_cast(0.41666)); + } + + // Based on Ian Taylor http://chilliant.blogspot.fr/2012/08/srgb-approximations-for-hlsl.html + template<> + GLM_FUNC_QUALIFIER vec<3, float, lowp> convertLinearToSRGB(vec<3, float, lowp> const& ColorLinear) + { + vec<3, float, lowp> S1 = sqrt(ColorLinear); + vec<3, float, lowp> S2 = sqrt(S1); + vec<3, float, lowp> S3 = sqrt(S2); + return 0.662002687f * S1 + 0.684122060f * S2 - 0.323583601f * S3 - 0.0225411470f * ColorLinear; + } + + template + GLM_FUNC_QUALIFIER vec convertLinearToSRGB(vec const& ColorLinear, T Gamma) + { + return detail::compute_rgbToSrgb::call(ColorLinear, static_cast(1) / Gamma); + } + + template + GLM_FUNC_QUALIFIER vec convertSRGBToLinear(vec const& ColorSRGB) + { + return detail::compute_srgbToRgb::call(ColorSRGB, static_cast(2.4)); + } + + template + GLM_FUNC_QUALIFIER vec convertSRGBToLinear(vec const& ColorSRGB, T Gamma) + { + return detail::compute_srgbToRgb::call(ColorSRGB, Gamma); + } +}//namespace glm diff --git a/dep/glm/gtc/constants.hpp b/dep/glm/gtc/constants.hpp new file mode 100644 index 0000000..99f2128 --- /dev/null +++ b/dep/glm/gtc/constants.hpp @@ -0,0 +1,165 @@ +/// @ref gtc_constants +/// @file glm/gtc/constants.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_constants GLM_GTC_constants +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Provide a list of constants and precomputed useful values. + +#pragma once + +// Dependencies +#include "../ext/scalar_constants.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_constants extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_constants + /// @{ + + /// Return 0. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType zero(); + + /// Return 1. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType one(); + + /// Return pi * 2. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType two_pi(); + + /// Return square root of pi. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_pi(); + + /// Return pi / 2. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType half_pi(); + + /// Return pi / 2 * 3. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType three_over_two_pi(); + + /// Return pi / 4. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType quarter_pi(); + + /// Return 1 / pi. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_pi(); + + /// Return 1 / (pi * 2). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_two_pi(); + + /// Return 2 / pi. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_pi(); + + /// Return 4 / pi. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType four_over_pi(); + + /// Return 2 / sqrt(pi). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_root_pi(); + + /// Return 1 / sqrt(2). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_root_two(); + + /// Return sqrt(pi / 2). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_half_pi(); + + /// Return sqrt(2 * pi). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_two_pi(); + + /// Return sqrt(ln(4)). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_ln_four(); + + /// Return e constant. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType e(); + + /// Return Euler's constant. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType euler(); + + /// Return sqrt(2). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_two(); + + /// Return sqrt(3). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_three(); + + /// Return sqrt(5). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType root_five(); + + /// Return ln(2). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType ln_two(); + + /// Return ln(10). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ten(); + + /// Return ln(ln(2)). + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ln_two(); + + /// Return 1 / 3. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType third(); + + /// Return 2 / 3. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType two_thirds(); + + /// Return the golden ratio constant. + /// @see gtc_constants + template + GLM_FUNC_DECL GLM_CONSTEXPR genType golden_ratio(); + + /// @} +} //namespace glm + +#include "constants.inl" diff --git a/dep/glm/gtc/constants.inl b/dep/glm/gtc/constants.inl new file mode 100644 index 0000000..bb98c6b --- /dev/null +++ b/dep/glm/gtc/constants.inl @@ -0,0 +1,167 @@ +/// @ref gtc_constants + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType zero() + { + return genType(0); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one() + { + return genType(1); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_pi() + { + return genType(6.28318530717958647692528676655900576); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_pi() + { + return genType(1.772453850905516027); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType half_pi() + { + return genType(1.57079632679489661923132169163975144); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType three_over_two_pi() + { + return genType(4.71238898038468985769396507491925432); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType quarter_pi() + { + return genType(0.785398163397448309615660845819875721); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_pi() + { + return genType(0.318309886183790671537767526745028724); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_two_pi() + { + return genType(0.159154943091895335768883763372514362); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_pi() + { + return genType(0.636619772367581343075535053490057448); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType four_over_pi() + { + return genType(1.273239544735162686151070106980114898); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_root_pi() + { + return genType(1.12837916709551257389615890312154517); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_root_two() + { + return genType(0.707106781186547524400844362104849039); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_half_pi() + { + return genType(1.253314137315500251); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two_pi() + { + return genType(2.506628274631000502); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_ln_four() + { + return genType(1.17741002251547469); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType e() + { + return genType(2.71828182845904523536); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType euler() + { + return genType(0.577215664901532860606); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two() + { + return genType(1.41421356237309504880168872420969808); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_three() + { + return genType(1.73205080756887729352744634150587236); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_five() + { + return genType(2.23606797749978969640917366873127623); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_two() + { + return genType(0.693147180559945309417232121458176568); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_ten() + { + return genType(2.30258509299404568401799145468436421); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_ln_two() + { + return genType(-0.3665129205816643); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType third() + { + return genType(0.3333333333333333333333333333333333333333); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_thirds() + { + return genType(0.666666666666666666666666666666666666667); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType golden_ratio() + { + return genType(1.61803398874989484820458683436563811); + } + +} //namespace glm diff --git a/dep/glm/gtc/epsilon.hpp b/dep/glm/gtc/epsilon.hpp new file mode 100644 index 0000000..640439b --- /dev/null +++ b/dep/glm/gtc/epsilon.hpp @@ -0,0 +1,60 @@ +/// @ref gtc_epsilon +/// @file glm/gtc/epsilon.hpp +/// +/// @see core (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtc_epsilon GLM_GTC_epsilon +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Comparison functions for a user defined epsilon values. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_epsilon extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_epsilon + /// @{ + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL vec epsilonEqual(vec const& x, vec const& y, T const& epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL bool epsilonEqual(genType const& x, genType const& y, genType const& epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is not satisfied. + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL vec epsilonNotEqual(vec const& x, vec const& y, T const& epsilon); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// True if this expression is not satisfied. + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL bool epsilonNotEqual(genType const& x, genType const& y, genType const& epsilon); + + /// @} +}//namespace glm + +#include "epsilon.inl" diff --git a/dep/glm/gtc/epsilon.inl b/dep/glm/gtc/epsilon.inl new file mode 100644 index 0000000..508b9f8 --- /dev/null +++ b/dep/glm/gtc/epsilon.inl @@ -0,0 +1,80 @@ +/// @ref gtc_epsilon + +// Dependency: +#include "../vector_relational.hpp" +#include "../common.hpp" + +namespace glm +{ + template<> + GLM_FUNC_QUALIFIER bool epsilonEqual + ( + float const& x, + float const& y, + float const& epsilon + ) + { + return abs(x - y) < epsilon; + } + + template<> + GLM_FUNC_QUALIFIER bool epsilonEqual + ( + double const& x, + double const& y, + double const& epsilon + ) + { + return abs(x - y) < epsilon; + } + + template + GLM_FUNC_QUALIFIER vec epsilonEqual(vec const& x, vec const& y, T const& epsilon) + { + return lessThan(abs(x - y), vec(epsilon)); + } + + template + GLM_FUNC_QUALIFIER vec epsilonEqual(vec const& x, vec const& y, vec const& epsilon) + { + return lessThan(abs(x - y), vec(epsilon)); + } + + template<> + GLM_FUNC_QUALIFIER bool epsilonNotEqual(float const& x, float const& y, float const& epsilon) + { + return abs(x - y) >= epsilon; + } + + template<> + GLM_FUNC_QUALIFIER bool epsilonNotEqual(double const& x, double const& y, double const& epsilon) + { + return abs(x - y) >= epsilon; + } + + template + GLM_FUNC_QUALIFIER vec epsilonNotEqual(vec const& x, vec const& y, T const& epsilon) + { + return greaterThanEqual(abs(x - y), vec(epsilon)); + } + + template + GLM_FUNC_QUALIFIER vec epsilonNotEqual(vec const& x, vec const& y, vec const& epsilon) + { + return greaterThanEqual(abs(x - y), vec(epsilon)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> epsilonEqual(qua const& x, qua const& y, T const& epsilon) + { + vec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); + return lessThan(abs(v), vec<4, T, Q>(epsilon)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> epsilonNotEqual(qua const& x, qua const& y, T const& epsilon) + { + vec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); + return greaterThanEqual(abs(v), vec<4, T, Q>(epsilon)); + } +}//namespace glm diff --git a/dep/glm/gtc/integer.hpp b/dep/glm/gtc/integer.hpp new file mode 100644 index 0000000..64ce10b --- /dev/null +++ b/dep/glm/gtc/integer.hpp @@ -0,0 +1,65 @@ +/// @ref gtc_integer +/// @file glm/gtc/integer.hpp +/// +/// @see core (dependence) +/// @see gtc_integer (dependence) +/// +/// @defgroup gtc_integer GLM_GTC_integer +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// @brief Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../common.hpp" +#include "../integer.hpp" +#include "../exponential.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_integer extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_integer + /// @{ + + /// Returns the log2 of x for integer values. Usefull to compute mipmap count from the texture size. + /// @see gtc_integer + template + GLM_FUNC_DECL genIUType log2(genIUType x); + + /// Returns a value equal to the nearest integer to x. + /// The fraction 0.5 will round in a direction chosen by the + /// implementation, presumably the direction that is fastest. + /// + /// @param x The values of the argument must be greater or equal to zero. + /// @tparam T floating point scalar types. + /// + /// @see GLSL round man page + /// @see gtc_integer + template + GLM_FUNC_DECL vec iround(vec const& x); + + /// Returns a value equal to the nearest integer to x. + /// The fraction 0.5 will round in a direction chosen by the + /// implementation, presumably the direction that is fastest. + /// + /// @param x The values of the argument must be greater or equal to zero. + /// @tparam T floating point scalar types. + /// + /// @see GLSL round man page + /// @see gtc_integer + template + GLM_FUNC_DECL vec uround(vec const& x); + + /// @} +} //namespace glm + +#include "integer.inl" diff --git a/dep/glm/gtc/integer.inl b/dep/glm/gtc/integer.inl new file mode 100644 index 0000000..f0a8b4f --- /dev/null +++ b/dep/glm/gtc/integer.inl @@ -0,0 +1,68 @@ +/// @ref gtc_integer + +namespace glm{ +namespace detail +{ + template + struct compute_log2 + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + //Equivalent to return findMSB(vec); but save one function call in ASM with VC + //return findMSB(vec); + return vec(detail::compute_findMSB_vec::call(v)); + } + }; + +# if GLM_HAS_BITSCAN_WINDOWS + template + struct compute_log2<4, int, Q, false, Aligned> + { + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v) + { + vec<4, int, Q> Result; + _BitScanReverse(reinterpret_cast(&Result.x), v.x); + _BitScanReverse(reinterpret_cast(&Result.y), v.y); + _BitScanReverse(reinterpret_cast(&Result.z), v.z); + _BitScanReverse(reinterpret_cast(&Result.w), v.w); + return Result; + } + }; +# endif//GLM_HAS_BITSCAN_WINDOWS +}//namespace detail + template + GLM_FUNC_QUALIFIER int iround(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'iround' only accept floating-point inputs"); + assert(static_cast(0.0) <= x); + + return static_cast(x + static_cast(0.5)); + } + + template + GLM_FUNC_QUALIFIER vec iround(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'iround' only accept floating-point inputs"); + assert(all(lessThanEqual(vec(0), x))); + + return vec(x + static_cast(0.5)); + } + + template + GLM_FUNC_QUALIFIER uint uround(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'uround' only accept floating-point inputs"); + assert(static_cast(0.0) <= x); + + return static_cast(x + static_cast(0.5)); + } + + template + GLM_FUNC_QUALIFIER vec uround(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'uround' only accept floating-point inputs"); + assert(all(lessThanEqual(vec(0), x))); + + return vec(x + static_cast(0.5)); + } +}//namespace glm diff --git a/dep/glm/gtc/matrix_access.hpp b/dep/glm/gtc/matrix_access.hpp new file mode 100644 index 0000000..4935ba7 --- /dev/null +++ b/dep/glm/gtc/matrix_access.hpp @@ -0,0 +1,60 @@ +/// @ref gtc_matrix_access +/// @file glm/gtc/matrix_access.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_matrix_access GLM_GTC_matrix_access +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines functions to access rows or columns of a matrix easily. + +#pragma once + +// Dependency: +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_matrix_access extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_matrix_access + /// @{ + + /// Get a specific row of a matrix. + /// @see gtc_matrix_access + template + GLM_FUNC_DECL typename genType::row_type row( + genType const& m, + length_t index); + + /// Set a specific row to a matrix. + /// @see gtc_matrix_access + template + GLM_FUNC_DECL genType row( + genType const& m, + length_t index, + typename genType::row_type const& x); + + /// Get a specific column of a matrix. + /// @see gtc_matrix_access + template + GLM_FUNC_DECL typename genType::col_type column( + genType const& m, + length_t index); + + /// Set a specific column to a matrix. + /// @see gtc_matrix_access + template + GLM_FUNC_DECL genType column( + genType const& m, + length_t index, + typename genType::col_type const& x); + + /// @} +}//namespace glm + +#include "matrix_access.inl" diff --git a/dep/glm/gtc/matrix_access.inl b/dep/glm/gtc/matrix_access.inl new file mode 100644 index 0000000..09fcc10 --- /dev/null +++ b/dep/glm/gtc/matrix_access.inl @@ -0,0 +1,62 @@ +/// @ref gtc_matrix_access + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType row + ( + genType const& m, + length_t index, + typename genType::row_type const& x + ) + { + assert(index >= 0 && index < m[0].length()); + + genType Result = m; + for(length_t i = 0; i < m.length(); ++i) + Result[i][index] = x[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER typename genType::row_type row + ( + genType const& m, + length_t index + ) + { + assert(index >= 0 && index < m[0].length()); + + typename genType::row_type Result(0); + for(length_t i = 0; i < m.length(); ++i) + Result[i] = m[i][index]; + return Result; + } + + template + GLM_FUNC_QUALIFIER genType column + ( + genType const& m, + length_t index, + typename genType::col_type const& x + ) + { + assert(index >= 0 && index < m.length()); + + genType Result = m; + Result[index] = x; + return Result; + } + + template + GLM_FUNC_QUALIFIER typename genType::col_type column + ( + genType const& m, + length_t index + ) + { + assert(index >= 0 && index < m.length()); + + return m[index]; + } +}//namespace glm diff --git a/dep/glm/gtc/matrix_integer.hpp b/dep/glm/gtc/matrix_integer.hpp new file mode 100644 index 0000000..d7ebdc7 --- /dev/null +++ b/dep/glm/gtc/matrix_integer.hpp @@ -0,0 +1,433 @@ +/// @ref gtc_matrix_integer +/// @file glm/gtc/matrix_integer.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_matrix_integer GLM_GTC_matrix_integer +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines a number of matrices with integer types. + +#pragma once + +// Dependency: +#include "../mat2x2.hpp" +#include "../mat2x3.hpp" +#include "../mat2x4.hpp" +#include "../mat3x2.hpp" +#include "../mat3x3.hpp" +#include "../mat3x4.hpp" +#include "../mat4x2.hpp" +#include "../mat4x3.hpp" +#include "../mat4x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_matrix_integer extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_matrix_integer + /// @{ + + /// High-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, highp> highp_imat2; + + /// High-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, highp> highp_imat3; + + /// High-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, highp> highp_imat4; + + /// High-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, highp> highp_imat2x2; + + /// High-qualifier signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, int, highp> highp_imat2x3; + + /// High-qualifier signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, int, highp> highp_imat2x4; + + /// High-qualifier signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, int, highp> highp_imat3x2; + + /// High-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, highp> highp_imat3x3; + + /// High-qualifier signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, int, highp> highp_imat3x4; + + /// High-qualifier signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, int, highp> highp_imat4x2; + + /// High-qualifier signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, int, highp> highp_imat4x3; + + /// High-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, highp> highp_imat4x4; + + + /// Medium-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, mediump> mediump_imat2; + + /// Medium-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, mediump> mediump_imat3; + + /// Medium-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, mediump> mediump_imat4; + + + /// Medium-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, mediump> mediump_imat2x2; + + /// Medium-qualifier signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, int, mediump> mediump_imat2x3; + + /// Medium-qualifier signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, int, mediump> mediump_imat2x4; + + /// Medium-qualifier signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, int, mediump> mediump_imat3x2; + + /// Medium-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, mediump> mediump_imat3x3; + + /// Medium-qualifier signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, int, mediump> mediump_imat3x4; + + /// Medium-qualifier signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, int, mediump> mediump_imat4x2; + + /// Medium-qualifier signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, int, mediump> mediump_imat4x3; + + /// Medium-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, mediump> mediump_imat4x4; + + + /// Low-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, lowp> lowp_imat2; + + /// Low-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, lowp> lowp_imat3; + + /// Low-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, lowp> lowp_imat4; + + + /// Low-qualifier signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, lowp> lowp_imat2x2; + + /// Low-qualifier signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, int, lowp> lowp_imat2x3; + + /// Low-qualifier signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, int, lowp> lowp_imat2x4; + + /// Low-qualifier signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, int, lowp> lowp_imat3x2; + + /// Low-qualifier signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, lowp> lowp_imat3x3; + + /// Low-qualifier signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, int, lowp> lowp_imat3x4; + + /// Low-qualifier signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, int, lowp> lowp_imat4x2; + + /// Low-qualifier signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, int, lowp> lowp_imat4x3; + + /// Low-qualifier signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, lowp> lowp_imat4x4; + + + /// High-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, highp> highp_umat2; + + /// High-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, highp> highp_umat3; + + /// High-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, highp> highp_umat4; + + /// High-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, highp> highp_umat2x2; + + /// High-qualifier unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, uint, highp> highp_umat2x3; + + /// High-qualifier unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, uint, highp> highp_umat2x4; + + /// High-qualifier unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, uint, highp> highp_umat3x2; + + /// High-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, highp> highp_umat3x3; + + /// High-qualifier unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, uint, highp> highp_umat3x4; + + /// High-qualifier unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, uint, highp> highp_umat4x2; + + /// High-qualifier unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, uint, highp> highp_umat4x3; + + /// High-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, highp> highp_umat4x4; + + + /// Medium-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, mediump> mediump_umat2; + + /// Medium-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, mediump> mediump_umat3; + + /// Medium-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, mediump> mediump_umat4; + + + /// Medium-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, mediump> mediump_umat2x2; + + /// Medium-qualifier unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, uint, mediump> mediump_umat2x3; + + /// Medium-qualifier unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, uint, mediump> mediump_umat2x4; + + /// Medium-qualifier unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, uint, mediump> mediump_umat3x2; + + /// Medium-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, mediump> mediump_umat3x3; + + /// Medium-qualifier unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, uint, mediump> mediump_umat3x4; + + /// Medium-qualifier unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, uint, mediump> mediump_umat4x2; + + /// Medium-qualifier unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, uint, mediump> mediump_umat4x3; + + /// Medium-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, mediump> mediump_umat4x4; + + + /// Low-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, lowp> lowp_umat2; + + /// Low-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, lowp> lowp_umat3; + + /// Low-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, lowp> lowp_umat4; + + + /// Low-qualifier unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, lowp> lowp_umat2x2; + + /// Low-qualifier unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, uint, lowp> lowp_umat2x3; + + /// Low-qualifier unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, uint, lowp> lowp_umat2x4; + + /// Low-qualifier unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, uint, lowp> lowp_umat3x2; + + /// Low-qualifier unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, lowp> lowp_umat3x3; + + /// Low-qualifier unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, uint, lowp> lowp_umat3x4; + + /// Low-qualifier unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, uint, lowp> lowp_umat4x2; + + /// Low-qualifier unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, uint, lowp> lowp_umat4x3; + + /// Low-qualifier unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, lowp> lowp_umat4x4; + + + + /// Signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, defaultp> imat2; + + /// Signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, defaultp> imat3; + + /// Signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, defaultp> imat4; + + /// Signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, int, defaultp> imat2x2; + + /// Signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, int, defaultp> imat2x3; + + /// Signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, int, defaultp> imat2x4; + + /// Signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, int, defaultp> imat3x2; + + /// Signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, int, defaultp> imat3x3; + + /// Signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, int, defaultp> imat3x4; + + /// Signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, int, defaultp> imat4x2; + + /// Signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, int, defaultp> imat4x3; + + /// Signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, int, defaultp> imat4x4; + + + + /// Unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, defaultp> umat2; + + /// Unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, defaultp> umat3; + + /// Unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, defaultp> umat4; + + /// Unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 2, uint, defaultp> umat2x2; + + /// Unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 3, uint, defaultp> umat2x3; + + /// Unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mat<2, 4, uint, defaultp> umat2x4; + + /// Unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 2, uint, defaultp> umat3x2; + + /// Unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 3, uint, defaultp> umat3x3; + + /// Unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mat<3, 4, uint, defaultp> umat3x4; + + /// Unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 2, uint, defaultp> umat4x2; + + /// Unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 3, uint, defaultp> umat4x3; + + /// Unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mat<4, 4, uint, defaultp> umat4x4; + + /// @} +}//namespace glm diff --git a/dep/glm/gtc/matrix_inverse.hpp b/dep/glm/gtc/matrix_inverse.hpp new file mode 100644 index 0000000..a1900ad --- /dev/null +++ b/dep/glm/gtc/matrix_inverse.hpp @@ -0,0 +1,50 @@ +/// @ref gtc_matrix_inverse +/// @file glm/gtc/matrix_inverse.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_matrix_inverse GLM_GTC_matrix_inverse +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines additional matrix inverting functions. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../matrix.hpp" +#include "../mat2x2.hpp" +#include "../mat3x3.hpp" +#include "../mat4x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_matrix_inverse extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_matrix_inverse + /// @{ + + /// Fast matrix inverse for affine matrix. + /// + /// @param m Input matrix to invert. + /// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-qualifier floating point value is highly innacurate. + /// @see gtc_matrix_inverse + template + GLM_FUNC_DECL genType affineInverse(genType const& m); + + /// Compute the inverse transpose of a matrix. + /// + /// @param m Input matrix to invert transpose. + /// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-qualifier floating point value is highly innacurate. + /// @see gtc_matrix_inverse + template + GLM_FUNC_DECL genType inverseTranspose(genType const& m); + + /// @} +}//namespace glm + +#include "matrix_inverse.inl" diff --git a/dep/glm/gtc/matrix_inverse.inl b/dep/glm/gtc/matrix_inverse.inl new file mode 100644 index 0000000..c004b9e --- /dev/null +++ b/dep/glm/gtc/matrix_inverse.inl @@ -0,0 +1,118 @@ +/// @ref gtc_matrix_inverse + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> affineInverse(mat<3, 3, T, Q> const& m) + { + mat<2, 2, T, Q> const Inv(inverse(mat<2, 2, T, Q>(m))); + + return mat<3, 3, T, Q>( + vec<3, T, Q>(Inv[0], static_cast(0)), + vec<3, T, Q>(Inv[1], static_cast(0)), + vec<3, T, Q>(-Inv * vec<2, T, Q>(m[2]), static_cast(1))); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> affineInverse(mat<4, 4, T, Q> const& m) + { + mat<3, 3, T, Q> const Inv(inverse(mat<3, 3, T, Q>(m))); + + return mat<4, 4, T, Q>( + vec<4, T, Q>(Inv[0], static_cast(0)), + vec<4, T, Q>(Inv[1], static_cast(0)), + vec<4, T, Q>(Inv[2], static_cast(0)), + vec<4, T, Q>(-Inv * vec<3, T, Q>(m[3]), static_cast(1))); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> inverseTranspose(mat<2, 2, T, Q> const& m) + { + T Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1]; + + mat<2, 2, T, Q> Inverse( + + m[1][1] / Determinant, + - m[0][1] / Determinant, + - m[1][0] / Determinant, + + m[0][0] / Determinant); + + return Inverse; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> inverseTranspose(mat<3, 3, T, Q> const& m) + { + T Determinant = + + m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) + - m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]) + + m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); + + mat<3, 3, T, Q> Inverse; + Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]); + Inverse[0][1] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]); + Inverse[0][2] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]); + Inverse[1][0] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]); + Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]); + Inverse[1][2] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]); + Inverse[2][0] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]); + Inverse[2][1] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]); + Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]); + Inverse /= Determinant; + + return Inverse; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> inverseTranspose(mat<4, 4, T, Q> const& m) + { + T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + T SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + T SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + T SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + T SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + T SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + T SubFactor11 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + T SubFactor12 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + T SubFactor13 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + T SubFactor14 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + T SubFactor15 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + T SubFactor16 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + T SubFactor17 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + mat<4, 4, T, Q> Inverse; + Inverse[0][0] = + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02); + Inverse[0][1] = - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04); + Inverse[0][2] = + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05); + Inverse[0][3] = - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05); + + Inverse[1][0] = - (m[0][1] * SubFactor00 - m[0][2] * SubFactor01 + m[0][3] * SubFactor02); + Inverse[1][1] = + (m[0][0] * SubFactor00 - m[0][2] * SubFactor03 + m[0][3] * SubFactor04); + Inverse[1][2] = - (m[0][0] * SubFactor01 - m[0][1] * SubFactor03 + m[0][3] * SubFactor05); + Inverse[1][3] = + (m[0][0] * SubFactor02 - m[0][1] * SubFactor04 + m[0][2] * SubFactor05); + + Inverse[2][0] = + (m[0][1] * SubFactor06 - m[0][2] * SubFactor07 + m[0][3] * SubFactor08); + Inverse[2][1] = - (m[0][0] * SubFactor06 - m[0][2] * SubFactor09 + m[0][3] * SubFactor10); + Inverse[2][2] = + (m[0][0] * SubFactor07 - m[0][1] * SubFactor09 + m[0][3] * SubFactor11); + Inverse[2][3] = - (m[0][0] * SubFactor08 - m[0][1] * SubFactor10 + m[0][2] * SubFactor11); + + Inverse[3][0] = - (m[0][1] * SubFactor12 - m[0][2] * SubFactor13 + m[0][3] * SubFactor14); + Inverse[3][1] = + (m[0][0] * SubFactor12 - m[0][2] * SubFactor15 + m[0][3] * SubFactor16); + Inverse[3][2] = - (m[0][0] * SubFactor13 - m[0][1] * SubFactor15 + m[0][3] * SubFactor17); + Inverse[3][3] = + (m[0][0] * SubFactor14 - m[0][1] * SubFactor16 + m[0][2] * SubFactor17); + + T Determinant = + + m[0][0] * Inverse[0][0] + + m[0][1] * Inverse[0][1] + + m[0][2] * Inverse[0][2] + + m[0][3] * Inverse[0][3]; + + Inverse /= Determinant; + + return Inverse; + } +}//namespace glm diff --git a/dep/glm/gtc/matrix_transform.hpp b/dep/glm/gtc/matrix_transform.hpp new file mode 100644 index 0000000..612418f --- /dev/null +++ b/dep/glm/gtc/matrix_transform.hpp @@ -0,0 +1,36 @@ +/// @ref gtc_matrix_transform +/// @file glm/gtc/matrix_transform.hpp +/// +/// @see core (dependence) +/// @see gtx_transform +/// @see gtx_transform2 +/// +/// @defgroup gtc_matrix_transform GLM_GTC_matrix_transform +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines functions that generate common transformation matrices. +/// +/// The matrices generated by this extension use standard OpenGL fixed-function +/// conventions. For example, the lookAt function generates a transform from world +/// space into the specific eye space that the projective matrix functions +/// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility +/// specifications defines the particular layout of this eye space. + +#pragma once + +// Dependencies +#include "../mat4x4.hpp" +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../ext/matrix_projection.hpp" +#include "../ext/matrix_clip_space.hpp" +#include "../ext/matrix_transform.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_matrix_transform extension included") +#endif + +#include "matrix_transform.inl" diff --git a/dep/glm/gtc/matrix_transform.inl b/dep/glm/gtc/matrix_transform.inl new file mode 100644 index 0000000..15b46bc --- /dev/null +++ b/dep/glm/gtc/matrix_transform.inl @@ -0,0 +1,3 @@ +#include "../geometric.hpp" +#include "../trigonometric.hpp" +#include "../matrix.hpp" diff --git a/dep/glm/gtc/noise.hpp b/dep/glm/gtc/noise.hpp new file mode 100644 index 0000000..ab1772e --- /dev/null +++ b/dep/glm/gtc/noise.hpp @@ -0,0 +1,61 @@ +/// @ref gtc_noise +/// @file glm/gtc/noise.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_noise GLM_GTC_noise +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines 2D, 3D and 4D procedural noise functions +/// Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": +/// https://github.com/ashima/webgl-noise +/// Following Stefan Gustavson's paper "Simplex noise demystified": +/// http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_noise.hpp" +#include "../geometric.hpp" +#include "../common.hpp" +#include "../vector_relational.hpp" +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_noise extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_noise + /// @{ + + /// Classic perlin noise. + /// @see gtc_noise + template + GLM_FUNC_DECL T perlin( + vec const& p); + + /// Periodic perlin noise. + /// @see gtc_noise + template + GLM_FUNC_DECL T perlin( + vec const& p, + vec const& rep); + + /// Simplex noise. + /// @see gtc_noise + template + GLM_FUNC_DECL T simplex( + vec const& p); + + /// @} +}//namespace glm + +#include "noise.inl" diff --git a/dep/glm/gtc/noise.inl b/dep/glm/gtc/noise.inl new file mode 100644 index 0000000..30d0b27 --- /dev/null +++ b/dep/glm/gtc/noise.inl @@ -0,0 +1,807 @@ +/// @ref gtc_noise +/// +// Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": +// https://github.com/ashima/webgl-noise +// Following Stefan Gustavson's paper "Simplex noise demystified": +// http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf + +namespace glm{ +namespace gtc +{ + template + GLM_FUNC_QUALIFIER vec<4, T, Q> grad4(T const& j, vec<4, T, Q> const& ip) + { + vec<3, T, Q> pXYZ = floor(fract(vec<3, T, Q>(j) * vec<3, T, Q>(ip)) * T(7)) * ip[2] - T(1); + T pW = static_cast(1.5) - dot(abs(pXYZ), vec<3, T, Q>(1)); + vec<4, T, Q> s = vec<4, T, Q>(lessThan(vec<4, T, Q>(pXYZ, pW), vec<4, T, Q>(0.0))); + pXYZ = pXYZ + (vec<3, T, Q>(s) * T(2) - T(1)) * s.w; + return vec<4, T, Q>(pXYZ, pW); + } +}//namespace gtc + + // Classic Perlin noise + template + GLM_FUNC_QUALIFIER T perlin(vec<2, T, Q> const& Position) + { + vec<4, T, Q> Pi = glm::floor(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) + vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + vec<4, T, Q> Pf = glm::fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + Pi = mod(Pi, vec<4, T, Q>(289)); // To avoid truncation effects in permutation + vec<4, T, Q> ix(Pi.x, Pi.z, Pi.x, Pi.z); + vec<4, T, Q> iy(Pi.y, Pi.y, Pi.w, Pi.w); + vec<4, T, Q> fx(Pf.x, Pf.z, Pf.x, Pf.z); + vec<4, T, Q> fy(Pf.y, Pf.y, Pf.w, Pf.w); + + vec<4, T, Q> i = detail::permute(detail::permute(ix) + iy); + + vec<4, T, Q> gx = static_cast(2) * glm::fract(i / T(41)) - T(1); + vec<4, T, Q> gy = glm::abs(gx) - T(0.5); + vec<4, T, Q> tx = glm::floor(gx + T(0.5)); + gx = gx - tx; + + vec<2, T, Q> g00(gx.x, gy.x); + vec<2, T, Q> g10(gx.y, gy.y); + vec<2, T, Q> g01(gx.z, gy.z); + vec<2, T, Q> g11(gx.w, gy.w); + + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); + g00 *= norm.x; + g01 *= norm.y; + g10 *= norm.z; + g11 *= norm.w; + + T n00 = dot(g00, vec<2, T, Q>(fx.x, fy.x)); + T n10 = dot(g10, vec<2, T, Q>(fx.y, fy.y)); + T n01 = dot(g01, vec<2, T, Q>(fx.z, fy.z)); + T n11 = dot(g11, vec<2, T, Q>(fx.w, fy.w)); + + vec<2, T, Q> fade_xy = detail::fade(vec<2, T, Q>(Pf.x, Pf.y)); + vec<2, T, Q> n_x = mix(vec<2, T, Q>(n00, n01), vec<2, T, Q>(n10, n11), fade_xy.x); + T n_xy = mix(n_x.x, n_x.y, fade_xy.y); + return T(2.3) * n_xy; + } + + // Classic Perlin noise + template + GLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& Position) + { + vec<3, T, Q> Pi0 = floor(Position); // Integer part for indexing + vec<3, T, Q> Pi1 = Pi0 + T(1); // Integer part + 1 + Pi0 = detail::mod289(Pi0); + Pi1 = detail::mod289(Pi1); + vec<3, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<3, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy = vec<4, T, Q>(vec<2, T, Q>(Pi0.y), vec<2, T, Q>(Pi1.y)); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + + vec<4, T, Q> gx0 = ixy0 * T(1.0 / 7.0); + vec<4, T, Q> gy0 = fract(floor(gx0) * T(1.0 / 7.0)) - T(0.5); + gx0 = fract(gx0); + vec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0); + vec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0.0)); + gx0 -= sz0 * (step(T(0), gx0) - T(0.5)); + gy0 -= sz0 * (step(T(0), gy0) - T(0.5)); + + vec<4, T, Q> gx1 = ixy1 * T(1.0 / 7.0); + vec<4, T, Q> gy1 = fract(floor(gx1) * T(1.0 / 7.0)) - T(0.5); + gx1 = fract(gx1); + vec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1); + vec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(0.0)); + gx1 -= sz1 * (step(T(0), gx1) - T(0.5)); + gy1 -= sz1 * (step(T(0), gy1) - T(0.5)); + + vec<3, T, Q> g000(gx0.x, gy0.x, gz0.x); + vec<3, T, Q> g100(gx0.y, gy0.y, gz0.y); + vec<3, T, Q> g010(gx0.z, gy0.z, gz0.z); + vec<3, T, Q> g110(gx0.w, gy0.w, gz0.w); + vec<3, T, Q> g001(gx1.x, gy1.x, gz1.x); + vec<3, T, Q> g101(gx1.y, gy1.y, gz1.y); + vec<3, T, Q> g011(gx1.z, gy1.z, gz1.z); + vec<3, T, Q> g111(gx1.w, gy1.w, gz1.w); + + vec<4, T, Q> norm0 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + vec<4, T, Q> norm1 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + + T n000 = dot(g000, Pf0); + T n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z)); + T n111 = dot(g111, Pf1); + + vec<3, T, Q> fade_xyz = detail::fade(Pf0); + vec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z); + vec<2, T, Q> n_yz = mix(vec<2, T, Q>(n_z.x, n_z.y), vec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y); + T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return T(2.2) * n_xyz; + } + /* + // Classic Perlin noise + template + GLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& P) + { + vec<3, T, Q> Pi0 = floor(P); // Integer part for indexing + vec<3, T, Q> Pi1 = Pi0 + T(1); // Integer part + 1 + Pi0 = mod(Pi0, T(289)); + Pi1 = mod(Pi1, T(289)); + vec<3, T, Q> Pf0 = fract(P); // Fractional part for interpolation + vec<3, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + + vec<4, T, Q> ixy = permute(permute(ix) + iy); + vec<4, T, Q> ixy0 = permute(ixy + iz0); + vec<4, T, Q> ixy1 = permute(ixy + iz1); + + vec<4, T, Q> gx0 = ixy0 / T(7); + vec<4, T, Q> gy0 = fract(floor(gx0) / T(7)) - T(0.5); + gx0 = fract(gx0); + vec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0); + vec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0.0)); + gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); + gy0 -= sz0 * (step(0.0, gy0) - T(0.5)); + + vec<4, T, Q> gx1 = ixy1 / T(7); + vec<4, T, Q> gy1 = fract(floor(gx1) / T(7)) - T(0.5); + gx1 = fract(gx1); + vec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1); + vec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(0.0)); + gx1 -= sz1 * (step(T(0), gx1) - T(0.5)); + gy1 -= sz1 * (step(T(0), gy1) - T(0.5)); + + vec<3, T, Q> g000(gx0.x, gy0.x, gz0.x); + vec<3, T, Q> g100(gx0.y, gy0.y, gz0.y); + vec<3, T, Q> g010(gx0.z, gy0.z, gz0.z); + vec<3, T, Q> g110(gx0.w, gy0.w, gz0.w); + vec<3, T, Q> g001(gx1.x, gy1.x, gz1.x); + vec<3, T, Q> g101(gx1.y, gy1.y, gz1.y); + vec<3, T, Q> g011(gx1.z, gy1.z, gz1.z); + vec<3, T, Q> g111(gx1.w, gy1.w, gz1.w); + + vec<4, T, Q> norm0 = taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + vec<4, T, Q> norm1 = taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + + T n000 = dot(g000, Pf0); + T n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z)); + T n111 = dot(g111, Pf1); + + vec<3, T, Q> fade_xyz = fade(Pf0); + vec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z); + vec<2, T, Q> n_yz = mix( + vec<2, T, Q>(n_z.x, n_z.y), + vec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y); + T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return T(2.2) * n_xyz; + } + */ + // Classic Perlin noise + template + GLM_FUNC_QUALIFIER T perlin(vec<4, T, Q> const& Position) + { + vec<4, T, Q> Pi0 = floor(Position); // Integer part for indexing + vec<4, T, Q> Pi1 = Pi0 + T(1); // Integer part + 1 + Pi0 = mod(Pi0, vec<4, T, Q>(289)); + Pi1 = mod(Pi1, vec<4, T, Q>(289)); + vec<4, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<4, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + vec<4, T, Q> iw0(Pi0.w); + vec<4, T, Q> iw1(Pi1.w); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + vec<4, T, Q> ixy00 = detail::permute(ixy0 + iw0); + vec<4, T, Q> ixy01 = detail::permute(ixy0 + iw1); + vec<4, T, Q> ixy10 = detail::permute(ixy1 + iw0); + vec<4, T, Q> ixy11 = detail::permute(ixy1 + iw1); + + vec<4, T, Q> gx00 = ixy00 / T(7); + vec<4, T, Q> gy00 = floor(gx00) / T(7); + vec<4, T, Q> gz00 = floor(gy00) / T(6); + gx00 = fract(gx00) - T(0.5); + gy00 = fract(gy00) - T(0.5); + gz00 = fract(gz00) - T(0.5); + vec<4, T, Q> gw00 = vec<4, T, Q>(0.75) - abs(gx00) - abs(gy00) - abs(gz00); + vec<4, T, Q> sw00 = step(gw00, vec<4, T, Q>(0.0)); + gx00 -= sw00 * (step(T(0), gx00) - T(0.5)); + gy00 -= sw00 * (step(T(0), gy00) - T(0.5)); + + vec<4, T, Q> gx01 = ixy01 / T(7); + vec<4, T, Q> gy01 = floor(gx01) / T(7); + vec<4, T, Q> gz01 = floor(gy01) / T(6); + gx01 = fract(gx01) - T(0.5); + gy01 = fract(gy01) - T(0.5); + gz01 = fract(gz01) - T(0.5); + vec<4, T, Q> gw01 = vec<4, T, Q>(0.75) - abs(gx01) - abs(gy01) - abs(gz01); + vec<4, T, Q> sw01 = step(gw01, vec<4, T, Q>(0.0)); + gx01 -= sw01 * (step(T(0), gx01) - T(0.5)); + gy01 -= sw01 * (step(T(0), gy01) - T(0.5)); + + vec<4, T, Q> gx10 = ixy10 / T(7); + vec<4, T, Q> gy10 = floor(gx10) / T(7); + vec<4, T, Q> gz10 = floor(gy10) / T(6); + gx10 = fract(gx10) - T(0.5); + gy10 = fract(gy10) - T(0.5); + gz10 = fract(gz10) - T(0.5); + vec<4, T, Q> gw10 = vec<4, T, Q>(0.75) - abs(gx10) - abs(gy10) - abs(gz10); + vec<4, T, Q> sw10 = step(gw10, vec<4, T, Q>(0)); + gx10 -= sw10 * (step(T(0), gx10) - T(0.5)); + gy10 -= sw10 * (step(T(0), gy10) - T(0.5)); + + vec<4, T, Q> gx11 = ixy11 / T(7); + vec<4, T, Q> gy11 = floor(gx11) / T(7); + vec<4, T, Q> gz11 = floor(gy11) / T(6); + gx11 = fract(gx11) - T(0.5); + gy11 = fract(gy11) - T(0.5); + gz11 = fract(gz11) - T(0.5); + vec<4, T, Q> gw11 = vec<4, T, Q>(0.75) - abs(gx11) - abs(gy11) - abs(gz11); + vec<4, T, Q> sw11 = step(gw11, vec<4, T, Q>(0.0)); + gx11 -= sw11 * (step(T(0), gx11) - T(0.5)); + gy11 -= sw11 * (step(T(0), gy11) - T(0.5)); + + vec<4, T, Q> g0000(gx00.x, gy00.x, gz00.x, gw00.x); + vec<4, T, Q> g1000(gx00.y, gy00.y, gz00.y, gw00.y); + vec<4, T, Q> g0100(gx00.z, gy00.z, gz00.z, gw00.z); + vec<4, T, Q> g1100(gx00.w, gy00.w, gz00.w, gw00.w); + vec<4, T, Q> g0010(gx10.x, gy10.x, gz10.x, gw10.x); + vec<4, T, Q> g1010(gx10.y, gy10.y, gz10.y, gw10.y); + vec<4, T, Q> g0110(gx10.z, gy10.z, gz10.z, gw10.z); + vec<4, T, Q> g1110(gx10.w, gy10.w, gz10.w, gw10.w); + vec<4, T, Q> g0001(gx01.x, gy01.x, gz01.x, gw01.x); + vec<4, T, Q> g1001(gx01.y, gy01.y, gz01.y, gw01.y); + vec<4, T, Q> g0101(gx01.z, gy01.z, gz01.z, gw01.z); + vec<4, T, Q> g1101(gx01.w, gy01.w, gz01.w, gw01.w); + vec<4, T, Q> g0011(gx11.x, gy11.x, gz11.x, gw11.x); + vec<4, T, Q> g1011(gx11.y, gy11.y, gz11.y, gw11.y); + vec<4, T, Q> g0111(gx11.z, gy11.z, gz11.z, gw11.z); + vec<4, T, Q> g1111(gx11.w, gy11.w, gz11.w, gw11.w); + + vec<4, T, Q> norm00 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100))); + g0000 *= norm00.x; + g0100 *= norm00.y; + g1000 *= norm00.z; + g1100 *= norm00.w; + + vec<4, T, Q> norm01 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101))); + g0001 *= norm01.x; + g0101 *= norm01.y; + g1001 *= norm01.z; + g1101 *= norm01.w; + + vec<4, T, Q> norm10 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110))); + g0010 *= norm10.x; + g0110 *= norm10.y; + g1010 *= norm10.z; + g1110 *= norm10.w; + + vec<4, T, Q> norm11 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111))); + g0011 *= norm11.x; + g0111 *= norm11.y; + g1011 *= norm11.z; + g1111 *= norm11.w; + + T n0000 = dot(g0000, Pf0); + T n1000 = dot(g1000, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf0.w)); + T n0100 = dot(g0100, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf0.w)); + T n1100 = dot(g1100, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf0.w)); + T n0010 = dot(g0010, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf0.w)); + T n1010 = dot(g1010, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf0.w)); + T n0110 = dot(g0110, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf0.w)); + T n1110 = dot(g1110, vec<4, T, Q>(Pf1.x, Pf1.y, Pf1.z, Pf0.w)); + T n0001 = dot(g0001, vec<4, T, Q>(Pf0.x, Pf0.y, Pf0.z, Pf1.w)); + T n1001 = dot(g1001, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf1.w)); + T n0101 = dot(g0101, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf1.w)); + T n1101 = dot(g1101, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf1.w)); + T n0011 = dot(g0011, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf1.w)); + T n1011 = dot(g1011, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf1.w)); + T n0111 = dot(g0111, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf1.w)); + T n1111 = dot(g1111, Pf1); + + vec<4, T, Q> fade_xyzw = detail::fade(Pf0); + vec<4, T, Q> n_0w = mix(vec<4, T, Q>(n0000, n1000, n0100, n1100), vec<4, T, Q>(n0001, n1001, n0101, n1101), fade_xyzw.w); + vec<4, T, Q> n_1w = mix(vec<4, T, Q>(n0010, n1010, n0110, n1110), vec<4, T, Q>(n0011, n1011, n0111, n1111), fade_xyzw.w); + vec<4, T, Q> n_zw = mix(n_0w, n_1w, fade_xyzw.z); + vec<2, T, Q> n_yzw = mix(vec<2, T, Q>(n_zw.x, n_zw.y), vec<2, T, Q>(n_zw.z, n_zw.w), fade_xyzw.y); + T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x); + return T(2.2) * n_xyzw; + } + + // Classic Perlin noise, periodic variant + template + GLM_FUNC_QUALIFIER T perlin(vec<2, T, Q> const& Position, vec<2, T, Q> const& rep) + { + vec<4, T, Q> Pi = floor(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) + vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + vec<4, T, Q> Pf = fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + Pi = mod(Pi, vec<4, T, Q>(rep.x, rep.y, rep.x, rep.y)); // To create noise with explicit period + Pi = mod(Pi, vec<4, T, Q>(289)); // To avoid truncation effects in permutation + vec<4, T, Q> ix(Pi.x, Pi.z, Pi.x, Pi.z); + vec<4, T, Q> iy(Pi.y, Pi.y, Pi.w, Pi.w); + vec<4, T, Q> fx(Pf.x, Pf.z, Pf.x, Pf.z); + vec<4, T, Q> fy(Pf.y, Pf.y, Pf.w, Pf.w); + + vec<4, T, Q> i = detail::permute(detail::permute(ix) + iy); + + vec<4, T, Q> gx = static_cast(2) * fract(i / T(41)) - T(1); + vec<4, T, Q> gy = abs(gx) - T(0.5); + vec<4, T, Q> tx = floor(gx + T(0.5)); + gx = gx - tx; + + vec<2, T, Q> g00(gx.x, gy.x); + vec<2, T, Q> g10(gx.y, gy.y); + vec<2, T, Q> g01(gx.z, gy.z); + vec<2, T, Q> g11(gx.w, gy.w); + + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); + g00 *= norm.x; + g01 *= norm.y; + g10 *= norm.z; + g11 *= norm.w; + + T n00 = dot(g00, vec<2, T, Q>(fx.x, fy.x)); + T n10 = dot(g10, vec<2, T, Q>(fx.y, fy.y)); + T n01 = dot(g01, vec<2, T, Q>(fx.z, fy.z)); + T n11 = dot(g11, vec<2, T, Q>(fx.w, fy.w)); + + vec<2, T, Q> fade_xy = detail::fade(vec<2, T, Q>(Pf.x, Pf.y)); + vec<2, T, Q> n_x = mix(vec<2, T, Q>(n00, n01), vec<2, T, Q>(n10, n11), fade_xy.x); + T n_xy = mix(n_x.x, n_x.y, fade_xy.y); + return T(2.3) * n_xy; + } + + // Classic Perlin noise, periodic variant + template + GLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& Position, vec<3, T, Q> const& rep) + { + vec<3, T, Q> Pi0 = mod(floor(Position), rep); // Integer part, modulo period + vec<3, T, Q> Pi1 = mod(Pi0 + vec<3, T, Q>(T(1)), rep); // Integer part + 1, mod period + Pi0 = mod(Pi0, vec<3, T, Q>(289)); + Pi1 = mod(Pi1, vec<3, T, Q>(289)); + vec<3, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<3, T, Q> Pf1 = Pf0 - vec<3, T, Q>(T(1)); // Fractional part - 1.0 + vec<4, T, Q> ix = vec<4, T, Q>(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy = vec<4, T, Q>(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + + vec<4, T, Q> gx0 = ixy0 / T(7); + vec<4, T, Q> gy0 = fract(floor(gx0) / T(7)) - T(0.5); + gx0 = fract(gx0); + vec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0); + vec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0)); + gx0 -= sz0 * (step(T(0), gx0) - T(0.5)); + gy0 -= sz0 * (step(T(0), gy0) - T(0.5)); + + vec<4, T, Q> gx1 = ixy1 / T(7); + vec<4, T, Q> gy1 = fract(floor(gx1) / T(7)) - T(0.5); + gx1 = fract(gx1); + vec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1); + vec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(T(0))); + gx1 -= sz1 * (step(T(0), gx1) - T(0.5)); + gy1 -= sz1 * (step(T(0), gy1) - T(0.5)); + + vec<3, T, Q> g000 = vec<3, T, Q>(gx0.x, gy0.x, gz0.x); + vec<3, T, Q> g100 = vec<3, T, Q>(gx0.y, gy0.y, gz0.y); + vec<3, T, Q> g010 = vec<3, T, Q>(gx0.z, gy0.z, gz0.z); + vec<3, T, Q> g110 = vec<3, T, Q>(gx0.w, gy0.w, gz0.w); + vec<3, T, Q> g001 = vec<3, T, Q>(gx1.x, gy1.x, gz1.x); + vec<3, T, Q> g101 = vec<3, T, Q>(gx1.y, gy1.y, gz1.y); + vec<3, T, Q> g011 = vec<3, T, Q>(gx1.z, gy1.z, gz1.z); + vec<3, T, Q> g111 = vec<3, T, Q>(gx1.w, gy1.w, gz1.w); + + vec<4, T, Q> norm0 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + vec<4, T, Q> norm1 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + + T n000 = dot(g000, Pf0); + T n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z)); + T n111 = dot(g111, Pf1); + + vec<3, T, Q> fade_xyz = detail::fade(Pf0); + vec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z); + vec<2, T, Q> n_yz = mix(vec<2, T, Q>(n_z.x, n_z.y), vec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y); + T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return T(2.2) * n_xyz; + } + + // Classic Perlin noise, periodic version + template + GLM_FUNC_QUALIFIER T perlin(vec<4, T, Q> const& Position, vec<4, T, Q> const& rep) + { + vec<4, T, Q> Pi0 = mod(floor(Position), rep); // Integer part modulo rep + vec<4, T, Q> Pi1 = mod(Pi0 + T(1), rep); // Integer part + 1 mod rep + vec<4, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<4, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix = vec<4, T, Q>(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy = vec<4, T, Q>(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + vec<4, T, Q> iw0(Pi0.w); + vec<4, T, Q> iw1(Pi1.w); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + vec<4, T, Q> ixy00 = detail::permute(ixy0 + iw0); + vec<4, T, Q> ixy01 = detail::permute(ixy0 + iw1); + vec<4, T, Q> ixy10 = detail::permute(ixy1 + iw0); + vec<4, T, Q> ixy11 = detail::permute(ixy1 + iw1); + + vec<4, T, Q> gx00 = ixy00 / T(7); + vec<4, T, Q> gy00 = floor(gx00) / T(7); + vec<4, T, Q> gz00 = floor(gy00) / T(6); + gx00 = fract(gx00) - T(0.5); + gy00 = fract(gy00) - T(0.5); + gz00 = fract(gz00) - T(0.5); + vec<4, T, Q> gw00 = vec<4, T, Q>(0.75) - abs(gx00) - abs(gy00) - abs(gz00); + vec<4, T, Q> sw00 = step(gw00, vec<4, T, Q>(0)); + gx00 -= sw00 * (step(T(0), gx00) - T(0.5)); + gy00 -= sw00 * (step(T(0), gy00) - T(0.5)); + + vec<4, T, Q> gx01 = ixy01 / T(7); + vec<4, T, Q> gy01 = floor(gx01) / T(7); + vec<4, T, Q> gz01 = floor(gy01) / T(6); + gx01 = fract(gx01) - T(0.5); + gy01 = fract(gy01) - T(0.5); + gz01 = fract(gz01) - T(0.5); + vec<4, T, Q> gw01 = vec<4, T, Q>(0.75) - abs(gx01) - abs(gy01) - abs(gz01); + vec<4, T, Q> sw01 = step(gw01, vec<4, T, Q>(0.0)); + gx01 -= sw01 * (step(T(0), gx01) - T(0.5)); + gy01 -= sw01 * (step(T(0), gy01) - T(0.5)); + + vec<4, T, Q> gx10 = ixy10 / T(7); + vec<4, T, Q> gy10 = floor(gx10) / T(7); + vec<4, T, Q> gz10 = floor(gy10) / T(6); + gx10 = fract(gx10) - T(0.5); + gy10 = fract(gy10) - T(0.5); + gz10 = fract(gz10) - T(0.5); + vec<4, T, Q> gw10 = vec<4, T, Q>(0.75) - abs(gx10) - abs(gy10) - abs(gz10); + vec<4, T, Q> sw10 = step(gw10, vec<4, T, Q>(0.0)); + gx10 -= sw10 * (step(T(0), gx10) - T(0.5)); + gy10 -= sw10 * (step(T(0), gy10) - T(0.5)); + + vec<4, T, Q> gx11 = ixy11 / T(7); + vec<4, T, Q> gy11 = floor(gx11) / T(7); + vec<4, T, Q> gz11 = floor(gy11) / T(6); + gx11 = fract(gx11) - T(0.5); + gy11 = fract(gy11) - T(0.5); + gz11 = fract(gz11) - T(0.5); + vec<4, T, Q> gw11 = vec<4, T, Q>(0.75) - abs(gx11) - abs(gy11) - abs(gz11); + vec<4, T, Q> sw11 = step(gw11, vec<4, T, Q>(T(0))); + gx11 -= sw11 * (step(T(0), gx11) - T(0.5)); + gy11 -= sw11 * (step(T(0), gy11) - T(0.5)); + + vec<4, T, Q> g0000(gx00.x, gy00.x, gz00.x, gw00.x); + vec<4, T, Q> g1000(gx00.y, gy00.y, gz00.y, gw00.y); + vec<4, T, Q> g0100(gx00.z, gy00.z, gz00.z, gw00.z); + vec<4, T, Q> g1100(gx00.w, gy00.w, gz00.w, gw00.w); + vec<4, T, Q> g0010(gx10.x, gy10.x, gz10.x, gw10.x); + vec<4, T, Q> g1010(gx10.y, gy10.y, gz10.y, gw10.y); + vec<4, T, Q> g0110(gx10.z, gy10.z, gz10.z, gw10.z); + vec<4, T, Q> g1110(gx10.w, gy10.w, gz10.w, gw10.w); + vec<4, T, Q> g0001(gx01.x, gy01.x, gz01.x, gw01.x); + vec<4, T, Q> g1001(gx01.y, gy01.y, gz01.y, gw01.y); + vec<4, T, Q> g0101(gx01.z, gy01.z, gz01.z, gw01.z); + vec<4, T, Q> g1101(gx01.w, gy01.w, gz01.w, gw01.w); + vec<4, T, Q> g0011(gx11.x, gy11.x, gz11.x, gw11.x); + vec<4, T, Q> g1011(gx11.y, gy11.y, gz11.y, gw11.y); + vec<4, T, Q> g0111(gx11.z, gy11.z, gz11.z, gw11.z); + vec<4, T, Q> g1111(gx11.w, gy11.w, gz11.w, gw11.w); + + vec<4, T, Q> norm00 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100))); + g0000 *= norm00.x; + g0100 *= norm00.y; + g1000 *= norm00.z; + g1100 *= norm00.w; + + vec<4, T, Q> norm01 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101))); + g0001 *= norm01.x; + g0101 *= norm01.y; + g1001 *= norm01.z; + g1101 *= norm01.w; + + vec<4, T, Q> norm10 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110))); + g0010 *= norm10.x; + g0110 *= norm10.y; + g1010 *= norm10.z; + g1110 *= norm10.w; + + vec<4, T, Q> norm11 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111))); + g0011 *= norm11.x; + g0111 *= norm11.y; + g1011 *= norm11.z; + g1111 *= norm11.w; + + T n0000 = dot(g0000, Pf0); + T n1000 = dot(g1000, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf0.w)); + T n0100 = dot(g0100, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf0.w)); + T n1100 = dot(g1100, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf0.w)); + T n0010 = dot(g0010, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf0.w)); + T n1010 = dot(g1010, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf0.w)); + T n0110 = dot(g0110, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf0.w)); + T n1110 = dot(g1110, vec<4, T, Q>(Pf1.x, Pf1.y, Pf1.z, Pf0.w)); + T n0001 = dot(g0001, vec<4, T, Q>(Pf0.x, Pf0.y, Pf0.z, Pf1.w)); + T n1001 = dot(g1001, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf1.w)); + T n0101 = dot(g0101, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf1.w)); + T n1101 = dot(g1101, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf1.w)); + T n0011 = dot(g0011, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf1.w)); + T n1011 = dot(g1011, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf1.w)); + T n0111 = dot(g0111, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf1.w)); + T n1111 = dot(g1111, Pf1); + + vec<4, T, Q> fade_xyzw = detail::fade(Pf0); + vec<4, T, Q> n_0w = mix(vec<4, T, Q>(n0000, n1000, n0100, n1100), vec<4, T, Q>(n0001, n1001, n0101, n1101), fade_xyzw.w); + vec<4, T, Q> n_1w = mix(vec<4, T, Q>(n0010, n1010, n0110, n1110), vec<4, T, Q>(n0011, n1011, n0111, n1111), fade_xyzw.w); + vec<4, T, Q> n_zw = mix(n_0w, n_1w, fade_xyzw.z); + vec<2, T, Q> n_yzw = mix(vec<2, T, Q>(n_zw.x, n_zw.y), vec<2, T, Q>(n_zw.z, n_zw.w), fade_xyzw.y); + T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x); + return T(2.2) * n_xyzw; + } + + template + GLM_FUNC_QUALIFIER T simplex(glm::vec<2, T, Q> const& v) + { + vec<4, T, Q> const C = vec<4, T, Q>( + T( 0.211324865405187), // (3.0 - sqrt(3.0)) / 6.0 + T( 0.366025403784439), // 0.5 * (sqrt(3.0) - 1.0) + T(-0.577350269189626), // -1.0 + 2.0 * C.x + T( 0.024390243902439)); // 1.0 / 41.0 + + // First corner + vec<2, T, Q> i = floor(v + dot(v, vec<2, T, Q>(C[1]))); + vec<2, T, Q> x0 = v - i + dot(i, vec<2, T, Q>(C[0])); + + // Other corners + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + vec<2, T, Q> i1 = (x0.x > x0.y) ? vec<2, T, Q>(1, 0) : vec<2, T, Q>(0, 1); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + vec<4, T, Q> x12 = vec<4, T, Q>(x0.x, x0.y, x0.x, x0.y) + vec<4, T, Q>(C.x, C.x, C.z, C.z); + x12 = vec<4, T, Q>(vec<2, T, Q>(x12) - i1, x12.z, x12.w); + + // Permutations + i = mod(i, vec<2, T, Q>(289)); // Avoid truncation effects in permutation + vec<3, T, Q> p = detail::permute( + detail::permute(i.y + vec<3, T, Q>(T(0), i1.y, T(1))) + + i.x + vec<3, T, Q>(T(0), i1.x, T(1))); + + vec<3, T, Q> m = max(vec<3, T, Q>(0.5) - vec<3, T, Q>( + dot(x0, x0), + dot(vec<2, T, Q>(x12.x, x12.y), vec<2, T, Q>(x12.x, x12.y)), + dot(vec<2, T, Q>(x12.z, x12.w), vec<2, T, Q>(x12.z, x12.w))), vec<3, T, Q>(0)); + m = m * m ; + m = m * m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + vec<3, T, Q> x = static_cast(2) * fract(p * C.w) - T(1); + vec<3, T, Q> h = abs(x) - T(0.5); + vec<3, T, Q> ox = floor(x + T(0.5)); + vec<3, T, Q> a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Inlined for speed: m *= taylorInvSqrt( a0*a0 + h*h ); + m *= static_cast(1.79284291400159) - T(0.85373472095314) * (a0 * a0 + h * h); + + // Compute final noise value at P + vec<3, T, Q> g; + g.x = a0.x * x0.x + h.x * x0.y; + //g.yz = a0.yz * x12.xz + h.yz * x12.yw; + g.y = a0.y * x12.x + h.y * x12.y; + g.z = a0.z * x12.z + h.z * x12.w; + return T(130) * dot(m, g); + } + + template + GLM_FUNC_QUALIFIER T simplex(vec<3, T, Q> const& v) + { + vec<2, T, Q> const C(1.0 / 6.0, 1.0 / 3.0); + vec<4, T, Q> const D(0.0, 0.5, 1.0, 2.0); + + // First corner + vec<3, T, Q> i(floor(v + dot(v, vec<3, T, Q>(C.y)))); + vec<3, T, Q> x0(v - i + dot(i, vec<3, T, Q>(C.x))); + + // Other corners + vec<3, T, Q> g(step(vec<3, T, Q>(x0.y, x0.z, x0.x), x0)); + vec<3, T, Q> l(T(1) - g); + vec<3, T, Q> i1(min(g, vec<3, T, Q>(l.z, l.x, l.y))); + vec<3, T, Q> i2(max(g, vec<3, T, Q>(l.z, l.x, l.y))); + + // x0 = x0 - 0.0 + 0.0 * C.xxx; + // x1 = x0 - i1 + 1.0 * C.xxx; + // x2 = x0 - i2 + 2.0 * C.xxx; + // x3 = x0 - 1.0 + 3.0 * C.xxx; + vec<3, T, Q> x1(x0 - i1 + C.x); + vec<3, T, Q> x2(x0 - i2 + C.y); // 2.0*C.x = 1/3 = C.y + vec<3, T, Q> x3(x0 - D.y); // -1.0+3.0*C.x = -0.5 = -D.y + + // Permutations + i = detail::mod289(i); + vec<4, T, Q> p(detail::permute(detail::permute(detail::permute( + i.z + vec<4, T, Q>(T(0), i1.z, i2.z, T(1))) + + i.y + vec<4, T, Q>(T(0), i1.y, i2.y, T(1))) + + i.x + vec<4, T, Q>(T(0), i1.x, i2.x, T(1)))); + + // Gradients: 7x7 points over a square, mapped onto an octahedron. + // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) + T n_ = static_cast(0.142857142857); // 1.0/7.0 + vec<3, T, Q> ns(n_ * vec<3, T, Q>(D.w, D.y, D.z) - vec<3, T, Q>(D.x, D.z, D.x)); + + vec<4, T, Q> j(p - T(49) * floor(p * ns.z * ns.z)); // mod(p,7*7) + + vec<4, T, Q> x_(floor(j * ns.z)); + vec<4, T, Q> y_(floor(j - T(7) * x_)); // mod(j,N) + + vec<4, T, Q> x(x_ * ns.x + ns.y); + vec<4, T, Q> y(y_ * ns.x + ns.y); + vec<4, T, Q> h(T(1) - abs(x) - abs(y)); + + vec<4, T, Q> b0(x.x, x.y, y.x, y.y); + vec<4, T, Q> b1(x.z, x.w, y.z, y.w); + + // vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; + // vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; + vec<4, T, Q> s0(floor(b0) * T(2) + T(1)); + vec<4, T, Q> s1(floor(b1) * T(2) + T(1)); + vec<4, T, Q> sh(-step(h, vec<4, T, Q>(0.0))); + + vec<4, T, Q> a0 = vec<4, T, Q>(b0.x, b0.z, b0.y, b0.w) + vec<4, T, Q>(s0.x, s0.z, s0.y, s0.w) * vec<4, T, Q>(sh.x, sh.x, sh.y, sh.y); + vec<4, T, Q> a1 = vec<4, T, Q>(b1.x, b1.z, b1.y, b1.w) + vec<4, T, Q>(s1.x, s1.z, s1.y, s1.w) * vec<4, T, Q>(sh.z, sh.z, sh.w, sh.w); + + vec<3, T, Q> p0(a0.x, a0.y, h.x); + vec<3, T, Q> p1(a0.z, a0.w, h.y); + vec<3, T, Q> p2(a1.x, a1.y, h.z); + vec<3, T, Q> p3(a1.z, a1.w, h.w); + + // Normalise gradients + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + // Mix final noise value + vec<4, T, Q> m = max(T(0.6) - vec<4, T, Q>(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), vec<4, T, Q>(0)); + m = m * m; + return T(42) * dot(m * m, vec<4, T, Q>(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); + } + + template + GLM_FUNC_QUALIFIER T simplex(vec<4, T, Q> const& v) + { + vec<4, T, Q> const C( + 0.138196601125011, // (5 - sqrt(5))/20 G4 + 0.276393202250021, // 2 * G4 + 0.414589803375032, // 3 * G4 + -0.447213595499958); // -1 + 4 * G4 + + // (sqrt(5) - 1)/4 = F4, used once below + T const F4 = static_cast(0.309016994374947451); + + // First corner + vec<4, T, Q> i = floor(v + dot(v, vec<4, T, Q>(F4))); + vec<4, T, Q> x0 = v - i + dot(i, vec<4, T, Q>(C.x)); + + // Other corners + + // Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI) + vec<4, T, Q> i0; + vec<3, T, Q> isX = step(vec<3, T, Q>(x0.y, x0.z, x0.w), vec<3, T, Q>(x0.x)); + vec<3, T, Q> isYZ = step(vec<3, T, Q>(x0.z, x0.w, x0.w), vec<3, T, Q>(x0.y, x0.y, x0.z)); + // i0.x = dot(isX, vec3(1.0)); + //i0.x = isX.x + isX.y + isX.z; + //i0.yzw = static_cast(1) - isX; + i0 = vec<4, T, Q>(isX.x + isX.y + isX.z, T(1) - isX); + // i0.y += dot(isYZ.xy, vec2(1.0)); + i0.y += isYZ.x + isYZ.y; + //i0.zw += 1.0 - vec<2, T, Q>(isYZ.x, isYZ.y); + i0.z += static_cast(1) - isYZ.x; + i0.w += static_cast(1) - isYZ.y; + i0.z += isYZ.z; + i0.w += static_cast(1) - isYZ.z; + + // i0 now contains the unique values 0,1,2,3 in each channel + vec<4, T, Q> i3 = clamp(i0, T(0), T(1)); + vec<4, T, Q> i2 = clamp(i0 - T(1), T(0), T(1)); + vec<4, T, Q> i1 = clamp(i0 - T(2), T(0), T(1)); + + // x0 = x0 - 0.0 + 0.0 * C.xxxx + // x1 = x0 - i1 + 0.0 * C.xxxx + // x2 = x0 - i2 + 0.0 * C.xxxx + // x3 = x0 - i3 + 0.0 * C.xxxx + // x4 = x0 - 1.0 + 4.0 * C.xxxx + vec<4, T, Q> x1 = x0 - i1 + C.x; + vec<4, T, Q> x2 = x0 - i2 + C.y; + vec<4, T, Q> x3 = x0 - i3 + C.z; + vec<4, T, Q> x4 = x0 + C.w; + + // Permutations + i = mod(i, vec<4, T, Q>(289)); + T j0 = detail::permute(detail::permute(detail::permute(detail::permute(i.w) + i.z) + i.y) + i.x); + vec<4, T, Q> j1 = detail::permute(detail::permute(detail::permute(detail::permute( + i.w + vec<4, T, Q>(i1.w, i2.w, i3.w, T(1))) + + i.z + vec<4, T, Q>(i1.z, i2.z, i3.z, T(1))) + + i.y + vec<4, T, Q>(i1.y, i2.y, i3.y, T(1))) + + i.x + vec<4, T, Q>(i1.x, i2.x, i3.x, T(1))); + + // Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope + // 7*7*6 = 294, which is close to the ring size 17*17 = 289. + vec<4, T, Q> ip = vec<4, T, Q>(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0)); + + vec<4, T, Q> p0 = gtc::grad4(j0, ip); + vec<4, T, Q> p1 = gtc::grad4(j1.x, ip); + vec<4, T, Q> p2 = gtc::grad4(j1.y, ip); + vec<4, T, Q> p3 = gtc::grad4(j1.z, ip); + vec<4, T, Q> p4 = gtc::grad4(j1.w, ip); + + // Normalise gradients + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + p4 *= detail::taylorInvSqrt(dot(p4, p4)); + + // Mix contributions from the five corners + vec<3, T, Q> m0 = max(T(0.6) - vec<3, T, Q>(dot(x0, x0), dot(x1, x1), dot(x2, x2)), vec<3, T, Q>(0)); + vec<2, T, Q> m1 = max(T(0.6) - vec<2, T, Q>(dot(x3, x3), dot(x4, x4) ), vec<2, T, Q>(0)); + m0 = m0 * m0; + m1 = m1 * m1; + return T(49) * + (dot(m0 * m0, vec<3, T, Q>(dot(p0, x0), dot(p1, x1), dot(p2, x2))) + + dot(m1 * m1, vec<2, T, Q>(dot(p3, x3), dot(p4, x4)))); + } +}//namespace glm diff --git a/dep/glm/gtc/packing.hpp b/dep/glm/gtc/packing.hpp new file mode 100644 index 0000000..8e416b3 --- /dev/null +++ b/dep/glm/gtc/packing.hpp @@ -0,0 +1,728 @@ +/// @ref gtc_packing +/// @file glm/gtc/packing.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_packing GLM_GTC_packing +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// This extension provides a set of function to convert vertors to packed +/// formats. + +#pragma once + +// Dependency: +#include "type_precision.hpp" +#include "../ext/vector_packing.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_packing extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_packing + /// @{ + + /// First, converts the normalized floating-point value v into a 8-bit integer value. + /// Then, the results are packed into the returned 8-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm1x8: round(clamp(c, 0, +1) * 255.0) + /// + /// @see gtc_packing + /// @see uint16 packUnorm2x8(vec2 const& v) + /// @see uint32 packUnorm4x8(vec4 const& v) + /// @see GLSL packUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint8 packUnorm1x8(float v); + + /// Convert a single 8-bit integer to a normalized floating-point value. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm4x8: f / 255.0 + /// + /// @see gtc_packing + /// @see vec2 unpackUnorm2x8(uint16 p) + /// @see vec4 unpackUnorm4x8(uint32 p) + /// @see GLSL unpackUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL float unpackUnorm1x8(uint8 p); + + /// First, converts each component of the normalized floating-point value v into 8-bit integer values. + /// Then, the results are packed into the returned 16-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm2x8: round(clamp(c, 0, +1) * 255.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see gtc_packing + /// @see uint8 packUnorm1x8(float const& v) + /// @see uint32 packUnorm4x8(vec4 const& v) + /// @see GLSL packUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint16 packUnorm2x8(vec2 const& v); + + /// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit unsigned integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm4x8: f / 255.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see float unpackUnorm1x8(uint8 v) + /// @see vec4 unpackUnorm4x8(uint32 p) + /// @see GLSL unpackUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec2 unpackUnorm2x8(uint16 p); + + /// First, converts the normalized floating-point value v into 8-bit integer value. + /// Then, the results are packed into the returned 8-bit unsigned integer. + /// + /// The conversion to fixed point is done as follows: + /// packSnorm1x8: round(clamp(s, -1, +1) * 127.0) + /// + /// @see gtc_packing + /// @see uint16 packSnorm2x8(vec2 const& v) + /// @see uint32 packSnorm4x8(vec4 const& v) + /// @see GLSL packSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint8 packSnorm1x8(float s); + + /// First, unpacks a single 8-bit unsigned integer p into a single 8-bit signed integers. + /// Then, the value is converted to a normalized floating-point value to generate the returned scalar. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm1x8: clamp(f / 127.0, -1, +1) + /// + /// @see gtc_packing + /// @see vec2 unpackSnorm2x8(uint16 p) + /// @see vec4 unpackSnorm4x8(uint32 p) + /// @see GLSL unpackSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL float unpackSnorm1x8(uint8 p); + + /// First, converts each component of the normalized floating-point value v into 8-bit integer values. + /// Then, the results are packed into the returned 16-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm2x8: round(clamp(c, -1, +1) * 127.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see gtc_packing + /// @see uint8 packSnorm1x8(float const& v) + /// @see uint32 packSnorm4x8(vec4 const& v) + /// @see GLSL packSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint16 packSnorm2x8(vec2 const& v); + + /// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm2x8: clamp(f / 127.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see float unpackSnorm1x8(uint8 p) + /// @see vec4 unpackSnorm4x8(uint32 p) + /// @see GLSL unpackSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec2 unpackSnorm2x8(uint16 p); + + /// First, converts the normalized floating-point value v into a 16-bit integer value. + /// Then, the results are packed into the returned 16-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm1x16: round(clamp(c, 0, +1) * 65535.0) + /// + /// @see gtc_packing + /// @see uint16 packSnorm1x16(float const& v) + /// @see uint64 packSnorm4x16(vec4 const& v) + /// @see GLSL packUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint16 packUnorm1x16(float v); + + /// First, unpacks a single 16-bit unsigned integer p into a of 16-bit unsigned integers. + /// Then, the value is converted to a normalized floating-point value to generate the returned scalar. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm1x16: f / 65535.0 + /// + /// @see gtc_packing + /// @see vec2 unpackUnorm2x16(uint32 p) + /// @see vec4 unpackUnorm4x16(uint64 p) + /// @see GLSL unpackUnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL float unpackUnorm1x16(uint16 p); + + /// First, converts each component of the normalized floating-point value v into 16-bit integer values. + /// Then, the results are packed into the returned 64-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm4x16: round(clamp(c, 0, +1) * 65535.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see gtc_packing + /// @see uint16 packUnorm1x16(float const& v) + /// @see uint32 packUnorm2x16(vec2 const& v) + /// @see GLSL packUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint64 packUnorm4x16(vec4 const& v); + + /// First, unpacks a single 64-bit unsigned integer p into four 16-bit unsigned integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnormx4x16: f / 65535.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see float unpackUnorm1x16(uint16 p) + /// @see vec2 unpackUnorm2x16(uint32 p) + /// @see GLSL unpackUnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec4 unpackUnorm4x16(uint64 p); + + /// First, converts the normalized floating-point value v into 16-bit integer value. + /// Then, the results are packed into the returned 16-bit unsigned integer. + /// + /// The conversion to fixed point is done as follows: + /// packSnorm1x8: round(clamp(s, -1, +1) * 32767.0) + /// + /// @see gtc_packing + /// @see uint32 packSnorm2x16(vec2 const& v) + /// @see uint64 packSnorm4x16(vec4 const& v) + /// @see GLSL packSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint16 packSnorm1x16(float v); + + /// First, unpacks a single 16-bit unsigned integer p into a single 16-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned scalar. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm1x16: clamp(f / 32767.0, -1, +1) + /// + /// @see gtc_packing + /// @see vec2 unpackSnorm2x16(uint32 p) + /// @see vec4 unpackSnorm4x16(uint64 p) + /// @see GLSL unpackSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL float unpackSnorm1x16(uint16 p); + + /// First, converts each component of the normalized floating-point value v into 16-bit integer values. + /// Then, the results are packed into the returned 64-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm2x8: round(clamp(c, -1, +1) * 32767.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see gtc_packing + /// @see uint16 packSnorm1x16(float const& v) + /// @see uint32 packSnorm2x16(vec2 const& v) + /// @see GLSL packSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint64 packSnorm4x16(vec4 const& v); + + /// First, unpacks a single 64-bit unsigned integer p into four 16-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm4x16: clamp(f / 32767.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see float unpackSnorm1x16(uint16 p) + /// @see vec2 unpackSnorm2x16(uint32 p) + /// @see GLSL unpackSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec4 unpackSnorm4x16(uint64 p); + + /// Returns an unsigned integer obtained by converting the components of a floating-point scalar + /// to the 16-bit floating-point representation found in the OpenGL Specification, + /// and then packing this 16-bit value into a 16-bit unsigned integer. + /// + /// @see gtc_packing + /// @see uint32 packHalf2x16(vec2 const& v) + /// @see uint64 packHalf4x16(vec4 const& v) + /// @see GLSL packHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint16 packHalf1x16(float v); + + /// Returns a floating-point scalar with components obtained by unpacking a 16-bit unsigned integer into a 16-bit value, + /// interpreted as a 16-bit floating-point number according to the OpenGL Specification, + /// and converting it to 32-bit floating-point values. + /// + /// @see gtc_packing + /// @see vec2 unpackHalf2x16(uint32 const& v) + /// @see vec4 unpackHalf4x16(uint64 const& v) + /// @see GLSL unpackHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL float unpackHalf1x16(uint16 v); + + /// Returns an unsigned integer obtained by converting the components of a four-component floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification, + /// and then packing these four 16-bit values into a 64-bit unsigned integer. + /// The first vector component specifies the 16 least-significant bits of the result; + /// the forth component specifies the 16 most-significant bits. + /// + /// @see gtc_packing + /// @see uint16 packHalf1x16(float const& v) + /// @see uint32 packHalf2x16(vec2 const& v) + /// @see GLSL packHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint64 packHalf4x16(vec4 const& v); + + /// Returns a four-component floating-point vector with components obtained by unpacking a 64-bit unsigned integer into four 16-bit values, + /// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, + /// and converting them to 32-bit floating-point values. + /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// the forth component is obtained from the 16 most-significant bits of v. + /// + /// @see gtc_packing + /// @see float unpackHalf1x16(uint16 const& v) + /// @see vec2 unpackHalf2x16(uint32 const& v) + /// @see GLSL unpackHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec4 unpackHalf4x16(uint64 p); + + /// Returns an unsigned integer obtained by converting the components of a four-component signed integer vector + /// to the 10-10-10-2-bit signed integer representation found in the OpenGL Specification, + /// and then packing these four values into a 32-bit unsigned integer. + /// The first vector component specifies the 10 least-significant bits of the result; + /// the forth component specifies the 2 most-significant bits. + /// + /// @see gtc_packing + /// @see uint32 packI3x10_1x2(uvec4 const& v) + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see ivec4 unpackI3x10_1x2(uint32 const& p) + GLM_FUNC_DECL uint32 packI3x10_1x2(ivec4 const& v); + + /// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit signed integers. + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see vec4 unpackSnorm3x10_1x2(uint32 const& p); + /// @see uvec4 unpackI3x10_1x2(uint32 const& p); + GLM_FUNC_DECL ivec4 unpackI3x10_1x2(uint32 p); + + /// Returns an unsigned integer obtained by converting the components of a four-component unsigned integer vector + /// to the 10-10-10-2-bit unsigned integer representation found in the OpenGL Specification, + /// and then packing these four values into a 32-bit unsigned integer. + /// The first vector component specifies the 10 least-significant bits of the result; + /// the forth component specifies the 2 most-significant bits. + /// + /// @see gtc_packing + /// @see uint32 packI3x10_1x2(ivec4 const& v) + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see ivec4 unpackU3x10_1x2(uint32 const& p) + GLM_FUNC_DECL uint32 packU3x10_1x2(uvec4 const& v); + + /// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit unsigned integers. + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see vec4 unpackSnorm3x10_1x2(uint32 const& p); + /// @see uvec4 unpackI3x10_1x2(uint32 const& p); + GLM_FUNC_DECL uvec4 unpackU3x10_1x2(uint32 p); + + /// First, converts the first three components of the normalized floating-point value v into 10-bit signed integer values. + /// Then, converts the forth component of the normalized floating-point value v into 2-bit signed integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm3x10_1x2(xyz): round(clamp(c, -1, +1) * 511.0) + /// packSnorm3x10_1x2(w): round(clamp(c, -1, +1) * 1.0) + /// + /// The first vector component specifies the 10 least-significant bits of the result; + /// the forth component specifies the 2 most-significant bits. + /// + /// @see gtc_packing + /// @see vec4 unpackSnorm3x10_1x2(uint32 const& p) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see uint32 packI3x10_1x2(ivec4 const& v) + GLM_FUNC_DECL uint32 packSnorm3x10_1x2(vec4 const& v); + + /// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm3x10_1x2(xyz): clamp(f / 511.0, -1, +1) + /// unpackSnorm3x10_1x2(w): clamp(f / 511.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see vec4 unpackUnorm3x10_1x2(uint32 const& p)) + /// @see uvec4 unpackI3x10_1x2(uint32 const& p) + /// @see uvec4 unpackU3x10_1x2(uint32 const& p) + GLM_FUNC_DECL vec4 unpackSnorm3x10_1x2(uint32 p); + + /// First, converts the first three components of the normalized floating-point value v into 10-bit unsigned integer values. + /// Then, converts the forth component of the normalized floating-point value v into 2-bit signed uninteger values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm3x10_1x2(xyz): round(clamp(c, 0, +1) * 1023.0) + /// packUnorm3x10_1x2(w): round(clamp(c, 0, +1) * 3.0) + /// + /// The first vector component specifies the 10 least-significant bits of the result; + /// the forth component specifies the 2 most-significant bits. + /// + /// @see gtc_packing + /// @see vec4 unpackUnorm3x10_1x2(uint32 const& p) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see uint32 packI3x10_1x2(ivec4 const& v) + GLM_FUNC_DECL uint32 packUnorm3x10_1x2(vec4 const& v); + + /// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm3x10_1x2(xyz): clamp(f / 1023.0, 0, +1) + /// unpackSnorm3x10_1x2(w): clamp(f / 3.0, 0, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see vec4 unpackInorm3x10_1x2(uint32 const& p)) + /// @see uvec4 unpackI3x10_1x2(uint32 const& p) + /// @see uvec4 unpackU3x10_1x2(uint32 const& p) + GLM_FUNC_DECL vec4 unpackUnorm3x10_1x2(uint32 p); + + /// First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values. + /// Then, converts the third component of the normalized floating-point value v into a 10-bit signless floating-point value. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The first vector component specifies the 11 least-significant bits of the result; + /// the last component specifies the 10 most-significant bits. + /// + /// @see gtc_packing + /// @see vec3 unpackF2x11_1x10(uint32 const& p) + GLM_FUNC_DECL uint32 packF2x11_1x10(vec3 const& v); + + /// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . + /// Then, each component is converted to a normalized floating-point value to generate the returned three-component vector. + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see gtc_packing + /// @see uint32 packF2x11_1x10(vec3 const& v) + GLM_FUNC_DECL vec3 unpackF2x11_1x10(uint32 p); + + + /// First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values. + /// Then, converts the third component of the normalized floating-point value v into a 10-bit signless floating-point value. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The first vector component specifies the 11 least-significant bits of the result; + /// the last component specifies the 10 most-significant bits. + /// + /// packF3x9_E1x5 allows encoding into RGBE / RGB9E5 format + /// + /// @see gtc_packing + /// @see vec3 unpackF3x9_E1x5(uint32 const& p) + GLM_FUNC_DECL uint32 packF3x9_E1x5(vec3 const& v); + + /// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . + /// Then, each component is converted to a normalized floating-point value to generate the returned three-component vector. + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// unpackF3x9_E1x5 allows decoding RGBE / RGB9E5 data + /// + /// @see gtc_packing + /// @see uint32 packF3x9_E1x5(vec3 const& v) + GLM_FUNC_DECL vec3 unpackF3x9_E1x5(uint32 p); + + /// Returns an unsigned integer vector obtained by converting the components of a floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification. + /// The first vector component specifies the 16 least-significant bits of the result; + /// the forth component specifies the 16 most-significant bits. + /// + /// @see gtc_packing + /// @see vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& p) + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + template + GLM_FUNC_DECL vec<4, T, Q> packRGBM(vec<3, T, Q> const& rgb); + + /// Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values. + /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// the forth component is obtained from the 16 most-significant bits of v. + /// + /// @see gtc_packing + /// @see vec<4, T, Q> packRGBM(vec<3, float, Q> const& v) + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + template + GLM_FUNC_DECL vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& rgbm); + + /// Returns an unsigned integer vector obtained by converting the components of a floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification. + /// The first vector component specifies the 16 least-significant bits of the result; + /// the forth component specifies the 16 most-significant bits. + /// + /// @see gtc_packing + /// @see vec unpackHalf(vec const& p) + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + template + GLM_FUNC_DECL vec packHalf(vec const& v); + + /// Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values. + /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// the forth component is obtained from the 16 most-significant bits of v. + /// + /// @see gtc_packing + /// @see vec packHalf(vec const& v) + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + template + GLM_FUNC_DECL vec unpackHalf(vec const& p); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec unpackUnorm(vec const& p); + template + GLM_FUNC_DECL vec packUnorm(vec const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see vec packUnorm(vec const& v) + template + GLM_FUNC_DECL vec unpackUnorm(vec const& v); + + /// Convert each component of the normalized floating-point vector into signed integer values. + /// + /// @see gtc_packing + /// @see vec unpackSnorm(vec const& p); + template + GLM_FUNC_DECL vec packSnorm(vec const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see vec packSnorm(vec const& v) + template + GLM_FUNC_DECL vec unpackSnorm(vec const& v); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec2 unpackUnorm2x4(uint8 p) + GLM_FUNC_DECL uint8 packUnorm2x4(vec2 const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see uint8 packUnorm2x4(vec2 const& v) + GLM_FUNC_DECL vec2 unpackUnorm2x4(uint8 p); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec4 unpackUnorm4x4(uint16 p) + GLM_FUNC_DECL uint16 packUnorm4x4(vec4 const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see uint16 packUnorm4x4(vec4 const& v) + GLM_FUNC_DECL vec4 unpackUnorm4x4(uint16 p); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec3 unpackUnorm1x5_1x6_1x5(uint16 p) + GLM_FUNC_DECL uint16 packUnorm1x5_1x6_1x5(vec3 const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see uint16 packUnorm1x5_1x6_1x5(vec3 const& v) + GLM_FUNC_DECL vec3 unpackUnorm1x5_1x6_1x5(uint16 p); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec4 unpackUnorm3x5_1x1(uint16 p) + GLM_FUNC_DECL uint16 packUnorm3x5_1x1(vec4 const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see uint16 packUnorm3x5_1x1(vec4 const& v) + GLM_FUNC_DECL vec4 unpackUnorm3x5_1x1(uint16 p); + + /// Convert each component of the normalized floating-point vector into unsigned integer values. + /// + /// @see gtc_packing + /// @see vec3 unpackUnorm2x3_1x2(uint8 p) + GLM_FUNC_DECL uint8 packUnorm2x3_1x2(vec3 const& v); + + /// Convert a packed integer to a normalized floating-point vector. + /// + /// @see gtc_packing + /// @see uint8 packUnorm2x3_1x2(vec3 const& v) + GLM_FUNC_DECL vec3 unpackUnorm2x3_1x2(uint8 p); + + + + /// Convert each component from an integer vector into a packed integer. + /// + /// @see gtc_packing + /// @see i8vec2 unpackInt2x8(int16 p) + GLM_FUNC_DECL int16 packInt2x8(i8vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int16 packInt2x8(i8vec2 const& v) + GLM_FUNC_DECL i8vec2 unpackInt2x8(int16 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u8vec2 unpackInt2x8(uint16 p) + GLM_FUNC_DECL uint16 packUint2x8(u8vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint16 packInt2x8(u8vec2 const& v) + GLM_FUNC_DECL u8vec2 unpackUint2x8(uint16 p); + + /// Convert each component from an integer vector into a packed integer. + /// + /// @see gtc_packing + /// @see i8vec4 unpackInt4x8(int32 p) + GLM_FUNC_DECL int32 packInt4x8(i8vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int32 packInt2x8(i8vec4 const& v) + GLM_FUNC_DECL i8vec4 unpackInt4x8(int32 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u8vec4 unpackUint4x8(uint32 p) + GLM_FUNC_DECL uint32 packUint4x8(u8vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint32 packUint4x8(u8vec2 const& v) + GLM_FUNC_DECL u8vec4 unpackUint4x8(uint32 p); + + /// Convert each component from an integer vector into a packed integer. + /// + /// @see gtc_packing + /// @see i16vec2 unpackInt2x16(int p) + GLM_FUNC_DECL int packInt2x16(i16vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int packInt2x16(i16vec2 const& v) + GLM_FUNC_DECL i16vec2 unpackInt2x16(int p); + + /// Convert each component from an integer vector into a packed integer. + /// + /// @see gtc_packing + /// @see i16vec4 unpackInt4x16(int64 p) + GLM_FUNC_DECL int64 packInt4x16(i16vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int64 packInt4x16(i16vec4 const& v) + GLM_FUNC_DECL i16vec4 unpackInt4x16(int64 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u16vec2 unpackUint2x16(uint p) + GLM_FUNC_DECL uint packUint2x16(u16vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint packUint2x16(u16vec2 const& v) + GLM_FUNC_DECL u16vec2 unpackUint2x16(uint p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u16vec4 unpackUint4x16(uint64 p) + GLM_FUNC_DECL uint64 packUint4x16(u16vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint64 packUint4x16(u16vec4 const& v) + GLM_FUNC_DECL u16vec4 unpackUint4x16(uint64 p); + + /// Convert each component from an integer vector into a packed integer. + /// + /// @see gtc_packing + /// @see i32vec2 unpackInt2x32(int p) + GLM_FUNC_DECL int64 packInt2x32(i32vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int packInt2x16(i32vec2 const& v) + GLM_FUNC_DECL i32vec2 unpackInt2x32(int64 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u32vec2 unpackUint2x32(int p) + GLM_FUNC_DECL uint64 packUint2x32(u32vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int packUint2x16(u32vec2 const& v) + GLM_FUNC_DECL u32vec2 unpackUint2x32(uint64 p); + + /// @} +}// namespace glm + +#include "packing.inl" diff --git a/dep/glm/gtc/packing.inl b/dep/glm/gtc/packing.inl new file mode 100644 index 0000000..8c906e1 --- /dev/null +++ b/dep/glm/gtc/packing.inl @@ -0,0 +1,938 @@ +/// @ref gtc_packing + +#include "../ext/scalar_relational.hpp" +#include "../ext/vector_relational.hpp" +#include "../common.hpp" +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../detail/type_half.hpp" +#include +#include + +namespace glm{ +namespace detail +{ + GLM_FUNC_QUALIFIER glm::uint16 float2half(glm::uint32 f) + { + // 10 bits => EE EEEFFFFF + // 11 bits => EEE EEFFFFFF + // Half bits => SEEEEEFF FFFFFFFF + // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF + + // 0x00007c00 => 00000000 00000000 01111100 00000000 + // 0x000003ff => 00000000 00000000 00000011 11111111 + // 0x38000000 => 00111000 00000000 00000000 00000000 + // 0x7f800000 => 01111111 10000000 00000000 00000000 + // 0x00008000 => 00000000 00000000 10000000 00000000 + return + ((f >> 16) & 0x8000) | // sign + ((((f & 0x7f800000) - 0x38000000) >> 13) & 0x7c00) | // exponential + ((f >> 13) & 0x03ff); // Mantissa + } + + GLM_FUNC_QUALIFIER glm::uint32 float2packed11(glm::uint32 f) + { + // 10 bits => EE EEEFFFFF + // 11 bits => EEE EEFFFFFF + // Half bits => SEEEEEFF FFFFFFFF + // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF + + // 0x000007c0 => 00000000 00000000 00000111 11000000 + // 0x00007c00 => 00000000 00000000 01111100 00000000 + // 0x000003ff => 00000000 00000000 00000011 11111111 + // 0x38000000 => 00111000 00000000 00000000 00000000 + // 0x7f800000 => 01111111 10000000 00000000 00000000 + // 0x00008000 => 00000000 00000000 10000000 00000000 + return + ((((f & 0x7f800000) - 0x38000000) >> 17) & 0x07c0) | // exponential + ((f >> 17) & 0x003f); // Mantissa + } + + GLM_FUNC_QUALIFIER glm::uint32 packed11ToFloat(glm::uint32 p) + { + // 10 bits => EE EEEFFFFF + // 11 bits => EEE EEFFFFFF + // Half bits => SEEEEEFF FFFFFFFF + // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF + + // 0x000007c0 => 00000000 00000000 00000111 11000000 + // 0x00007c00 => 00000000 00000000 01111100 00000000 + // 0x000003ff => 00000000 00000000 00000011 11111111 + // 0x38000000 => 00111000 00000000 00000000 00000000 + // 0x7f800000 => 01111111 10000000 00000000 00000000 + // 0x00008000 => 00000000 00000000 10000000 00000000 + return + ((((p & 0x07c0) << 17) + 0x38000000) & 0x7f800000) | // exponential + ((p & 0x003f) << 17); // Mantissa + } + + GLM_FUNC_QUALIFIER glm::uint32 float2packed10(glm::uint32 f) + { + // 10 bits => EE EEEFFFFF + // 11 bits => EEE EEFFFFFF + // Half bits => SEEEEEFF FFFFFFFF + // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF + + // 0x0000001F => 00000000 00000000 00000000 00011111 + // 0x0000003F => 00000000 00000000 00000000 00111111 + // 0x000003E0 => 00000000 00000000 00000011 11100000 + // 0x000007C0 => 00000000 00000000 00000111 11000000 + // 0x00007C00 => 00000000 00000000 01111100 00000000 + // 0x000003FF => 00000000 00000000 00000011 11111111 + // 0x38000000 => 00111000 00000000 00000000 00000000 + // 0x7f800000 => 01111111 10000000 00000000 00000000 + // 0x00008000 => 00000000 00000000 10000000 00000000 + return + ((((f & 0x7f800000) - 0x38000000) >> 18) & 0x03E0) | // exponential + ((f >> 18) & 0x001f); // Mantissa + } + + GLM_FUNC_QUALIFIER glm::uint32 packed10ToFloat(glm::uint32 p) + { + // 10 bits => EE EEEFFFFF + // 11 bits => EEE EEFFFFFF + // Half bits => SEEEEEFF FFFFFFFF + // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF + + // 0x0000001F => 00000000 00000000 00000000 00011111 + // 0x0000003F => 00000000 00000000 00000000 00111111 + // 0x000003E0 => 00000000 00000000 00000011 11100000 + // 0x000007C0 => 00000000 00000000 00000111 11000000 + // 0x00007C00 => 00000000 00000000 01111100 00000000 + // 0x000003FF => 00000000 00000000 00000011 11111111 + // 0x38000000 => 00111000 00000000 00000000 00000000 + // 0x7f800000 => 01111111 10000000 00000000 00000000 + // 0x00008000 => 00000000 00000000 10000000 00000000 + return + ((((p & 0x03E0) << 18) + 0x38000000) & 0x7f800000) | // exponential + ((p & 0x001f) << 18); // Mantissa + } + + GLM_FUNC_QUALIFIER glm::uint half2float(glm::uint h) + { + return ((h & 0x8000) << 16) | ((( h & 0x7c00) + 0x1C000) << 13) | ((h & 0x03FF) << 13); + } + + GLM_FUNC_QUALIFIER glm::uint floatTo11bit(float x) + { + if(x == 0.0f) + return 0u; + else if(glm::isnan(x)) + return ~0u; + else if(glm::isinf(x)) + return 0x1Fu << 6u; + + uint Pack = 0u; + memcpy(&Pack, &x, sizeof(Pack)); + return float2packed11(Pack); + } + + GLM_FUNC_QUALIFIER float packed11bitToFloat(glm::uint x) + { + if(x == 0) + return 0.0f; + else if(x == ((1 << 11) - 1)) + return ~0;//NaN + else if(x == (0x1f << 6)) + return ~0;//Inf + + uint Result = packed11ToFloat(x); + + float Temp = 0; + memcpy(&Temp, &Result, sizeof(Temp)); + return Temp; + } + + GLM_FUNC_QUALIFIER glm::uint floatTo10bit(float x) + { + if(x == 0.0f) + return 0u; + else if(glm::isnan(x)) + return ~0u; + else if(glm::isinf(x)) + return 0x1Fu << 5u; + + uint Pack = 0; + memcpy(&Pack, &x, sizeof(Pack)); + return float2packed10(Pack); + } + + GLM_FUNC_QUALIFIER float packed10bitToFloat(glm::uint x) + { + if(x == 0) + return 0.0f; + else if(x == ((1 << 10) - 1)) + return ~0;//NaN + else if(x == (0x1f << 5)) + return ~0;//Inf + + uint Result = packed10ToFloat(x); + + float Temp = 0; + memcpy(&Temp, &Result, sizeof(Temp)); + return Temp; + } + +// GLM_FUNC_QUALIFIER glm::uint f11_f11_f10(float x, float y, float z) +// { +// return ((floatTo11bit(x) & ((1 << 11) - 1)) << 0) | ((floatTo11bit(y) & ((1 << 11) - 1)) << 11) | ((floatTo10bit(z) & ((1 << 10) - 1)) << 22); +// } + + union u3u3u2 + { + struct + { + uint x : 3; + uint y : 3; + uint z : 2; + } data; + uint8 pack; + }; + + union u4u4 + { + struct + { + uint x : 4; + uint y : 4; + } data; + uint8 pack; + }; + + union u4u4u4u4 + { + struct + { + uint x : 4; + uint y : 4; + uint z : 4; + uint w : 4; + } data; + uint16 pack; + }; + + union u5u6u5 + { + struct + { + uint x : 5; + uint y : 6; + uint z : 5; + } data; + uint16 pack; + }; + + union u5u5u5u1 + { + struct + { + uint x : 5; + uint y : 5; + uint z : 5; + uint w : 1; + } data; + uint16 pack; + }; + + union u10u10u10u2 + { + struct + { + uint x : 10; + uint y : 10; + uint z : 10; + uint w : 2; + } data; + uint32 pack; + }; + + union i10i10i10i2 + { + struct + { + int x : 10; + int y : 10; + int z : 10; + int w : 2; + } data; + uint32 pack; + }; + + union u9u9u9e5 + { + struct + { + uint x : 9; + uint y : 9; + uint z : 9; + uint w : 5; + } data; + uint32 pack; + }; + + template + struct compute_half + {}; + + template + struct compute_half<1, Q> + { + GLM_FUNC_QUALIFIER static vec<1, uint16, Q> pack(vec<1, float, Q> const& v) + { + int16 const Unpack(detail::toFloat16(v.x)); + u16vec1 Packed; + memcpy(&Packed, &Unpack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER static vec<1, float, Q> unpack(vec<1, uint16, Q> const& v) + { + i16vec1 Unpack; + memcpy(&Unpack, &v, sizeof(Unpack)); + return vec<1, float, Q>(detail::toFloat32(v.x)); + } + }; + + template + struct compute_half<2, Q> + { + GLM_FUNC_QUALIFIER static vec<2, uint16, Q> pack(vec<2, float, Q> const& v) + { + vec<2, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y)); + u16vec2 Packed; + memcpy(&Packed, &Unpack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER static vec<2, float, Q> unpack(vec<2, uint16, Q> const& v) + { + i16vec2 Unpack; + memcpy(&Unpack, &v, sizeof(Unpack)); + return vec<2, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y)); + } + }; + + template + struct compute_half<3, Q> + { + GLM_FUNC_QUALIFIER static vec<3, uint16, Q> pack(vec<3, float, Q> const& v) + { + vec<3, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z)); + u16vec3 Packed; + memcpy(&Packed, &Unpack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER static vec<3, float, Q> unpack(vec<3, uint16, Q> const& v) + { + i16vec3 Unpack; + memcpy(&Unpack, &v, sizeof(Unpack)); + return vec<3, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z)); + } + }; + + template + struct compute_half<4, Q> + { + GLM_FUNC_QUALIFIER static vec<4, uint16, Q> pack(vec<4, float, Q> const& v) + { + vec<4, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z), detail::toFloat16(v.w)); + u16vec4 Packed; + memcpy(&Packed, &Unpack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER static vec<4, float, Q> unpack(vec<4, uint16, Q> const& v) + { + i16vec4 Unpack; + memcpy(&Unpack, &v, sizeof(Unpack)); + return vec<4, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z), detail::toFloat32(v.w)); + } + }; +}//namespace detail + + GLM_FUNC_QUALIFIER uint8 packUnorm1x8(float v) + { + return static_cast(round(clamp(v, 0.0f, 1.0f) * 255.0f)); + } + + GLM_FUNC_QUALIFIER float unpackUnorm1x8(uint8 p) + { + float const Unpack(p); + return Unpack * static_cast(0.0039215686274509803921568627451); // 1 / 255 + } + + GLM_FUNC_QUALIFIER uint16 packUnorm2x8(vec2 const& v) + { + u8vec2 const Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f)); + + uint16 Unpack = 0; + memcpy(&Unpack, &Topack, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER vec2 unpackUnorm2x8(uint16 p) + { + u8vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return vec2(Unpack) * float(0.0039215686274509803921568627451); // 1 / 255 + } + + GLM_FUNC_QUALIFIER uint8 packSnorm1x8(float v) + { + int8 const Topack(static_cast(round(clamp(v ,-1.0f, 1.0f) * 127.0f))); + uint8 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER float unpackSnorm1x8(uint8 p) + { + int8 Unpack = 0; + memcpy(&Unpack, &p, sizeof(Unpack)); + return clamp( + static_cast(Unpack) * 0.00787401574803149606299212598425f, // 1.0f / 127.0f + -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint16 packSnorm2x8(vec2 const& v) + { + i8vec2 const Topack(round(clamp(v, -1.0f, 1.0f) * 127.0f)); + uint16 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER vec2 unpackSnorm2x8(uint16 p) + { + i8vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return clamp( + vec2(Unpack) * 0.00787401574803149606299212598425f, // 1.0f / 127.0f + -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint16 packUnorm1x16(float s) + { + return static_cast(round(clamp(s, 0.0f, 1.0f) * 65535.0f)); + } + + GLM_FUNC_QUALIFIER float unpackUnorm1x16(uint16 p) + { + float const Unpack(p); + return Unpack * 1.5259021896696421759365224689097e-5f; // 1.0 / 65535.0 + } + + GLM_FUNC_QUALIFIER uint64 packUnorm4x16(vec4 const& v) + { + u16vec4 const Topack(round(clamp(v , 0.0f, 1.0f) * 65535.0f)); + uint64 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER vec4 unpackUnorm4x16(uint64 p) + { + u16vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return vec4(Unpack) * 1.5259021896696421759365224689097e-5f; // 1.0 / 65535.0 + } + + GLM_FUNC_QUALIFIER uint16 packSnorm1x16(float v) + { + int16 const Topack = static_cast(round(clamp(v ,-1.0f, 1.0f) * 32767.0f)); + uint16 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER float unpackSnorm1x16(uint16 p) + { + int16 Unpack = 0; + memcpy(&Unpack, &p, sizeof(Unpack)); + return clamp( + static_cast(Unpack) * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f, + -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint64 packSnorm4x16(vec4 const& v) + { + i16vec4 const Topack(round(clamp(v ,-1.0f, 1.0f) * 32767.0f)); + uint64 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER vec4 unpackSnorm4x16(uint64 p) + { + i16vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return clamp( + vec4(Unpack) * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f, + -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint16 packHalf1x16(float v) + { + int16 const Topack(detail::toFloat16(v)); + uint16 Packed = 0; + memcpy(&Packed, &Topack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER float unpackHalf1x16(uint16 v) + { + int16 Unpack = 0; + memcpy(&Unpack, &v, sizeof(Unpack)); + return detail::toFloat32(Unpack); + } + + GLM_FUNC_QUALIFIER uint64 packHalf4x16(glm::vec4 const& v) + { + i16vec4 const Unpack( + detail::toFloat16(v.x), + detail::toFloat16(v.y), + detail::toFloat16(v.z), + detail::toFloat16(v.w)); + uint64 Packed = 0; + memcpy(&Packed, &Unpack, sizeof(Packed)); + return Packed; + } + + GLM_FUNC_QUALIFIER glm::vec4 unpackHalf4x16(uint64 v) + { + i16vec4 Unpack; + memcpy(&Unpack, &v, sizeof(Unpack)); + return vec4( + detail::toFloat32(Unpack.x), + detail::toFloat32(Unpack.y), + detail::toFloat32(Unpack.z), + detail::toFloat32(Unpack.w)); + } + + GLM_FUNC_QUALIFIER uint32 packI3x10_1x2(ivec4 const& v) + { + detail::i10i10i10i2 Result; + Result.data.x = v.x; + Result.data.y = v.y; + Result.data.z = v.z; + Result.data.w = v.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER ivec4 unpackI3x10_1x2(uint32 v) + { + detail::i10i10i10i2 Unpack; + Unpack.pack = v; + return ivec4( + Unpack.data.x, + Unpack.data.y, + Unpack.data.z, + Unpack.data.w); + } + + GLM_FUNC_QUALIFIER uint32 packU3x10_1x2(uvec4 const& v) + { + detail::u10u10u10u2 Result; + Result.data.x = v.x; + Result.data.y = v.y; + Result.data.z = v.z; + Result.data.w = v.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER uvec4 unpackU3x10_1x2(uint32 v) + { + detail::u10u10u10u2 Unpack; + Unpack.pack = v; + return uvec4( + Unpack.data.x, + Unpack.data.y, + Unpack.data.z, + Unpack.data.w); + } + + GLM_FUNC_QUALIFIER uint32 packSnorm3x10_1x2(vec4 const& v) + { + ivec4 const Pack(round(clamp(v,-1.0f, 1.0f) * vec4(511.f, 511.f, 511.f, 1.f))); + + detail::i10i10i10i2 Result; + Result.data.x = Pack.x; + Result.data.y = Pack.y; + Result.data.z = Pack.z; + Result.data.w = Pack.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec4 unpackSnorm3x10_1x2(uint32 v) + { + detail::i10i10i10i2 Unpack; + Unpack.pack = v; + + vec4 const Result(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w); + + return clamp(Result * vec4(1.f / 511.f, 1.f / 511.f, 1.f / 511.f, 1.f), -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER uint32 packUnorm3x10_1x2(vec4 const& v) + { + uvec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec4(1023.f, 1023.f, 1023.f, 3.f))); + + detail::u10u10u10u2 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + Result.data.z = Unpack.z; + Result.data.w = Unpack.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec4 unpackUnorm3x10_1x2(uint32 v) + { + vec4 const ScaleFactors(1.0f / 1023.f, 1.0f / 1023.f, 1.0f / 1023.f, 1.0f / 3.f); + + detail::u10u10u10u2 Unpack; + Unpack.pack = v; + return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactors; + } + + GLM_FUNC_QUALIFIER uint32 packF2x11_1x10(vec3 const& v) + { + return + ((detail::floatTo11bit(v.x) & ((1 << 11) - 1)) << 0) | + ((detail::floatTo11bit(v.y) & ((1 << 11) - 1)) << 11) | + ((detail::floatTo10bit(v.z) & ((1 << 10) - 1)) << 22); + } + + GLM_FUNC_QUALIFIER vec3 unpackF2x11_1x10(uint32 v) + { + return vec3( + detail::packed11bitToFloat(v >> 0), + detail::packed11bitToFloat(v >> 11), + detail::packed10bitToFloat(v >> 22)); + } + + GLM_FUNC_QUALIFIER uint32 packF3x9_E1x5(vec3 const& v) + { + float const SharedExpMax = (pow(2.0f, 9.0f - 1.0f) / pow(2.0f, 9.0f)) * pow(2.0f, 31.f - 15.f); + vec3 const Color = clamp(v, 0.0f, SharedExpMax); + float const MaxColor = max(Color.x, max(Color.y, Color.z)); + + float const ExpSharedP = max(-15.f - 1.f, floor(log2(MaxColor))) + 1.0f + 15.f; + float const MaxShared = floor(MaxColor / pow(2.0f, (ExpSharedP - 15.f - 9.f)) + 0.5f); + float const ExpShared = equal(MaxShared, pow(2.0f, 9.0f), epsilon()) ? ExpSharedP + 1.0f : ExpSharedP; + + uvec3 const ColorComp(floor(Color / pow(2.f, (ExpShared - 15.f - 9.f)) + 0.5f)); + + detail::u9u9u9e5 Unpack; + Unpack.data.x = ColorComp.x; + Unpack.data.y = ColorComp.y; + Unpack.data.z = ColorComp.z; + Unpack.data.w = uint(ExpShared); + return Unpack.pack; + } + + GLM_FUNC_QUALIFIER vec3 unpackF3x9_E1x5(uint32 v) + { + detail::u9u9u9e5 Unpack; + Unpack.pack = v; + + return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * pow(2.0f, Unpack.data.w - 15.f - 9.f); + } + + // Based on Brian Karis http://graphicrants.blogspot.fr/2009/04/rgbm-color-encoding.html + template + GLM_FUNC_QUALIFIER vec<4, T, Q> packRGBM(vec<3, T, Q> const& rgb) + { + vec<3, T, Q> const Color(rgb * static_cast(1.0 / 6.0)); + T Alpha = clamp(max(max(Color.x, Color.y), max(Color.z, static_cast(1e-6))), static_cast(0), static_cast(1)); + Alpha = ceil(Alpha * static_cast(255.0)) / static_cast(255.0); + return vec<4, T, Q>(Color / Alpha, Alpha); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& rgbm) + { + return vec<3, T, Q>(rgbm.x, rgbm.y, rgbm.z) * rgbm.w * static_cast(6); + } + + template + GLM_FUNC_QUALIFIER vec packHalf(vec const& v) + { + return detail::compute_half::pack(v); + } + + template + GLM_FUNC_QUALIFIER vec unpackHalf(vec const& v) + { + return detail::compute_half::unpack(v); + } + + template + GLM_FUNC_QUALIFIER vec packUnorm(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "uintType must be an integer type"); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "floatType must be a floating point type"); + + return vec(round(clamp(v, static_cast(0), static_cast(1)) * static_cast(std::numeric_limits::max()))); + } + + template + GLM_FUNC_QUALIFIER vec unpackUnorm(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "uintType must be an integer type"); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "floatType must be a floating point type"); + + return vec(v) * (static_cast(1) / static_cast(std::numeric_limits::max())); + } + + template + GLM_FUNC_QUALIFIER vec packSnorm(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "uintType must be an integer type"); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "floatType must be a floating point type"); + + return vec(round(clamp(v , static_cast(-1), static_cast(1)) * static_cast(std::numeric_limits::max()))); + } + + template + GLM_FUNC_QUALIFIER vec unpackSnorm(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "uintType must be an integer type"); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "floatType must be a floating point type"); + + return clamp(vec(v) * (static_cast(1) / static_cast(std::numeric_limits::max())), static_cast(-1), static_cast(1)); + } + + GLM_FUNC_QUALIFIER uint8 packUnorm2x4(vec2 const& v) + { + u32vec2 const Unpack(round(clamp(v, 0.0f, 1.0f) * 15.0f)); + detail::u4u4 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec2 unpackUnorm2x4(uint8 v) + { + float const ScaleFactor(1.f / 15.f); + detail::u4u4 Unpack; + Unpack.pack = v; + return vec2(Unpack.data.x, Unpack.data.y) * ScaleFactor; + } + + GLM_FUNC_QUALIFIER uint16 packUnorm4x4(vec4 const& v) + { + u32vec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * 15.0f)); + detail::u4u4u4u4 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + Result.data.z = Unpack.z; + Result.data.w = Unpack.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec4 unpackUnorm4x4(uint16 v) + { + float const ScaleFactor(1.f / 15.f); + detail::u4u4u4u4 Unpack; + Unpack.pack = v; + return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactor; + } + + GLM_FUNC_QUALIFIER uint16 packUnorm1x5_1x6_1x5(vec3 const& v) + { + u32vec3 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec3(31.f, 63.f, 31.f))); + detail::u5u6u5 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + Result.data.z = Unpack.z; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec3 unpackUnorm1x5_1x6_1x5(uint16 v) + { + vec3 const ScaleFactor(1.f / 31.f, 1.f / 63.f, 1.f / 31.f); + detail::u5u6u5 Unpack; + Unpack.pack = v; + return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * ScaleFactor; + } + + GLM_FUNC_QUALIFIER uint16 packUnorm3x5_1x1(vec4 const& v) + { + u32vec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec4(31.f, 31.f, 31.f, 1.f))); + detail::u5u5u5u1 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + Result.data.z = Unpack.z; + Result.data.w = Unpack.w; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec4 unpackUnorm3x5_1x1(uint16 v) + { + vec4 const ScaleFactor(1.f / 31.f, 1.f / 31.f, 1.f / 31.f, 1.f); + detail::u5u5u5u1 Unpack; + Unpack.pack = v; + return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactor; + } + + GLM_FUNC_QUALIFIER uint8 packUnorm2x3_1x2(vec3 const& v) + { + u32vec3 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec3(7.f, 7.f, 3.f))); + detail::u3u3u2 Result; + Result.data.x = Unpack.x; + Result.data.y = Unpack.y; + Result.data.z = Unpack.z; + return Result.pack; + } + + GLM_FUNC_QUALIFIER vec3 unpackUnorm2x3_1x2(uint8 v) + { + vec3 const ScaleFactor(1.f / 7.f, 1.f / 7.f, 1.f / 3.f); + detail::u3u3u2 Unpack; + Unpack.pack = v; + return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * ScaleFactor; + } + + GLM_FUNC_QUALIFIER int16 packInt2x8(i8vec2 const& v) + { + int16 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i8vec2 unpackInt2x8(int16 p) + { + i8vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint16 packUint2x8(u8vec2 const& v) + { + uint16 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u8vec2 unpackUint2x8(uint16 p) + { + u8vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int32 packInt4x8(i8vec4 const& v) + { + int32 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i8vec4 unpackInt4x8(int32 p) + { + i8vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint32 packUint4x8(u8vec4 const& v) + { + uint32 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u8vec4 unpackUint4x8(uint32 p) + { + u8vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int packInt2x16(i16vec2 const& v) + { + int Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i16vec2 unpackInt2x16(int p) + { + i16vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int64 packInt4x16(i16vec4 const& v) + { + int64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i16vec4 unpackInt4x16(int64 p) + { + i16vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint packUint2x16(u16vec2 const& v) + { + uint Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u16vec2 unpackUint2x16(uint p) + { + u16vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint64 packUint4x16(u16vec4 const& v) + { + uint64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u16vec4 unpackUint4x16(uint64 p) + { + u16vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int64 packInt2x32(i32vec2 const& v) + { + int64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i32vec2 unpackInt2x32(int64 p) + { + i32vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint64 packUint2x32(u32vec2 const& v) + { + uint64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u32vec2 unpackUint2x32(uint64 p) + { + u32vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } +}//namespace glm + diff --git a/dep/glm/gtc/quaternion.hpp b/dep/glm/gtc/quaternion.hpp new file mode 100644 index 0000000..359e072 --- /dev/null +++ b/dep/glm/gtc/quaternion.hpp @@ -0,0 +1,173 @@ +/// @ref gtc_quaternion +/// @file glm/gtc/quaternion.hpp +/// +/// @see core (dependence) +/// @see gtc_constants (dependence) +/// +/// @defgroup gtc_quaternion GLM_GTC_quaternion +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines a templated quaternion type and several quaternion operations. + +#pragma once + +// Dependency: +#include "../gtc/constants.hpp" +#include "../gtc/matrix_transform.hpp" +#include "../ext/vector_relational.hpp" +#include "../ext/quaternion_common.hpp" +#include "../ext/quaternion_float.hpp" +#include "../ext/quaternion_float_precision.hpp" +#include "../ext/quaternion_double.hpp" +#include "../ext/quaternion_double_precision.hpp" +#include "../ext/quaternion_relational.hpp" +#include "../ext/quaternion_geometric.hpp" +#include "../ext/quaternion_trigonometric.hpp" +#include "../ext/quaternion_transform.hpp" +#include "../detail/type_mat3x3.hpp" +#include "../detail/type_mat4x4.hpp" +#include "../detail/type_vec3.hpp" +#include "../detail/type_vec4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_quaternion extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_quaternion + /// @{ + + /// Returns euler angles, pitch as x, yaw as y, roll as z. + /// The result is expressed in radians. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL vec<3, T, Q> eulerAngles(qua const& x); + + /// Returns roll value of euler angles expressed in radians. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL T roll(qua const& x); + + /// Returns pitch value of euler angles expressed in radians. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL T pitch(qua const& x); + + /// Returns yaw value of euler angles expressed in radians. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL T yaw(qua const& x); + + /// Converts a quaternion to a 3 * 3 matrix. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL mat<3, 3, T, Q> mat3_cast(qua const& x); + + /// Converts a quaternion to a 4 * 4 matrix. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL mat<4, 4, T, Q> mat4_cast(qua const& x); + + /// Converts a pure rotation 3 * 3 matrix to a quaternion. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL qua quat_cast(mat<3, 3, T, Q> const& x); + + /// Converts a pure rotation 4 * 4 matrix to a quaternion. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL qua quat_cast(mat<4, 4, T, Q> const& x); + + /// Returns the component-wise comparison result of x < y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_relational + template + GLM_FUNC_DECL vec<4, bool, Q> lessThan(qua const& x, qua const& y); + + /// Returns the component-wise comparison of result x <= y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_relational + template + GLM_FUNC_DECL vec<4, bool, Q> lessThanEqual(qua const& x, qua const& y); + + /// Returns the component-wise comparison of result x > y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_relational + template + GLM_FUNC_DECL vec<4, bool, Q> greaterThan(qua const& x, qua const& y); + + /// Returns the component-wise comparison of result x >= y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_quaternion_relational + template + GLM_FUNC_DECL vec<4, bool, Q> greaterThanEqual(qua const& x, qua const& y); + + /// Build a look at quaternion based on the default handedness. + /// + /// @param direction Desired forward direction. Needs to be normalized. + /// @param up Up vector, how the camera is oriented. Typically (0, 1, 0). + template + GLM_FUNC_DECL qua quatLookAt( + vec<3, T, Q> const& direction, + vec<3, T, Q> const& up); + + /// Build a right-handed look at quaternion. + /// + /// @param direction Desired forward direction onto which the -z-axis gets mapped. Needs to be normalized. + /// @param up Up vector, how the camera is oriented. Typically (0, 1, 0). + template + GLM_FUNC_DECL qua quatLookAtRH( + vec<3, T, Q> const& direction, + vec<3, T, Q> const& up); + + /// Build a left-handed look at quaternion. + /// + /// @param direction Desired forward direction onto which the +z-axis gets mapped. Needs to be normalized. + /// @param up Up vector, how the camera is oriented. Typically (0, 1, 0). + template + GLM_FUNC_DECL qua quatLookAtLH( + vec<3, T, Q> const& direction, + vec<3, T, Q> const& up); + /// @} +} //namespace glm + +#include "quaternion.inl" diff --git a/dep/glm/gtc/quaternion.inl b/dep/glm/gtc/quaternion.inl new file mode 100644 index 0000000..06f9f02 --- /dev/null +++ b/dep/glm/gtc/quaternion.inl @@ -0,0 +1,202 @@ +#include "../trigonometric.hpp" +#include "../geometric.hpp" +#include "../exponential.hpp" +#include "epsilon.hpp" +#include + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> eulerAngles(qua const& x) + { + return vec<3, T, Q>(pitch(x), yaw(x), roll(x)); + } + + template + GLM_FUNC_QUALIFIER T roll(qua const& q) + { + return static_cast(atan(static_cast(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z)); + } + + template + GLM_FUNC_QUALIFIER T pitch(qua const& q) + { + //return T(atan(T(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z)); + T const y = static_cast(2) * (q.y * q.z + q.w * q.x); + T const x = q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z; + + if(all(equal(vec<2, T, Q>(x, y), vec<2, T, Q>(0), epsilon()))) //avoid atan2(0,0) - handle singularity - Matiis + return static_cast(static_cast(2) * atan(q.x, q.w)); + + return static_cast(atan(y, x)); + } + + template + GLM_FUNC_QUALIFIER T yaw(qua const& q) + { + return asin(clamp(static_cast(-2) * (q.x * q.z - q.w * q.y), static_cast(-1), static_cast(1))); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat3_cast(qua const& q) + { + mat<3, 3, T, Q> Result(T(1)); + T qxx(q.x * q.x); + T qyy(q.y * q.y); + T qzz(q.z * q.z); + T qxz(q.x * q.z); + T qxy(q.x * q.y); + T qyz(q.y * q.z); + T qwx(q.w * q.x); + T qwy(q.w * q.y); + T qwz(q.w * q.z); + + Result[0][0] = T(1) - T(2) * (qyy + qzz); + Result[0][1] = T(2) * (qxy + qwz); + Result[0][2] = T(2) * (qxz - qwy); + + Result[1][0] = T(2) * (qxy - qwz); + Result[1][1] = T(1) - T(2) * (qxx + qzz); + Result[1][2] = T(2) * (qyz + qwx); + + Result[2][0] = T(2) * (qxz + qwy); + Result[2][1] = T(2) * (qyz - qwx); + Result[2][2] = T(1) - T(2) * (qxx + qyy); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat4_cast(qua const& q) + { + return mat<4, 4, T, Q>(mat3_cast(q)); + } + + template + GLM_FUNC_QUALIFIER qua quat_cast(mat<3, 3, T, Q> const& m) + { + T fourXSquaredMinus1 = m[0][0] - m[1][1] - m[2][2]; + T fourYSquaredMinus1 = m[1][1] - m[0][0] - m[2][2]; + T fourZSquaredMinus1 = m[2][2] - m[0][0] - m[1][1]; + T fourWSquaredMinus1 = m[0][0] + m[1][1] + m[2][2]; + + int biggestIndex = 0; + T fourBiggestSquaredMinus1 = fourWSquaredMinus1; + if(fourXSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourXSquaredMinus1; + biggestIndex = 1; + } + if(fourYSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourYSquaredMinus1; + biggestIndex = 2; + } + if(fourZSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourZSquaredMinus1; + biggestIndex = 3; + } + + T biggestVal = sqrt(fourBiggestSquaredMinus1 + static_cast(1)) * static_cast(0.5); + T mult = static_cast(0.25) / biggestVal; + + switch(biggestIndex) + { + case 0: + return qua(biggestVal, (m[1][2] - m[2][1]) * mult, (m[2][0] - m[0][2]) * mult, (m[0][1] - m[1][0]) * mult); + case 1: + return qua((m[1][2] - m[2][1]) * mult, biggestVal, (m[0][1] + m[1][0]) * mult, (m[2][0] + m[0][2]) * mult); + case 2: + return qua((m[2][0] - m[0][2]) * mult, (m[0][1] + m[1][0]) * mult, biggestVal, (m[1][2] + m[2][1]) * mult); + case 3: + return qua((m[0][1] - m[1][0]) * mult, (m[2][0] + m[0][2]) * mult, (m[1][2] + m[2][1]) * mult, biggestVal); + default: // Silence a -Wswitch-default warning in GCC. Should never actually get here. Assert is just for sanity. + assert(false); + return qua(1, 0, 0, 0); + } + } + + template + GLM_FUNC_QUALIFIER qua quat_cast(mat<4, 4, T, Q> const& m4) + { + return quat_cast(mat<3, 3, T, Q>(m4)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThan(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] < y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThanEqual(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] <= y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThan(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] > y[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThanEqual(qua const& x, qua const& y) + { + vec<4, bool, Q> Result; + for(length_t i = 0; i < x.length(); ++i) + Result[i] = x[i] >= y[i]; + return Result; + } + + + template + GLM_FUNC_QUALIFIER qua quatLookAt(vec<3, T, Q> const& direction, vec<3, T, Q> const& up) + { +# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT + return quatLookAtLH(direction, up); +# else + return quatLookAtRH(direction, up); +# endif + } + + template + GLM_FUNC_QUALIFIER qua quatLookAtRH(vec<3, T, Q> const& direction, vec<3, T, Q> const& up) + { + mat<3, 3, T, Q> Result; + + Result[2] = -direction; + vec<3, T, Q> const& Right = cross(up, Result[2]); + Result[0] = Right * inversesqrt(max(static_cast(0.00001), dot(Right, Right))); + Result[1] = cross(Result[2], Result[0]); + + return quat_cast(Result); + } + + template + GLM_FUNC_QUALIFIER qua quatLookAtLH(vec<3, T, Q> const& direction, vec<3, T, Q> const& up) + { + mat<3, 3, T, Q> Result; + + Result[2] = direction; + vec<3, T, Q> const& Right = cross(up, Result[2]); + Result[0] = Right * inversesqrt(max(static_cast(0.00001), dot(Right, Right))); + Result[1] = cross(Result[2], Result[0]); + + return quat_cast(Result); + } +}//namespace glm + +#if GLM_CONFIG_SIMD == GLM_ENABLE +# include "quaternion_simd.inl" +#endif + diff --git a/dep/glm/gtc/quaternion_simd.inl b/dep/glm/gtc/quaternion_simd.inl new file mode 100644 index 0000000..e69de29 diff --git a/dep/glm/gtc/random.hpp b/dep/glm/gtc/random.hpp new file mode 100644 index 0000000..9a85958 --- /dev/null +++ b/dep/glm/gtc/random.hpp @@ -0,0 +1,82 @@ +/// @ref gtc_random +/// @file glm/gtc/random.hpp +/// +/// @see core (dependence) +/// @see gtx_random (extended) +/// +/// @defgroup gtc_random GLM_GTC_random +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Generate random number from various distribution methods. + +#pragma once + +// Dependency: +#include "../ext/scalar_int_sized.hpp" +#include "../ext/scalar_uint_sized.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_random extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_random + /// @{ + + /// Generate random numbers in the interval [Min, Max], according a linear distribution + /// + /// @param Min Minimum value included in the sampling + /// @param Max Maximum value included in the sampling + /// @tparam genType Value type. Currently supported: float or double scalars. + /// @see gtc_random + template + GLM_FUNC_DECL genType linearRand(genType Min, genType Max); + + /// Generate random numbers in the interval [Min, Max], according a linear distribution + /// + /// @param Min Minimum value included in the sampling + /// @param Max Maximum value included in the sampling + /// @tparam T Value type. Currently supported: float or double. + /// + /// @see gtc_random + template + GLM_FUNC_DECL vec linearRand(vec const& Min, vec const& Max); + + /// Generate random numbers in the interval [Min, Max], according a gaussian distribution + /// + /// @see gtc_random + template + GLM_FUNC_DECL genType gaussRand(genType Mean, genType Deviation); + + /// Generate a random 2D vector which coordinates are regulary distributed on a circle of a given radius + /// + /// @see gtc_random + template + GLM_FUNC_DECL vec<2, T, defaultp> circularRand(T Radius); + + /// Generate a random 3D vector which coordinates are regulary distributed on a sphere of a given radius + /// + /// @see gtc_random + template + GLM_FUNC_DECL vec<3, T, defaultp> sphericalRand(T Radius); + + /// Generate a random 2D vector which coordinates are regulary distributed within the area of a disk of a given radius + /// + /// @see gtc_random + template + GLM_FUNC_DECL vec<2, T, defaultp> diskRand(T Radius); + + /// Generate a random 3D vector which coordinates are regulary distributed within the volume of a ball of a given radius + /// + /// @see gtc_random + template + GLM_FUNC_DECL vec<3, T, defaultp> ballRand(T Radius); + + /// @} +}//namespace glm + +#include "random.inl" diff --git a/dep/glm/gtc/random.inl b/dep/glm/gtc/random.inl new file mode 100644 index 0000000..7048509 --- /dev/null +++ b/dep/glm/gtc/random.inl @@ -0,0 +1,303 @@ +#include "../geometric.hpp" +#include "../exponential.hpp" +#include "../trigonometric.hpp" +#include "../detail/type_vec1.hpp" +#include +#include +#include +#include + +namespace glm{ +namespace detail +{ + template + struct compute_rand + { + GLM_FUNC_QUALIFIER static vec call(); + }; + + template + struct compute_rand<1, uint8, P> + { + GLM_FUNC_QUALIFIER static vec<1, uint8, P> call() + { + return vec<1, uint8, P>( + std::rand() % std::numeric_limits::max()); + } + }; + + template + struct compute_rand<2, uint8, P> + { + GLM_FUNC_QUALIFIER static vec<2, uint8, P> call() + { + return vec<2, uint8, P>( + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max()); + } + }; + + template + struct compute_rand<3, uint8, P> + { + GLM_FUNC_QUALIFIER static vec<3, uint8, P> call() + { + return vec<3, uint8, P>( + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max()); + } + }; + + template + struct compute_rand<4, uint8, P> + { + GLM_FUNC_QUALIFIER static vec<4, uint8, P> call() + { + return vec<4, uint8, P>( + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max(), + std::rand() % std::numeric_limits::max()); + } + }; + + template + struct compute_rand + { + GLM_FUNC_QUALIFIER static vec call() + { + return + (vec(compute_rand::call()) << static_cast(8)) | + (vec(compute_rand::call()) << static_cast(0)); + } + }; + + template + struct compute_rand + { + GLM_FUNC_QUALIFIER static vec call() + { + return + (vec(compute_rand::call()) << static_cast(16)) | + (vec(compute_rand::call()) << static_cast(0)); + } + }; + + template + struct compute_rand + { + GLM_FUNC_QUALIFIER static vec call() + { + return + (vec(compute_rand::call()) << static_cast(32)) | + (vec(compute_rand::call()) << static_cast(0)); + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max); + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (vec(compute_rand::call() % vec(Max + static_cast(1) - Min))) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (compute_rand::call() % (Max + static_cast(1) - Min)) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (vec(compute_rand::call() % vec(Max + static_cast(1) - Min))) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (compute_rand::call() % (Max + static_cast(1) - Min)) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (vec(compute_rand::call() % vec(Max + static_cast(1) - Min))) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (compute_rand::call() % (Max + static_cast(1) - Min)) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (vec(compute_rand::call() % vec(Max + static_cast(1) - Min))) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return (compute_rand::call() % (Max + static_cast(1) - Min)) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return vec(compute_rand::call()) / static_cast(std::numeric_limits::max()) * (Max - Min) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return vec(compute_rand::call()) / static_cast(std::numeric_limits::max()) * (Max - Min) + Min; + } + }; + + template + struct compute_linearRand + { + GLM_FUNC_QUALIFIER static vec call(vec const& Min, vec const& Max) + { + return vec(compute_rand::call()) / static_cast(std::numeric_limits::max()) * (Max - Min) + Min; + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER genType linearRand(genType Min, genType Max) + { + return detail::compute_linearRand<1, genType, highp>::call( + vec<1, genType, highp>(Min), + vec<1, genType, highp>(Max)).x; + } + + template + GLM_FUNC_QUALIFIER vec linearRand(vec const& Min, vec const& Max) + { + return detail::compute_linearRand::call(Min, Max); + } + + template + GLM_FUNC_QUALIFIER genType gaussRand(genType Mean, genType Deviation) + { + genType w, x1, x2; + + do + { + x1 = linearRand(genType(-1), genType(1)); + x2 = linearRand(genType(-1), genType(1)); + + w = x1 * x1 + x2 * x2; + } while(w > genType(1)); + + return static_cast(x2 * Deviation * Deviation * sqrt((genType(-2) * log(w)) / w) + Mean); + } + + template + GLM_FUNC_QUALIFIER vec gaussRand(vec const& Mean, vec const& Deviation) + { + return detail::functor2::call(gaussRand, Mean, Deviation); + } + + template + GLM_FUNC_QUALIFIER vec<2, T, defaultp> diskRand(T Radius) + { + assert(Radius > static_cast(0)); + + vec<2, T, defaultp> Result(T(0)); + T LenRadius(T(0)); + + do + { + Result = linearRand( + vec<2, T, defaultp>(-Radius), + vec<2, T, defaultp>(Radius)); + LenRadius = length(Result); + } + while(LenRadius > Radius); + + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, defaultp> ballRand(T Radius) + { + assert(Radius > static_cast(0)); + + vec<3, T, defaultp> Result(T(0)); + T LenRadius(T(0)); + + do + { + Result = linearRand( + vec<3, T, defaultp>(-Radius), + vec<3, T, defaultp>(Radius)); + LenRadius = length(Result); + } + while(LenRadius > Radius); + + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, defaultp> circularRand(T Radius) + { + assert(Radius > static_cast(0)); + + T a = linearRand(T(0), static_cast(6.283185307179586476925286766559)); + return vec<2, T, defaultp>(glm::cos(a), glm::sin(a)) * Radius; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, defaultp> sphericalRand(T Radius) + { + assert(Radius > static_cast(0)); + + T theta = linearRand(T(0), T(6.283185307179586476925286766559f)); + T phi = std::acos(linearRand(T(-1.0f), T(1.0f))); + + T x = std::sin(phi) * std::cos(theta); + T y = std::sin(phi) * std::sin(theta); + T z = std::cos(phi); + + return vec<3, T, defaultp>(x, y, z) * Radius; + } +}//namespace glm diff --git a/dep/glm/gtc/reciprocal.hpp b/dep/glm/gtc/reciprocal.hpp new file mode 100644 index 0000000..c7d1330 --- /dev/null +++ b/dep/glm/gtc/reciprocal.hpp @@ -0,0 +1,135 @@ +/// @ref gtc_reciprocal +/// @file glm/gtc/reciprocal.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_reciprocal GLM_GTC_reciprocal +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Define secant, cosecant and cotangent functions. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_reciprocal extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_reciprocal + /// @{ + + /// Secant function. + /// hypotenuse / adjacent or 1 / cos(x) + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType sec(genType angle); + + /// Cosecant function. + /// hypotenuse / opposite or 1 / sin(x) + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType csc(genType angle); + + /// Cotangent function. + /// adjacent / opposite or 1 / tan(x) + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType cot(genType angle); + + /// Inverse secant function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType asec(genType x); + + /// Inverse cosecant function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType acsc(genType x); + + /// Inverse cotangent function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType acot(genType x); + + /// Secant hyperbolic function. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType sech(genType angle); + + /// Cosecant hyperbolic function. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType csch(genType angle); + + /// Cotangent hyperbolic function. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType coth(genType angle); + + /// Inverse secant hyperbolic function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType asech(genType x); + + /// Inverse cosecant hyperbolic function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType acsch(genType x); + + /// Inverse cotangent hyperbolic function. + /// + /// @return Return an angle expressed in radians. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtc_reciprocal + template + GLM_FUNC_DECL genType acoth(genType x); + + /// @} +}//namespace glm + +#include "reciprocal.inl" diff --git a/dep/glm/gtc/reciprocal.inl b/dep/glm/gtc/reciprocal.inl new file mode 100644 index 0000000..d88729e --- /dev/null +++ b/dep/glm/gtc/reciprocal.inl @@ -0,0 +1,191 @@ +/// @ref gtc_reciprocal + +#include "../trigonometric.hpp" +#include + +namespace glm +{ + // sec + template + GLM_FUNC_QUALIFIER genType sec(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'sec' only accept floating-point values"); + return genType(1) / glm::cos(angle); + } + + template + GLM_FUNC_QUALIFIER vec sec(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'sec' only accept floating-point inputs"); + return detail::functor1::call(sec, x); + } + + // csc + template + GLM_FUNC_QUALIFIER genType csc(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'csc' only accept floating-point values"); + return genType(1) / glm::sin(angle); + } + + template + GLM_FUNC_QUALIFIER vec csc(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'csc' only accept floating-point inputs"); + return detail::functor1::call(csc, x); + } + + // cot + template + GLM_FUNC_QUALIFIER genType cot(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'cot' only accept floating-point values"); + + genType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0); + return glm::tan(pi_over_2 - angle); + } + + template + GLM_FUNC_QUALIFIER vec cot(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'cot' only accept floating-point inputs"); + return detail::functor1::call(cot, x); + } + + // asec + template + GLM_FUNC_QUALIFIER genType asec(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'asec' only accept floating-point values"); + return acos(genType(1) / x); + } + + template + GLM_FUNC_QUALIFIER vec asec(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'asec' only accept floating-point inputs"); + return detail::functor1::call(asec, x); + } + + // acsc + template + GLM_FUNC_QUALIFIER genType acsc(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acsc' only accept floating-point values"); + return asin(genType(1) / x); + } + + template + GLM_FUNC_QUALIFIER vec acsc(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acsc' only accept floating-point inputs"); + return detail::functor1::call(acsc, x); + } + + // acot + template + GLM_FUNC_QUALIFIER genType acot(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acot' only accept floating-point values"); + + genType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0); + return pi_over_2 - atan(x); + } + + template + GLM_FUNC_QUALIFIER vec acot(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acot' only accept floating-point inputs"); + return detail::functor1::call(acot, x); + } + + // sech + template + GLM_FUNC_QUALIFIER genType sech(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'sech' only accept floating-point values"); + return genType(1) / glm::cosh(angle); + } + + template + GLM_FUNC_QUALIFIER vec sech(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'sech' only accept floating-point inputs"); + return detail::functor1::call(sech, x); + } + + // csch + template + GLM_FUNC_QUALIFIER genType csch(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'csch' only accept floating-point values"); + return genType(1) / glm::sinh(angle); + } + + template + GLM_FUNC_QUALIFIER vec csch(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'csch' only accept floating-point inputs"); + return detail::functor1::call(csch, x); + } + + // coth + template + GLM_FUNC_QUALIFIER genType coth(genType angle) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'coth' only accept floating-point values"); + return glm::cosh(angle) / glm::sinh(angle); + } + + template + GLM_FUNC_QUALIFIER vec coth(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'coth' only accept floating-point inputs"); + return detail::functor1::call(coth, x); + } + + // asech + template + GLM_FUNC_QUALIFIER genType asech(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'asech' only accept floating-point values"); + return acosh(genType(1) / x); + } + + template + GLM_FUNC_QUALIFIER vec asech(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'asech' only accept floating-point inputs"); + return detail::functor1::call(asech, x); + } + + // acsch + template + GLM_FUNC_QUALIFIER genType acsch(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acsch' only accept floating-point values"); + return asinh(genType(1) / x); + } + + template + GLM_FUNC_QUALIFIER vec acsch(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acsch' only accept floating-point inputs"); + return detail::functor1::call(acsch, x); + } + + // acoth + template + GLM_FUNC_QUALIFIER genType acoth(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acoth' only accept floating-point values"); + return atanh(genType(1) / x); + } + + template + GLM_FUNC_QUALIFIER vec acoth(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'acoth' only accept floating-point inputs"); + return detail::functor1::call(acoth, x); + } +}//namespace glm diff --git a/dep/glm/gtc/round.hpp b/dep/glm/gtc/round.hpp new file mode 100644 index 0000000..56edbbc --- /dev/null +++ b/dep/glm/gtc/round.hpp @@ -0,0 +1,160 @@ +/// @ref gtc_round +/// @file glm/gtc/round.hpp +/// +/// @see core (dependence) +/// @see gtc_round (dependence) +/// +/// @defgroup gtc_round GLM_GTC_round +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Rounding value to specific boundings + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_vectorize.hpp" +#include "../vector_relational.hpp" +#include "../common.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_round extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_round + /// @{ + + /// Return the power of two number which value is just higher the input value, + /// round up to a power of two. + /// + /// @see gtc_round + template + GLM_FUNC_DECL genIUType ceilPowerOfTwo(genIUType v); + + /// Return the power of two number which value is just higher the input value, + /// round up to a power of two. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec ceilPowerOfTwo(vec const& v); + + /// Return the power of two number which value is just lower the input value, + /// round down to a power of two. + /// + /// @see gtc_round + template + GLM_FUNC_DECL genIUType floorPowerOfTwo(genIUType v); + + /// Return the power of two number which value is just lower the input value, + /// round down to a power of two. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec floorPowerOfTwo(vec const& v); + + /// Return the power of two number which value is the closet to the input value. + /// + /// @see gtc_round + template + GLM_FUNC_DECL genIUType roundPowerOfTwo(genIUType v); + + /// Return the power of two number which value is the closet to the input value. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec roundPowerOfTwo(vec const& v); + + /// Higher multiple number of Source. + /// + /// @tparam genType Floating-point or integer scalar or vector types. + /// + /// @param v Source value to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL genType ceilMultiple(genType v, genType Multiple); + + /// Higher multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec ceilMultiple(vec const& v, vec const& Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam genType Floating-point or integer scalar or vector types. + /// + /// @param v Source value to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL genType floorMultiple(genType v, genType Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec floorMultiple(vec const& v, vec const& Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam genType Floating-point or integer scalar or vector types. + /// + /// @param v Source value to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL genType roundMultiple(genType v, genType Multiple); + + /// Lower multiple number of Source. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function + /// @param Multiple Must be a null or positive value + /// + /// @see gtc_round + template + GLM_FUNC_DECL vec roundMultiple(vec const& v, vec const& Multiple); + + /// @} +} //namespace glm + +#include "round.inl" diff --git a/dep/glm/gtc/round.inl b/dep/glm/gtc/round.inl new file mode 100644 index 0000000..48411e4 --- /dev/null +++ b/dep/glm/gtc/round.inl @@ -0,0 +1,155 @@ +/// @ref gtc_round + +#include "../integer.hpp" +#include "../ext/vector_integer.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_roundMultiple {}; + + template<> + struct compute_roundMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if (Source >= genType(0)) + return Source - std::fmod(Source, Multiple); + else + { + genType Tmp = Source + genType(1); + return Tmp - std::fmod(Tmp, Multiple) - Multiple; + } + } + }; + + template<> + struct compute_roundMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if (Source >= genType(0)) + return Source - Source % Multiple; + else + { + genType Tmp = Source + genType(1); + return Tmp - Tmp % Multiple - Multiple; + } + } + }; + + template<> + struct compute_roundMultiple + { + template + GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) + { + if (Source >= genType(0)) + return Source - Source % Multiple; + else + { + genType Tmp = Source + genType(1); + return Tmp - Tmp % Multiple - Multiple; + } + } + }; +}//namespace detail + + ////////////////// + // ceilPowerOfTwo + + template + GLM_FUNC_QUALIFIER genType ceilPowerOfTwo(genType value) + { + return detail::compute_ceilPowerOfTwo<1, genType, defaultp, std::numeric_limits::is_signed>::call(vec<1, genType, defaultp>(value)).x; + } + + template + GLM_FUNC_QUALIFIER vec ceilPowerOfTwo(vec const& v) + { + return detail::compute_ceilPowerOfTwo::is_signed>::call(v); + } + + /////////////////// + // floorPowerOfTwo + + template + GLM_FUNC_QUALIFIER genType floorPowerOfTwo(genType value) + { + return isPowerOfTwo(value) ? value : static_cast(1) << findMSB(value); + } + + template + GLM_FUNC_QUALIFIER vec floorPowerOfTwo(vec const& v) + { + return detail::functor1::call(floorPowerOfTwo, v); + } + + /////////////////// + // roundPowerOfTwo + + template + GLM_FUNC_QUALIFIER genIUType roundPowerOfTwo(genIUType value) + { + if(isPowerOfTwo(value)) + return value; + + genIUType const prev = static_cast(1) << findMSB(value); + genIUType const next = prev << static_cast(1); + return (next - value) < (value - prev) ? next : prev; + } + + template + GLM_FUNC_QUALIFIER vec roundPowerOfTwo(vec const& v) + { + return detail::functor1::call(roundPowerOfTwo, v); + } + + ////////////////////// + // ceilMultiple + + template + GLM_FUNC_QUALIFIER genType ceilMultiple(genType Source, genType Multiple) + { + return detail::compute_ceilMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER vec ceilMultiple(vec const& Source, vec const& Multiple) + { + return detail::functor2::call(ceilMultiple, Source, Multiple); + } + + ////////////////////// + // floorMultiple + + template + GLM_FUNC_QUALIFIER genType floorMultiple(genType Source, genType Multiple) + { + return detail::compute_floorMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER vec floorMultiple(vec const& Source, vec const& Multiple) + { + return detail::functor2::call(floorMultiple, Source, Multiple); + } + + ////////////////////// + // roundMultiple + + template + GLM_FUNC_QUALIFIER genType roundMultiple(genType Source, genType Multiple) + { + return detail::compute_roundMultiple::is_iec559, std::numeric_limits::is_signed>::call(Source, Multiple); + } + + template + GLM_FUNC_QUALIFIER vec roundMultiple(vec const& Source, vec const& Multiple) + { + return detail::functor2::call(roundMultiple, Source, Multiple); + } +}//namespace glm diff --git a/dep/glm/gtc/type_aligned.hpp b/dep/glm/gtc/type_aligned.hpp new file mode 100644 index 0000000..5403abf --- /dev/null +++ b/dep/glm/gtc/type_aligned.hpp @@ -0,0 +1,1315 @@ +/// @ref gtc_type_aligned +/// @file glm/gtc/type_aligned.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_type_aligned GLM_GTC_type_aligned +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Aligned types allowing SIMD optimizations of vectors and matrices types + +#pragma once + +#if (GLM_CONFIG_ALIGNED_GENTYPES == GLM_DISABLE) +# error "GLM: Aligned gentypes require to enable C++ language extensions. Define GLM_FORCE_ALIGNED_GENTYPES before including GLM headers to use aligned types." +#endif + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_type_aligned extension included") +#endif + +#include "../mat4x4.hpp" +#include "../mat4x3.hpp" +#include "../mat4x2.hpp" +#include "../mat3x4.hpp" +#include "../mat3x3.hpp" +#include "../mat3x2.hpp" +#include "../mat2x4.hpp" +#include "../mat2x3.hpp" +#include "../mat2x2.hpp" +#include "../gtc/vec1.hpp" +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" + +namespace glm +{ + /// @addtogroup gtc_type_aligned + /// @{ + + // -- *vec1 -- + + /// 1 component vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, float, aligned_highp> aligned_highp_vec1; + + /// 1 component vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, float, aligned_mediump> aligned_mediump_vec1; + + /// 1 component vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, float, aligned_lowp> aligned_lowp_vec1; + + /// 1 component vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, double, aligned_highp> aligned_highp_dvec1; + + /// 1 component vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, double, aligned_mediump> aligned_mediump_dvec1; + + /// 1 component vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, double, aligned_lowp> aligned_lowp_dvec1; + + /// 1 component vector aligned in memory of signed integer numbers. + typedef vec<1, int, aligned_highp> aligned_highp_ivec1; + + /// 1 component vector aligned in memory of signed integer numbers. + typedef vec<1, int, aligned_mediump> aligned_mediump_ivec1; + + /// 1 component vector aligned in memory of signed integer numbers. + typedef vec<1, int, aligned_lowp> aligned_lowp_ivec1; + + /// 1 component vector aligned in memory of unsigned integer numbers. + typedef vec<1, uint, aligned_highp> aligned_highp_uvec1; + + /// 1 component vector aligned in memory of unsigned integer numbers. + typedef vec<1, uint, aligned_mediump> aligned_mediump_uvec1; + + /// 1 component vector aligned in memory of unsigned integer numbers. + typedef vec<1, uint, aligned_lowp> aligned_lowp_uvec1; + + /// 1 component vector aligned in memory of bool values. + typedef vec<1, bool, aligned_highp> aligned_highp_bvec1; + + /// 1 component vector aligned in memory of bool values. + typedef vec<1, bool, aligned_mediump> aligned_mediump_bvec1; + + /// 1 component vector aligned in memory of bool values. + typedef vec<1, bool, aligned_lowp> aligned_lowp_bvec1; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, float, packed_highp> packed_highp_vec1; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, float, packed_mediump> packed_mediump_vec1; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, float, packed_lowp> packed_lowp_vec1; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, double, packed_highp> packed_highp_dvec1; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, double, packed_mediump> packed_mediump_dvec1; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, double, packed_lowp> packed_lowp_dvec1; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef vec<1, int, packed_highp> packed_highp_ivec1; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef vec<1, int, packed_mediump> packed_mediump_ivec1; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef vec<1, int, packed_lowp> packed_lowp_ivec1; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef vec<1, uint, packed_highp> packed_highp_uvec1; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef vec<1, uint, packed_mediump> packed_mediump_uvec1; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef vec<1, uint, packed_lowp> packed_lowp_uvec1; + + /// 1 component vector tightly packed in memory of bool values. + typedef vec<1, bool, packed_highp> packed_highp_bvec1; + + /// 1 component vector tightly packed in memory of bool values. + typedef vec<1, bool, packed_mediump> packed_mediump_bvec1; + + /// 1 component vector tightly packed in memory of bool values. + typedef vec<1, bool, packed_lowp> packed_lowp_bvec1; + + // -- *vec2 -- + + /// 2 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, float, aligned_highp> aligned_highp_vec2; + + /// 2 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, float, aligned_mediump> aligned_mediump_vec2; + + /// 2 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, float, aligned_lowp> aligned_lowp_vec2; + + /// 2 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, double, aligned_highp> aligned_highp_dvec2; + + /// 2 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, double, aligned_mediump> aligned_mediump_dvec2; + + /// 2 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, double, aligned_lowp> aligned_lowp_dvec2; + + /// 2 components vector aligned in memory of signed integer numbers. + typedef vec<2, int, aligned_highp> aligned_highp_ivec2; + + /// 2 components vector aligned in memory of signed integer numbers. + typedef vec<2, int, aligned_mediump> aligned_mediump_ivec2; + + /// 2 components vector aligned in memory of signed integer numbers. + typedef vec<2, int, aligned_lowp> aligned_lowp_ivec2; + + /// 2 components vector aligned in memory of unsigned integer numbers. + typedef vec<2, uint, aligned_highp> aligned_highp_uvec2; + + /// 2 components vector aligned in memory of unsigned integer numbers. + typedef vec<2, uint, aligned_mediump> aligned_mediump_uvec2; + + /// 2 components vector aligned in memory of unsigned integer numbers. + typedef vec<2, uint, aligned_lowp> aligned_lowp_uvec2; + + /// 2 components vector aligned in memory of bool values. + typedef vec<2, bool, aligned_highp> aligned_highp_bvec2; + + /// 2 components vector aligned in memory of bool values. + typedef vec<2, bool, aligned_mediump> aligned_mediump_bvec2; + + /// 2 components vector aligned in memory of bool values. + typedef vec<2, bool, aligned_lowp> aligned_lowp_bvec2; + + /// 2 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, float, packed_highp> packed_highp_vec2; + + /// 2 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, float, packed_mediump> packed_mediump_vec2; + + /// 2 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, float, packed_lowp> packed_lowp_vec2; + + /// 2 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, double, packed_highp> packed_highp_dvec2; + + /// 2 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, double, packed_mediump> packed_mediump_dvec2; + + /// 2 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, double, packed_lowp> packed_lowp_dvec2; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef vec<2, int, packed_highp> packed_highp_ivec2; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef vec<2, int, packed_mediump> packed_mediump_ivec2; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef vec<2, int, packed_lowp> packed_lowp_ivec2; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<2, uint, packed_highp> packed_highp_uvec2; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<2, uint, packed_mediump> packed_mediump_uvec2; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<2, uint, packed_lowp> packed_lowp_uvec2; + + /// 2 components vector tightly packed in memory of bool values. + typedef vec<2, bool, packed_highp> packed_highp_bvec2; + + /// 2 components vector tightly packed in memory of bool values. + typedef vec<2, bool, packed_mediump> packed_mediump_bvec2; + + /// 2 components vector tightly packed in memory of bool values. + typedef vec<2, bool, packed_lowp> packed_lowp_bvec2; + + // -- *vec3 -- + + /// 3 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, float, aligned_highp> aligned_highp_vec3; + + /// 3 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, float, aligned_mediump> aligned_mediump_vec3; + + /// 3 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, float, aligned_lowp> aligned_lowp_vec3; + + /// 3 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, double, aligned_highp> aligned_highp_dvec3; + + /// 3 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, double, aligned_mediump> aligned_mediump_dvec3; + + /// 3 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, double, aligned_lowp> aligned_lowp_dvec3; + + /// 3 components vector aligned in memory of signed integer numbers. + typedef vec<3, int, aligned_highp> aligned_highp_ivec3; + + /// 3 components vector aligned in memory of signed integer numbers. + typedef vec<3, int, aligned_mediump> aligned_mediump_ivec3; + + /// 3 components vector aligned in memory of signed integer numbers. + typedef vec<3, int, aligned_lowp> aligned_lowp_ivec3; + + /// 3 components vector aligned in memory of unsigned integer numbers. + typedef vec<3, uint, aligned_highp> aligned_highp_uvec3; + + /// 3 components vector aligned in memory of unsigned integer numbers. + typedef vec<3, uint, aligned_mediump> aligned_mediump_uvec3; + + /// 3 components vector aligned in memory of unsigned integer numbers. + typedef vec<3, uint, aligned_lowp> aligned_lowp_uvec3; + + /// 3 components vector aligned in memory of bool values. + typedef vec<3, bool, aligned_highp> aligned_highp_bvec3; + + /// 3 components vector aligned in memory of bool values. + typedef vec<3, bool, aligned_mediump> aligned_mediump_bvec3; + + /// 3 components vector aligned in memory of bool values. + typedef vec<3, bool, aligned_lowp> aligned_lowp_bvec3; + + /// 3 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, float, packed_highp> packed_highp_vec3; + + /// 3 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, float, packed_mediump> packed_mediump_vec3; + + /// 3 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, float, packed_lowp> packed_lowp_vec3; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, double, packed_highp> packed_highp_dvec3; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, double, packed_mediump> packed_mediump_dvec3; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, double, packed_lowp> packed_lowp_dvec3; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef vec<3, int, packed_highp> packed_highp_ivec3; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef vec<3, int, packed_mediump> packed_mediump_ivec3; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef vec<3, int, packed_lowp> packed_lowp_ivec3; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<3, uint, packed_highp> packed_highp_uvec3; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<3, uint, packed_mediump> packed_mediump_uvec3; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<3, uint, packed_lowp> packed_lowp_uvec3; + + /// 3 components vector tightly packed in memory of bool values. + typedef vec<3, bool, packed_highp> packed_highp_bvec3; + + /// 3 components vector tightly packed in memory of bool values. + typedef vec<3, bool, packed_mediump> packed_mediump_bvec3; + + /// 3 components vector tightly packed in memory of bool values. + typedef vec<3, bool, packed_lowp> packed_lowp_bvec3; + + // -- *vec4 -- + + /// 4 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, float, aligned_highp> aligned_highp_vec4; + + /// 4 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, float, aligned_mediump> aligned_mediump_vec4; + + /// 4 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, float, aligned_lowp> aligned_lowp_vec4; + + /// 4 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, double, aligned_highp> aligned_highp_dvec4; + + /// 4 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, double, aligned_mediump> aligned_mediump_dvec4; + + /// 4 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, double, aligned_lowp> aligned_lowp_dvec4; + + /// 4 components vector aligned in memory of signed integer numbers. + typedef vec<4, int, aligned_highp> aligned_highp_ivec4; + + /// 4 components vector aligned in memory of signed integer numbers. + typedef vec<4, int, aligned_mediump> aligned_mediump_ivec4; + + /// 4 components vector aligned in memory of signed integer numbers. + typedef vec<4, int, aligned_lowp> aligned_lowp_ivec4; + + /// 4 components vector aligned in memory of unsigned integer numbers. + typedef vec<4, uint, aligned_highp> aligned_highp_uvec4; + + /// 4 components vector aligned in memory of unsigned integer numbers. + typedef vec<4, uint, aligned_mediump> aligned_mediump_uvec4; + + /// 4 components vector aligned in memory of unsigned integer numbers. + typedef vec<4, uint, aligned_lowp> aligned_lowp_uvec4; + + /// 4 components vector aligned in memory of bool values. + typedef vec<4, bool, aligned_highp> aligned_highp_bvec4; + + /// 4 components vector aligned in memory of bool values. + typedef vec<4, bool, aligned_mediump> aligned_mediump_bvec4; + + /// 4 components vector aligned in memory of bool values. + typedef vec<4, bool, aligned_lowp> aligned_lowp_bvec4; + + /// 4 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, float, packed_highp> packed_highp_vec4; + + /// 4 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, float, packed_mediump> packed_mediump_vec4; + + /// 4 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, float, packed_lowp> packed_lowp_vec4; + + /// 4 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, double, packed_highp> packed_highp_dvec4; + + /// 4 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, double, packed_mediump> packed_mediump_dvec4; + + /// 4 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, double, packed_lowp> packed_lowp_dvec4; + + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef vec<4, int, packed_highp> packed_highp_ivec4; + + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef vec<4, int, packed_mediump> packed_mediump_ivec4; + + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef vec<4, int, packed_lowp> packed_lowp_ivec4; + + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<4, uint, packed_highp> packed_highp_uvec4; + + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<4, uint, packed_mediump> packed_mediump_uvec4; + + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<4, uint, packed_lowp> packed_lowp_uvec4; + + /// 4 components vector tightly packed in memory of bool values. + typedef vec<4, bool, packed_highp> packed_highp_bvec4; + + /// 4 components vector tightly packed in memory of bool values. + typedef vec<4, bool, packed_mediump> packed_mediump_bvec4; + + /// 4 components vector tightly packed in memory of bool values. + typedef vec<4, bool, packed_lowp> packed_lowp_bvec4; + + // -- *mat2 -- + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_highp> aligned_highp_mat2; + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_mediump> aligned_mediump_mat2; + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_lowp> aligned_lowp_mat2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_highp> aligned_highp_dmat2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_mediump> aligned_mediump_dmat2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_lowp> aligned_lowp_dmat2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_highp> packed_highp_mat2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_mediump> packed_mediump_mat2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_lowp> packed_lowp_mat2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_highp> packed_highp_dmat2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_mediump> packed_mediump_dmat2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_lowp> packed_lowp_dmat2; + + // -- *mat3 -- + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_highp> aligned_highp_mat3; + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_mediump> aligned_mediump_mat3; + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_lowp> aligned_lowp_mat3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_highp> aligned_highp_dmat3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_mediump> aligned_mediump_dmat3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_lowp> aligned_lowp_dmat3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_highp> packed_highp_mat3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_mediump> packed_mediump_mat3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_lowp> packed_lowp_mat3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_highp> packed_highp_dmat3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_mediump> packed_mediump_dmat3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_lowp> packed_lowp_dmat3; + + // -- *mat4 -- + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_highp> aligned_highp_mat4; + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_mediump> aligned_mediump_mat4; + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_lowp> aligned_lowp_mat4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_highp> aligned_highp_dmat4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_mediump> aligned_mediump_dmat4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_lowp> aligned_lowp_dmat4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_highp> packed_highp_mat4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_mediump> packed_mediump_mat4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_lowp> packed_lowp_mat4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_highp> packed_highp_dmat4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_mediump> packed_mediump_dmat4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_lowp> packed_lowp_dmat4; + + // -- *mat2x2 -- + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_highp> aligned_highp_mat2x2; + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_mediump> aligned_mediump_mat2x2; + + /// 2 by 2 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, float, aligned_lowp> aligned_lowp_mat2x2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_highp> aligned_highp_dmat2x2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_mediump> aligned_mediump_dmat2x2; + + /// 2 by 2 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, double, aligned_lowp> aligned_lowp_dmat2x2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_highp> packed_highp_mat2x2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_mediump> packed_mediump_mat2x2; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, float, packed_lowp> packed_lowp_mat2x2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_highp> packed_highp_dmat2x2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_mediump> packed_mediump_dmat2x2; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 2, double, packed_lowp> packed_lowp_dmat2x2; + + // -- *mat2x3 -- + + /// 2 by 3 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 3, float, aligned_highp> aligned_highp_mat2x3; + + /// 2 by 3 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 3, float, aligned_mediump> aligned_mediump_mat2x3; + + /// 2 by 3 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 3, float, aligned_lowp> aligned_lowp_mat2x3; + + /// 2 by 3 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 3, double, aligned_highp> aligned_highp_dmat2x3; + + /// 2 by 3 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 3, double, aligned_mediump> aligned_mediump_dmat2x3; + + /// 2 by 3 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 3, double, aligned_lowp> aligned_lowp_dmat2x3; + + /// 2 by 3 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 3, float, packed_highp> packed_highp_mat2x3; + + /// 2 by 3 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 3, float, packed_mediump> packed_mediump_mat2x3; + + /// 2 by 3 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 3, float, packed_lowp> packed_lowp_mat2x3; + + /// 2 by 3 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 3, double, packed_highp> packed_highp_dmat2x3; + + /// 2 by 3 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 3, double, packed_mediump> packed_mediump_dmat2x3; + + /// 2 by 3 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 3, double, packed_lowp> packed_lowp_dmat2x3; + + // -- *mat2x4 -- + + /// 2 by 4 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 4, float, aligned_highp> aligned_highp_mat2x4; + + /// 2 by 4 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 4, float, aligned_mediump> aligned_mediump_mat2x4; + + /// 2 by 4 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 4, float, aligned_lowp> aligned_lowp_mat2x4; + + /// 2 by 4 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 4, double, aligned_highp> aligned_highp_dmat2x4; + + /// 2 by 4 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 4, double, aligned_mediump> aligned_mediump_dmat2x4; + + /// 2 by 4 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 4, double, aligned_lowp> aligned_lowp_dmat2x4; + + /// 2 by 4 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 4, float, packed_highp> packed_highp_mat2x4; + + /// 2 by 4 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 4, float, packed_mediump> packed_mediump_mat2x4; + + /// 2 by 4 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 4, float, packed_lowp> packed_lowp_mat2x4; + + /// 2 by 4 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<2, 4, double, packed_highp> packed_highp_dmat2x4; + + /// 2 by 4 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<2, 4, double, packed_mediump> packed_mediump_dmat2x4; + + /// 2 by 4 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<2, 4, double, packed_lowp> packed_lowp_dmat2x4; + + // -- *mat3x2 -- + + /// 3 by 2 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 2, float, aligned_highp> aligned_highp_mat3x2; + + /// 3 by 2 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 2, float, aligned_mediump> aligned_mediump_mat3x2; + + /// 3 by 2 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 2, float, aligned_lowp> aligned_lowp_mat3x2; + + /// 3 by 2 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 2, double, aligned_highp> aligned_highp_dmat3x2; + + /// 3 by 2 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 2, double, aligned_mediump> aligned_mediump_dmat3x2; + + /// 3 by 2 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 2, double, aligned_lowp> aligned_lowp_dmat3x2; + + /// 3 by 2 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 2, float, packed_highp> packed_highp_mat3x2; + + /// 3 by 2 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 2, float, packed_mediump> packed_mediump_mat3x2; + + /// 3 by 2 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 2, float, packed_lowp> packed_lowp_mat3x2; + + /// 3 by 2 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 2, double, packed_highp> packed_highp_dmat3x2; + + /// 3 by 2 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 2, double, packed_mediump> packed_mediump_dmat3x2; + + /// 3 by 2 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 2, double, packed_lowp> packed_lowp_dmat3x2; + + // -- *mat3x3 -- + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_highp> aligned_highp_mat3x3; + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_mediump> aligned_mediump_mat3x3; + + /// 3 by 3 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, float, aligned_lowp> aligned_lowp_mat3x3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_highp> aligned_highp_dmat3x3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_mediump> aligned_mediump_dmat3x3; + + /// 3 by 3 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, double, aligned_lowp> aligned_lowp_dmat3x3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_highp> packed_highp_mat3x3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_mediump> packed_mediump_mat3x3; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, float, packed_lowp> packed_lowp_mat3x3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_highp> packed_highp_dmat3x3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_mediump> packed_mediump_dmat3x3; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 3, double, packed_lowp> packed_lowp_dmat3x3; + + // -- *mat3x4 -- + + /// 3 by 4 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 4, float, aligned_highp> aligned_highp_mat3x4; + + /// 3 by 4 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 4, float, aligned_mediump> aligned_mediump_mat3x4; + + /// 3 by 4 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 4, float, aligned_lowp> aligned_lowp_mat3x4; + + /// 3 by 4 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 4, double, aligned_highp> aligned_highp_dmat3x4; + + /// 3 by 4 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 4, double, aligned_mediump> aligned_mediump_dmat3x4; + + /// 3 by 4 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 4, double, aligned_lowp> aligned_lowp_dmat3x4; + + /// 3 by 4 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 4, float, packed_highp> packed_highp_mat3x4; + + /// 3 by 4 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 4, float, packed_mediump> packed_mediump_mat3x4; + + /// 3 by 4 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 4, float, packed_lowp> packed_lowp_mat3x4; + + /// 3 by 4 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<3, 4, double, packed_highp> packed_highp_dmat3x4; + + /// 3 by 4 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<3, 4, double, packed_mediump> packed_mediump_dmat3x4; + + /// 3 by 4 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<3, 4, double, packed_lowp> packed_lowp_dmat3x4; + + // -- *mat4x2 -- + + /// 4 by 2 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 2, float, aligned_highp> aligned_highp_mat4x2; + + /// 4 by 2 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 2, float, aligned_mediump> aligned_mediump_mat4x2; + + /// 4 by 2 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 2, float, aligned_lowp> aligned_lowp_mat4x2; + + /// 4 by 2 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 2, double, aligned_highp> aligned_highp_dmat4x2; + + /// 4 by 2 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 2, double, aligned_mediump> aligned_mediump_dmat4x2; + + /// 4 by 2 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 2, double, aligned_lowp> aligned_lowp_dmat4x2; + + /// 4 by 2 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 2, float, packed_highp> packed_highp_mat4x2; + + /// 4 by 2 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 2, float, packed_mediump> packed_mediump_mat4x2; + + /// 4 by 2 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 2, float, packed_lowp> packed_lowp_mat4x2; + + /// 4 by 2 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 2, double, packed_highp> packed_highp_dmat4x2; + + /// 4 by 2 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 2, double, packed_mediump> packed_mediump_dmat4x2; + + /// 4 by 2 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 2, double, packed_lowp> packed_lowp_dmat4x2; + + // -- *mat4x3 -- + + /// 4 by 3 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 3, float, aligned_highp> aligned_highp_mat4x3; + + /// 4 by 3 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 3, float, aligned_mediump> aligned_mediump_mat4x3; + + /// 4 by 3 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 3, float, aligned_lowp> aligned_lowp_mat4x3; + + /// 4 by 3 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 3, double, aligned_highp> aligned_highp_dmat4x3; + + /// 4 by 3 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 3, double, aligned_mediump> aligned_mediump_dmat4x3; + + /// 4 by 3 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 3, double, aligned_lowp> aligned_lowp_dmat4x3; + + /// 4 by 3 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 3, float, packed_highp> packed_highp_mat4x3; + + /// 4 by 3 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 3, float, packed_mediump> packed_mediump_mat4x3; + + /// 4 by 3 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 3, float, packed_lowp> packed_lowp_mat4x3; + + /// 4 by 3 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 3, double, packed_highp> packed_highp_dmat4x3; + + /// 4 by 3 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 3, double, packed_mediump> packed_mediump_dmat4x3; + + /// 4 by 3 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 3, double, packed_lowp> packed_lowp_dmat4x3; + + // -- *mat4x4 -- + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_highp> aligned_highp_mat4x4; + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_mediump> aligned_mediump_mat4x4; + + /// 4 by 4 matrix aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, float, aligned_lowp> aligned_lowp_mat4x4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_highp> aligned_highp_dmat4x4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_mediump> aligned_mediump_dmat4x4; + + /// 4 by 4 matrix aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, double, aligned_lowp> aligned_lowp_dmat4x4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_highp> packed_highp_mat4x4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_mediump> packed_mediump_mat4x4; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, float, packed_lowp> packed_lowp_mat4x4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_highp> packed_highp_dmat4x4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_mediump> packed_mediump_dmat4x4; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef mat<4, 4, double, packed_lowp> packed_lowp_dmat4x4; + + // -- default -- + +#if(defined(GLM_PRECISION_LOWP_FLOAT)) + typedef aligned_lowp_vec1 aligned_vec1; + typedef aligned_lowp_vec2 aligned_vec2; + typedef aligned_lowp_vec3 aligned_vec3; + typedef aligned_lowp_vec4 aligned_vec4; + typedef packed_lowp_vec1 packed_vec1; + typedef packed_lowp_vec2 packed_vec2; + typedef packed_lowp_vec3 packed_vec3; + typedef packed_lowp_vec4 packed_vec4; + + typedef aligned_lowp_mat2 aligned_mat2; + typedef aligned_lowp_mat3 aligned_mat3; + typedef aligned_lowp_mat4 aligned_mat4; + typedef packed_lowp_mat2 packed_mat2; + typedef packed_lowp_mat3 packed_mat3; + typedef packed_lowp_mat4 packed_mat4; + + typedef aligned_lowp_mat2x2 aligned_mat2x2; + typedef aligned_lowp_mat2x3 aligned_mat2x3; + typedef aligned_lowp_mat2x4 aligned_mat2x4; + typedef aligned_lowp_mat3x2 aligned_mat3x2; + typedef aligned_lowp_mat3x3 aligned_mat3x3; + typedef aligned_lowp_mat3x4 aligned_mat3x4; + typedef aligned_lowp_mat4x2 aligned_mat4x2; + typedef aligned_lowp_mat4x3 aligned_mat4x3; + typedef aligned_lowp_mat4x4 aligned_mat4x4; + typedef packed_lowp_mat2x2 packed_mat2x2; + typedef packed_lowp_mat2x3 packed_mat2x3; + typedef packed_lowp_mat2x4 packed_mat2x4; + typedef packed_lowp_mat3x2 packed_mat3x2; + typedef packed_lowp_mat3x3 packed_mat3x3; + typedef packed_lowp_mat3x4 packed_mat3x4; + typedef packed_lowp_mat4x2 packed_mat4x2; + typedef packed_lowp_mat4x3 packed_mat4x3; + typedef packed_lowp_mat4x4 packed_mat4x4; +#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) + typedef aligned_mediump_vec1 aligned_vec1; + typedef aligned_mediump_vec2 aligned_vec2; + typedef aligned_mediump_vec3 aligned_vec3; + typedef aligned_mediump_vec4 aligned_vec4; + typedef packed_mediump_vec1 packed_vec1; + typedef packed_mediump_vec2 packed_vec2; + typedef packed_mediump_vec3 packed_vec3; + typedef packed_mediump_vec4 packed_vec4; + + typedef aligned_mediump_mat2 aligned_mat2; + typedef aligned_mediump_mat3 aligned_mat3; + typedef aligned_mediump_mat4 aligned_mat4; + typedef packed_mediump_mat2 packed_mat2; + typedef packed_mediump_mat3 packed_mat3; + typedef packed_mediump_mat4 packed_mat4; + + typedef aligned_mediump_mat2x2 aligned_mat2x2; + typedef aligned_mediump_mat2x3 aligned_mat2x3; + typedef aligned_mediump_mat2x4 aligned_mat2x4; + typedef aligned_mediump_mat3x2 aligned_mat3x2; + typedef aligned_mediump_mat3x3 aligned_mat3x3; + typedef aligned_mediump_mat3x4 aligned_mat3x4; + typedef aligned_mediump_mat4x2 aligned_mat4x2; + typedef aligned_mediump_mat4x3 aligned_mat4x3; + typedef aligned_mediump_mat4x4 aligned_mat4x4; + typedef packed_mediump_mat2x2 packed_mat2x2; + typedef packed_mediump_mat2x3 packed_mat2x3; + typedef packed_mediump_mat2x4 packed_mat2x4; + typedef packed_mediump_mat3x2 packed_mat3x2; + typedef packed_mediump_mat3x3 packed_mat3x3; + typedef packed_mediump_mat3x4 packed_mat3x4; + typedef packed_mediump_mat4x2 packed_mat4x2; + typedef packed_mediump_mat4x3 packed_mat4x3; + typedef packed_mediump_mat4x4 packed_mat4x4; +#else //defined(GLM_PRECISION_HIGHP_FLOAT) + /// 1 component vector aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_vec1 aligned_vec1; + + /// 2 components vector aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_vec2 aligned_vec2; + + /// 3 components vector aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_vec3 aligned_vec3; + + /// 4 components vector aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_vec4 aligned_vec4; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec1 packed_vec1; + + /// 2 components vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec2 packed_vec2; + + /// 3 components vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec3 packed_vec3; + + /// 4 components vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec4 packed_vec4; + + /// 2 by 2 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat2 aligned_mat2; + + /// 3 by 3 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat3 aligned_mat3; + + /// 4 by 4 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat4 aligned_mat4; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat2 packed_mat2; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat3 packed_mat3; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat4 packed_mat4; + + /// 2 by 2 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat2x2 aligned_mat2x2; + + /// 2 by 3 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat2x3 aligned_mat2x3; + + /// 2 by 4 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat2x4 aligned_mat2x4; + + /// 3 by 2 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat3x2 aligned_mat3x2; + + /// 3 by 3 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat3x3 aligned_mat3x3; + + /// 3 by 4 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat3x4 aligned_mat3x4; + + /// 4 by 2 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat4x2 aligned_mat4x2; + + /// 4 by 3 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat4x3 aligned_mat4x3; + + /// 4 by 4 matrix tightly aligned in memory of single-precision floating-point numbers. + typedef aligned_highp_mat4x4 aligned_mat4x4; + + /// 2 by 2 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat2x2 packed_mat2x2; + + /// 2 by 3 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat2x3 packed_mat2x3; + + /// 2 by 4 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat2x4 packed_mat2x4; + + /// 3 by 2 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat3x2 packed_mat3x2; + + /// 3 by 3 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat3x3 packed_mat3x3; + + /// 3 by 4 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat3x4 packed_mat3x4; + + /// 4 by 2 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat4x2 packed_mat4x2; + + /// 4 by 3 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat4x3 packed_mat4x3; + + /// 4 by 4 matrix tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_mat4x4 packed_mat4x4; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_LOWP_DOUBLE)) + typedef aligned_lowp_dvec1 aligned_dvec1; + typedef aligned_lowp_dvec2 aligned_dvec2; + typedef aligned_lowp_dvec3 aligned_dvec3; + typedef aligned_lowp_dvec4 aligned_dvec4; + typedef packed_lowp_dvec1 packed_dvec1; + typedef packed_lowp_dvec2 packed_dvec2; + typedef packed_lowp_dvec3 packed_dvec3; + typedef packed_lowp_dvec4 packed_dvec4; + + typedef aligned_lowp_dmat2 aligned_dmat2; + typedef aligned_lowp_dmat3 aligned_dmat3; + typedef aligned_lowp_dmat4 aligned_dmat4; + typedef packed_lowp_dmat2 packed_dmat2; + typedef packed_lowp_dmat3 packed_dmat3; + typedef packed_lowp_dmat4 packed_dmat4; + + typedef aligned_lowp_dmat2x2 aligned_dmat2x2; + typedef aligned_lowp_dmat2x3 aligned_dmat2x3; + typedef aligned_lowp_dmat2x4 aligned_dmat2x4; + typedef aligned_lowp_dmat3x2 aligned_dmat3x2; + typedef aligned_lowp_dmat3x3 aligned_dmat3x3; + typedef aligned_lowp_dmat3x4 aligned_dmat3x4; + typedef aligned_lowp_dmat4x2 aligned_dmat4x2; + typedef aligned_lowp_dmat4x3 aligned_dmat4x3; + typedef aligned_lowp_dmat4x4 aligned_dmat4x4; + typedef packed_lowp_dmat2x2 packed_dmat2x2; + typedef packed_lowp_dmat2x3 packed_dmat2x3; + typedef packed_lowp_dmat2x4 packed_dmat2x4; + typedef packed_lowp_dmat3x2 packed_dmat3x2; + typedef packed_lowp_dmat3x3 packed_dmat3x3; + typedef packed_lowp_dmat3x4 packed_dmat3x4; + typedef packed_lowp_dmat4x2 packed_dmat4x2; + typedef packed_lowp_dmat4x3 packed_dmat4x3; + typedef packed_lowp_dmat4x4 packed_dmat4x4; +#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE)) + typedef aligned_mediump_dvec1 aligned_dvec1; + typedef aligned_mediump_dvec2 aligned_dvec2; + typedef aligned_mediump_dvec3 aligned_dvec3; + typedef aligned_mediump_dvec4 aligned_dvec4; + typedef packed_mediump_dvec1 packed_dvec1; + typedef packed_mediump_dvec2 packed_dvec2; + typedef packed_mediump_dvec3 packed_dvec3; + typedef packed_mediump_dvec4 packed_dvec4; + + typedef aligned_mediump_dmat2 aligned_dmat2; + typedef aligned_mediump_dmat3 aligned_dmat3; + typedef aligned_mediump_dmat4 aligned_dmat4; + typedef packed_mediump_dmat2 packed_dmat2; + typedef packed_mediump_dmat3 packed_dmat3; + typedef packed_mediump_dmat4 packed_dmat4; + + typedef aligned_mediump_dmat2x2 aligned_dmat2x2; + typedef aligned_mediump_dmat2x3 aligned_dmat2x3; + typedef aligned_mediump_dmat2x4 aligned_dmat2x4; + typedef aligned_mediump_dmat3x2 aligned_dmat3x2; + typedef aligned_mediump_dmat3x3 aligned_dmat3x3; + typedef aligned_mediump_dmat3x4 aligned_dmat3x4; + typedef aligned_mediump_dmat4x2 aligned_dmat4x2; + typedef aligned_mediump_dmat4x3 aligned_dmat4x3; + typedef aligned_mediump_dmat4x4 aligned_dmat4x4; + typedef packed_mediump_dmat2x2 packed_dmat2x2; + typedef packed_mediump_dmat2x3 packed_dmat2x3; + typedef packed_mediump_dmat2x4 packed_dmat2x4; + typedef packed_mediump_dmat3x2 packed_dmat3x2; + typedef packed_mediump_dmat3x3 packed_dmat3x3; + typedef packed_mediump_dmat3x4 packed_dmat3x4; + typedef packed_mediump_dmat4x2 packed_dmat4x2; + typedef packed_mediump_dmat4x3 packed_dmat4x3; + typedef packed_mediump_dmat4x4 packed_dmat4x4; +#else //defined(GLM_PRECISION_HIGHP_DOUBLE) + /// 1 component vector aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dvec1 aligned_dvec1; + + /// 2 components vector aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dvec2 aligned_dvec2; + + /// 3 components vector aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dvec3 aligned_dvec3; + + /// 4 components vector aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dvec4 aligned_dvec4; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec1 packed_dvec1; + + /// 2 components vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec2 packed_dvec2; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec3 packed_dvec3; + + /// 4 components vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec4 packed_dvec4; + + /// 2 by 2 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat2 aligned_dmat2; + + /// 3 by 3 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat3 aligned_dmat3; + + /// 4 by 4 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat4 aligned_dmat4; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat2 packed_dmat2; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat3 packed_dmat3; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat4 packed_dmat4; + + /// 2 by 2 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat2x2 aligned_dmat2x2; + + /// 2 by 3 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat2x3 aligned_dmat2x3; + + /// 2 by 4 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat2x4 aligned_dmat2x4; + + /// 3 by 2 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat3x2 aligned_dmat3x2; + + /// 3 by 3 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat3x3 aligned_dmat3x3; + + /// 3 by 4 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat3x4 aligned_dmat3x4; + + /// 4 by 2 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat4x2 aligned_dmat4x2; + + /// 4 by 3 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat4x3 aligned_dmat4x3; + + /// 4 by 4 matrix tightly aligned in memory of double-precision floating-point numbers. + typedef aligned_highp_dmat4x4 aligned_dmat4x4; + + /// 2 by 2 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat2x2 packed_dmat2x2; + + /// 2 by 3 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat2x3 packed_dmat2x3; + + /// 2 by 4 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat2x4 packed_dmat2x4; + + /// 3 by 2 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat3x2 packed_dmat3x2; + + /// 3 by 3 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat3x3 packed_dmat3x3; + + /// 3 by 4 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat3x4 packed_dmat3x4; + + /// 4 by 2 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat4x2 packed_dmat4x2; + + /// 4 by 3 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat4x3 packed_dmat4x3; + + /// 4 by 4 matrix tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dmat4x4 packed_dmat4x4; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_LOWP_INT)) + typedef aligned_lowp_ivec1 aligned_ivec1; + typedef aligned_lowp_ivec2 aligned_ivec2; + typedef aligned_lowp_ivec3 aligned_ivec3; + typedef aligned_lowp_ivec4 aligned_ivec4; +#elif(defined(GLM_PRECISION_MEDIUMP_INT)) + typedef aligned_mediump_ivec1 aligned_ivec1; + typedef aligned_mediump_ivec2 aligned_ivec2; + typedef aligned_mediump_ivec3 aligned_ivec3; + typedef aligned_mediump_ivec4 aligned_ivec4; +#else //defined(GLM_PRECISION_HIGHP_INT) + /// 1 component vector aligned in memory of signed integer numbers. + typedef aligned_highp_ivec1 aligned_ivec1; + + /// 2 components vector aligned in memory of signed integer numbers. + typedef aligned_highp_ivec2 aligned_ivec2; + + /// 3 components vector aligned in memory of signed integer numbers. + typedef aligned_highp_ivec3 aligned_ivec3; + + /// 4 components vector aligned in memory of signed integer numbers. + typedef aligned_highp_ivec4 aligned_ivec4; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec1 packed_ivec1; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec2 packed_ivec2; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec3 packed_ivec3; + + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec4 packed_ivec4; +#endif//GLM_PRECISION + + // -- Unsigned integer definition -- + +#if(defined(GLM_PRECISION_LOWP_UINT)) + typedef aligned_lowp_uvec1 aligned_uvec1; + typedef aligned_lowp_uvec2 aligned_uvec2; + typedef aligned_lowp_uvec3 aligned_uvec3; + typedef aligned_lowp_uvec4 aligned_uvec4; +#elif(defined(GLM_PRECISION_MEDIUMP_UINT)) + typedef aligned_mediump_uvec1 aligned_uvec1; + typedef aligned_mediump_uvec2 aligned_uvec2; + typedef aligned_mediump_uvec3 aligned_uvec3; + typedef aligned_mediump_uvec4 aligned_uvec4; +#else //defined(GLM_PRECISION_HIGHP_UINT) + /// 1 component vector aligned in memory of unsigned integer numbers. + typedef aligned_highp_uvec1 aligned_uvec1; + + /// 2 components vector aligned in memory of unsigned integer numbers. + typedef aligned_highp_uvec2 aligned_uvec2; + + /// 3 components vector aligned in memory of unsigned integer numbers. + typedef aligned_highp_uvec3 aligned_uvec3; + + /// 4 components vector aligned in memory of unsigned integer numbers. + typedef aligned_highp_uvec4 aligned_uvec4; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec1 packed_uvec1; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec2 packed_uvec2; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec3 packed_uvec3; + + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec4 packed_uvec4; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_LOWP_BOOL)) + typedef aligned_lowp_bvec1 aligned_bvec1; + typedef aligned_lowp_bvec2 aligned_bvec2; + typedef aligned_lowp_bvec3 aligned_bvec3; + typedef aligned_lowp_bvec4 aligned_bvec4; +#elif(defined(GLM_PRECISION_MEDIUMP_BOOL)) + typedef aligned_mediump_bvec1 aligned_bvec1; + typedef aligned_mediump_bvec2 aligned_bvec2; + typedef aligned_mediump_bvec3 aligned_bvec3; + typedef aligned_mediump_bvec4 aligned_bvec4; +#else //defined(GLM_PRECISION_HIGHP_BOOL) + /// 1 component vector aligned in memory of bool values. + typedef aligned_highp_bvec1 aligned_bvec1; + + /// 2 components vector aligned in memory of bool values. + typedef aligned_highp_bvec2 aligned_bvec2; + + /// 3 components vector aligned in memory of bool values. + typedef aligned_highp_bvec3 aligned_bvec3; + + /// 4 components vector aligned in memory of bool values. + typedef aligned_highp_bvec4 aligned_bvec4; + + /// 1 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec1 packed_bvec1; + + /// 2 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec2 packed_bvec2; + + /// 3 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec3 packed_bvec3; + + /// 4 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec4 packed_bvec4; +#endif//GLM_PRECISION + + /// @} +}//namespace glm diff --git a/dep/glm/gtc/type_precision.hpp b/dep/glm/gtc/type_precision.hpp new file mode 100644 index 0000000..775e2f4 --- /dev/null +++ b/dep/glm/gtc/type_precision.hpp @@ -0,0 +1,2094 @@ +/// @ref gtc_type_precision +/// @file glm/gtc/type_precision.hpp +/// +/// @see core (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtc_type_precision GLM_GTC_type_precision +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Defines specific C++-based qualifier types. + +#pragma once + +// Dependency: +#include "../gtc/quaternion.hpp" +#include "../gtc/vec1.hpp" +#include "../ext/vector_int1_sized.hpp" +#include "../ext/vector_int2_sized.hpp" +#include "../ext/vector_int3_sized.hpp" +#include "../ext/vector_int4_sized.hpp" +#include "../ext/scalar_int_sized.hpp" +#include "../ext/vector_uint1_sized.hpp" +#include "../ext/vector_uint2_sized.hpp" +#include "../ext/vector_uint3_sized.hpp" +#include "../ext/vector_uint4_sized.hpp" +#include "../ext/scalar_uint_sized.hpp" +#include "../detail/type_vec2.hpp" +#include "../detail/type_vec3.hpp" +#include "../detail/type_vec4.hpp" +#include "../detail/type_mat2x2.hpp" +#include "../detail/type_mat2x3.hpp" +#include "../detail/type_mat2x4.hpp" +#include "../detail/type_mat3x2.hpp" +#include "../detail/type_mat3x3.hpp" +#include "../detail/type_mat3x4.hpp" +#include "../detail/type_mat4x2.hpp" +#include "../detail/type_mat4x3.hpp" +#include "../detail/type_mat4x4.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_type_precision extension included") +#endif + +namespace glm +{ + /////////////////////////// + // Signed int vector types + + /// @addtogroup gtc_type_precision + /// @{ + + /// Low qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 lowp_int8; + + /// Low qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 lowp_int16; + + /// Low qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 lowp_int32; + + /// Low qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 lowp_int64; + + /// Low qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 lowp_int8_t; + + /// Low qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 lowp_int16_t; + + /// Low qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 lowp_int32_t; + + /// Low qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 lowp_int64_t; + + /// Low qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 lowp_i8; + + /// Low qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 lowp_i16; + + /// Low qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 lowp_i32; + + /// Low qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 lowp_i64; + + /// Medium qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 mediump_int8; + + /// Medium qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 mediump_int16; + + /// Medium qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 mediump_int32; + + /// Medium qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 mediump_int64; + + /// Medium qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 mediump_int8_t; + + /// Medium qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 mediump_int16_t; + + /// Medium qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 mediump_int32_t; + + /// Medium qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 mediump_int64_t; + + /// Medium qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 mediump_i8; + + /// Medium qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 mediump_i16; + + /// Medium qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 mediump_i32; + + /// Medium qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 mediump_i64; + + /// High qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 highp_int8; + + /// High qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 highp_int16; + + /// High qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 highp_int32; + + /// High qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 highp_int64; + + /// High qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 highp_int8_t; + + /// High qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 highp_int16_t; + + /// 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 highp_int32_t; + + /// High qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 highp_int64_t; + + /// High qualifier 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 highp_i8; + + /// High qualifier 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 highp_i16; + + /// High qualifier 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 highp_i32; + + /// High qualifier 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 highp_i64; + + +#if GLM_HAS_EXTENDED_INTEGER_TYPE + using std::int8_t; + using std::int16_t; + using std::int32_t; + using std::int64_t; +#else + /// 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 int8_t; + + /// 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 int16_t; + + /// 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 int32_t; + + /// 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 int64_t; +#endif + + /// 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 i8; + + /// 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 i16; + + /// 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 i32; + + /// 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 i64; + + ///////////////////////////// + // Unsigned int vector types + + /// Low qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 lowp_uint8; + + /// Low qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 lowp_uint16; + + /// Low qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 lowp_uint32; + + /// Low qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 lowp_uint64; + + /// Low qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 lowp_uint8_t; + + /// Low qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 lowp_uint16_t; + + /// Low qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 lowp_uint32_t; + + /// Low qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 lowp_uint64_t; + + /// Low qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 lowp_u8; + + /// Low qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 lowp_u16; + + /// Low qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 lowp_u32; + + /// Low qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 lowp_u64; + + /// Medium qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 mediump_uint8; + + /// Medium qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 mediump_uint16; + + /// Medium qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 mediump_uint32; + + /// Medium qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 mediump_uint64; + + /// Medium qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 mediump_uint8_t; + + /// Medium qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 mediump_uint16_t; + + /// Medium qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 mediump_uint32_t; + + /// Medium qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 mediump_uint64_t; + + /// Medium qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 mediump_u8; + + /// Medium qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 mediump_u16; + + /// Medium qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 mediump_u32; + + /// Medium qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 mediump_u64; + + /// High qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 highp_uint8; + + /// High qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 highp_uint16; + + /// High qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 highp_uint32; + + /// High qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 highp_uint64; + + /// High qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 highp_uint8_t; + + /// High qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 highp_uint16_t; + + /// High qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 highp_uint32_t; + + /// High qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 highp_uint64_t; + + /// High qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 highp_u8; + + /// High qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 highp_u16; + + /// High qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 highp_u32; + + /// High qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 highp_u64; + +#if GLM_HAS_EXTENDED_INTEGER_TYPE + using std::uint8_t; + using std::uint16_t; + using std::uint32_t; + using std::uint64_t; +#else + /// Default qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 uint8_t; + + /// Default qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 uint16_t; + + /// Default qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 uint32_t; + + /// Default qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 uint64_t; +#endif + + /// Default qualifier 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 u8; + + /// Default qualifier 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 u16; + + /// Default qualifier 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 u32; + + /// Default qualifier 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 u64; + + + + + + ////////////////////// + // Float vector types + + /// Single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float float32; + + /// Double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef double float64; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32_t; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64_t; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_f32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_f64; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32_t; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64_t; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_f32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_f64; + + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_float32_t; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_float64_t; + + /// Low 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 lowp_f32; + + /// Low 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 lowp_f64; + + + /// Medium 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 mediump_float32; + + /// Medium 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 mediump_float64; + + /// Medium 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 mediump_float32_t; + + /// Medium 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 mediump_float64_t; + + /// Medium 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 mediump_f32; + + /// Medium 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 mediump_f64; + + + /// High 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 highp_float32; + + /// High 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 highp_float64; + + /// High 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 highp_float32_t; + + /// High 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 highp_float64_t; + + /// High 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 highp_f32; + + /// High 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 highp_f64; + + +#if(defined(GLM_PRECISION_LOWP_FLOAT)) + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef lowp_float32_t float32_t; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef lowp_float64_t float64_t; + + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef lowp_f32 f32; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef lowp_f64 f64; + +#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef mediump_float32 float32_t; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef mediump_float64 float64_t; + + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef mediump_float32 f32; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef mediump_float64 f64; + +#else//(defined(GLM_PRECISION_HIGHP_FLOAT)) + + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef highp_float32_t float32_t; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef highp_float64_t float64_t; + + /// Default 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef highp_float32_t f32; + + /// Default 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef highp_float64_t f64; +#endif + + + /// Low single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, float, lowp> lowp_fvec1; + + /// Low single-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, float, lowp> lowp_fvec2; + + /// Low single-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, float, lowp> lowp_fvec3; + + /// Low single-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, float, lowp> lowp_fvec4; + + + /// Medium single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, float, mediump> mediump_fvec1; + + /// Medium Single-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, float, mediump> mediump_fvec2; + + /// Medium Single-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, float, mediump> mediump_fvec3; + + /// Medium Single-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, float, mediump> mediump_fvec4; + + + /// High single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, float, highp> highp_fvec1; + + /// High Single-qualifier floating-point vector of 2 components. + /// @see core_precision + typedef vec<2, float, highp> highp_fvec2; + + /// High Single-qualifier floating-point vector of 3 components. + /// @see core_precision + typedef vec<3, float, highp> highp_fvec3; + + /// High Single-qualifier floating-point vector of 4 components. + /// @see core_precision + typedef vec<4, float, highp> highp_fvec4; + + + /// Low single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f32, lowp> lowp_f32vec1; + + /// Low single-qualifier floating-point vector of 2 components. + /// @see core_precision + typedef vec<2, f32, lowp> lowp_f32vec2; + + /// Low single-qualifier floating-point vector of 3 components. + /// @see core_precision + typedef vec<3, f32, lowp> lowp_f32vec3; + + /// Low single-qualifier floating-point vector of 4 components. + /// @see core_precision + typedef vec<4, f32, lowp> lowp_f32vec4; + + /// Medium single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f32, mediump> mediump_f32vec1; + + /// Medium single-qualifier floating-point vector of 2 components. + /// @see core_precision + typedef vec<2, f32, mediump> mediump_f32vec2; + + /// Medium single-qualifier floating-point vector of 3 components. + /// @see core_precision + typedef vec<3, f32, mediump> mediump_f32vec3; + + /// Medium single-qualifier floating-point vector of 4 components. + /// @see core_precision + typedef vec<4, f32, mediump> mediump_f32vec4; + + /// High single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f32, highp> highp_f32vec1; + + /// High single-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f32, highp> highp_f32vec2; + + /// High single-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f32, highp> highp_f32vec3; + + /// High single-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f32, highp> highp_f32vec4; + + + /// Low double-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f64, lowp> lowp_f64vec1; + + /// Low double-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f64, lowp> lowp_f64vec2; + + /// Low double-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f64, lowp> lowp_f64vec3; + + /// Low double-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f64, lowp> lowp_f64vec4; + + /// Medium double-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f64, mediump> mediump_f64vec1; + + /// Medium double-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f64, mediump> mediump_f64vec2; + + /// Medium double-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f64, mediump> mediump_f64vec3; + + /// Medium double-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f64, mediump> mediump_f64vec4; + + /// High double-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f64, highp> highp_f64vec1; + + /// High double-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f64, highp> highp_f64vec2; + + /// High double-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f64, highp> highp_f64vec3; + + /// High double-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f64, highp> highp_f64vec4; + + + + ////////////////////// + // Float matrix types + + /// Low single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef lowp_f32 lowp_fmat1x1; + + /// Low single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, lowp> lowp_fmat2x2; + + /// Low single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, lowp> lowp_fmat2x3; + + /// Low single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, lowp> lowp_fmat2x4; + + /// Low single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, lowp> lowp_fmat3x2; + + /// Low single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, lowp> lowp_fmat3x3; + + /// Low single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, lowp> lowp_fmat3x4; + + /// Low single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, lowp> lowp_fmat4x2; + + /// Low single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, lowp> lowp_fmat4x3; + + /// Low single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, lowp> lowp_fmat4x4; + + /// Low single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef lowp_fmat1x1 lowp_fmat1; + + /// Low single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef lowp_fmat2x2 lowp_fmat2; + + /// Low single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef lowp_fmat3x3 lowp_fmat3; + + /// Low single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef lowp_fmat4x4 lowp_fmat4; + + + /// Medium single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef mediump_f32 mediump_fmat1x1; + + /// Medium single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, mediump> mediump_fmat2x2; + + /// Medium single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, mediump> mediump_fmat2x3; + + /// Medium single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, mediump> mediump_fmat2x4; + + /// Medium single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, mediump> mediump_fmat3x2; + + /// Medium single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, mediump> mediump_fmat3x3; + + /// Medium single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, mediump> mediump_fmat3x4; + + /// Medium single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, mediump> mediump_fmat4x2; + + /// Medium single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, mediump> mediump_fmat4x3; + + /// Medium single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, mediump> mediump_fmat4x4; + + /// Medium single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef mediump_fmat1x1 mediump_fmat1; + + /// Medium single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mediump_fmat2x2 mediump_fmat2; + + /// Medium single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mediump_fmat3x3 mediump_fmat3; + + /// Medium single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mediump_fmat4x4 mediump_fmat4; + + + /// High single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef highp_f32 highp_fmat1x1; + + /// High single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, highp> highp_fmat2x2; + + /// High single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, highp> highp_fmat2x3; + + /// High single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, highp> highp_fmat2x4; + + /// High single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, highp> highp_fmat3x2; + + /// High single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, highp> highp_fmat3x3; + + /// High single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, highp> highp_fmat3x4; + + /// High single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, highp> highp_fmat4x2; + + /// High single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, highp> highp_fmat4x3; + + /// High single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, highp> highp_fmat4x4; + + /// High single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef highp_fmat1x1 highp_fmat1; + + /// High single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef highp_fmat2x2 highp_fmat2; + + /// High single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef highp_fmat3x3 highp_fmat3; + + /// High single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef highp_fmat4x4 highp_fmat4; + + + /// Low single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 lowp_f32mat1x1; + + /// Low single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, lowp> lowp_f32mat2x2; + + /// Low single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, lowp> lowp_f32mat2x3; + + /// Low single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, lowp> lowp_f32mat2x4; + + /// Low single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, lowp> lowp_f32mat3x2; + + /// Low single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, lowp> lowp_f32mat3x3; + + /// Low single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, lowp> lowp_f32mat3x4; + + /// Low single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, lowp> lowp_f32mat4x2; + + /// Low single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, lowp> lowp_f32mat4x3; + + /// Low single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, lowp> lowp_f32mat4x4; + + /// Low single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 lowp_f32mat1; + + /// Low single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef lowp_f32mat2x2 lowp_f32mat2; + + /// Low single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef lowp_f32mat3x3 lowp_f32mat3; + + /// Low single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef lowp_f32mat4x4 lowp_f32mat4; + + + /// High single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 mediump_f32mat1x1; + + /// Low single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, mediump> mediump_f32mat2x2; + + /// Medium single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, mediump> mediump_f32mat2x3; + + /// Medium single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, mediump> mediump_f32mat2x4; + + /// Medium single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, mediump> mediump_f32mat3x2; + + /// Medium single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, mediump> mediump_f32mat3x3; + + /// Medium single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, mediump> mediump_f32mat3x4; + + /// Medium single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, mediump> mediump_f32mat4x2; + + /// Medium single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, mediump> mediump_f32mat4x3; + + /// Medium single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, mediump> mediump_f32mat4x4; + + /// Medium single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 f32mat1; + + /// Medium single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mediump_f32mat2x2 mediump_f32mat2; + + /// Medium single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mediump_f32mat3x3 mediump_f32mat3; + + /// Medium single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mediump_f32mat4x4 mediump_f32mat4; + + + /// High single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 highp_f32mat1x1; + + /// High single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, highp> highp_f32mat2x2; + + /// High single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, highp> highp_f32mat2x3; + + /// High single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, highp> highp_f32mat2x4; + + /// High single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, highp> highp_f32mat3x2; + + /// High single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, highp> highp_f32mat3x3; + + /// High single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, highp> highp_f32mat3x4; + + /// High single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, highp> highp_f32mat4x2; + + /// High single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, highp> highp_f32mat4x3; + + /// High single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, highp> highp_f32mat4x4; + + /// High single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 f32mat1; + + /// High single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef highp_f32mat2x2 highp_f32mat2; + + /// High single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef highp_f32mat3x3 highp_f32mat3; + + /// High single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef highp_f32mat4x4 highp_f32mat4; + + + /// Low double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f64 lowp_f64mat1x1; + + /// Low double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f64, lowp> lowp_f64mat2x2; + + /// Low double-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f64, lowp> lowp_f64mat2x3; + + /// Low double-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f64, lowp> lowp_f64mat2x4; + + /// Low double-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f64, lowp> lowp_f64mat3x2; + + /// Low double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f64, lowp> lowp_f64mat3x3; + + /// Low double-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f64, lowp> lowp_f64mat3x4; + + /// Low double-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f64, lowp> lowp_f64mat4x2; + + /// Low double-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f64, lowp> lowp_f64mat4x3; + + /// Low double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f64, lowp> lowp_f64mat4x4; + + /// Low double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef lowp_f64mat1x1 lowp_f64mat1; + + /// Low double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef lowp_f64mat2x2 lowp_f64mat2; + + /// Low double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef lowp_f64mat3x3 lowp_f64mat3; + + /// Low double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef lowp_f64mat4x4 lowp_f64mat4; + + + /// Medium double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f64 Highp_f64mat1x1; + + /// Medium double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f64, mediump> mediump_f64mat2x2; + + /// Medium double-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f64, mediump> mediump_f64mat2x3; + + /// Medium double-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f64, mediump> mediump_f64mat2x4; + + /// Medium double-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f64, mediump> mediump_f64mat3x2; + + /// Medium double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f64, mediump> mediump_f64mat3x3; + + /// Medium double-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f64, mediump> mediump_f64mat3x4; + + /// Medium double-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f64, mediump> mediump_f64mat4x2; + + /// Medium double-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f64, mediump> mediump_f64mat4x3; + + /// Medium double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f64, mediump> mediump_f64mat4x4; + + /// Medium double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef mediump_f64mat1x1 mediump_f64mat1; + + /// Medium double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mediump_f64mat2x2 mediump_f64mat2; + + /// Medium double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mediump_f64mat3x3 mediump_f64mat3; + + /// Medium double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mediump_f64mat4x4 mediump_f64mat4; + + /// High double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f64 highp_f64mat1x1; + + /// High double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f64, highp> highp_f64mat2x2; + + /// High double-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f64, highp> highp_f64mat2x3; + + /// High double-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f64, highp> highp_f64mat2x4; + + /// High double-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f64, highp> highp_f64mat3x2; + + /// High double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f64, highp> highp_f64mat3x3; + + /// High double-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f64, highp> highp_f64mat3x4; + + /// High double-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f64, highp> highp_f64mat4x2; + + /// High double-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f64, highp> highp_f64mat4x3; + + /// High double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f64, highp> highp_f64mat4x4; + + /// High double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef highp_f64mat1x1 highp_f64mat1; + + /// High double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef highp_f64mat2x2 highp_f64mat2; + + /// High double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef highp_f64mat3x3 highp_f64mat3; + + /// High double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef highp_f64mat4x4 highp_f64mat4; + + + ///////////////////////////// + // Signed int vector types + + /// Low qualifier signed integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, int, lowp> lowp_ivec1; + + /// Low qualifier signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, int, lowp> lowp_ivec2; + + /// Low qualifier signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, int, lowp> lowp_ivec3; + + /// Low qualifier signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, int, lowp> lowp_ivec4; + + + /// Medium qualifier signed integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, int, mediump> mediump_ivec1; + + /// Medium qualifier signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, int, mediump> mediump_ivec2; + + /// Medium qualifier signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, int, mediump> mediump_ivec3; + + /// Medium qualifier signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, int, mediump> mediump_ivec4; + + + /// High qualifier signed integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, int, highp> highp_ivec1; + + /// High qualifier signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, int, highp> highp_ivec2; + + /// High qualifier signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, int, highp> highp_ivec3; + + /// High qualifier signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, int, highp> highp_ivec4; + + + /// Low qualifier 8 bit signed integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, i8, lowp> lowp_i8vec1; + + /// Low qualifier 8 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i8, lowp> lowp_i8vec2; + + /// Low qualifier 8 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i8, lowp> lowp_i8vec3; + + /// Low qualifier 8 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i8, lowp> lowp_i8vec4; + + + /// Medium qualifier 8 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i8, mediump> mediump_i8vec1; + + /// Medium qualifier 8 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i8, mediump> mediump_i8vec2; + + /// Medium qualifier 8 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i8, mediump> mediump_i8vec3; + + /// Medium qualifier 8 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i8, mediump> mediump_i8vec4; + + + /// High qualifier 8 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i8, highp> highp_i8vec1; + + /// High qualifier 8 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i8, highp> highp_i8vec2; + + /// High qualifier 8 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i8, highp> highp_i8vec3; + + /// High qualifier 8 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i8, highp> highp_i8vec4; + + + /// Low qualifier 16 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i16, lowp> lowp_i16vec1; + + /// Low qualifier 16 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i16, lowp> lowp_i16vec2; + + /// Low qualifier 16 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i16, lowp> lowp_i16vec3; + + /// Low qualifier 16 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i16, lowp> lowp_i16vec4; + + + /// Medium qualifier 16 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i16, mediump> mediump_i16vec1; + + /// Medium qualifier 16 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i16, mediump> mediump_i16vec2; + + /// Medium qualifier 16 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i16, mediump> mediump_i16vec3; + + /// Medium qualifier 16 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i16, mediump> mediump_i16vec4; + + + /// High qualifier 16 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i16, highp> highp_i16vec1; + + /// High qualifier 16 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i16, highp> highp_i16vec2; + + /// High qualifier 16 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i16, highp> highp_i16vec3; + + /// High qualifier 16 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i16, highp> highp_i16vec4; + + + /// Low qualifier 32 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i32, lowp> lowp_i32vec1; + + /// Low qualifier 32 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i32, lowp> lowp_i32vec2; + + /// Low qualifier 32 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i32, lowp> lowp_i32vec3; + + /// Low qualifier 32 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i32, lowp> lowp_i32vec4; + + + /// Medium qualifier 32 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i32, mediump> mediump_i32vec1; + + /// Medium qualifier 32 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i32, mediump> mediump_i32vec2; + + /// Medium qualifier 32 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i32, mediump> mediump_i32vec3; + + /// Medium qualifier 32 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i32, mediump> mediump_i32vec4; + + + /// High qualifier 32 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i32, highp> highp_i32vec1; + + /// High qualifier 32 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i32, highp> highp_i32vec2; + + /// High qualifier 32 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i32, highp> highp_i32vec3; + + /// High qualifier 32 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i32, highp> highp_i32vec4; + + + /// Low qualifier 64 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i64, lowp> lowp_i64vec1; + + /// Low qualifier 64 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i64, lowp> lowp_i64vec2; + + /// Low qualifier 64 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i64, lowp> lowp_i64vec3; + + /// Low qualifier 64 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i64, lowp> lowp_i64vec4; + + + /// Medium qualifier 64 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i64, mediump> mediump_i64vec1; + + /// Medium qualifier 64 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i64, mediump> mediump_i64vec2; + + /// Medium qualifier 64 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i64, mediump> mediump_i64vec3; + + /// Medium qualifier 64 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i64, mediump> mediump_i64vec4; + + + /// High qualifier 64 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i64, highp> highp_i64vec1; + + /// High qualifier 64 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i64, highp> highp_i64vec2; + + /// High qualifier 64 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i64, highp> highp_i64vec3; + + /// High qualifier 64 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i64, highp> highp_i64vec4; + + + ///////////////////////////// + // Unsigned int vector types + + /// Low qualifier unsigned integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, uint, lowp> lowp_uvec1; + + /// Low qualifier unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, uint, lowp> lowp_uvec2; + + /// Low qualifier unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, uint, lowp> lowp_uvec3; + + /// Low qualifier unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, uint, lowp> lowp_uvec4; + + + /// Medium qualifier unsigned integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, uint, mediump> mediump_uvec1; + + /// Medium qualifier unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, uint, mediump> mediump_uvec2; + + /// Medium qualifier unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, uint, mediump> mediump_uvec3; + + /// Medium qualifier unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, uint, mediump> mediump_uvec4; + + + /// High qualifier unsigned integer vector of 1 component type. + /// @see gtc_type_precision + typedef vec<1, uint, highp> highp_uvec1; + + /// High qualifier unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, uint, highp> highp_uvec2; + + /// High qualifier unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, uint, highp> highp_uvec3; + + /// High qualifier unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, uint, highp> highp_uvec4; + + + /// Low qualifier 8 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u8, lowp> lowp_u8vec1; + + /// Low qualifier 8 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u8, lowp> lowp_u8vec2; + + /// Low qualifier 8 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u8, lowp> lowp_u8vec3; + + /// Low qualifier 8 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u8, lowp> lowp_u8vec4; + + + /// Medium qualifier 8 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u8, mediump> mediump_u8vec1; + + /// Medium qualifier 8 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u8, mediump> mediump_u8vec2; + + /// Medium qualifier 8 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u8, mediump> mediump_u8vec3; + + /// Medium qualifier 8 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u8, mediump> mediump_u8vec4; + + + /// High qualifier 8 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u8, highp> highp_u8vec1; + + /// High qualifier 8 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u8, highp> highp_u8vec2; + + /// High qualifier 8 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u8, highp> highp_u8vec3; + + /// High qualifier 8 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u8, highp> highp_u8vec4; + + + /// Low qualifier 16 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u16, lowp> lowp_u16vec1; + + /// Low qualifier 16 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u16, lowp> lowp_u16vec2; + + /// Low qualifier 16 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u16, lowp> lowp_u16vec3; + + /// Low qualifier 16 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u16, lowp> lowp_u16vec4; + + + /// Medium qualifier 16 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u16, mediump> mediump_u16vec1; + + /// Medium qualifier 16 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u16, mediump> mediump_u16vec2; + + /// Medium qualifier 16 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u16, mediump> mediump_u16vec3; + + /// Medium qualifier 16 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u16, mediump> mediump_u16vec4; + + + /// High qualifier 16 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u16, highp> highp_u16vec1; + + /// High qualifier 16 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u16, highp> highp_u16vec2; + + /// High qualifier 16 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u16, highp> highp_u16vec3; + + /// High qualifier 16 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u16, highp> highp_u16vec4; + + + /// Low qualifier 32 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u32, lowp> lowp_u32vec1; + + /// Low qualifier 32 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u32, lowp> lowp_u32vec2; + + /// Low qualifier 32 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u32, lowp> lowp_u32vec3; + + /// Low qualifier 32 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u32, lowp> lowp_u32vec4; + + + /// Medium qualifier 32 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u32, mediump> mediump_u32vec1; + + /// Medium qualifier 32 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u32, mediump> mediump_u32vec2; + + /// Medium qualifier 32 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u32, mediump> mediump_u32vec3; + + /// Medium qualifier 32 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u32, mediump> mediump_u32vec4; + + + /// High qualifier 32 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u32, highp> highp_u32vec1; + + /// High qualifier 32 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u32, highp> highp_u32vec2; + + /// High qualifier 32 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u32, highp> highp_u32vec3; + + /// High qualifier 32 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u32, highp> highp_u32vec4; + + + /// Low qualifier 64 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u64, lowp> lowp_u64vec1; + + /// Low qualifier 64 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u64, lowp> lowp_u64vec2; + + /// Low qualifier 64 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u64, lowp> lowp_u64vec3; + + /// Low qualifier 64 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u64, lowp> lowp_u64vec4; + + + /// Medium qualifier 64 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u64, mediump> mediump_u64vec1; + + /// Medium qualifier 64 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u64, mediump> mediump_u64vec2; + + /// Medium qualifier 64 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u64, mediump> mediump_u64vec3; + + /// Medium qualifier 64 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u64, mediump> mediump_u64vec4; + + + /// High qualifier 64 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef vec<1, u64, highp> highp_u64vec1; + + /// High qualifier 64 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, u64, highp> highp_u64vec2; + + /// High qualifier 64 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, u64, highp> highp_u64vec3; + + /// High qualifier 64 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, u64, highp> highp_u64vec4; + + + ////////////////////// + // Float vector types + + /// 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 float32_t; + + /// 32 bit single-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float32 f32; + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 float64_t; + + /// 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 f64; +# endif//GLM_FORCE_SINGLE_ONLY + + /// Single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, float, defaultp> fvec1; + + /// Single-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, float, defaultp> fvec2; + + /// Single-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, float, defaultp> fvec3; + + /// Single-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, float, defaultp> fvec4; + + + /// Single-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f32, defaultp> f32vec1; + + /// Single-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f32, defaultp> f32vec2; + + /// Single-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f32, defaultp> f32vec3; + + /// Single-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f32, defaultp> f32vec4; + +# ifndef GLM_FORCE_SINGLE_ONLY + /// Double-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f64, defaultp> f64vec1; + + /// Double-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f64, defaultp> f64vec2; + + /// Double-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f64, defaultp> f64vec3; + + /// Double-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f64, defaultp> f64vec4; +# endif//GLM_FORCE_SINGLE_ONLY + + + ////////////////////// + // Float matrix types + + /// Single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 fmat1; + + /// Single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, defaultp> fmat2; + + /// Single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, defaultp> fmat3; + + /// Single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, defaultp> fmat4; + + + /// Single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 fmat1x1; + + /// Single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, defaultp> fmat2x2; + + /// Single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, defaultp> fmat2x3; + + /// Single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, defaultp> fmat2x4; + + /// Single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, defaultp> fmat3x2; + + /// Single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, defaultp> fmat3x3; + + /// Single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, defaultp> fmat3x4; + + /// Single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, defaultp> fmat4x2; + + /// Single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, defaultp> fmat4x3; + + /// Single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, defaultp> fmat4x4; + + + /// Single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 f32mat1; + + /// Single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, defaultp> f32mat2; + + /// Single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, defaultp> f32mat3; + + /// Single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, defaultp> f32mat4; + + + /// Single-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 f32mat1x1; + + /// Single-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f32, defaultp> f32mat2x2; + + /// Single-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f32, defaultp> f32mat2x3; + + /// Single-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f32, defaultp> f32mat2x4; + + /// Single-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f32, defaultp> f32mat3x2; + + /// Single-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f32, defaultp> f32mat3x3; + + /// Single-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f32, defaultp> f32mat3x4; + + /// Single-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f32, defaultp> f32mat4x2; + + /// Single-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f32, defaultp> f32mat4x3; + + /// Single-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f32, defaultp> f32mat4x4; + + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1 f64mat1; + + /// Double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f64, defaultp> f64mat2; + + /// Double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f64, defaultp> f64mat3; + + /// Double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f64, defaultp> f64mat4; + + + /// Double-qualifier floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f64 f64mat1x1; + + /// Double-qualifier floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef mat<2, 2, f64, defaultp> f64mat2x2; + + /// Double-qualifier floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef mat<2, 3, f64, defaultp> f64mat2x3; + + /// Double-qualifier floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef mat<2, 4, f64, defaultp> f64mat2x4; + + /// Double-qualifier floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef mat<3, 2, f64, defaultp> f64mat3x2; + + /// Double-qualifier floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef mat<3, 3, f64, defaultp> f64mat3x3; + + /// Double-qualifier floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef mat<3, 4, f64, defaultp> f64mat3x4; + + /// Double-qualifier floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef mat<4, 2, f64, defaultp> f64mat4x2; + + /// Double-qualifier floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef mat<4, 3, f64, defaultp> f64mat4x3; + + /// Double-qualifier floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef mat<4, 4, f64, defaultp> f64mat4x4; + +# endif//GLM_FORCE_SINGLE_ONLY + + ////////////////////////// + // Quaternion types + + /// Single-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua f32quat; + + /// Low single-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua lowp_f32quat; + + /// Low double-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua lowp_f64quat; + + /// Medium single-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua mediump_f32quat; + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Medium double-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua mediump_f64quat; + + /// High single-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua highp_f32quat; + + /// High double-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua highp_f64quat; + + /// Double-qualifier floating-point quaternion. + /// @see gtc_type_precision + typedef qua f64quat; + +# endif//GLM_FORCE_SINGLE_ONLY + + /// @} +}//namespace glm + +#include "type_precision.inl" diff --git a/dep/glm/gtc/type_precision.inl b/dep/glm/gtc/type_precision.inl new file mode 100644 index 0000000..ae80912 --- /dev/null +++ b/dep/glm/gtc/type_precision.inl @@ -0,0 +1,6 @@ +/// @ref gtc_precision + +namespace glm +{ + +} diff --git a/dep/glm/gtc/type_ptr.hpp b/dep/glm/gtc/type_ptr.hpp new file mode 100644 index 0000000..d7e625a --- /dev/null +++ b/dep/glm/gtc/type_ptr.hpp @@ -0,0 +1,230 @@ +/// @ref gtc_type_ptr +/// @file glm/gtc/type_ptr.hpp +/// +/// @see core (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtc_type_ptr GLM_GTC_type_ptr +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Handles the interaction between pointers and vector, matrix types. +/// +/// This extension defines an overloaded function, glm::value_ptr. It returns +/// a pointer to the memory layout of the object. Matrix types store their values +/// in column-major order. +/// +/// This is useful for uploading data to matrices or copying data to buffer objects. +/// +/// Example: +/// @code +/// #include +/// #include +/// +/// glm::vec3 aVector(3); +/// glm::mat4 someMatrix(1.0); +/// +/// glUniform3fv(uniformLoc, 1, glm::value_ptr(aVector)); +/// glUniformMatrix4fv(uniformMatrixLoc, 1, GL_FALSE, glm::value_ptr(someMatrix)); +/// @endcode +/// +/// need to be included to use the features of this extension. + +#pragma once + +// Dependency: +#include "../gtc/quaternion.hpp" +#include "../gtc/vec1.hpp" +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../mat2x2.hpp" +#include "../mat2x3.hpp" +#include "../mat2x4.hpp" +#include "../mat3x2.hpp" +#include "../mat3x3.hpp" +#include "../mat3x4.hpp" +#include "../mat4x2.hpp" +#include "../mat4x3.hpp" +#include "../mat4x4.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_type_ptr extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_type_ptr + /// @{ + + /// Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL typename genType::value_type const * value_ptr(genType const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<4, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<4, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<4, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<4, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<2, T, defaultp> make_vec2(T const * const ptr); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<3, T, defaultp> make_vec3(T const * const ptr); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL vec<4, T, defaultp> make_vec4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<2, 2, T, defaultp> make_mat2x2(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<2, 3, T, defaultp> make_mat2x3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<2, 4, T, defaultp> make_mat2x4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<3, 2, T, defaultp> make_mat3x2(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<3, 3, T, defaultp> make_mat3x3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<3, 4, T, defaultp> make_mat3x4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<4, 2, T, defaultp> make_mat4x2(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<4, 3, T, defaultp> make_mat4x3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> make_mat4x4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<2, 2, T, defaultp> make_mat2(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<3, 3, T, defaultp> make_mat3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> make_mat4(T const * const ptr); + + /// Build a quaternion from a pointer. + /// @see gtc_type_ptr + template + GLM_FUNC_DECL qua make_quat(T const * const ptr); + + /// @} +}//namespace glm + +#include "type_ptr.inl" diff --git a/dep/glm/gtc/type_ptr.inl b/dep/glm/gtc/type_ptr.inl new file mode 100644 index 0000000..71df4d3 --- /dev/null +++ b/dep/glm/gtc/type_ptr.inl @@ -0,0 +1,386 @@ +/// @ref gtc_type_ptr + +#include + +namespace glm +{ + /// @addtogroup gtc_type_ptr + /// @{ + + template + GLM_FUNC_QUALIFIER T const* value_ptr(vec<2, T, Q> const& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(vec<2, T, Q>& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T const * value_ptr(vec<3, T, Q> const& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(vec<3, T, Q>& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(vec<4, T, Q> const& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(vec<4, T, Q>& v) + { + return &(v.x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 2, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<2, 2, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 3, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<3, 3, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 4, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<4, 4, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 3, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<2, 3, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 2, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<3, 2, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 4, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<2, 4, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 2, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<4, 2, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 4, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(mat<3, 4, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 3, T, Q> const& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T * value_ptr(mat<4, 3, T, Q>& m) + { + return &(m[0].x); + } + + template + GLM_FUNC_QUALIFIER T const * value_ptr(qua const& q) + { + return &(q[0]); + } + + template + GLM_FUNC_QUALIFIER T* value_ptr(qua& q) + { + return &(q[0]); + } + + template + inline vec<1, T, Q> make_vec1(vec<1, T, Q> const& v) + { + return v; + } + + template + inline vec<1, T, Q> make_vec1(vec<2, T, Q> const& v) + { + return vec<1, T, Q>(v); + } + + template + inline vec<1, T, Q> make_vec1(vec<3, T, Q> const& v) + { + return vec<1, T, Q>(v); + } + + template + inline vec<1, T, Q> make_vec1(vec<4, T, Q> const& v) + { + return vec<1, T, Q>(v); + } + + template + inline vec<2, T, Q> make_vec2(vec<1, T, Q> const& v) + { + return vec<2, T, Q>(v.x, static_cast(0)); + } + + template + inline vec<2, T, Q> make_vec2(vec<2, T, Q> const& v) + { + return v; + } + + template + inline vec<2, T, Q> make_vec2(vec<3, T, Q> const& v) + { + return vec<2, T, Q>(v); + } + + template + inline vec<2, T, Q> make_vec2(vec<4, T, Q> const& v) + { + return vec<2, T, Q>(v); + } + + template + inline vec<3, T, Q> make_vec3(vec<1, T, Q> const& v) + { + return vec<3, T, Q>(v.x, static_cast(0), static_cast(0)); + } + + template + inline vec<3, T, Q> make_vec3(vec<2, T, Q> const& v) + { + return vec<3, T, Q>(v.x, v.y, static_cast(0)); + } + + template + inline vec<3, T, Q> make_vec3(vec<3, T, Q> const& v) + { + return v; + } + + template + inline vec<3, T, Q> make_vec3(vec<4, T, Q> const& v) + { + return vec<3, T, Q>(v); + } + + template + inline vec<4, T, Q> make_vec4(vec<1, T, Q> const& v) + { + return vec<4, T, Q>(v.x, static_cast(0), static_cast(0), static_cast(1)); + } + + template + inline vec<4, T, Q> make_vec4(vec<2, T, Q> const& v) + { + return vec<4, T, Q>(v.x, v.y, static_cast(0), static_cast(1)); + } + + template + inline vec<4, T, Q> make_vec4(vec<3, T, Q> const& v) + { + return vec<4, T, Q>(v.x, v.y, v.z, static_cast(1)); + } + + template + inline vec<4, T, Q> make_vec4(vec<4, T, Q> const& v) + { + return v; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, defaultp> make_vec2(T const *const ptr) + { + vec<2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(vec<2, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, defaultp> make_vec3(T const *const ptr) + { + vec<3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(vec<3, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, defaultp> make_vec4(T const *const ptr) + { + vec<4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(vec<4, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> make_mat2x2(T const *const ptr) + { + mat<2, 2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<2, 2, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, defaultp> make_mat2x3(T const *const ptr) + { + mat<2, 3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<2, 3, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, defaultp> make_mat2x4(T const *const ptr) + { + mat<2, 4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<2, 4, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, defaultp> make_mat3x2(T const *const ptr) + { + mat<3, 2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<3, 2, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> make_mat3x3(T const *const ptr) + { + mat<3, 3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<3, 3, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, defaultp> make_mat3x4(T const *const ptr) + { + mat<3, 4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<3, 4, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, defaultp> make_mat4x2(T const *const ptr) + { + mat<4, 2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<4, 2, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, defaultp> make_mat4x3(T const *const ptr) + { + mat<4, 3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<4, 3, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> make_mat4x4(T const *const ptr) + { + mat<4, 4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<4, 4, T, defaultp>)); + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> make_mat2(T const *const ptr) + { + return make_mat2x2(ptr); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> make_mat3(T const *const ptr) + { + return make_mat3x3(ptr); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> make_mat4(T const *const ptr) + { + return make_mat4x4(ptr); + } + + template + GLM_FUNC_QUALIFIER qua make_quat(T const *const ptr) + { + qua Result; + memcpy(value_ptr(Result), ptr, sizeof(qua)); + return Result; + } + + /// @} +}//namespace glm + diff --git a/dep/glm/gtc/ulp.hpp b/dep/glm/gtc/ulp.hpp new file mode 100644 index 0000000..0d80a75 --- /dev/null +++ b/dep/glm/gtc/ulp.hpp @@ -0,0 +1,152 @@ +/// @ref gtc_ulp +/// @file glm/gtc/ulp.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_ulp GLM_GTC_ulp +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Allow the measurement of the accuracy of a function against a reference +/// implementation. This extension works on floating-point data and provide results +/// in ULP. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/_vectorize.hpp" +#include "../ext/scalar_int_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_ulp extension included") +#endif + +namespace glm +{ + /// Return the next ULP value(s) after the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL genType next_float(genType x); + + /// Return the previous ULP value(s) before the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL genType prev_float(genType x); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL genType next_float(genType x, int ULPs); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam genType A floating-point scalar type. + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL genType prev_float(genType x, int ULPs); + + /// Return the distance in the number of ULP between 2 single-precision floating-point scalars. + /// + /// @see gtc_ulp + GLM_FUNC_DECL int float_distance(float x, float y); + + /// Return the distance in the number of ULP between 2 double-precision floating-point scalars. + /// + /// @see gtc_ulp + GLM_FUNC_DECL int64 float_distance(double x, double y); + + /// Return the next ULP value(s) after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec next_float(vec const& x); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec next_float(vec const& x, int ULPs); + + /// Return the value(s) ULP distance after the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec next_float(vec const& x, vec const& ULPs); + + /// Return the previous ULP value(s) before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec prev_float(vec const& x); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec prev_float(vec const& x, int ULPs); + + /// Return the value(s) ULP distance before the input value(s). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec prev_float(vec const& x, vec const& ULPs); + + /// Return the distance in the number of ULP between 2 single-precision floating-point scalars. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec float_distance(vec const& x, vec const& y); + + /// Return the distance in the number of ULP between 2 double-precision floating-point scalars. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see gtc_ulp + template + GLM_FUNC_DECL vec float_distance(vec const& x, vec const& y); + + /// @} +}//namespace glm + +#include "ulp.inl" diff --git a/dep/glm/gtc/ulp.inl b/dep/glm/gtc/ulp.inl new file mode 100644 index 0000000..4ecbd3f --- /dev/null +++ b/dep/glm/gtc/ulp.inl @@ -0,0 +1,173 @@ +/// @ref gtc_ulp + +#include "../ext/scalar_ulp.hpp" + +namespace glm +{ + template<> + GLM_FUNC_QUALIFIER float next_float(float x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::max()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafterf(x, FLT_MAX); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafterf(x, FLT_MAX); +# else + return nextafterf(x, FLT_MAX); +# endif + } + + template<> + GLM_FUNC_QUALIFIER double next_float(double x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::max()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafter(x, std::numeric_limits::max()); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafter(x, DBL_MAX); +# else + return nextafter(x, DBL_MAX); +# endif + } + + template + GLM_FUNC_QUALIFIER T next_float(T x, int ULPs) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'next_float' only accept floating-point input"); + assert(ULPs >= 0); + + T temp = x; + for (int i = 0; i < ULPs; ++i) + temp = next_float(temp); + return temp; + } + + GLM_FUNC_QUALIFIER float prev_float(float x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::min()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return detail::nextafterf(x, FLT_MIN); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafterf(x, FLT_MIN); +# else + return nextafterf(x, FLT_MIN); +# endif + } + + GLM_FUNC_QUALIFIER double prev_float(double x) + { +# if GLM_HAS_CXX11_STL + return std::nextafter(x, std::numeric_limits::min()); +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) + return _nextafter(x, DBL_MIN); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafter(x, DBL_MIN); +# else + return nextafter(x, DBL_MIN); +# endif + } + + template + GLM_FUNC_QUALIFIER T prev_float(T x, int ULPs) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'prev_float' only accept floating-point input"); + assert(ULPs >= 0); + + T temp = x; + for (int i = 0; i < ULPs; ++i) + temp = prev_float(temp); + return temp; + } + + GLM_FUNC_QUALIFIER int float_distance(float x, float y) + { + detail::float_t const a(x); + detail::float_t const b(y); + + return abs(a.i - b.i); + } + + GLM_FUNC_QUALIFIER int64 float_distance(double x, double y) + { + detail::float_t const a(x); + detail::float_t const b(y); + + return abs(a.i - b.i); + } + + template + GLM_FUNC_QUALIFIER vec next_float(vec const& x) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = next_float(x[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec next_float(vec const& x, int ULPs) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = next_float(x[i], ULPs); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec next_float(vec const& x, vec const& ULPs) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = next_float(x[i], ULPs[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prev_float(vec const& x) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prev_float(x[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prev_float(vec const& x, int ULPs) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prev_float(x[i], ULPs); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec prev_float(vec const& x, vec const& ULPs) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = prev_float(x[i], ULPs[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec float_distance(vec const& x, vec const& y) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = float_distance(x[i], y[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER vec float_distance(vec const& x, vec const& y) + { + vec Result; + for (length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = float_distance(x[i], y[i]); + return Result; + } +}//namespace glm + diff --git a/dep/glm/gtc/vec1.hpp b/dep/glm/gtc/vec1.hpp new file mode 100644 index 0000000..63697a2 --- /dev/null +++ b/dep/glm/gtc/vec1.hpp @@ -0,0 +1,30 @@ +/// @ref gtc_vec1 +/// @file glm/gtc/vec1.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtc_vec1 GLM_GTC_vec1 +/// @ingroup gtc +/// +/// Include to use the features of this extension. +/// +/// Add vec1, ivec1, uvec1 and bvec1 types. + +#pragma once + +// Dependency: +#include "../ext/vector_bool1.hpp" +#include "../ext/vector_bool1_precision.hpp" +#include "../ext/vector_float1.hpp" +#include "../ext/vector_float1_precision.hpp" +#include "../ext/vector_double1.hpp" +#include "../ext/vector_double1_precision.hpp" +#include "../ext/vector_int1.hpp" +#include "../ext/vector_int1_sized.hpp" +#include "../ext/vector_uint1.hpp" +#include "../ext/vector_uint1_sized.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_vec1 extension included") +#endif + diff --git a/dep/glm/gtx/associated_min_max.hpp b/dep/glm/gtx/associated_min_max.hpp new file mode 100644 index 0000000..d1a41c0 --- /dev/null +++ b/dep/glm/gtx/associated_min_max.hpp @@ -0,0 +1,207 @@ +/// @ref gtx_associated_min_max +/// @file glm/gtx/associated_min_max.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_associated_min_max GLM_GTX_associated_min_max +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// @brief Min and max functions that return associated values not the compared onces. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_associated_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_associated_min_max extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_associated_min_max + /// @{ + + /// Minimum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMin(T x, U a, T y, U b); + + /// Minimum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec<2, U, Q> associatedMin( + vec const& x, vec const& a, + vec const& y, vec const& b); + + /// Minimum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + T x, const vec& a, + T y, const vec& b); + + /// Minimum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + vec const& x, U a, + vec const& y, U b); + + /// Minimum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMin( + T x, U a, + T y, U b, + T z, U c); + + /// Minimum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c); + + /// Minimum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMin( + T x, U a, + T y, U b, + T z, U c, + T w, U d); + + /// Minimum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c, + vec const& w, vec const& d); + + /// Minimum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c, + T w, vec const& d); + + /// Minimum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMin( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c, + vec const& w, U d); + + /// Maximum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMax(T x, U a, T y, U b); + + /// Maximum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec<2, U, Q> associatedMax( + vec const& x, vec const& a, + vec const& y, vec const& b); + + /// Maximum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + T x, vec const& a, + T y, vec const& b); + + /// Maximum comparison between 2 variables and returns 2 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + vec const& x, U a, + vec const& y, U b); + + /// Maximum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMax( + T x, U a, + T y, U b, + T z, U c); + + /// Maximum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c); + + /// Maximum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c); + + /// Maximum comparison between 3 variables and returns 3 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c); + + /// Maximum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL U associatedMax( + T x, U a, + T y, U b, + T z, U c, + T w, U d); + + /// Maximum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c, + vec const& w, vec const& d); + + /// Maximum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c, + T w, vec const& d); + + /// Maximum comparison between 4 variables and returns 4 associated variable values + /// @see gtx_associated_min_max + template + GLM_FUNC_DECL vec associatedMax( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c, + vec const& w, U d); + + /// @} +} //namespace glm + +#include "associated_min_max.inl" diff --git a/dep/glm/gtx/associated_min_max.inl b/dep/glm/gtx/associated_min_max.inl new file mode 100644 index 0000000..5186c47 --- /dev/null +++ b/dep/glm/gtx/associated_min_max.inl @@ -0,0 +1,354 @@ +/// @ref gtx_associated_min_max + +namespace glm{ + +// Min comparison between 2 variables +template +GLM_FUNC_QUALIFIER U associatedMin(T x, U a, T y, U b) +{ + return x < y ? a : b; +} + +template +GLM_FUNC_QUALIFIER vec<2, U, Q> associatedMin +( + vec const& x, vec const& a, + vec const& y, vec const& b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] < y[i] ? a[i] : b[i]; + return Result; +} + +template +GLM_FUNC_QUALIFIER vec associatedMin +( + T x, const vec& a, + T y, const vec& b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x < y ? a[i] : b[i]; + return Result; +} + +template +GLM_FUNC_QUALIFIER vec associatedMin +( + vec const& x, U a, + vec const& y, U b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] < y[i] ? a : b; + return Result; +} + +// Min comparison between 3 variables +template +GLM_FUNC_QUALIFIER U associatedMin +( + T x, U a, + T y, U b, + T z, U c +) +{ + U Result = x < y ? (x < z ? a : c) : (y < z ? b : c); + return Result; +} + +template +GLM_FUNC_QUALIFIER vec associatedMin +( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]); + return Result; +} + +// Min comparison between 4 variables +template +GLM_FUNC_QUALIFIER U associatedMin +( + T x, U a, + T y, U b, + T z, U c, + T w, U d +) +{ + T Test1 = min(x, y); + T Test2 = min(z, w); + U Result1 = x < y ? a : b; + U Result2 = z < w ? c : d; + U Result = Test1 < Test2 ? Result1 : Result2; + return Result; +} + +// Min comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMin +( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c, + vec const& w, vec const& d +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + T Test1 = min(x[i], y[i]); + T Test2 = min(z[i], w[i]); + U Result1 = x[i] < y[i] ? a[i] : b[i]; + U Result2 = z[i] < w[i] ? c[i] : d[i]; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMin +( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c, + T w, vec const& d +) +{ + T Test1 = min(x, y); + T Test2 = min(z, w); + + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + U Result1 = x < y ? a[i] : b[i]; + U Result2 = z < w ? c[i] : d[i]; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMin +( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c, + vec const& w, U d +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + T Test1 = min(x[i], y[i]); + T Test2 = min(z[i], w[i]); + U Result1 = x[i] < y[i] ? a : b; + U Result2 = z[i] < w[i] ? c : d; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 2 variables +template +GLM_FUNC_QUALIFIER U associatedMax(T x, U a, T y, U b) +{ + return x > y ? a : b; +} + +// Max comparison between 2 variables +template +GLM_FUNC_QUALIFIER vec<2, U, Q> associatedMax +( + vec const& x, vec const& a, + vec const& y, vec const& b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] > y[i] ? a[i] : b[i]; + return Result; +} + +// Max comparison between 2 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + T x, vec const& a, + T y, vec const& b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x > y ? a[i] : b[i]; + return Result; +} + +// Max comparison between 2 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + vec const& x, U a, + vec const& y, U b +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] > y[i] ? a : b; + return Result; +} + +// Max comparison between 3 variables +template +GLM_FUNC_QUALIFIER U associatedMax +( + T x, U a, + T y, U b, + T z, U c +) +{ + U Result = x > y ? (x > z ? a : c) : (y > z ? b : c); + return Result; +} + +// Max comparison between 3 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]); + return Result; +} + +// Max comparison between 3 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]); + return Result; +} + +// Max comparison between 3 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c); + return Result; +} + +// Max comparison between 4 variables +template +GLM_FUNC_QUALIFIER U associatedMax +( + T x, U a, + T y, U b, + T z, U c, + T w, U d +) +{ + T Test1 = max(x, y); + T Test2 = max(z, w); + U Result1 = x > y ? a : b; + U Result2 = z > w ? c : d; + U Result = Test1 > Test2 ? Result1 : Result2; + return Result; +} + +// Max comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + vec const& x, vec const& a, + vec const& y, vec const& b, + vec const& z, vec const& c, + vec const& w, vec const& d +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + T Test1 = max(x[i], y[i]); + T Test2 = max(z[i], w[i]); + U Result1 = x[i] > y[i] ? a[i] : b[i]; + U Result2 = z[i] > w[i] ? c[i] : d[i]; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + T x, vec const& a, + T y, vec const& b, + T z, vec const& c, + T w, vec const& d +) +{ + T Test1 = max(x, y); + T Test2 = max(z, w); + + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + U Result1 = x > y ? a[i] : b[i]; + U Result2 = z > w ? c[i] : d[i]; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template +GLM_FUNC_QUALIFIER vec associatedMax +( + vec const& x, U a, + vec const& y, U b, + vec const& z, U c, + vec const& w, U d +) +{ + vec Result; + for(length_t i = 0, n = Result.length(); i < n; ++i) + { + T Test1 = max(x[i], y[i]); + T Test2 = max(z[i], w[i]); + U Result1 = x[i] > y[i] ? a : b; + U Result2 = z[i] > w[i] ? c : d; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} +}//namespace glm diff --git a/dep/glm/gtx/bit.hpp b/dep/glm/gtx/bit.hpp new file mode 100644 index 0000000..60a7aef --- /dev/null +++ b/dep/glm/gtx/bit.hpp @@ -0,0 +1,98 @@ +/// @ref gtx_bit +/// @file glm/gtx/bit.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_bit GLM_GTX_bit +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../gtc/bitfield.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_bit is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_bit extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_bit + /// @{ + + /// @see gtx_bit + template + GLM_FUNC_DECL genIUType highestBitValue(genIUType Value); + + /// @see gtx_bit + template + GLM_FUNC_DECL genIUType lowestBitValue(genIUType Value); + + /// Find the highest bit set to 1 in a integer variable and return its value. + /// + /// @see gtx_bit + template + GLM_FUNC_DECL vec highestBitValue(vec const& value); + + /// Return the power of two number which value is just higher the input value. + /// Deprecated, use ceilPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoAbove(genIUType Value); + + /// Return the power of two number which value is just higher the input value. + /// Deprecated, use ceilPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL vec powerOfTwoAbove(vec const& value); + + /// Return the power of two number which value is just lower the input value. + /// Deprecated, use floorPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoBelow(genIUType Value); + + /// Return the power of two number which value is just lower the input value. + /// Deprecated, use floorPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL vec powerOfTwoBelow(vec const& value); + + /// Return the power of two number which value is the closet to the input value. + /// Deprecated, use roundPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoNearest(genIUType Value); + + /// Return the power of two number which value is the closet to the input value. + /// Deprecated, use roundPowerOfTwo from GTC_round instead + /// + /// @see gtc_round + /// @see gtx_bit + template + GLM_DEPRECATED GLM_FUNC_DECL vec powerOfTwoNearest(vec const& value); + + /// @} +} //namespace glm + + +#include "bit.inl" + diff --git a/dep/glm/gtx/bit.inl b/dep/glm/gtx/bit.inl new file mode 100644 index 0000000..621b626 --- /dev/null +++ b/dep/glm/gtx/bit.inl @@ -0,0 +1,92 @@ +/// @ref gtx_bit + +namespace glm +{ + /////////////////// + // highestBitValue + + template + GLM_FUNC_QUALIFIER genIUType highestBitValue(genIUType Value) + { + genIUType tmp = Value; + genIUType result = genIUType(0); + while(tmp) + { + result = (tmp & (~tmp + 1)); // grab lowest bit + tmp &= ~result; // clear lowest bit + } + return result; + } + + template + GLM_FUNC_QUALIFIER vec highestBitValue(vec const& v) + { + return detail::functor1::call(highestBitValue, v); + } + + /////////////////// + // lowestBitValue + + template + GLM_FUNC_QUALIFIER genIUType lowestBitValue(genIUType Value) + { + return (Value & (~Value + 1)); + } + + template + GLM_FUNC_QUALIFIER vec lowestBitValue(vec const& v) + { + return detail::functor1::call(lowestBitValue, v); + } + + /////////////////// + // powerOfTwoAbove + + template + GLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType value) + { + return isPowerOfTwo(value) ? value : highestBitValue(value) << 1; + } + + template + GLM_FUNC_QUALIFIER vec powerOfTwoAbove(vec const& v) + { + return detail::functor1::call(powerOfTwoAbove, v); + } + + /////////////////// + // powerOfTwoBelow + + template + GLM_FUNC_QUALIFIER genType powerOfTwoBelow(genType value) + { + return isPowerOfTwo(value) ? value : highestBitValue(value); + } + + template + GLM_FUNC_QUALIFIER vec powerOfTwoBelow(vec const& v) + { + return detail::functor1::call(powerOfTwoBelow, v); + } + + ///////////////////// + // powerOfTwoNearest + + template + GLM_FUNC_QUALIFIER genType powerOfTwoNearest(genType value) + { + if(isPowerOfTwo(value)) + return value; + + genType const prev = highestBitValue(value); + genType const next = prev << 1; + return (next - value) < (value - prev) ? next : prev; + } + + template + GLM_FUNC_QUALIFIER vec powerOfTwoNearest(vec const& v) + { + return detail::functor1::call(powerOfTwoNearest, v); + } + +}//namespace glm diff --git a/dep/glm/gtx/closest_point.hpp b/dep/glm/gtx/closest_point.hpp new file mode 100644 index 0000000..de6dbbf --- /dev/null +++ b/dep/glm/gtx/closest_point.hpp @@ -0,0 +1,49 @@ +/// @ref gtx_closest_point +/// @file glm/gtx/closest_point.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_closest_point GLM_GTX_closest_point +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Find the point on a straight line which is the closet of a point. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_closest_point extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_closest_point + /// @{ + + /// Find the point on a straight line which is the closet of a point. + /// @see gtx_closest_point + template + GLM_FUNC_DECL vec<3, T, Q> closestPointOnLine( + vec<3, T, Q> const& point, + vec<3, T, Q> const& a, + vec<3, T, Q> const& b); + + /// 2d lines work as well + template + GLM_FUNC_DECL vec<2, T, Q> closestPointOnLine( + vec<2, T, Q> const& point, + vec<2, T, Q> const& a, + vec<2, T, Q> const& b); + + /// @} +}// namespace glm + +#include "closest_point.inl" diff --git a/dep/glm/gtx/closest_point.inl b/dep/glm/gtx/closest_point.inl new file mode 100644 index 0000000..0a39b04 --- /dev/null +++ b/dep/glm/gtx/closest_point.inl @@ -0,0 +1,45 @@ +/// @ref gtx_closest_point + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> closestPointOnLine + ( + vec<3, T, Q> const& point, + vec<3, T, Q> const& a, + vec<3, T, Q> const& b + ) + { + T LineLength = distance(a, b); + vec<3, T, Q> Vector = point - a; + vec<3, T, Q> LineDirection = (b - a) / LineLength; + + // Project Vector to LineDirection to get the distance of point from a + T Distance = dot(Vector, LineDirection); + + if(Distance <= T(0)) return a; + if(Distance >= LineLength) return b; + return a + LineDirection * Distance; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> closestPointOnLine + ( + vec<2, T, Q> const& point, + vec<2, T, Q> const& a, + vec<2, T, Q> const& b + ) + { + T LineLength = distance(a, b); + vec<2, T, Q> Vector = point - a; + vec<2, T, Q> LineDirection = (b - a) / LineLength; + + // Project Vector to LineDirection to get the distance of point from a + T Distance = dot(Vector, LineDirection); + + if(Distance <= T(0)) return a; + if(Distance >= LineLength) return b; + return a + LineDirection * Distance; + } + +}//namespace glm diff --git a/dep/glm/gtx/color_encoding.hpp b/dep/glm/gtx/color_encoding.hpp new file mode 100644 index 0000000..96ded2a --- /dev/null +++ b/dep/glm/gtx/color_encoding.hpp @@ -0,0 +1,54 @@ +/// @ref gtx_color_encoding +/// @file glm/gtx/color_encoding.hpp +/// +/// @see core (dependence) +/// @see gtx_color_encoding (dependence) +/// +/// @defgroup gtx_color_encoding GLM_GTX_color_encoding +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// @brief Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../vec3.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTC_color_encoding is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTC_color_encoding extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_color_encoding + /// @{ + + /// Convert a linear sRGB color to D65 YUV. + template + GLM_FUNC_DECL vec<3, T, Q> convertLinearSRGBToD65XYZ(vec<3, T, Q> const& ColorLinearSRGB); + + /// Convert a linear sRGB color to D50 YUV. + template + GLM_FUNC_DECL vec<3, T, Q> convertLinearSRGBToD50XYZ(vec<3, T, Q> const& ColorLinearSRGB); + + /// Convert a D65 YUV color to linear sRGB. + template + GLM_FUNC_DECL vec<3, T, Q> convertD65XYZToLinearSRGB(vec<3, T, Q> const& ColorD65XYZ); + + /// Convert a D65 YUV color to D50 YUV. + template + GLM_FUNC_DECL vec<3, T, Q> convertD65XYZToD50XYZ(vec<3, T, Q> const& ColorD65XYZ); + + /// @} +} //namespace glm + +#include "color_encoding.inl" diff --git a/dep/glm/gtx/color_encoding.inl b/dep/glm/gtx/color_encoding.inl new file mode 100644 index 0000000..e50fa3e --- /dev/null +++ b/dep/glm/gtx/color_encoding.inl @@ -0,0 +1,45 @@ +/// @ref gtx_color_encoding + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> convertLinearSRGBToD65XYZ(vec<3, T, Q> const& ColorLinearSRGB) + { + vec<3, T, Q> const M(0.490f, 0.17697f, 0.2f); + vec<3, T, Q> const N(0.31f, 0.8124f, 0.01063f); + vec<3, T, Q> const O(0.490f, 0.01f, 0.99f); + + return (M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB) * static_cast(5.650675255693055f); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> convertLinearSRGBToD50XYZ(vec<3, T, Q> const& ColorLinearSRGB) + { + vec<3, T, Q> const M(0.436030342570117f, 0.222438466210245f, 0.013897440074263f); + vec<3, T, Q> const N(0.385101860087134f, 0.716942745571917f, 0.097076381494207f); + vec<3, T, Q> const O(0.143067806654203f, 0.060618777416563f, 0.713926257896652f); + + return M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> convertD65XYZToLinearSRGB(vec<3, T, Q> const& ColorD65XYZ) + { + vec<3, T, Q> const M(0.41847f, -0.091169f, 0.0009209f); + vec<3, T, Q> const N(-0.15866f, 0.25243f, 0.015708f); + vec<3, T, Q> const O(0.0009209f, -0.0025498f, 0.1786f); + + return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> convertD65XYZToD50XYZ(vec<3, T, Q> const& ColorD65XYZ) + { + vec<3, T, Q> const M(+1.047844353856414f, +0.029549007606644f, -0.009250984365223f); + vec<3, T, Q> const N(+0.022898981050086f, +0.990508028941971f, +0.015072338237051f); + vec<3, T, Q> const O(-0.050206647741605f, -0.017074711360960f, +0.751717835079977f); + + return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; + } + +}//namespace glm diff --git a/dep/glm/gtx/color_space.hpp b/dep/glm/gtx/color_space.hpp new file mode 100644 index 0000000..a634392 --- /dev/null +++ b/dep/glm/gtx/color_space.hpp @@ -0,0 +1,72 @@ +/// @ref gtx_color_space +/// @file glm/gtx/color_space.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_color_space GLM_GTX_color_space +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Related to RGB to HSV conversions and operations. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_color_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_color_space extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_color_space + /// @{ + + /// Converts a color from HSV color space to its color in RGB color space. + /// @see gtx_color_space + template + GLM_FUNC_DECL vec<3, T, Q> rgbColor( + vec<3, T, Q> const& hsvValue); + + /// Converts a color from RGB color space to its color in HSV color space. + /// @see gtx_color_space + template + GLM_FUNC_DECL vec<3, T, Q> hsvColor( + vec<3, T, Q> const& rgbValue); + + /// Build a saturation matrix. + /// @see gtx_color_space + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> saturation( + T const s); + + /// Modify the saturation of a color. + /// @see gtx_color_space + template + GLM_FUNC_DECL vec<3, T, Q> saturation( + T const s, + vec<3, T, Q> const& color); + + /// Modify the saturation of a color. + /// @see gtx_color_space + template + GLM_FUNC_DECL vec<4, T, Q> saturation( + T const s, + vec<4, T, Q> const& color); + + /// Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB canals. + /// @see gtx_color_space + template + GLM_FUNC_DECL T luminosity( + vec<3, T, Q> const& color); + + /// @} +}//namespace glm + +#include "color_space.inl" diff --git a/dep/glm/gtx/color_space.inl b/dep/glm/gtx/color_space.inl new file mode 100644 index 0000000..f698afe --- /dev/null +++ b/dep/glm/gtx/color_space.inl @@ -0,0 +1,141 @@ +/// @ref gtx_color_space + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rgbColor(const vec<3, T, Q>& hsvColor) + { + vec<3, T, Q> hsv = hsvColor; + vec<3, T, Q> rgbColor; + + if(hsv.y == static_cast(0)) + // achromatic (grey) + rgbColor = vec<3, T, Q>(hsv.z); + else + { + T sector = floor(hsv.x * (T(1) / T(60))); + T frac = (hsv.x * (T(1) / T(60))) - sector; + // factorial part of h + T o = hsv.z * (T(1) - hsv.y); + T p = hsv.z * (T(1) - hsv.y * frac); + T q = hsv.z * (T(1) - hsv.y * (T(1) - frac)); + + switch(int(sector)) + { + default: + case 0: + rgbColor.r = hsv.z; + rgbColor.g = q; + rgbColor.b = o; + break; + case 1: + rgbColor.r = p; + rgbColor.g = hsv.z; + rgbColor.b = o; + break; + case 2: + rgbColor.r = o; + rgbColor.g = hsv.z; + rgbColor.b = q; + break; + case 3: + rgbColor.r = o; + rgbColor.g = p; + rgbColor.b = hsv.z; + break; + case 4: + rgbColor.r = q; + rgbColor.g = o; + rgbColor.b = hsv.z; + break; + case 5: + rgbColor.r = hsv.z; + rgbColor.g = o; + rgbColor.b = p; + break; + } + } + + return rgbColor; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> hsvColor(const vec<3, T, Q>& rgbColor) + { + vec<3, T, Q> hsv = rgbColor; + float Min = min(min(rgbColor.r, rgbColor.g), rgbColor.b); + float Max = max(max(rgbColor.r, rgbColor.g), rgbColor.b); + float Delta = Max - Min; + + hsv.z = Max; + + if(Max != static_cast(0)) + { + hsv.y = Delta / hsv.z; + T h = static_cast(0); + + if(rgbColor.r == Max) + // between yellow & magenta + h = static_cast(0) + T(60) * (rgbColor.g - rgbColor.b) / Delta; + else if(rgbColor.g == Max) + // between cyan & yellow + h = static_cast(120) + T(60) * (rgbColor.b - rgbColor.r) / Delta; + else + // between magenta & cyan + h = static_cast(240) + T(60) * (rgbColor.r - rgbColor.g) / Delta; + + if(h < T(0)) + hsv.x = h + T(360); + else + hsv.x = h; + } + else + { + // If r = g = b = 0 then s = 0, h is undefined + hsv.y = static_cast(0); + hsv.x = static_cast(0); + } + + return hsv; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> saturation(T const s) + { + vec<3, T, defaultp> rgbw = vec<3, T, defaultp>(T(0.2126), T(0.7152), T(0.0722)); + + vec<3, T, defaultp> const col((T(1) - s) * rgbw); + + mat<4, 4, T, defaultp> result(T(1)); + result[0][0] = col.x + s; + result[0][1] = col.x; + result[0][2] = col.x; + result[1][0] = col.y; + result[1][1] = col.y + s; + result[1][2] = col.y; + result[2][0] = col.z; + result[2][1] = col.z; + result[2][2] = col.z + s; + + return result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> saturation(const T s, const vec<3, T, Q>& color) + { + return vec<3, T, Q>(saturation(s) * vec<4, T, Q>(color, T(0))); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> saturation(const T s, const vec<4, T, Q>& color) + { + return saturation(s) * color; + } + + template + GLM_FUNC_QUALIFIER T luminosity(const vec<3, T, Q>& color) + { + const vec<3, T, Q> tmp = vec<3, T, Q>(0.33, 0.59, 0.11); + return dot(color, tmp); + } +}//namespace glm diff --git a/dep/glm/gtx/color_space_YCoCg.hpp b/dep/glm/gtx/color_space_YCoCg.hpp new file mode 100644 index 0000000..dd2b771 --- /dev/null +++ b/dep/glm/gtx/color_space_YCoCg.hpp @@ -0,0 +1,60 @@ +/// @ref gtx_color_space_YCoCg +/// @file glm/gtx/color_space_YCoCg.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_color_space_YCoCg GLM_GTX_color_space_YCoCg +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// RGB to YCoCg conversions and operations + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_color_space_YCoCg is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_color_space_YCoCg extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_color_space_YCoCg + /// @{ + + /// Convert a color from RGB color space to YCoCg color space. + /// @see gtx_color_space_YCoCg + template + GLM_FUNC_DECL vec<3, T, Q> rgb2YCoCg( + vec<3, T, Q> const& rgbColor); + + /// Convert a color from YCoCg color space to RGB color space. + /// @see gtx_color_space_YCoCg + template + GLM_FUNC_DECL vec<3, T, Q> YCoCg2rgb( + vec<3, T, Q> const& YCoCgColor); + + /// Convert a color from RGB color space to YCoCgR color space. + /// @see "YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range" + /// @see gtx_color_space_YCoCg + template + GLM_FUNC_DECL vec<3, T, Q> rgb2YCoCgR( + vec<3, T, Q> const& rgbColor); + + /// Convert a color from YCoCgR color space to RGB color space. + /// @see "YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range" + /// @see gtx_color_space_YCoCg + template + GLM_FUNC_DECL vec<3, T, Q> YCoCgR2rgb( + vec<3, T, Q> const& YCoCgColor); + + /// @} +}//namespace glm + +#include "color_space_YCoCg.inl" diff --git a/dep/glm/gtx/color_space_YCoCg.inl b/dep/glm/gtx/color_space_YCoCg.inl new file mode 100644 index 0000000..83ba857 --- /dev/null +++ b/dep/glm/gtx/color_space_YCoCg.inl @@ -0,0 +1,107 @@ +/// @ref gtx_color_space_YCoCg + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCg + ( + vec<3, T, Q> const& rgbColor + ) + { + vec<3, T, Q> result; + result.x/*Y */ = rgbColor.r / T(4) + rgbColor.g / T(2) + rgbColor.b / T(4); + result.y/*Co*/ = rgbColor.r / T(2) + rgbColor.g * T(0) - rgbColor.b / T(2); + result.z/*Cg*/ = - rgbColor.r / T(4) + rgbColor.g / T(2) - rgbColor.b / T(4); + return result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCg2rgb + ( + vec<3, T, Q> const& YCoCgColor + ) + { + vec<3, T, Q> result; + result.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z; + result.g = YCoCgColor.x + YCoCgColor.z; + result.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z; + return result; + } + + template + class compute_YCoCgR { + public: + static GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR + ( + vec<3, T, Q> const& rgbColor + ) + { + vec<3, T, Q> result; + result.x/*Y */ = rgbColor.g * static_cast(0.5) + (rgbColor.r + rgbColor.b) * static_cast(0.25); + result.y/*Co*/ = rgbColor.r - rgbColor.b; + result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) * static_cast(0.5); + return result; + } + + static GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb + ( + vec<3, T, Q> const& YCoCgRColor + ) + { + vec<3, T, Q> result; + T tmp = YCoCgRColor.x - (YCoCgRColor.z * static_cast(0.5)); + result.g = YCoCgRColor.z + tmp; + result.b = tmp - (YCoCgRColor.y * static_cast(0.5)); + result.r = result.b + YCoCgRColor.y; + return result; + } + }; + + template + class compute_YCoCgR { + public: + static GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR + ( + vec<3, T, Q> const& rgbColor + ) + { + vec<3, T, Q> result; + result.y/*Co*/ = rgbColor.r - rgbColor.b; + T tmp = rgbColor.b + (result.y >> 1); + result.z/*Cg*/ = rgbColor.g - tmp; + result.x/*Y */ = tmp + (result.z >> 1); + return result; + } + + static GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb + ( + vec<3, T, Q> const& YCoCgRColor + ) + { + vec<3, T, Q> result; + T tmp = YCoCgRColor.x - (YCoCgRColor.z >> 1); + result.g = YCoCgRColor.z + tmp; + result.b = tmp - (YCoCgRColor.y >> 1); + result.r = result.b + YCoCgRColor.y; + return result; + } + }; + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR + ( + vec<3, T, Q> const& rgbColor + ) + { + return compute_YCoCgR::is_integer>::rgb2YCoCgR(rgbColor); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb + ( + vec<3, T, Q> const& YCoCgRColor + ) + { + return compute_YCoCgR::is_integer>::YCoCgR2rgb(YCoCgRColor); + } +}//namespace glm diff --git a/dep/glm/gtx/common.hpp b/dep/glm/gtx/common.hpp new file mode 100644 index 0000000..254ada2 --- /dev/null +++ b/dep/glm/gtx/common.hpp @@ -0,0 +1,76 @@ +/// @ref gtx_common +/// @file glm/gtx/common.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_common GLM_GTX_common +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// @brief Provide functions to increase the compatibility with Cg and HLSL languages + +#pragma once + +// Dependencies: +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../gtc/vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_common is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_common extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_common + /// @{ + + /// Returns true if x is a denormalized number + /// Numbers whose absolute value is too small to be represented in the normal format are represented in an alternate, denormalized format. + /// This format is less precise but can represent values closer to zero. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see GLSL isnan man page + /// @see GLSL 4.20.8 specification, section 8.3 Common Functions + template + GLM_FUNC_DECL typename genType::bool_type isdenormal(genType const& x); + + /// Similar to 'mod' but with a different rounding and integer support. + /// Returns 'x - y * trunc(x/y)' instead of 'x - y * floor(x/y)' + /// + /// @see GLSL mod vs HLSL fmod + /// @see GLSL mod man page + template + GLM_FUNC_DECL vec fmod(vec const& v); + + /// Returns whether vector components values are within an interval. A open interval excludes its endpoints, and is denoted with square brackets. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_relational + template + GLM_FUNC_DECL vec openBounded(vec const& Value, vec const& Min, vec const& Max); + + /// Returns whether vector components values are within an interval. A closed interval includes its endpoints, and is denoted with square brackets. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_relational + template + GLM_FUNC_DECL vec closeBounded(vec const& Value, vec const& Min, vec const& Max); + + /// @} +}//namespace glm + +#include "common.inl" diff --git a/dep/glm/gtx/common.inl b/dep/glm/gtx/common.inl new file mode 100644 index 0000000..4ad2126 --- /dev/null +++ b/dep/glm/gtx/common.inl @@ -0,0 +1,125 @@ +/// @ref gtx_common + +#include +#include "../gtc/epsilon.hpp" +#include "../gtc/constants.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_fmod + { + GLM_FUNC_QUALIFIER static vec call(vec const& a, vec const& b) + { + return detail::functor2::call(std::fmod, a, b); + } + }; + + template + struct compute_fmod + { + GLM_FUNC_QUALIFIER static vec call(vec const& a, vec const& b) + { + return a % b; + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER bool isdenormal(T const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isdenormal' only accept floating-point inputs"); + +# if GLM_HAS_CXX11_STL + return std::fpclassify(x) == FP_SUBNORMAL; +# else + return epsilonNotEqual(x, static_cast(0), epsilon()) && std::fabs(x) < std::numeric_limits::min(); +# endif + } + + template + GLM_FUNC_QUALIFIER typename vec<1, T, Q>::bool_type isdenormal + ( + vec<1, T, Q> const& x + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isdenormal' only accept floating-point inputs"); + + return typename vec<1, T, Q>::bool_type( + isdenormal(x.x)); + } + + template + GLM_FUNC_QUALIFIER typename vec<2, T, Q>::bool_type isdenormal + ( + vec<2, T, Q> const& x + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isdenormal' only accept floating-point inputs"); + + return typename vec<2, T, Q>::bool_type( + isdenormal(x.x), + isdenormal(x.y)); + } + + template + GLM_FUNC_QUALIFIER typename vec<3, T, Q>::bool_type isdenormal + ( + vec<3, T, Q> const& x + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isdenormal' only accept floating-point inputs"); + + return typename vec<3, T, Q>::bool_type( + isdenormal(x.x), + isdenormal(x.y), + isdenormal(x.z)); + } + + template + GLM_FUNC_QUALIFIER typename vec<4, T, Q>::bool_type isdenormal + ( + vec<4, T, Q> const& x + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isdenormal' only accept floating-point inputs"); + + return typename vec<4, T, Q>::bool_type( + isdenormal(x.x), + isdenormal(x.y), + isdenormal(x.z), + isdenormal(x.w)); + } + + // fmod + template + GLM_FUNC_QUALIFIER genType fmod(genType x, genType y) + { + return fmod(vec<1, genType>(x), y).x; + } + + template + GLM_FUNC_QUALIFIER vec fmod(vec const& x, T y) + { + return detail::compute_fmod::is_iec559>::call(x, vec(y)); + } + + template + GLM_FUNC_QUALIFIER vec fmod(vec const& x, vec const& y) + { + return detail::compute_fmod::is_iec559>::call(x, y); + } + + template + GLM_FUNC_QUALIFIER vec openBounded(vec const& Value, vec const& Min, vec const& Max) + { + return greaterThan(Value, Min) && lessThan(Value, Max); + } + + template + GLM_FUNC_QUALIFIER vec closeBounded(vec const& Value, vec const& Min, vec const& Max) + { + return greaterThanEqual(Value, Min) && lessThanEqual(Value, Max); + } +}//namespace glm diff --git a/dep/glm/gtx/compatibility.hpp b/dep/glm/gtx/compatibility.hpp new file mode 100644 index 0000000..f1b00a6 --- /dev/null +++ b/dep/glm/gtx/compatibility.hpp @@ -0,0 +1,133 @@ +/// @ref gtx_compatibility +/// @file glm/gtx/compatibility.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_compatibility GLM_GTX_compatibility +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Provide functions to increase the compatibility with Cg and HLSL languages + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/quaternion.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_compatibility is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_compatibility extension included") +# endif +#endif + +#if GLM_COMPILER & GLM_COMPILER_VC +# include +#elif GLM_COMPILER & GLM_COMPILER_GCC +# include +# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID) +# undef isfinite +# endif +#endif//GLM_COMPILER + +namespace glm +{ + /// @addtogroup gtx_compatibility + /// @{ + + template GLM_FUNC_QUALIFIER T lerp(T x, T y, T a){return mix(x, y, a);} //!< \brief 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]. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<2, T, Q> lerp(const vec<2, T, Q>& x, const vec<2, T, Q>& y, T a){return mix(x, y, a);} //!< \brief 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]. (From GLM_GTX_compatibility) + + template GLM_FUNC_QUALIFIER vec<3, T, Q> lerp(const vec<3, T, Q>& x, const vec<3, T, Q>& y, T a){return mix(x, y, a);} //!< \brief 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]. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<4, T, Q> lerp(const vec<4, T, Q>& x, const vec<4, T, Q>& y, T a){return mix(x, y, a);} //!< \brief 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]. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<2, T, Q> lerp(const vec<2, T, Q>& x, const vec<2, T, Q>& y, const vec<2, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<3, T, Q> lerp(const vec<3, T, Q>& x, const vec<3, T, Q>& y, const vec<3, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<4, T, Q> lerp(const vec<4, T, Q>& x, const vec<4, T, Q>& y, const vec<4, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + + template GLM_FUNC_QUALIFIER T saturate(T x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<2, T, Q> saturate(const vec<2, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<3, T, Q> saturate(const vec<3, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template GLM_FUNC_QUALIFIER vec<4, T, Q> saturate(const vec<4, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + + template GLM_FUNC_QUALIFIER T atan2(T x, T 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_QUALIFIER vec<2, T, Q> atan2(const vec<2, T, Q>& x, const vec<2, T, Q>& 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_QUALIFIER vec<3, T, Q> atan2(const vec<3, T, Q>& x, const vec<3, T, Q>& 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_QUALIFIER vec<4, T, Q> atan2(const vec<4, T, Q>& x, const vec<4, T, Q>& 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 vec<1, bool, Q> isfinite(const vec<1, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template GLM_FUNC_DECL vec<2, bool, Q> isfinite(const vec<2, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template GLM_FUNC_DECL vec<3, bool, Q> isfinite(const vec<3, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template GLM_FUNC_DECL vec<4, bool, Q> isfinite(const vec<4, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + + typedef bool bool1; //!< \brief boolean type with 1 component. (From GLM_GTX_compatibility extension) + typedef vec<2, bool, highp> bool2; //!< \brief boolean type with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, bool, highp> bool3; //!< \brief boolean type with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, bool, highp> bool4; //!< \brief boolean type with 4 components. (From GLM_GTX_compatibility extension) + + typedef bool bool1x1; //!< \brief boolean matrix with 1 x 1 component. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, bool, highp> bool2x2; //!< \brief boolean matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, bool, highp> bool2x3; //!< \brief boolean matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, bool, highp> bool2x4; //!< \brief boolean matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, bool, highp> bool3x2; //!< \brief boolean matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, bool, highp> bool3x3; //!< \brief boolean matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, bool, highp> bool3x4; //!< \brief boolean matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, bool, highp> bool4x2; //!< \brief boolean matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, bool, highp> bool4x3; //!< \brief boolean matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, bool, highp> bool4x4; //!< \brief boolean matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef int int1; //!< \brief integer vector with 1 component. (From GLM_GTX_compatibility extension) + typedef vec<2, int, highp> int2; //!< \brief integer vector with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, int, highp> int3; //!< \brief integer vector with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, int, highp> int4; //!< \brief integer vector with 4 components. (From GLM_GTX_compatibility extension) + + typedef int int1x1; //!< \brief integer matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, int, highp> int2x2; //!< \brief integer matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, int, highp> int2x3; //!< \brief integer matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, int, highp> int2x4; //!< \brief integer matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, int, highp> int3x2; //!< \brief integer matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, int, highp> int3x3; //!< \brief integer matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, int, highp> int3x4; //!< \brief integer matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, int, highp> int4x2; //!< \brief integer matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, int, highp> int4x3; //!< \brief integer matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, int, highp> int4x4; //!< \brief integer matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef float float1; //!< \brief single-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) + typedef vec<2, float, highp> float2; //!< \brief single-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, float, highp> float3; //!< \brief single-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, float, highp> float4; //!< \brief single-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) + + typedef float float1x1; //!< \brief single-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, float, highp> float2x2; //!< \brief single-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, float, highp> float2x3; //!< \brief single-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, float, highp> float2x4; //!< \brief single-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, float, highp> float3x2; //!< \brief single-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, float, highp> float3x3; //!< \brief single-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, float, highp> float3x4; //!< \brief single-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, float, highp> float4x2; //!< \brief single-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, float, highp> float4x3; //!< \brief single-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, float, highp> float4x4; //!< \brief single-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef double double1; //!< \brief double-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) + typedef vec<2, double, highp> double2; //!< \brief double-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, double, highp> double3; //!< \brief double-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, double, highp> double4; //!< \brief double-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) + + typedef double double1x1; //!< \brief double-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, double, highp> double2x2; //!< \brief double-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, double, highp> double2x3; //!< \brief double-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, double, highp> double2x4; //!< \brief double-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, double, highp> double3x2; //!< \brief double-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, double, highp> double3x3; //!< \brief double-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, double, highp> double3x4; //!< \brief double-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, double, highp> double4x2; //!< \brief double-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, double, highp> double4x3; //!< \brief double-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, double, highp> double4x4; //!< \brief double-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + /// @} +}//namespace glm + +#include "compatibility.inl" diff --git a/dep/glm/gtx/compatibility.inl b/dep/glm/gtx/compatibility.inl new file mode 100644 index 0000000..1d49496 --- /dev/null +++ b/dep/glm/gtx/compatibility.inl @@ -0,0 +1,62 @@ +#include + +namespace glm +{ + // isfinite + template + GLM_FUNC_QUALIFIER bool isfinite( + genType const& x) + { +# if GLM_HAS_CXX11_STL + return std::isfinite(x) != 0; +# elif GLM_COMPILER & GLM_COMPILER_VC + return _finite(x) != 0; +# elif GLM_COMPILER & GLM_COMPILER_GCC && GLM_PLATFORM & GLM_PLATFORM_ANDROID + return _isfinite(x) != 0; +# else + 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 vec<1, bool, Q> isfinite( + vec<1, T, Q> const& x) + { + return vec<1, bool, Q>( + isfinite(x.x)); + } + + template + GLM_FUNC_QUALIFIER vec<2, bool, Q> isfinite( + vec<2, T, Q> const& x) + { + return vec<2, bool, Q>( + isfinite(x.x), + isfinite(x.y)); + } + + template + GLM_FUNC_QUALIFIER vec<3, bool, Q> isfinite( + vec<3, T, Q> const& x) + { + return vec<3, bool, Q>( + isfinite(x.x), + isfinite(x.y), + isfinite(x.z)); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> isfinite( + vec<4, T, Q> const& x) + { + return vec<4, bool, Q>( + isfinite(x.x), + isfinite(x.y), + isfinite(x.z), + isfinite(x.w)); + } + +}//namespace glm diff --git a/dep/glm/gtx/component_wise.hpp b/dep/glm/gtx/component_wise.hpp new file mode 100644 index 0000000..34a2b0a --- /dev/null +++ b/dep/glm/gtx/component_wise.hpp @@ -0,0 +1,69 @@ +/// @ref gtx_component_wise +/// @file glm/gtx/component_wise.hpp +/// @date 2007-05-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_component_wise GLM_GTX_component_wise +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Operations between components of a type + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_component_wise is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_component_wise extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_component_wise + /// @{ + + /// Convert an integer vector to a normalized float vector. + /// If the parameter value type is already a floating qualifier type, the value is passed through. + /// @see gtx_component_wise + template + GLM_FUNC_DECL vec compNormalize(vec const& v); + + /// Convert a normalized float vector to an integer vector. + /// If the parameter value type is already a floating qualifier type, the value is passed through. + /// @see gtx_component_wise + template + GLM_FUNC_DECL vec compScale(vec const& v); + + /// Add all vector components together. + /// @see gtx_component_wise + template + GLM_FUNC_DECL typename genType::value_type compAdd(genType const& v); + + /// Multiply all vector components together. + /// @see gtx_component_wise + template + GLM_FUNC_DECL typename genType::value_type compMul(genType const& v); + + /// Find the minimum value between single vector components. + /// @see gtx_component_wise + template + GLM_FUNC_DECL typename genType::value_type compMin(genType const& v); + + /// Find the maximum value between single vector components. + /// @see gtx_component_wise + template + GLM_FUNC_DECL typename genType::value_type compMax(genType const& v); + + /// @} +}//namespace glm + +#include "component_wise.inl" diff --git a/dep/glm/gtx/component_wise.inl b/dep/glm/gtx/component_wise.inl new file mode 100644 index 0000000..cbbc7d4 --- /dev/null +++ b/dep/glm/gtx/component_wise.inl @@ -0,0 +1,127 @@ +/// @ref gtx_component_wise + +#include + +namespace glm{ +namespace detail +{ + template + struct compute_compNormalize + {}; + + template + struct compute_compNormalize + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + floatType const Min = static_cast(std::numeric_limits::min()); + floatType const Max = static_cast(std::numeric_limits::max()); + return (vec(v) - Min) / (Max - Min) * static_cast(2) - static_cast(1); + } + }; + + template + struct compute_compNormalize + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + return vec(v) / static_cast(std::numeric_limits::max()); + } + }; + + template + struct compute_compNormalize + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + return v; + } + }; + + template + struct compute_compScale + {}; + + template + struct compute_compScale + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + floatType const Max = static_cast(std::numeric_limits::max()) + static_cast(0.5); + vec const Scaled(v * Max); + vec const Result(Scaled - static_cast(0.5)); + return Result; + } + }; + + template + struct compute_compScale + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + return vec(vec(v) * static_cast(std::numeric_limits::max())); + } + }; + + template + struct compute_compScale + { + GLM_FUNC_QUALIFIER static vec call(vec const& v) + { + return v; + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER vec compNormalize(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'compNormalize' accepts only floating-point types for 'floatType' template parameter"); + + return detail::compute_compNormalize::is_integer, std::numeric_limits::is_signed>::call(v); + } + + template + GLM_FUNC_QUALIFIER vec compScale(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'compScale' accepts only floating-point types for 'floatType' template parameter"); + + return detail::compute_compScale::is_integer, std::numeric_limits::is_signed>::call(v); + } + + template + GLM_FUNC_QUALIFIER T compAdd(vec const& v) + { + T Result(0); + for(length_t i = 0, n = v.length(); i < n; ++i) + Result += v[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER T compMul(vec const& v) + { + T Result(1); + for(length_t i = 0, n = v.length(); i < n; ++i) + Result *= v[i]; + return Result; + } + + template + GLM_FUNC_QUALIFIER T compMin(vec const& v) + { + T Result(v[0]); + for(length_t i = 1, n = v.length(); i < n; ++i) + Result = min(Result, v[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER T compMax(vec const& v) + { + T Result(v[0]); + for(length_t i = 1, n = v.length(); i < n; ++i) + Result = max(Result, v[i]); + return Result; + } +}//namespace glm diff --git a/dep/glm/gtx/dual_quaternion.hpp b/dep/glm/gtx/dual_quaternion.hpp new file mode 100644 index 0000000..6a51ab7 --- /dev/null +++ b/dep/glm/gtx/dual_quaternion.hpp @@ -0,0 +1,274 @@ +/// @ref gtx_dual_quaternion +/// @file glm/gtx/dual_quaternion.hpp +/// @author Maksim Vorobiev (msomeone@gmail.com) +/// +/// @see core (dependence) +/// @see gtc_constants (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_dual_quaternion GLM_GTX_dual_quaternion +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defines a templated dual-quaternion type and several dual-quaternion operations. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/constants.hpp" +#include "../gtc/quaternion.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_dual_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_dual_quaternion extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_dual_quaternion + /// @{ + + template + struct tdualquat + { + // -- Implementation detail -- + + typedef T value_type; + typedef qua part_type; + + // -- Data -- + + qua real, dual; + + // -- Component accesses -- + + typedef length_t length_type; + /// Return the count of components of a dual quaternion + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 2;} + + GLM_FUNC_DECL part_type & operator[](length_type i); + GLM_FUNC_DECL part_type const& operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat() GLM_DEFAULT; + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat const& d) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat const& d); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(qua const& real); + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(qua const& orientation, vec<3, T, Q> const& translation); + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(qua const& real, qua const& dual); + + // -- Conversion constructors -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tdualquat(tdualquat const& q); + + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR tdualquat(mat<2, 4, T, Q> const& holder_mat); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR tdualquat(mat<3, 4, T, Q> const& aug_mat); + + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL tdualquat & operator=(tdualquat const& m) GLM_DEFAULT; + + template + GLM_FUNC_DECL tdualquat & operator=(tdualquat const& m); + template + GLM_FUNC_DECL tdualquat & operator*=(U s); + template + GLM_FUNC_DECL tdualquat & operator/=(U s); + }; + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL tdualquat operator+(tdualquat const& q); + + template + GLM_FUNC_DECL tdualquat operator-(tdualquat const& q); + + // -- Binary operators -- + + 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 vec<3, T, Q> operator*(tdualquat const& q, vec<3, T, Q> const& v); + + template + GLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v, tdualquat const& q); + + template + GLM_FUNC_DECL vec<4, T, Q> operator*(tdualquat const& q, vec<4, T, Q> const& v); + + template + GLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v, tdualquat 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, T const& s); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(tdualquat const& q1, tdualquat const& q2); + + template + GLM_FUNC_DECL bool operator!=(tdualquat const& q1, tdualquat const& q2); + + /// Creates an identity dual quaternion. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL tdualquat dual_quat_identity(); + + /// Returns the normalized quaternion. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL tdualquat normalize(tdualquat const& q); + + /// Returns the linear interpolation of two dual quaternion. + /// + /// @see gtc_dual_quaternion + template + GLM_FUNC_DECL tdualquat lerp(tdualquat const& x, tdualquat const& y, T const& a); + + /// Returns the q inverse. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL tdualquat inverse(tdualquat const& q); + + /// Converts a quaternion to a 2 * 4 matrix. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL mat<2, 4, T, Q> mat2x4_cast(tdualquat const& x); + + /// Converts a quaternion to a 3 * 4 matrix. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL mat<3, 4, T, Q> mat3x4_cast(tdualquat const& x); + + /// Converts a 2 * 4 matrix (matrix which holds real and dual parts) to a quaternion. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL tdualquat dualquat_cast(mat<2, 4, T, Q> const& x); + + /// Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a quaternion. + /// + /// @see gtx_dual_quaternion + template + GLM_FUNC_DECL tdualquat dualquat_cast(mat<3, 4, T, Q> const& x); + + + /// Dual-quaternion of low single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat lowp_dualquat; + + /// Dual-quaternion of medium single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat mediump_dualquat; + + /// Dual-quaternion of high single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat highp_dualquat; + + + /// Dual-quaternion of low single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat lowp_fdualquat; + + /// Dual-quaternion of medium single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat mediump_fdualquat; + + /// Dual-quaternion of high single-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat highp_fdualquat; + + + /// Dual-quaternion of low double-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat lowp_ddualquat; + + /// Dual-quaternion of medium double-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef tdualquat mediump_ddualquat; + + /// Dual-quaternion of high double-qualifier 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-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef highp_fdualquat fdualquat; +#elif(defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) + typedef highp_fdualquat dualquat; + typedef highp_fdualquat fdualquat; +#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) + typedef mediump_fdualquat dualquat; + typedef mediump_fdualquat fdualquat; +#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && defined(GLM_PRECISION_LOWP_FLOAT)) + typedef lowp_fdualquat dualquat; + typedef lowp_fdualquat fdualquat; +#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-qualifier floating-point numbers. + /// + /// @see gtx_dual_quaternion + typedef highp_ddualquat ddualquat; +#elif(defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) + typedef highp_ddualquat ddualquat; +#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) + typedef mediump_ddualquat ddualquat; +#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && defined(GLM_PRECISION_LOWP_DOUBLE)) + typedef lowp_ddualquat ddualquat; +#else +# error "GLM error: Multiple default precision requested for double-precision floating-point types" +#endif + + /// @} +} //namespace glm + +#include "dual_quaternion.inl" diff --git a/dep/glm/gtx/dual_quaternion.inl b/dep/glm/gtx/dual_quaternion.inl new file mode 100644 index 0000000..fad07ea --- /dev/null +++ b/dep/glm/gtx/dual_quaternion.inl @@ -0,0 +1,352 @@ +/// @ref gtx_dual_quaternion + +#include "../geometric.hpp" +#include + +namespace glm +{ + // -- Component accesses -- + + template + GLM_FUNC_QUALIFIER typename tdualquat::part_type & tdualquat::operator[](typename tdualquat::length_type i) + { + assert(i >= 0 && i < this->length()); + return (&real)[i]; + } + + template + GLM_FUNC_QUALIFIER typename tdualquat::part_type const& tdualquat::operator[](typename tdualquat::length_type i) const + { + assert(i >= 0 && i < this->length()); + return (&real)[i]; + } + + // -- Implicit basic constructors -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat() +# if GLM_CONFIG_DEFAULTED_FUNCTIONS != GLM_DISABLE + : real(qua()) + , dual(qua(0, 0, 0, 0)) +# endif + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(tdualquat const& d) + : real(d.real) + , dual(d.dual) + {} +# endif + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(tdualquat const& d) + : real(d.real) + , dual(d.dual) + {} + + // -- Explicit basic constructors -- + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(qua const& r) + : real(r), dual(qua(0, 0, 0, 0)) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(qua const& q, vec<3, T, Q> const& p) + : real(q), dual( + T(-0.5) * ( p.x*q.x + p.y*q.y + p.z*q.z), + T(+0.5) * ( p.x*q.w + p.y*q.z - p.z*q.y), + T(+0.5) * (-p.x*q.z + p.y*q.w + p.z*q.x), + T(+0.5) * ( p.x*q.y - p.y*q.x + p.z*q.w)) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(qua const& r, qua const& d) + : real(r), dual(d) + {} + + // -- Conversion constructors -- + + template + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(tdualquat const& q) + : real(q.real) + , dual(q.dual) + {} + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(mat<2, 4, T, Q> const& m) + { + *this = dualquat_cast(m); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat::tdualquat(mat<3, 4, T, Q> const& m) + { + *this = dualquat_cast(m); + } + + // -- Unary arithmetic operators -- + +# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE + template + GLM_FUNC_QUALIFIER tdualquat & tdualquat::operator=(tdualquat const& q) + { + this->real = q.real; + this->dual = q.dual; + return *this; + } +# endif + + template + template + GLM_FUNC_QUALIFIER tdualquat & tdualquat::operator=(tdualquat const& q) + { + this->real = q.real; + this->dual = q.dual; + return *this; + } + + template + template + GLM_FUNC_QUALIFIER tdualquat & tdualquat::operator*=(U s) + { + this->real *= static_cast(s); + this->dual *= static_cast(s); + return *this; + } + + template + template + GLM_FUNC_QUALIFIER tdualquat & tdualquat::operator/=(U s) + { + this->real /= static_cast(s); + this->dual /= static_cast(s); + return *this; + } + + // -- Unary bit operators -- + + template + GLM_FUNC_QUALIFIER tdualquat operator+(tdualquat const& q) + { + return q; + } + + template + GLM_FUNC_QUALIFIER tdualquat operator-(tdualquat const& q) + { + return tdualquat(-q.real, -q.dual); + } + + // -- Binary operators -- + + template + GLM_FUNC_QUALIFIER tdualquat operator+(tdualquat const& q, tdualquat const& p) + { + return tdualquat(q.real + p.real,q.dual + p.dual); + } + + template + GLM_FUNC_QUALIFIER tdualquat operator*(tdualquat const& p, tdualquat const& o) + { + return tdualquat(p.real * o.real,p.real * o.dual + p.dual * o.real); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(tdualquat const& q, vec<3, T, Q> const& v) + { + vec<3, T, Q> const real_v3(q.real.x,q.real.y,q.real.z); + vec<3, T, Q> const dual_v3(q.dual.x,q.dual.y,q.dual.z); + return (cross(real_v3, cross(real_v3,v) + v * q.real.w + dual_v3) + dual_v3 * q.real.w - real_v3 * q.dual.w) * T(2) + v; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v, tdualquat const& q) + { + return glm::inverse(q) * v; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(tdualquat const& q, vec<4, T, Q> const& v) + { + return vec<4, T, Q>(q * vec<3, T, Q>(v), v.w); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v, tdualquat const& q) + { + return glm::inverse(q) * v; + } + + template + GLM_FUNC_QUALIFIER tdualquat operator*(tdualquat const& q, T const& s) + { + return tdualquat(q.real * s, q.dual * s); + } + + template + GLM_FUNC_QUALIFIER tdualquat operator*(T const& s, tdualquat const& q) + { + return q * s; + } + + template + GLM_FUNC_QUALIFIER tdualquat operator/(tdualquat const& q, T const& s) + { + return tdualquat(q.real / s, q.dual / s); + } + + // -- Boolean operators -- + + template + GLM_FUNC_QUALIFIER bool operator==(tdualquat const& q1, tdualquat const& q2) + { + return (q1.real == q2.real) && (q1.dual == q2.dual); + } + + template + GLM_FUNC_QUALIFIER bool operator!=(tdualquat const& q1, tdualquat const& q2) + { + return (q1.real != q2.real) || (q1.dual != q2.dual); + } + + // -- Operations -- + + template + GLM_FUNC_QUALIFIER tdualquat dual_quat_identity() + { + return tdualquat( + qua(static_cast(1), static_cast(0), static_cast(0), static_cast(0)), + qua(static_cast(0), static_cast(0), static_cast(0), static_cast(0))); + } + + template + GLM_FUNC_QUALIFIER tdualquat normalize(tdualquat const& q) + { + return q / length(q.real); + } + + template + GLM_FUNC_QUALIFIER tdualquat lerp(tdualquat const& x, tdualquat const& y, T const& a) + { + // Dual Quaternion Linear blend aka DLB: + // Lerp is only defined in [0, 1] + assert(a >= static_cast(0)); + assert(a <= static_cast(1)); + T const k = dot(x.real,y.real) < static_cast(0) ? -a : a; + T const one(1); + return tdualquat(x * (one - a) + y * k); + } + + template + GLM_FUNC_QUALIFIER tdualquat inverse(tdualquat const& q) + { + const glm::qua real = conjugate(q.real); + const glm::qua dual = conjugate(q.dual); + return tdualquat(real, dual + (real * (-2.0f * dot(real,dual)))); + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat2x4_cast(tdualquat const& x) + { + return mat<2, 4, T, Q>( x[0].x, x[0].y, x[0].z, x[0].w, x[1].x, x[1].y, x[1].z, x[1].w ); + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat3x4_cast(tdualquat const& x) + { + qua r = x.real / length2(x.real); + + qua const rr(r.w * x.real.w, r.x * x.real.x, r.y * x.real.y, r.z * x.real.z); + r *= static_cast(2); + + T const xy = r.x * x.real.y; + T const xz = r.x * x.real.z; + T const yz = r.y * x.real.z; + T const wx = r.w * x.real.x; + T const wy = r.w * x.real.y; + T const wz = r.w * x.real.z; + + vec<4, T, Q> const a( + rr.w + rr.x - rr.y - rr.z, + xy - wz, + xz + wy, + -(x.dual.w * r.x - x.dual.x * r.w + x.dual.y * r.z - x.dual.z * r.y)); + + vec<4, T, Q> const b( + xy + wz, + rr.w + rr.y - rr.x - rr.z, + yz - wx, + -(x.dual.w * r.y - x.dual.x * r.z - x.dual.y * r.w + x.dual.z * r.x)); + + vec<4, T, Q> const c( + xz - wy, + yz + wx, + rr.w + rr.z - rr.x - rr.y, + -(x.dual.w * r.z + x.dual.x * r.y - x.dual.y * r.x - x.dual.z * r.w)); + + return mat<3, 4, T, Q>(a, b, c); + } + + template + GLM_FUNC_QUALIFIER tdualquat dualquat_cast(mat<2, 4, T, Q> const& x) + { + return tdualquat( + qua( x[0].w, x[0].x, x[0].y, x[0].z ), + qua( x[1].w, x[1].x, x[1].y, x[1].z )); + } + + template + GLM_FUNC_QUALIFIER tdualquat dualquat_cast(mat<3, 4, T, Q> const& x) + { + qua real; + + T const trace = x[0].x + x[1].y + x[2].z; + if(trace > static_cast(0)) + { + T const r = sqrt(T(1) + trace); + T const invr = static_cast(0.5) / r; + real.w = static_cast(0.5) * r; + real.x = (x[2].y - x[1].z) * invr; + real.y = (x[0].z - x[2].x) * invr; + real.z = (x[1].x - x[0].y) * invr; + } + else if(x[0].x > x[1].y && x[0].x > x[2].z) + { + T const r = sqrt(T(1) + x[0].x - x[1].y - x[2].z); + T const invr = static_cast(0.5) / r; + real.x = static_cast(0.5)*r; + real.y = (x[1].x + x[0].y) * invr; + real.z = (x[0].z + x[2].x) * invr; + real.w = (x[2].y - x[1].z) * invr; + } + else if(x[1].y > x[2].z) + { + T const r = sqrt(T(1) + x[1].y - x[0].x - x[2].z); + T const invr = static_cast(0.5) / r; + real.x = (x[1].x + x[0].y) * invr; + real.y = static_cast(0.5) * r; + real.z = (x[2].y + x[1].z) * invr; + real.w = (x[0].z - x[2].x) * invr; + } + else + { + T const r = sqrt(T(1) + x[2].z - x[0].x - x[1].y); + T const invr = static_cast(0.5) / r; + real.x = (x[0].z + x[2].x) * invr; + real.y = (x[2].y + x[1].z) * invr; + real.z = static_cast(0.5) * r; + real.w = (x[1].x - x[0].y) * invr; + } + + qua dual; + dual.x = static_cast(0.5) * ( x[0].w * real.w + x[1].w * real.z - x[2].w * real.y); + dual.y = static_cast(0.5) * (-x[0].w * real.z + x[1].w * real.w + x[2].w * real.x); + dual.z = static_cast(0.5) * ( x[0].w * real.y - x[1].w * real.x + x[2].w * real.w); + dual.w = -static_cast(0.5) * ( x[0].w * real.x + x[1].w * real.y + x[2].w * real.z); + return tdualquat(real, dual); + } +}//namespace glm diff --git a/dep/glm/gtx/easing.hpp b/dep/glm/gtx/easing.hpp new file mode 100644 index 0000000..57f3d61 --- /dev/null +++ b/dep/glm/gtx/easing.hpp @@ -0,0 +1,219 @@ +/// @ref gtx_easing +/// @file glm/gtx/easing.hpp +/// @author Robert Chisholm +/// +/// @see core (dependence) +/// +/// @defgroup gtx_easing GLM_GTX_easing +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Easing functions for animations and transitons +/// All functions take a parameter x in the range [0.0,1.0] +/// +/// Based on the AHEasing project of Warren Moore (https://github.com/warrenm/AHEasing) + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/constants.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_easing is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_easing extension included") +# endif +#endif + +namespace glm{ + /// @addtogroup gtx_easing + /// @{ + + /// Modelled after the line y = x + /// @see gtx_easing + template + GLM_FUNC_DECL genType linearInterpolation(genType const & a); + + /// Modelled after the parabola y = x^2 + /// @see gtx_easing + template + GLM_FUNC_DECL genType quadraticEaseIn(genType const & a); + + /// Modelled after the parabola y = -x^2 + 2x + /// @see gtx_easing + template + GLM_FUNC_DECL genType quadraticEaseOut(genType const & a); + + /// Modelled after the piecewise quadratic + /// y = (1/2)((2x)^2) ; [0, 0.5) + /// y = -(1/2)((2x-1)*(2x-3) - 1) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType quadraticEaseInOut(genType const & a); + + /// Modelled after the cubic y = x^3 + template + GLM_FUNC_DECL genType cubicEaseIn(genType const & a); + + /// Modelled after the cubic y = (x - 1)^3 + 1 + /// @see gtx_easing + template + GLM_FUNC_DECL genType cubicEaseOut(genType const & a); + + /// Modelled after the piecewise cubic + /// y = (1/2)((2x)^3) ; [0, 0.5) + /// y = (1/2)((2x-2)^3 + 2) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType cubicEaseInOut(genType const & a); + + /// Modelled after the quartic x^4 + /// @see gtx_easing + template + GLM_FUNC_DECL genType quarticEaseIn(genType const & a); + + /// Modelled after the quartic y = 1 - (x - 1)^4 + /// @see gtx_easing + template + GLM_FUNC_DECL genType quarticEaseOut(genType const & a); + + /// Modelled after the piecewise quartic + /// y = (1/2)((2x)^4) ; [0, 0.5) + /// y = -(1/2)((2x-2)^4 - 2) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType quarticEaseInOut(genType const & a); + + /// Modelled after the quintic y = x^5 + /// @see gtx_easing + template + GLM_FUNC_DECL genType quinticEaseIn(genType const & a); + + /// Modelled after the quintic y = (x - 1)^5 + 1 + /// @see gtx_easing + template + GLM_FUNC_DECL genType quinticEaseOut(genType const & a); + + /// Modelled after the piecewise quintic + /// y = (1/2)((2x)^5) ; [0, 0.5) + /// y = (1/2)((2x-2)^5 + 2) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType quinticEaseInOut(genType const & a); + + /// Modelled after quarter-cycle of sine wave + /// @see gtx_easing + template + GLM_FUNC_DECL genType sineEaseIn(genType const & a); + + /// Modelled after quarter-cycle of sine wave (different phase) + /// @see gtx_easing + template + GLM_FUNC_DECL genType sineEaseOut(genType const & a); + + /// Modelled after half sine wave + /// @see gtx_easing + template + GLM_FUNC_DECL genType sineEaseInOut(genType const & a); + + /// Modelled after shifted quadrant IV of unit circle + /// @see gtx_easing + template + GLM_FUNC_DECL genType circularEaseIn(genType const & a); + + /// Modelled after shifted quadrant II of unit circle + /// @see gtx_easing + template + GLM_FUNC_DECL genType circularEaseOut(genType const & a); + + /// Modelled after the piecewise circular function + /// y = (1/2)(1 - sqrt(1 - 4x^2)) ; [0, 0.5) + /// y = (1/2)(sqrt(-(2x - 3)*(2x - 1)) + 1) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType circularEaseInOut(genType const & a); + + /// Modelled after the exponential function y = 2^(10(x - 1)) + /// @see gtx_easing + template + GLM_FUNC_DECL genType exponentialEaseIn(genType const & a); + + /// Modelled after the exponential function y = -2^(-10x) + 1 + /// @see gtx_easing + template + GLM_FUNC_DECL genType exponentialEaseOut(genType const & a); + + /// Modelled after the piecewise exponential + /// y = (1/2)2^(10(2x - 1)) ; [0,0.5) + /// y = -(1/2)*2^(-10(2x - 1))) + 1 ; [0.5,1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType exponentialEaseInOut(genType const & a); + + /// Modelled after the damped sine wave y = sin(13pi/2*x)*pow(2, 10 * (x - 1)) + /// @see gtx_easing + template + GLM_FUNC_DECL genType elasticEaseIn(genType const & a); + + /// Modelled after the damped sine wave y = sin(-13pi/2*(x + 1))*pow(2, -10x) + 1 + /// @see gtx_easing + template + GLM_FUNC_DECL genType elasticEaseOut(genType const & a); + + /// Modelled after the piecewise exponentially-damped sine wave: + /// y = (1/2)*sin(13pi/2*(2*x))*pow(2, 10 * ((2*x) - 1)) ; [0,0.5) + /// y = (1/2)*(sin(-13pi/2*((2x-1)+1))*pow(2,-10(2*x-1)) + 2) ; [0.5, 1] + /// @see gtx_easing + template + GLM_FUNC_DECL genType elasticEaseInOut(genType const & a); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseIn(genType const& a); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseOut(genType const& a); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseInOut(genType const& a); + + /// @param a parameter + /// @param o Optional overshoot modifier + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseIn(genType const& a, genType const& o); + + /// @param a parameter + /// @param o Optional overshoot modifier + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseOut(genType const& a, genType const& o); + + /// @param a parameter + /// @param o Optional overshoot modifier + /// @see gtx_easing + template + GLM_FUNC_DECL genType backEaseInOut(genType const& a, genType const& o); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType bounceEaseIn(genType const& a); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType bounceEaseOut(genType const& a); + + /// @see gtx_easing + template + GLM_FUNC_DECL genType bounceEaseInOut(genType const& a); + + /// @} +}//namespace glm + +#include "easing.inl" diff --git a/dep/glm/gtx/easing.inl b/dep/glm/gtx/easing.inl new file mode 100644 index 0000000..4b7d05b --- /dev/null +++ b/dep/glm/gtx/easing.inl @@ -0,0 +1,436 @@ +/// @ref gtx_easing + +#include + +namespace glm{ + + template + GLM_FUNC_QUALIFIER genType linearInterpolation(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return a; + } + + template + GLM_FUNC_QUALIFIER genType quadraticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return a * a; + } + + template + GLM_FUNC_QUALIFIER genType quadraticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return -(a * (a - static_cast(2))); + } + + template + GLM_FUNC_QUALIFIER genType quadraticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + { + return static_cast(2) * a * a; + } + else + { + return (-static_cast(2) * a * a) + (4 * a) - one(); + } + } + + template + GLM_FUNC_QUALIFIER genType cubicEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return a * a * a; + } + + template + GLM_FUNC_QUALIFIER genType cubicEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType const f = a - one(); + return f * f * f + one(); + } + + template + GLM_FUNC_QUALIFIER genType cubicEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if (a < static_cast(0.5)) + { + return static_cast(4) * a * a * a; + } + else + { + genType const f = ((static_cast(2) * a) - static_cast(2)); + return static_cast(0.5) * f * f * f + one(); + } + } + + template + GLM_FUNC_QUALIFIER genType quarticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return a * a * a * a; + } + + template + GLM_FUNC_QUALIFIER genType quarticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType const f = (a - one()); + return f * f * f * (one() - a) + one(); + } + + template + GLM_FUNC_QUALIFIER genType quarticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + { + return static_cast(8) * a * a * a * a; + } + else + { + genType const f = (a - one()); + return -static_cast(8) * f * f * f * f + one(); + } + } + + template + GLM_FUNC_QUALIFIER genType quinticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return a * a * a * a * a; + } + + template + GLM_FUNC_QUALIFIER genType quinticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType const f = (a - one()); + return f * f * f * f * f + one(); + } + + template + GLM_FUNC_QUALIFIER genType quinticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + { + return static_cast(16) * a * a * a * a * a; + } + else + { + genType const f = ((static_cast(2) * a) - static_cast(2)); + return static_cast(0.5) * f * f * f * f * f + one(); + } + } + + template + GLM_FUNC_QUALIFIER genType sineEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return sin((a - one()) * half_pi()) + one(); + } + + template + GLM_FUNC_QUALIFIER genType sineEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return sin(a * half_pi()); + } + + template + GLM_FUNC_QUALIFIER genType sineEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return static_cast(0.5) * (one() - cos(a * pi())); + } + + template + GLM_FUNC_QUALIFIER genType circularEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return one() - sqrt(one() - (a * a)); + } + + template + GLM_FUNC_QUALIFIER genType circularEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return sqrt((static_cast(2) - a) * a); + } + + template + GLM_FUNC_QUALIFIER genType circularEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + { + return static_cast(0.5) * (one() - std::sqrt(one() - static_cast(4) * (a * a))); + } + else + { + return static_cast(0.5) * (std::sqrt(-((static_cast(2) * a) - static_cast(3)) * ((static_cast(2) * a) - one())) + one()); + } + } + + template + GLM_FUNC_QUALIFIER genType exponentialEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a <= zero()) + return a; + else + { + genType const Complementary = a - one(); + genType const Two = static_cast(2); + + return glm::pow(Two, Complementary * static_cast(10)); + } + } + + template + GLM_FUNC_QUALIFIER genType exponentialEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a >= one()) + return a; + else + { + return one() - glm::pow(static_cast(2), -static_cast(10) * a); + } + } + + template + GLM_FUNC_QUALIFIER genType exponentialEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + return static_cast(0.5) * glm::pow(static_cast(2), (static_cast(20) * a) - static_cast(10)); + else + return -static_cast(0.5) * glm::pow(static_cast(2), (-static_cast(20) * a) + static_cast(10)) + one(); + } + + template + GLM_FUNC_QUALIFIER genType elasticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return std::sin(static_cast(13) * half_pi() * a) * glm::pow(static_cast(2), static_cast(10) * (a - one())); + } + + template + GLM_FUNC_QUALIFIER genType elasticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return std::sin(-static_cast(13) * half_pi() * (a + one())) * glm::pow(static_cast(2), -static_cast(10) * a) + one(); + } + + template + GLM_FUNC_QUALIFIER genType elasticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + return static_cast(0.5) * std::sin(static_cast(13) * half_pi() * (static_cast(2) * a)) * glm::pow(static_cast(2), static_cast(10) * ((static_cast(2) * a) - one())); + else + return static_cast(0.5) * (std::sin(-static_cast(13) * half_pi() * ((static_cast(2) * a - one()) + one())) * glm::pow(static_cast(2), -static_cast(10) * (static_cast(2) * a - one())) + static_cast(2)); + } + + template + GLM_FUNC_QUALIFIER genType backEaseIn(genType const& a, genType const& o) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType z = ((o + one()) * a) - o; + return (a * a * z); + } + + template + GLM_FUNC_QUALIFIER genType backEaseOut(genType const& a, genType const& o) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType n = a - one(); + genType z = ((o + one()) * n) + o; + return (n * n * z) + one(); + } + + template + GLM_FUNC_QUALIFIER genType backEaseInOut(genType const& a, genType const& o) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + genType s = o * static_cast(1.525); + genType x = static_cast(0.5); + genType n = a / static_cast(0.5); + + if (n < static_cast(1)) + { + genType z = ((s + static_cast(1)) * n) - s; + genType m = n * n * z; + return x * m; + } + else + { + n -= static_cast(2); + genType z = ((s + static_cast(1)) * n) + s; + genType m = (n*n*z) + static_cast(2); + return x * m; + } + } + + template + GLM_FUNC_QUALIFIER genType backEaseIn(genType const& a) + { + return backEaseIn(a, static_cast(1.70158)); + } + + template + GLM_FUNC_QUALIFIER genType backEaseOut(genType const& a) + { + return backEaseOut(a, static_cast(1.70158)); + } + + template + GLM_FUNC_QUALIFIER genType backEaseInOut(genType const& a) + { + return backEaseInOut(a, static_cast(1.70158)); + } + + template + GLM_FUNC_QUALIFIER genType bounceEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(4.0 / 11.0)) + { + return (static_cast(121) * a * a) / static_cast(16); + } + else if(a < static_cast(8.0 / 11.0)) + { + return (static_cast(363.0 / 40.0) * a * a) - (static_cast(99.0 / 10.0) * a) + static_cast(17.0 / 5.0); + } + else if(a < static_cast(9.0 / 10.0)) + { + return (static_cast(4356.0 / 361.0) * a * a) - (static_cast(35442.0 / 1805.0) * a) + static_cast(16061.0 / 1805.0); + } + else + { + return (static_cast(54.0 / 5.0) * a * a) - (static_cast(513.0 / 25.0) * a) + static_cast(268.0 / 25.0); + } + } + + template + GLM_FUNC_QUALIFIER genType bounceEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + return one() - bounceEaseOut(one() - a); + } + + template + GLM_FUNC_QUALIFIER genType bounceEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero()); + assert(a <= one()); + + if(a < static_cast(0.5)) + { + return static_cast(0.5) * (one() - bounceEaseOut(a * static_cast(2))); + } + else + { + return static_cast(0.5) * bounceEaseOut(a * static_cast(2) - one()) + static_cast(0.5); + } + } + +}//namespace glm diff --git a/dep/glm/gtx/euler_angles.hpp b/dep/glm/gtx/euler_angles.hpp new file mode 100644 index 0000000..2723697 --- /dev/null +++ b/dep/glm/gtx/euler_angles.hpp @@ -0,0 +1,335 @@ +/// @ref gtx_euler_angles +/// @file glm/gtx/euler_angles.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_euler_angles GLM_GTX_euler_angles +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Build matrices from Euler angles. +/// +/// Extraction of Euler angles from rotation matrix. +/// Based on the original paper 2014 Mike Day - Extracting Euler Angles from a Rotation Matrix. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_euler_angles is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_euler_angles extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_euler_angles + /// @{ + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle X. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleX( + T const& angleX); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Y. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleY( + T const& angleY); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Z. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZ( + T const& angleZ); + + /// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about X-axis. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleX( + T const & angleX, T const & angularVelocityX); + + /// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about Y-axis. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleY( + T const & angleY, T const & angularVelocityY); + + /// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about Z-axis. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleZ( + T const & angleZ, T const & angularVelocityZ); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXY( + T const& angleX, + T const& angleY); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYX( + T const& angleY, + T const& angleX); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZ( + T const& angleX, + T const& angleZ); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZX( + T const& angle, + T const& angleX); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZ( + T const& angleY, + T const& angleZ); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZY( + 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 mat<4, 4, T, defaultp> 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 + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYXZ( + T const& yaw, + T const& pitch, + T const& roll); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZX( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXYX( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYXY( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZY( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZYZ( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZXZ( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZY( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZX( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y * X). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZYX( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X * Y). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZXY( + 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 + GLM_FUNC_DECL mat<4, 4, T, defaultp> yawPitchRoll( + T const& yaw, + T const& pitch, + T const& roll); + + /// Creates a 2D 2 * 2 rotation matrix from an euler angle. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<2, 2, T, defaultp> orientate2(T const& angle); + + /// Creates a 2D 4 * 4 homogeneous rotation matrix from an euler angle. + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<3, 3, T, defaultp> orientate3(T const& angle); + + /// Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<3, 3, T, Q> orientate3(vec<3, T, Q> const& angles); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template + GLM_FUNC_DECL mat<4, 4, T, Q> orientate4(vec<3, T, Q> const& angles); + + /// Extracts the (X * Y * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleXYZ(mat<4, 4, T, defaultp> const& M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Y * X * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleYXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (X * Z * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleXZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (X * Y * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleXYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Y * X * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleYXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Y * Z * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleYZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * Y * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleZYZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * X * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleZXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (X * Z * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleXZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Y * Z * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleYZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * Y * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleZYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * X * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template + GLM_FUNC_DECL void extractEulerAngleZXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// @} +}//namespace glm + +#include "euler_angles.inl" diff --git a/dep/glm/gtx/euler_angles.inl b/dep/glm/gtx/euler_angles.inl new file mode 100644 index 0000000..68c5012 --- /dev/null +++ b/dep/glm/gtx/euler_angles.inl @@ -0,0 +1,899 @@ +/// @ref gtx_euler_angles + +#include "compatibility.hpp" // glm::atan2 + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleX + ( + T const& angleX + ) + { + T cosX = glm::cos(angleX); + T sinX = glm::sin(angleX); + + return mat<4, 4, T, defaultp>( + T(1), T(0), T(0), T(0), + T(0), cosX, sinX, T(0), + T(0),-sinX, cosX, T(0), + T(0), T(0), T(0), T(1)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleY + ( + T const& angleY + ) + { + T cosY = glm::cos(angleY); + T sinY = glm::sin(angleY); + + return mat<4, 4, T, defaultp>( + cosY, T(0), -sinY, T(0), + T(0), T(1), T(0), T(0), + sinY, T(0), cosY, T(0), + T(0), T(0), T(0), T(1)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZ + ( + T const& angleZ + ) + { + T cosZ = glm::cos(angleZ); + T sinZ = glm::sin(angleZ); + + return mat<4, 4, T, defaultp>( + cosZ, sinZ, T(0), T(0), + -sinZ, cosZ, T(0), T(0), + T(0), T(0), T(1), T(0), + T(0), T(0), T(0), T(1)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleX + ( + T const & angleX, + T const & angularVelocityX + ) + { + T cosX = glm::cos(angleX) * angularVelocityX; + T sinX = glm::sin(angleX) * angularVelocityX; + + return mat<4, 4, T, defaultp>( + T(0), T(0), T(0), T(0), + T(0),-sinX, cosX, T(0), + T(0),-cosX,-sinX, T(0), + T(0), T(0), T(0), T(0)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleY + ( + T const & angleY, + T const & angularVelocityY + ) + { + T cosY = glm::cos(angleY) * angularVelocityY; + T sinY = glm::sin(angleY) * angularVelocityY; + + return mat<4, 4, T, defaultp>( + -sinY, T(0), -cosY, T(0), + T(0), T(0), T(0), T(0), + cosY, T(0), -sinY, T(0), + T(0), T(0), T(0), T(0)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleZ + ( + T const & angleZ, + T const & angularVelocityZ + ) + { + T cosZ = glm::cos(angleZ) * angularVelocityZ; + T sinZ = glm::sin(angleZ) * angularVelocityZ; + + return mat<4, 4, T, defaultp>( + -sinZ, cosZ, T(0), T(0), + -cosZ, -sinZ, T(0), T(0), + T(0), T(0), T(0), T(0), + T(0), T(0), T(0), T(0)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXY + ( + T const& angleX, + T const& angleY + ) + { + T cosX = glm::cos(angleX); + T sinX = glm::sin(angleX); + T cosY = glm::cos(angleY); + T sinY = glm::sin(angleY); + + return mat<4, 4, T, defaultp>( + cosY, -sinX * -sinY, cosX * -sinY, T(0), + T(0), cosX, sinX, T(0), + sinY, -sinX * cosY, cosX * cosY, T(0), + T(0), T(0), T(0), T(1)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYX + ( + T const& angleY, + T const& angleX + ) + { + T cosX = glm::cos(angleX); + T sinX = glm::sin(angleX); + T cosY = glm::cos(angleY); + T sinY = glm::sin(angleY); + + return mat<4, 4, T, defaultp>( + cosY, 0, -sinY, T(0), + sinY * sinX, cosX, cosY * sinX, T(0), + sinY * cosX, -sinX, cosY * cosX, T(0), + T(0), T(0), T(0), T(1)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXZ + ( + T const& angleX, + T const& angleZ + ) + { + return eulerAngleX(angleX) * eulerAngleZ(angleZ); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZX + ( + T const& angleZ, + T const& angleX + ) + { + return eulerAngleZ(angleZ) * eulerAngleX(angleX); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYZ + ( + T const& angleY, + T const& angleZ + ) + { + return eulerAngleY(angleY) * eulerAngleZ(angleZ); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZY + ( + T const& angleZ, + T const& angleY + ) + { + return eulerAngleZ(angleZ) * eulerAngleY(angleY); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> 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); + + mat<4, 4, T, defaultp> 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 mat<4, 4, T, defaultp> eulerAngleYXZ + ( + T const& yaw, + T const& pitch, + T const& roll + ) + { + T tmp_ch = glm::cos(yaw); + T tmp_sh = glm::sin(yaw); + T tmp_cp = glm::cos(pitch); + T tmp_sp = glm::sin(pitch); + T tmp_cb = glm::cos(roll); + T tmp_sb = glm::sin(roll); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; + Result[0][1] = tmp_sb * tmp_cp; + Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; + Result[0][3] = static_cast(0); + Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb; + Result[1][1] = tmp_cb * tmp_cp; + Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb; + Result[1][3] = static_cast(0); + Result[2][0] = tmp_sh * tmp_cp; + Result[2][1] = -tmp_sp; + Result[2][2] = tmp_ch * tmp_cp; + 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 mat<4, 4, T, defaultp> eulerAngleXZX + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c2; + Result[0][1] = c1 * s2; + Result[0][2] = s1 * s2; + Result[0][3] = static_cast(0); + Result[1][0] =-c3 * s2; + Result[1][1] = c1 * c2 * c3 - s1 * s3; + Result[1][2] = c1 * s3 + c2 * c3 * s1; + Result[1][3] = static_cast(0); + Result[2][0] = s2 * s3; + Result[2][1] =-c3 * s1 - c1 * c2 * s3; + Result[2][2] = c1 * c3 - c2 * s1 * s3; + 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 mat<4, 4, T, defaultp> eulerAngleXYX + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c2; + Result[0][1] = s1 * s2; + Result[0][2] =-c1 * s2; + Result[0][3] = static_cast(0); + Result[1][0] = s2 * s3; + Result[1][1] = c1 * c3 - c2 * s1 * s3; + Result[1][2] = c3 * s1 + c1 * c2 * s3; + Result[1][3] = static_cast(0); + Result[2][0] = c3 * s2; + Result[2][1] =-c1 * s3 - c2 * c3 * s1; + Result[2][2] = c1 * c2 * c3 - s1 * s3; + 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 mat<4, 4, T, defaultp> eulerAngleYXY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c3 - c2 * s1 * s3; + Result[0][1] = s2* s3; + Result[0][2] =-c3 * s1 - c1 * c2 * s3; + Result[0][3] = static_cast(0); + Result[1][0] = s1 * s2; + Result[1][1] = c2; + Result[1][2] = c1 * s2; + Result[1][3] = static_cast(0); + Result[2][0] = c1 * s3 + c2 * c3 * s1; + Result[2][1] =-c3 * s2; + Result[2][2] = c1 * c2 * c3 - s1 * s3; + 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 mat<4, 4, T, defaultp> eulerAngleYZY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2 * c3 - s1 * s3; + Result[0][1] = c3 * s2; + Result[0][2] =-c1 * s3 - c2 * c3 * s1; + Result[0][3] = static_cast(0); + Result[1][0] =-c1 * s2; + Result[1][1] = c2; + Result[1][2] = s1 * s2; + Result[1][3] = static_cast(0); + Result[2][0] = c3 * s1 + c1 * c2 * s3; + Result[2][1] = s2 * s3; + Result[2][2] = c1 * c3 - c2 * s1 * s3; + 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 mat<4, 4, T, defaultp> eulerAngleZYZ + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2 * c3 - s1 * s3; + Result[0][1] = c1 * s3 + c2 * c3 * s1; + Result[0][2] =-c3 * s2; + Result[0][3] = static_cast(0); + Result[1][0] =-c3 * s1 - c1 * c2 * s3; + Result[1][1] = c1 * c3 - c2 * s1 * s3; + Result[1][2] = s2 * s3; + Result[1][3] = static_cast(0); + Result[2][0] = c1 * s2; + Result[2][1] = s1 * s2; + Result[2][2] = 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 mat<4, 4, T, defaultp> eulerAngleZXZ + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c3 - c2 * s1 * s3; + Result[0][1] = c3 * s1 + c1 * c2 * s3; + Result[0][2] = s2 *s3; + Result[0][3] = static_cast(0); + Result[1][0] =-c1 * s3 - c2 * c3 * s1; + Result[1][1] = c1 * c2 * c3 - s1 * s3; + Result[1][2] = c3 * s2; + Result[1][3] = static_cast(0); + Result[2][0] = s1 * s2; + Result[2][1] =-c1 * s2; + Result[2][2] = 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 mat<4, 4, T, defaultp> eulerAngleXZY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c2 * c3; + Result[0][1] = s1 * s3 + c1 * c3 * s2; + Result[0][2] = c3 * s1 * s2 - c1 * s3; + Result[0][3] = static_cast(0); + Result[1][0] =-s2; + Result[1][1] = c1 * c2; + Result[1][2] = c2 * s1; + Result[1][3] = static_cast(0); + Result[2][0] = c2 * s3; + Result[2][1] = c1 * s2 * s3 - c3 * s1; + Result[2][2] = c1 * c3 + s1 * s2 *s3; + 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 mat<4, 4, T, defaultp> eulerAngleYZX + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2; + Result[0][1] = s2; + Result[0][2] =-c2 * s1; + Result[0][3] = static_cast(0); + Result[1][0] = s1 * s3 - c1 * c3 * s2; + Result[1][1] = c2 * c3; + Result[1][2] = c1 * s3 + c3 * s1 * s2; + Result[1][3] = static_cast(0); + Result[2][0] = c3 * s1 + c1 * s2 * s3; + Result[2][1] =-c2 * s3; + Result[2][2] = c1 * c3 - s1 * s2 * s3; + 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 mat<4, 4, T, defaultp> eulerAngleZYX + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2; + Result[0][1] = c2 * s1; + Result[0][2] =-s2; + Result[0][3] = static_cast(0); + Result[1][0] = c1 * s2 * s3 - c3 * s1; + Result[1][1] = c1 * c3 + s1 * s2 * s3; + Result[1][2] = c2 * s3; + Result[1][3] = static_cast(0); + Result[2][0] = s1 * s3 + c1 * c3 * s2; + Result[2][1] = c3 * s1 * s2 - c1 * s3; + Result[2][2] = c2 * c3; + 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 mat<4, 4, T, defaultp> eulerAngleZXY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c3 - s1 * s2 * s3; + Result[0][1] = c3 * s1 + c1 * s2 * s3; + Result[0][2] =-c2 * s3; + Result[0][3] = static_cast(0); + Result[1][0] =-c2 * s1; + Result[1][1] = c1 * c2; + Result[1][2] = s2; + Result[1][3] = static_cast(0); + Result[2][0] = c1 * s3 + c3 * s1 * s2; + Result[2][1] = s1 * s3 - c1 * c3 * s2; + Result[2][2] = c2 * c3; + 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 mat<4, 4, T, defaultp> yawPitchRoll + ( + T const& yaw, + T const& pitch, + T const& roll + ) + { + T tmp_ch = glm::cos(yaw); + T tmp_sh = glm::sin(yaw); + T tmp_cp = glm::cos(pitch); + T tmp_sp = glm::sin(pitch); + T tmp_cb = glm::cos(roll); + T tmp_sb = glm::sin(roll); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; + Result[0][1] = tmp_sb * tmp_cp; + Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; + Result[0][3] = static_cast(0); + Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb; + Result[1][1] = tmp_cb * tmp_cp; + Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb; + Result[1][3] = static_cast(0); + Result[2][0] = tmp_sh * tmp_cp; + Result[2][1] = -tmp_sp; + Result[2][2] = tmp_ch * tmp_cp; + 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 mat<2, 2, T, defaultp> orientate2 + ( + T const& angle + ) + { + T c = glm::cos(angle); + T s = glm::sin(angle); + + mat<2, 2, T, defaultp> Result; + Result[0][0] = c; + Result[0][1] = s; + Result[1][0] = -s; + Result[1][1] = c; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> orientate3 + ( + T const& angle + ) + { + T c = glm::cos(angle); + T s = glm::sin(angle); + + mat<3, 3, T, defaultp> Result; + Result[0][0] = c; + Result[0][1] = s; + Result[0][2] = 0.0f; + Result[1][0] = -s; + Result[1][1] = c; + Result[1][2] = 0.0f; + Result[2][0] = 0.0f; + Result[2][1] = 0.0f; + Result[2][2] = 1.0f; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> orientate3 + ( + vec<3, T, Q> const& angles + ) + { + return mat<3, 3, T, Q>(yawPitchRoll(angles.z, angles.x, angles.y)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> orientate4 + ( + vec<3, T, Q> const& angles + ) + { + return yawPitchRoll(angles.z, angles.x, angles.y); + } + + template + GLM_FUNC_DECL void extractEulerAngleXYZ(mat<4, 4, T, defaultp> const& M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[2][1], M[2][2]); + T C2 = glm::sqrt(M[0][0]*M[0][0] + M[1][0]*M[1][0]); + T T2 = glm::atan2(-M[2][0], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T 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; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleYXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[2][0], M[2][2]); + T C2 = glm::sqrt(M[0][1]*M[0][1] + M[1][1]*M[1][1]); + T T2 = glm::atan2(-M[2][1], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(S1*M[1][2] - C1*M[1][0], C1*M[0][0] - S1*M[0][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleXZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[0][2], M[0][1]); + T S2 = glm::sqrt(M[1][0]*M[1][0] + M[2][0]*M[2][0]); + T T2 = glm::atan2(S2, M[0][0]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(C1*M[1][2] - S1*M[1][1], C1*M[2][2] - S1*M[2][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleXYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[0][1], -M[0][2]); + T S2 = glm::sqrt(M[1][0]*M[1][0] + M[2][0]*M[2][0]); + T T2 = glm::atan2(S2, M[0][0]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(-C1*M[2][1] - S1*M[2][2], C1*M[1][1] + S1*M[1][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleYXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[1][0], M[1][2]); + T S2 = glm::sqrt(M[0][1]*M[0][1] + M[2][1]*M[2][1]); + T T2 = glm::atan2(S2, M[1][1]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(C1*M[2][0] - S1*M[2][2], C1*M[0][0] - S1*M[0][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleYZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[1][2], -M[1][0]); + T S2 = glm::sqrt(M[0][1]*M[0][1] + M[2][1]*M[2][1]); + T T2 = glm::atan2(S2, M[1][1]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(-S1*M[0][0] - C1*M[0][2], S1*M[2][0] + C1*M[2][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleZYZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[2][1], M[2][0]); + T S2 = glm::sqrt(M[0][2]*M[0][2] + M[1][2]*M[1][2]); + T T2 = glm::atan2(S2, M[2][2]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(C1*M[0][1] - S1*M[0][0], C1*M[1][1] - S1*M[1][0]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleZXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[2][0], -M[2][1]); + T S2 = glm::sqrt(M[0][2]*M[0][2] + M[1][2]*M[1][2]); + T T2 = glm::atan2(S2, M[2][2]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(-C1*M[1][0] - S1*M[1][1], C1*M[0][0] + S1*M[0][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleXZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[1][2], M[1][1]); + T C2 = glm::sqrt(M[0][0]*M[0][0] + M[2][0]*M[2][0]); + T T2 = glm::atan2(-M[1][0], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(S1*M[0][1] - C1*M[0][2], C1*M[2][2] - S1*M[2][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleYZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(-M[0][2], M[0][0]); + T C2 = glm::sqrt(M[1][1]*M[1][1] + M[2][1]*M[2][1]); + T T2 = glm::atan2(M[0][1], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(S1*M[1][0] + C1*M[1][2], S1*M[2][0] + C1*M[2][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleZYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(M[0][1], M[0][0]); + T C2 = glm::sqrt(M[1][2]*M[1][2] + M[2][2]*M[2][2]); + T T2 = glm::atan2(-M[0][2], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(S1*M[2][0] - C1*M[2][1], C1*M[1][1] - S1*M[1][0]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template + GLM_FUNC_QUALIFIER void extractEulerAngleZXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2(-M[1][0], M[1][1]); + T C2 = glm::sqrt(M[0][2]*M[0][2] + M[2][2]*M[2][2]); + T T2 = glm::atan2(M[1][2], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2(C1*M[2][0] + S1*M[2][1], C1*M[0][0] + S1*M[0][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } +}//namespace glm diff --git a/dep/glm/gtx/extend.hpp b/dep/glm/gtx/extend.hpp new file mode 100644 index 0000000..28b7c5c --- /dev/null +++ b/dep/glm/gtx/extend.hpp @@ -0,0 +1,42 @@ +/// @ref gtx_extend +/// @file glm/gtx/extend.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_extend GLM_GTX_extend +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Extend a position from a source to a position at a defined length. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_extend is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_extend extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_extend + /// @{ + + /// Extends of Length the Origin position using the (Source - Origin) direction. + /// @see gtx_extend + template + GLM_FUNC_DECL genType extend( + genType const& Origin, + genType const& Source, + typename genType::value_type const Length); + + /// @} +}//namespace glm + +#include "extend.inl" diff --git a/dep/glm/gtx/extend.inl b/dep/glm/gtx/extend.inl new file mode 100644 index 0000000..32128eb --- /dev/null +++ b/dep/glm/gtx/extend.inl @@ -0,0 +1,48 @@ +/// @ref gtx_extend + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType extend + ( + genType const& Origin, + genType const& Source, + genType const& Distance + ) + { + return Origin + (Source - Origin) * Distance; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> extend + ( + vec<2, T, Q> const& Origin, + vec<2, T, Q> const& Source, + T const& Distance + ) + { + return Origin + (Source - Origin) * Distance; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> extend + ( + vec<3, T, Q> const& Origin, + vec<3, T, Q> const& Source, + T const& Distance + ) + { + return Origin + (Source - Origin) * Distance; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> extend + ( + vec<4, T, Q> const& Origin, + vec<4, T, Q> const& Source, + T const& Distance + ) + { + return Origin + (Source - Origin) * Distance; + } +}//namespace glm diff --git a/dep/glm/gtx/extended_min_max.hpp b/dep/glm/gtx/extended_min_max.hpp new file mode 100644 index 0000000..025eda2 --- /dev/null +++ b/dep/glm/gtx/extended_min_max.hpp @@ -0,0 +1,137 @@ +/// @ref gtx_extended_min_max +/// @file glm/gtx/extended_min_max.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_extended_min_max GLM_GTX_extented_min_max +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Min and max functions for 3 to 4 parameters. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../ext/vector_common.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_extented_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_extented_min_max extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_extended_min_max + /// @{ + + /// Return the minimum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template + GLM_FUNC_DECL T min( + T const& x, + T const& y, + T const& z); + + /// Return the minimum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C min( + C const& x, + typename C::T const& y, + typename C::T const& z); + + /// Return the minimum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C min( + C const& x, + C const& y, + C const& z); + + /// Return the minimum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template + GLM_FUNC_DECL T min( + T const& x, + T const& y, + T const& z, + T const& w); + + /// Return the minimum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C min( + C const& x, + typename C::T const& y, + typename C::T const& z, + typename C::T const& w); + + /// Return the minimum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C min( + C const& x, + C const& y, + C const& z, + C const& w); + + /// Return the maximum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template + GLM_FUNC_DECL T max( + T const& x, + T const& y, + T const& z); + + /// Return the maximum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C max( + C const& x, + typename C::T const& y, + typename C::T const& z); + + /// Return the maximum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C max( + C const& x, + C const& y, + C const& z); + + /// Return the maximum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template + GLM_FUNC_DECL T max( + T const& x, + T const& y, + T const& z, + T const& w); + + /// Return the maximum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C max( + C const& x, + typename C::T const& y, + typename C::T const& z, + typename C::T const& w); + + /// Return the maximum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template class C> + GLM_FUNC_DECL C max( + C const& x, + C const& y, + C const& z, + C const& w); + + /// @} +}//namespace glm + +#include "extended_min_max.inl" diff --git a/dep/glm/gtx/extended_min_max.inl b/dep/glm/gtx/extended_min_max.inl new file mode 100644 index 0000000..de5998f --- /dev/null +++ b/dep/glm/gtx/extended_min_max.inl @@ -0,0 +1,138 @@ +/// @ref gtx_extended_min_max + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T min( + T const& x, + T const& y, + T const& z) + { + return glm::min(glm::min(x, y), z); + } + + template class C> + GLM_FUNC_QUALIFIER C min + ( + C const& x, + typename C::T const& y, + typename C::T const& z + ) + { + return glm::min(glm::min(x, y), z); + } + + template class C> + GLM_FUNC_QUALIFIER C min + ( + C const& x, + C const& y, + C const& z + ) + { + return glm::min(glm::min(x, y), z); + } + + template + GLM_FUNC_QUALIFIER T min + ( + T const& x, + T const& y, + T const& z, + T const& w + ) + { + return glm::min(glm::min(x, y), glm::min(z, w)); + } + + template class C> + GLM_FUNC_QUALIFIER C min + ( + C const& x, + typename C::T const& y, + typename C::T const& z, + typename C::T const& w + ) + { + return glm::min(glm::min(x, y), glm::min(z, w)); + } + + template class C> + GLM_FUNC_QUALIFIER C min + ( + C const& x, + C const& y, + C const& z, + C const& w + ) + { + return glm::min(glm::min(x, y), glm::min(z, w)); + } + + template + GLM_FUNC_QUALIFIER T max( + T const& x, + T const& y, + T const& z) + { + return glm::max(glm::max(x, y), z); + } + + template class C> + GLM_FUNC_QUALIFIER C max + ( + C const& x, + typename C::T const& y, + typename C::T const& z + ) + { + return glm::max(glm::max(x, y), z); + } + + template class C> + GLM_FUNC_QUALIFIER C max + ( + C const& x, + C const& y, + C const& z + ) + { + return glm::max(glm::max(x, y), z); + } + + template + GLM_FUNC_QUALIFIER T max + ( + T const& x, + T const& y, + T const& z, + T const& w + ) + { + return glm::max(glm::max(x, y), glm::max(z, w)); + } + + template class C> + GLM_FUNC_QUALIFIER C max + ( + C const& x, + typename C::T const& y, + typename C::T const& z, + typename C::T const& w + ) + { + return glm::max(glm::max(x, y), glm::max(z, w)); + } + + template class C> + GLM_FUNC_QUALIFIER C max + ( + C const& x, + C const& y, + C const& z, + C const& w + ) + { + return glm::max(glm::max(x, y), glm::max(z, w)); + } +}//namespace glm diff --git a/dep/glm/gtx/exterior_product.hpp b/dep/glm/gtx/exterior_product.hpp new file mode 100644 index 0000000..5522df7 --- /dev/null +++ b/dep/glm/gtx/exterior_product.hpp @@ -0,0 +1,45 @@ +/// @ref gtx_exterior_product +/// @file glm/gtx/exterior_product.hpp +/// +/// @see core (dependence) +/// @see gtx_exterior_product (dependence) +/// +/// @defgroup gtx_exterior_product GLM_GTX_exterior_product +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// @brief Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_exterior_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_exterior_product extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_exterior_product + /// @{ + + /// Returns the cross product of x and y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see Exterior product + template + GLM_FUNC_DECL T cross(vec<2, T, Q> const& v, vec<2, T, Q> const& u); + + /// @} +} //namespace glm + +#include "exterior_product.inl" diff --git a/dep/glm/gtx/exterior_product.inl b/dep/glm/gtx/exterior_product.inl new file mode 100644 index 0000000..93661fd --- /dev/null +++ b/dep/glm/gtx/exterior_product.inl @@ -0,0 +1,26 @@ +/// @ref gtx_exterior_product + +#include + +namespace glm { +namespace detail +{ + template + struct compute_cross_vec2 + { + GLM_FUNC_QUALIFIER static T call(vec<2, T, Q> const& v, vec<2, T, Q> const& u) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'cross' accepts only floating-point inputs"); + + return v.x * u.y - u.x * v.y; + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER T cross(vec<2, T, Q> const& x, vec<2, T, Q> const& y) + { + return detail::compute_cross_vec2::value>::call(x, y); + } +}//namespace glm + diff --git a/dep/glm/gtx/fast_exponential.hpp b/dep/glm/gtx/fast_exponential.hpp new file mode 100644 index 0000000..6fb7286 --- /dev/null +++ b/dep/glm/gtx/fast_exponential.hpp @@ -0,0 +1,95 @@ +/// @ref gtx_fast_exponential +/// @file glm/gtx/fast_exponential.hpp +/// +/// @see core (dependence) +/// @see gtx_half_float (dependence) +/// +/// @defgroup gtx_fast_exponential GLM_GTX_fast_exponential +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Fast but less accurate implementations of exponential based functions. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_fast_exponential is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_fast_exponential extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_fast_exponential + /// @{ + + /// Faster than the common pow function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL genType fastPow(genType x, genType y); + + /// Faster than the common pow function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastPow(vec const& x, vec const& y); + + /// Faster than the common pow function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL genTypeT fastPow(genTypeT x, genTypeU y); + + /// Faster than the common pow function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastPow(vec const& x); + + /// Faster than the common exp function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL T fastExp(T x); + + /// Faster than the common exp function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastExp(vec const& x); + + /// Faster than the common log function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL T fastLog(T x); + + /// Faster than the common exp2 function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastLog(vec const& x); + + /// Faster than the common exp2 function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL T fastExp2(T x); + + /// Faster than the common exp2 function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastExp2(vec const& x); + + /// Faster than the common log2 function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL T fastLog2(T x); + + /// Faster than the common log2 function but less accurate. + /// @see gtx_fast_exponential + template + GLM_FUNC_DECL vec fastLog2(vec const& x); + + /// @} +}//namespace glm + +#include "fast_exponential.inl" diff --git a/dep/glm/gtx/fast_exponential.inl b/dep/glm/gtx/fast_exponential.inl new file mode 100644 index 0000000..f139e50 --- /dev/null +++ b/dep/glm/gtx/fast_exponential.inl @@ -0,0 +1,136 @@ +/// @ref gtx_fast_exponential + +namespace glm +{ + // fastPow: + template + GLM_FUNC_QUALIFIER genType fastPow(genType x, genType y) + { + return exp(y * log(x)); + } + + template + GLM_FUNC_QUALIFIER vec fastPow(vec const& x, vec const& y) + { + return exp(y * log(x)); + } + + template + GLM_FUNC_QUALIFIER T fastPow(T x, int y) + { + T f = static_cast(1); + for(int i = 0; i < y; ++i) + f *= x; + return f; + } + + template + GLM_FUNC_QUALIFIER vec fastPow(vec const& x, vec const& y) + { + vec Result; + for(length_t i = 0, n = x.length(); i < n; ++i) + Result[i] = fastPow(x[i], y[i]); + return Result; + } + + // fastExp + // Note: This function provides accurate results only for value between -1 and 1, else avoid it. + template + GLM_FUNC_QUALIFIER T fastExp(T x) + { + // This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower. + // return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f)))); + T x2 = x * x; + T x3 = x2 * x; + T x4 = x3 * x; + T x5 = x4 * x; + return T(1) + x + (x2 * T(0.5)) + (x3 * T(0.1666666667)) + (x4 * T(0.041666667)) + (x5 * T(0.008333333333)); + } + /* // Try to handle all values of float... but often shower than std::exp, glm::floor and the loop kill the performance + GLM_FUNC_QUALIFIER float fastExp(float x) + { + const float e = 2.718281828f; + const float IntegerPart = floor(x); + const float FloatPart = x - IntegerPart; + float z = 1.f; + + for(int i = 0; i < int(IntegerPart); ++i) + z *= e; + + const float x2 = FloatPart * FloatPart; + const float x3 = x2 * FloatPart; + const float x4 = x3 * FloatPart; + const float x5 = x4 * FloatPart; + return z * (1.0f + FloatPart + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)); + } + + // Increase accuracy on number bigger that 1 and smaller than -1 but it's not enough for high and negative numbers + GLM_FUNC_QUALIFIER float fastExp(float x) + { + // This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower. + // return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f)))); + float x2 = x * x; + float x3 = x2 * x; + float x4 = x3 * x; + float x5 = x4 * x; + float x6 = x5 * x; + float x7 = x6 * x; + float x8 = x7 * x; + return 1.0f + x + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)+ (x6 * 0.00138888888888f) + (x7 * 0.000198412698f) + (x8 * 0.0000248015873f);; + } + */ + + template + GLM_FUNC_QUALIFIER vec fastExp(vec const& x) + { + return detail::functor1::call(fastExp, x); + } + + // fastLog + template + GLM_FUNC_QUALIFIER genType fastLog(genType x) + { + return std::log(x); + } + + /* Slower than the VC7.1 function... + GLM_FUNC_QUALIFIER float fastLog(float x) + { + float y1 = (x - 1.0f) / (x + 1.0f); + float y2 = y1 * y1; + return 2.0f * y1 * (1.0f + y2 * (0.3333333333f + y2 * (0.2f + y2 * 0.1428571429f))); + } + */ + + template + GLM_FUNC_QUALIFIER vec fastLog(vec const& x) + { + return detail::functor1::call(fastLog, x); + } + + //fastExp2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType fastExp2(genType x) + { + return fastExp(0.69314718055994530941723212145818f * x); + } + + template + GLM_FUNC_QUALIFIER vec fastExp2(vec const& x) + { + return detail::functor1::call(fastExp2, x); + } + + // fastLog2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType fastLog2(genType x) + { + return fastLog(x) / 0.69314718055994530941723212145818f; + } + + template + GLM_FUNC_QUALIFIER vec fastLog2(vec const& x) + { + return detail::functor1::call(fastLog2, x); + } +}//namespace glm diff --git a/dep/glm/gtx/fast_square_root.hpp b/dep/glm/gtx/fast_square_root.hpp new file mode 100644 index 0000000..9fb3f2f --- /dev/null +++ b/dep/glm/gtx/fast_square_root.hpp @@ -0,0 +1,92 @@ +/// @ref gtx_fast_square_root +/// @file glm/gtx/fast_square_root.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_fast_square_root GLM_GTX_fast_square_root +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Fast but less accurate implementations of square root based functions. +/// - Sqrt optimisation based on Newton's method, +/// www.gamedev.net/community/forums/topic.asp?topic id=139956 + +#pragma once + +// Dependency: +#include "../common.hpp" +#include "../exponential.hpp" +#include "../geometric.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_fast_square_root is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_fast_square_root extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_fast_square_root + /// @{ + + /// Faster than the common sqrt function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL genType fastSqrt(genType x); + + /// Faster than the common sqrt function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL vec fastSqrt(vec const& x); + + /// Faster than the common inversesqrt function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL genType fastInverseSqrt(genType x); + + /// Faster than the common inversesqrt function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL vec fastInverseSqrt(vec const& x); + + /// Faster than the common length function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL genType fastLength(genType x); + + /// Faster than the common length function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL T fastLength(vec const& x); + + /// Faster than the common distance function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL genType fastDistance(genType x, genType y); + + /// Faster than the common distance function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL T fastDistance(vec const& x, vec const& y); + + /// Faster than the common normalize function but less accurate. + /// + /// @see gtx_fast_square_root extension. + template + GLM_FUNC_DECL genType fastNormalize(genType const& x); + + /// @} +}// namespace glm + +#include "fast_square_root.inl" diff --git a/dep/glm/gtx/fast_square_root.inl b/dep/glm/gtx/fast_square_root.inl new file mode 100644 index 0000000..4e6c6de --- /dev/null +++ b/dep/glm/gtx/fast_square_root.inl @@ -0,0 +1,75 @@ +/// @ref gtx_fast_square_root + +namespace glm +{ + // fastSqrt + template + GLM_FUNC_QUALIFIER genType fastSqrt(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fastSqrt' only accept floating-point input"); + + return genType(1) / fastInverseSqrt(x); + } + + template + GLM_FUNC_QUALIFIER vec fastSqrt(vec const& x) + { + return detail::functor1::call(fastSqrt, x); + } + + // fastInversesqrt + template + GLM_FUNC_QUALIFIER genType fastInverseSqrt(genType x) + { + return detail::compute_inversesqrt<1, genType, lowp, detail::is_aligned::value>::call(vec<1, genType, lowp>(x)).x; + } + + template + GLM_FUNC_QUALIFIER vec fastInverseSqrt(vec const& x) + { + return detail::compute_inversesqrt::value>::call(x); + } + + // fastLength + template + GLM_FUNC_QUALIFIER genType fastLength(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fastLength' only accept floating-point inputs"); + + return abs(x); + } + + template + GLM_FUNC_QUALIFIER T fastLength(vec const& x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'fastLength' only accept floating-point inputs"); + + return fastSqrt(dot(x, x)); + } + + // fastDistance + template + GLM_FUNC_QUALIFIER genType fastDistance(genType x, genType y) + { + return fastLength(y - x); + } + + template + GLM_FUNC_QUALIFIER T fastDistance(vec const& x, vec const& y) + { + return fastLength(y - x); + } + + // fastNormalize + template + GLM_FUNC_QUALIFIER genType fastNormalize(genType x) + { + return x > genType(0) ? genType(1) : -genType(1); + } + + template + GLM_FUNC_QUALIFIER vec fastNormalize(vec const& x) + { + return x * fastInverseSqrt(dot(x, x)); + } +}//namespace glm diff --git a/dep/glm/gtx/fast_trigonometry.hpp b/dep/glm/gtx/fast_trigonometry.hpp new file mode 100644 index 0000000..2650d6e --- /dev/null +++ b/dep/glm/gtx/fast_trigonometry.hpp @@ -0,0 +1,79 @@ +/// @ref gtx_fast_trigonometry +/// @file glm/gtx/fast_trigonometry.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_fast_trigonometry GLM_GTX_fast_trigonometry +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Fast but less accurate implementations of trigonometric functions. + +#pragma once + +// Dependency: +#include "../gtc/constants.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_fast_trigonometry is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_fast_trigonometry extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_fast_trigonometry + /// @{ + + /// Wrap an angle to [0 2pi[ + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T wrapAngle(T angle); + + /// Faster than the common sin function but less accurate. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastSin(T angle); + + /// Faster than the common cos function but less accurate. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastCos(T angle); + + /// Faster than the common tan function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastTan(T angle); + + /// Faster than the common asin function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastAsin(T angle); + + /// Faster than the common acos function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastAcos(T angle); + + /// Faster than the common atan function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastAtan(T y, T x); + + /// Faster than the common atan function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. + template + GLM_FUNC_DECL T fastAtan(T angle); + + /// @} +}//namespace glm + +#include "fast_trigonometry.inl" diff --git a/dep/glm/gtx/fast_trigonometry.inl b/dep/glm/gtx/fast_trigonometry.inl new file mode 100644 index 0000000..1a710cb --- /dev/null +++ b/dep/glm/gtx/fast_trigonometry.inl @@ -0,0 +1,142 @@ +/// @ref gtx_fast_trigonometry + +namespace glm{ +namespace detail +{ + template + GLM_FUNC_QUALIFIER vec taylorCos(vec const& x) + { + return static_cast(1) + - (x * x) * (1.f / 2.f) + + ((x * x) * (x * x)) * (1.f / 24.f) + - (((x * x) * (x * x)) * (x * x)) * (1.f / 720.f) + + (((x * x) * (x * x)) * ((x * x) * (x * x))) * (1.f / 40320.f); + } + + template + GLM_FUNC_QUALIFIER T cos_52s(T x) + { + T const xx(x * x); + return (T(0.9999932946) + xx * (T(-0.4999124376) + xx * (T(0.0414877472) + xx * T(-0.0012712095)))); + } + + template + GLM_FUNC_QUALIFIER vec cos_52s(vec const& x) + { + return detail::functor1::call(cos_52s, x); + } +}//namespace detail + + // wrapAngle + template + GLM_FUNC_QUALIFIER T wrapAngle(T angle) + { + return abs(mod(angle, two_pi())); + } + + template + GLM_FUNC_QUALIFIER vec wrapAngle(vec const& x) + { + return detail::functor1::call(wrapAngle, x); + } + + // cos + template + GLM_FUNC_QUALIFIER T fastCos(T x) + { + T const angle(wrapAngle(x)); + + if(angle < half_pi()) + return detail::cos_52s(angle); + if(angle < pi()) + return -detail::cos_52s(pi() - angle); + if(angle < (T(3) * half_pi())) + return -detail::cos_52s(angle - pi()); + + return detail::cos_52s(two_pi() - angle); + } + + template + GLM_FUNC_QUALIFIER vec fastCos(vec const& x) + { + return detail::functor1::call(fastCos, x); + } + + // sin + template + GLM_FUNC_QUALIFIER T fastSin(T x) + { + return fastCos(half_pi() - x); + } + + template + GLM_FUNC_QUALIFIER vec fastSin(vec const& x) + { + return detail::functor1::call(fastSin, x); + } + + // tan + template + GLM_FUNC_QUALIFIER T fastTan(T x) + { + return x + (x * x * x * T(0.3333333333)) + (x * x * x * x * x * T(0.1333333333333)) + (x * x * x * x * x * x * x * T(0.0539682539)); + } + + template + GLM_FUNC_QUALIFIER vec fastTan(vec const& x) + { + return detail::functor1::call(fastTan, x); + } + + // asin + template + GLM_FUNC_QUALIFIER T fastAsin(T x) + { + return x + (x * x * x * T(0.166666667)) + (x * x * x * x * x * T(0.075)) + (x * x * x * x * x * x * x * T(0.0446428571)) + (x * x * x * x * x * x * x * x * x * T(0.0303819444));// + (x * x * x * x * x * x * x * x * x * x * x * T(0.022372159)); + } + + template + GLM_FUNC_QUALIFIER vec fastAsin(vec const& x) + { + return detail::functor1::call(fastAsin, x); + } + + // acos + template + GLM_FUNC_QUALIFIER T fastAcos(T x) + { + return T(1.5707963267948966192313216916398) - fastAsin(x); //(PI / 2) + } + + template + GLM_FUNC_QUALIFIER vec fastAcos(vec const& x) + { + return detail::functor1::call(fastAcos, x); + } + + // atan + template + GLM_FUNC_QUALIFIER T fastAtan(T y, T x) + { + T sgn = sign(y) * sign(x); + return abs(fastAtan(y / x)) * sgn; + } + + template + GLM_FUNC_QUALIFIER vec fastAtan(vec const& y, vec const& x) + { + return detail::functor2::call(fastAtan, y, x); + } + + template + GLM_FUNC_QUALIFIER T fastAtan(T x) + { + return x - (x * x * x * T(0.333333333333)) + (x * x * x * x * x * T(0.2)) - (x * x * x * x * x * x * x * T(0.1428571429)) + (x * x * x * x * x * x * x * x * x * T(0.111111111111)) - (x * x * x * x * x * x * x * x * x * x * x * T(0.0909090909)); + } + + template + GLM_FUNC_QUALIFIER vec fastAtan(vec const& x) + { + return detail::functor1::call(fastAtan, x); + } +}//namespace glm diff --git a/dep/glm/gtx/float_notmalize.inl b/dep/glm/gtx/float_notmalize.inl new file mode 100644 index 0000000..8cdbc5a --- /dev/null +++ b/dep/glm/gtx/float_notmalize.inl @@ -0,0 +1,13 @@ +/// @ref gtx_float_normalize + +#include + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec floatNormalize(vec const& v) + { + return vec(v) / static_cast(std::numeric_limits::max()); + } + +}//namespace glm diff --git a/dep/glm/gtx/functions.hpp b/dep/glm/gtx/functions.hpp new file mode 100644 index 0000000..9f4166c --- /dev/null +++ b/dep/glm/gtx/functions.hpp @@ -0,0 +1,56 @@ +/// @ref gtx_functions +/// @file glm/gtx/functions.hpp +/// +/// @see core (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_functions GLM_GTX_functions +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// List of useful common functions. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/type_vec2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_functions is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_functions extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_functions + /// @{ + + /// 1D gauss function + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL T gauss( + T x, + T ExpectedValue, + T StandardDeviation); + + /// 2D gauss function + /// + /// @see gtc_epsilon + template + GLM_FUNC_DECL T gauss( + vec<2, T, Q> const& Coord, + vec<2, T, Q> const& ExpectedValue, + vec<2, T, Q> const& StandardDeviation); + + /// @} +}//namespace glm + +#include "functions.inl" + diff --git a/dep/glm/gtx/functions.inl b/dep/glm/gtx/functions.inl new file mode 100644 index 0000000..29cbb20 --- /dev/null +++ b/dep/glm/gtx/functions.inl @@ -0,0 +1,30 @@ +/// @ref gtx_functions + +#include "../exponential.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T gauss + ( + T x, + T ExpectedValue, + T StandardDeviation + ) + { + return exp(-((x - ExpectedValue) * (x - ExpectedValue)) / (static_cast(2) * StandardDeviation * StandardDeviation)) / (StandardDeviation * sqrt(static_cast(6.28318530717958647692528676655900576))); + } + + template + GLM_FUNC_QUALIFIER T gauss + ( + vec<2, T, Q> const& Coord, + vec<2, T, Q> const& ExpectedValue, + vec<2, T, Q> const& StandardDeviation + ) + { + vec<2, T, Q> const Squared = ((Coord - ExpectedValue) * (Coord - ExpectedValue)) / (static_cast(2) * StandardDeviation * StandardDeviation); + return exp(-(Squared.x + Squared.y)); + } +}//namespace glm + diff --git a/dep/glm/gtx/gradient_paint.hpp b/dep/glm/gtx/gradient_paint.hpp new file mode 100644 index 0000000..6f85bf4 --- /dev/null +++ b/dep/glm/gtx/gradient_paint.hpp @@ -0,0 +1,53 @@ +/// @ref gtx_gradient_paint +/// @file glm/gtx/gradient_paint.hpp +/// +/// @see core (dependence) +/// @see gtx_optimum_pow (dependence) +/// +/// @defgroup gtx_gradient_paint GLM_GTX_gradient_paint +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Functions that return the color of procedural gradient for specific coordinates. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/optimum_pow.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_gradient_paint is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_gradient_paint extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_gradient_paint + /// @{ + + /// Return a color from a radial gradient. + /// @see - gtx_gradient_paint + template + GLM_FUNC_DECL T radialGradient( + vec<2, T, Q> const& Center, + T const& Radius, + vec<2, T, Q> const& Focal, + vec<2, T, Q> const& Position); + + /// Return a color from a linear gradient. + /// @see - gtx_gradient_paint + template + GLM_FUNC_DECL T linearGradient( + vec<2, T, Q> const& Point0, + vec<2, T, Q> const& Point1, + vec<2, T, Q> const& Position); + + /// @} +}// namespace glm + +#include "gradient_paint.inl" diff --git a/dep/glm/gtx/gradient_paint.inl b/dep/glm/gtx/gradient_paint.inl new file mode 100644 index 0000000..4c495e6 --- /dev/null +++ b/dep/glm/gtx/gradient_paint.inl @@ -0,0 +1,36 @@ +/// @ref gtx_gradient_paint + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T radialGradient + ( + vec<2, T, Q> const& Center, + T const& Radius, + vec<2, T, Q> const& Focal, + vec<2, T, Q> const& Position + ) + { + vec<2, T, Q> F = Focal - Center; + vec<2, T, Q> D = Position - Focal; + T Radius2 = pow2(Radius); + T Fx2 = pow2(F.x); + T Fy2 = pow2(F.y); + + T Numerator = (D.x * F.x + D.y * F.y) + sqrt(Radius2 * (pow2(D.x) + pow2(D.y)) - pow2(D.x * F.y - D.y * F.x)); + T Denominator = Radius2 - (Fx2 + Fy2); + return Numerator / Denominator; + } + + template + GLM_FUNC_QUALIFIER T linearGradient + ( + vec<2, T, Q> const& Point0, + vec<2, T, Q> const& Point1, + vec<2, T, Q> const& Position + ) + { + vec<2, T, Q> Dist = Point1 - Point0; + return (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) / glm::dot(Dist, Dist); + } +}//namespace glm diff --git a/dep/glm/gtx/handed_coordinate_space.hpp b/dep/glm/gtx/handed_coordinate_space.hpp new file mode 100644 index 0000000..3c85968 --- /dev/null +++ b/dep/glm/gtx/handed_coordinate_space.hpp @@ -0,0 +1,50 @@ +/// @ref gtx_handed_coordinate_space +/// @file glm/gtx/handed_coordinate_space.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_handed_coordinate_space GLM_GTX_handed_coordinate_space +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// To know if a set of three basis vectors defines a right or left-handed coordinate system. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_handed_coordinate_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_handed_coordinate_space extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_handed_coordinate_space + /// @{ + + //! Return if a trihedron right handed or not. + //! From GLM_GTX_handed_coordinate_space extension. + template + GLM_FUNC_DECL bool rightHanded( + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal); + + //! Return if a trihedron left handed or not. + //! From GLM_GTX_handed_coordinate_space extension. + template + GLM_FUNC_DECL bool leftHanded( + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal); + + /// @} +}// namespace glm + +#include "handed_coordinate_space.inl" diff --git a/dep/glm/gtx/handed_coordinate_space.inl b/dep/glm/gtx/handed_coordinate_space.inl new file mode 100644 index 0000000..e43c17b --- /dev/null +++ b/dep/glm/gtx/handed_coordinate_space.inl @@ -0,0 +1,26 @@ +/// @ref gtx_handed_coordinate_space + +namespace glm +{ + template + GLM_FUNC_QUALIFIER bool rightHanded + ( + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal + ) + { + return dot(cross(normal, tangent), binormal) > T(0); + } + + template + GLM_FUNC_QUALIFIER bool leftHanded + ( + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal + ) + { + return dot(cross(normal, tangent), binormal) < T(0); + } +}//namespace glm diff --git a/dep/glm/gtx/hash.hpp b/dep/glm/gtx/hash.hpp new file mode 100644 index 0000000..05dae9f --- /dev/null +++ b/dep/glm/gtx/hash.hpp @@ -0,0 +1,142 @@ +/// @ref gtx_hash +/// @file glm/gtx/hash.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_hash GLM_GTX_hash +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Add std::hash support for glm types + +#pragma once + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_hash is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_hash extension included") +# endif +#endif + +#include + +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../gtc/vec1.hpp" + +#include "../gtc/quaternion.hpp" +#include "../gtx/dual_quaternion.hpp" + +#include "../mat2x2.hpp" +#include "../mat2x3.hpp" +#include "../mat2x4.hpp" + +#include "../mat3x2.hpp" +#include "../mat3x3.hpp" +#include "../mat3x4.hpp" + +#include "../mat4x2.hpp" +#include "../mat4x3.hpp" +#include "../mat4x4.hpp" + +#if !GLM_HAS_CXX11_STL +# error "GLM_GTX_hash requires C++11 standard library support" +#endif + +namespace std +{ + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::vec<1, T, Q> const& v) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::vec<2, T, Q> const& v) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::vec<3, T, Q> const& v) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::vec<4, T, Q> const& v) const; + }; + + template + struct hash> + { + GLM_FUNC_DECL size_t operator()(glm::qua const& q) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::tdualquat const& q) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<2, 2, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<2, 3, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<2, 4, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<3, 2, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<3, 3, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<3, 4, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<4, 2, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<4, 3, T,Q> const& m) const; + }; + + template + struct hash > + { + GLM_FUNC_DECL size_t operator()(glm::mat<4, 4, T,Q> const& m) const; + }; +} // namespace std + +#include "hash.inl" diff --git a/dep/glm/gtx/hash.inl b/dep/glm/gtx/hash.inl new file mode 100644 index 0000000..ff71ca9 --- /dev/null +++ b/dep/glm/gtx/hash.inl @@ -0,0 +1,184 @@ +/// @ref gtx_hash +/// +/// @see core (dependence) +/// +/// @defgroup gtx_hash GLM_GTX_hash +/// @ingroup gtx +/// +/// @brief Add std::hash support for glm types +/// +/// need to be included to use the features of this extension. + +namespace glm { +namespace detail +{ + GLM_INLINE void hash_combine(size_t &seed, size_t hash) + { + hash += 0x9e3779b9 + (seed << 6) + (seed >> 2); + seed ^= hash; + } +}} + +namespace std +{ + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::vec<1, T, Q> const& v) const + { + hash hasher; + return hasher(v.x); + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::vec<2, T, Q> const& v) const + { + size_t seed = 0; + hash hasher; + glm::detail::hash_combine(seed, hasher(v.x)); + glm::detail::hash_combine(seed, hasher(v.y)); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::vec<3, T, Q> const& v) const + { + size_t seed = 0; + hash hasher; + glm::detail::hash_combine(seed, hasher(v.x)); + glm::detail::hash_combine(seed, hasher(v.y)); + glm::detail::hash_combine(seed, hasher(v.z)); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::vec<4, T, Q> const& v) const + { + size_t seed = 0; + hash hasher; + glm::detail::hash_combine(seed, hasher(v.x)); + glm::detail::hash_combine(seed, hasher(v.y)); + glm::detail::hash_combine(seed, hasher(v.z)); + glm::detail::hash_combine(seed, hasher(v.w)); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::qua const& q) const + { + size_t seed = 0; + hash hasher; + glm::detail::hash_combine(seed, hasher(q.x)); + glm::detail::hash_combine(seed, hasher(q.y)); + glm::detail::hash_combine(seed, hasher(q.z)); + glm::detail::hash_combine(seed, hasher(q.w)); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::tdualquat const& q) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(q.real)); + glm::detail::hash_combine(seed, hasher(q.dual)); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<2, 2, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<2, 3, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<2, 4, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<3, 2, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<3, 3, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<3, 4, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<4, 2, T,Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + glm::detail::hash_combine(seed, hasher(m[3])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<4, 3, T,Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + glm::detail::hash_combine(seed, hasher(m[3])); + return seed; + } + + template + GLM_FUNC_QUALIFIER size_t hash>::operator()(glm::mat<4, 4, T, Q> const& m) const + { + size_t seed = 0; + hash> hasher; + glm::detail::hash_combine(seed, hasher(m[0])); + glm::detail::hash_combine(seed, hasher(m[1])); + glm::detail::hash_combine(seed, hasher(m[2])); + glm::detail::hash_combine(seed, hasher(m[3])); + return seed; + } +} diff --git a/dep/glm/gtx/integer.hpp b/dep/glm/gtx/integer.hpp new file mode 100644 index 0000000..d0b4c61 --- /dev/null +++ b/dep/glm/gtx/integer.hpp @@ -0,0 +1,76 @@ +/// @ref gtx_integer +/// @file glm/gtx/integer.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_integer GLM_GTX_integer +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Add support for integer for core functions + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/integer.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_integer is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_integer extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_integer + /// @{ + + //! Returns x raised to the y power. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL int pow(int x, uint y); + + //! Returns the positive square root of x. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL int sqrt(int x); + + //! Returns the floor log2 of x. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL unsigned int floor_log2(unsigned int x); + + //! Modulus. Returns x - y * floor(x / y) for each component in x using the floating point value y. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL int mod(int x, int y); + + //! Return the factorial value of a number (!12 max, integer only) + //! From GLM_GTX_integer extension. + template + GLM_FUNC_DECL genType factorial(genType const& x); + + //! 32bit signed integer. + //! From GLM_GTX_integer extension. + typedef signed int sint; + + //! Returns x raised to the y power. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL uint pow(uint x, uint y); + + //! Returns the positive square root of x. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL uint sqrt(uint x); + + //! Modulus. Returns x - y * floor(x / y) for each component in x using the floating point value y. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL uint mod(uint x, uint y); + + //! Returns the number of leading zeros. + //! From GLM_GTX_integer extension. + GLM_FUNC_DECL uint nlz(uint x); + + /// @} +}//namespace glm + +#include "integer.inl" diff --git a/dep/glm/gtx/integer.inl b/dep/glm/gtx/integer.inl new file mode 100644 index 0000000..956366b --- /dev/null +++ b/dep/glm/gtx/integer.inl @@ -0,0 +1,185 @@ +/// @ref gtx_integer + +namespace glm +{ + // pow + GLM_FUNC_QUALIFIER int pow(int x, uint y) + { + if(y == 0) + return x >= 0 ? 1 : -1; + + int result = x; + for(uint i = 1; i < y; ++i) + result *= x; + return result; + } + + // sqrt: From Christopher J. Musial, An integer square root, Graphics Gems, 1990, page 387 + GLM_FUNC_QUALIFIER int sqrt(int x) + { + if(x <= 1) return x; + + int NextTrial = x >> 1; + int CurrentAnswer; + + do + { + CurrentAnswer = NextTrial; + NextTrial = (NextTrial + x / NextTrial) >> 1; + } while(NextTrial < CurrentAnswer); + + return CurrentAnswer; + } + +// Henry Gordon Dietz: http://aggregate.org/MAGIC/ +namespace detail +{ + GLM_FUNC_QUALIFIER unsigned int ones32(unsigned int x) + { + /* 32-bit recursive reduction using SWAR... + but first step is mapping 2-bit values + into sum of 2 1-bit values in sneaky way + */ + x -= ((x >> 1) & 0x55555555); + x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); + x = (((x >> 4) + x) & 0x0f0f0f0f); + x += (x >> 8); + x += (x >> 16); + return(x & 0x0000003f); + } +}//namespace detail + + // Henry Gordon Dietz: http://aggregate.org/MAGIC/ +/* + GLM_FUNC_QUALIFIER unsigned int floor_log2(unsigned int x) + { + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + + return _detail::ones32(x) >> 1; + } +*/ + // mod + GLM_FUNC_QUALIFIER int mod(int x, int y) + { + return ((x % y) + y) % y; + } + + // factorial (!12 max, integer only) + template + GLM_FUNC_QUALIFIER genType factorial(genType const& x) + { + genType Temp = x; + genType Result; + for(Result = 1; Temp > 1; --Temp) + Result *= Temp; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> factorial( + vec<2, T, Q> const& x) + { + return vec<2, T, Q>( + factorial(x.x), + factorial(x.y)); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> factorial( + vec<3, T, Q> const& x) + { + return vec<3, T, Q>( + factorial(x.x), + factorial(x.y), + factorial(x.z)); + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> factorial( + vec<4, T, Q> const& x) + { + return vec<4, T, Q>( + factorial(x.x), + factorial(x.y), + factorial(x.z), + factorial(x.w)); + } + + GLM_FUNC_QUALIFIER uint pow(uint x, uint y) + { + if (y == 0) + return 1u; + + uint result = x; + for(uint i = 1; i < y; ++i) + result *= x; + return result; + } + + GLM_FUNC_QUALIFIER uint sqrt(uint x) + { + if(x <= 1) return x; + + uint NextTrial = x >> 1; + uint CurrentAnswer; + + do + { + CurrentAnswer = NextTrial; + NextTrial = (NextTrial + x / NextTrial) >> 1; + } while(NextTrial < CurrentAnswer); + + return CurrentAnswer; + } + + GLM_FUNC_QUALIFIER uint mod(uint x, uint y) + { + return x - y * (x / y); + } + +#if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC)) + + GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) + { + return 31u - findMSB(x); + } + +#else + + // Hackers Delight: http://www.hackersdelight.org/HDcode/nlz.c.txt + GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) + { + int y, m, n; + + y = -int(x >> 16); // If left half of x is 0, + m = (y >> 16) & 16; // set n = 16. If left half + n = 16 - m; // is nonzero, set n = 0 and + x = x >> m; // shift x right 16. + // Now x is of the form 0000xxxx. + y = x - 0x100; // If positions 8-15 are 0, + m = (y >> 16) & 8; // add 8 to n and shift x left 8. + n = n + m; + x = x << m; + + y = x - 0x1000; // If positions 12-15 are 0, + m = (y >> 16) & 4; // add 4 to n and shift x left 4. + n = n + m; + x = x << m; + + y = x - 0x4000; // If positions 14-15 are 0, + m = (y >> 16) & 2; // add 2 to n and shift x left 2. + n = n + m; + x = x << m; + + y = x >> 14; // Set y = 0, 1, 2, or 3. + m = y & ~(y >> 1); // Set m = 0, 1, 2, or 2 resp. + return unsigned(n + 2 - m); + } + +#endif//(GLM_COMPILER) + +}//namespace glm diff --git a/dep/glm/gtx/intersect.hpp b/dep/glm/gtx/intersect.hpp new file mode 100644 index 0000000..3c78f2b --- /dev/null +++ b/dep/glm/gtx/intersect.hpp @@ -0,0 +1,92 @@ +/// @ref gtx_intersect +/// @file glm/gtx/intersect.hpp +/// +/// @see core (dependence) +/// @see gtx_closest_point (dependence) +/// +/// @defgroup gtx_intersect GLM_GTX_intersect +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Add intersection functions + +#pragma once + +// Dependency: +#include +#include +#include "../glm.hpp" +#include "../geometric.hpp" +#include "../gtx/closest_point.hpp" +#include "../gtx/vector_query.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_closest_point extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_intersect + /// @{ + + //! Compute the intersection of a ray and a plane. + //! Ray direction and plane normal must be unit length. + //! From GLM_GTX_intersect extension. + template + GLM_FUNC_DECL bool intersectRayPlane( + genType const& orig, genType const& dir, + genType const& planeOrig, genType const& planeNormal, + typename genType::value_type & intersectionDistance); + + //! Compute the intersection of a ray and a triangle. + /// Based om Tomas Möller implementation http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/raytri/ + //! From GLM_GTX_intersect extension. + template + GLM_FUNC_DECL bool intersectRayTriangle( + vec<3, T, Q> const& orig, vec<3, T, Q> const& dir, + vec<3, T, Q> const& v0, vec<3, T, Q> const& v1, vec<3, T, Q> const& v2, + vec<2, T, Q>& baryPosition, T& distance); + + //! Compute the intersection of a line and a triangle. + //! From GLM_GTX_intersect extension. + template + GLM_FUNC_DECL bool intersectLineTriangle( + genType const& orig, genType const& dir, + genType const& vert0, genType const& vert1, genType const& vert2, + genType & position); + + //! Compute the intersection distance of a ray and a sphere. + //! The ray direction vector is unit length. + //! From GLM_GTX_intersect extension. + template + GLM_FUNC_DECL bool intersectRaySphere( + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, typename genType::value_type const sphereRadiusSquered, + typename genType::value_type & intersectionDistance); + + //! Compute the intersection of a ray and a sphere. + //! From GLM_GTX_intersect extension. + template + GLM_FUNC_DECL bool intersectRaySphere( + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, const typename genType::value_type sphereRadius, + genType & intersectionPosition, genType & intersectionNormal); + + //! Compute the intersection of a line and a sphere. + //! From GLM_GTX_intersect extension + template + GLM_FUNC_DECL bool intersectLineSphere( + genType const& point0, genType const& point1, + genType const& sphereCenter, typename genType::value_type sphereRadius, + genType & intersectionPosition1, genType & intersectionNormal1, + genType & intersectionPosition2 = genType(), genType & intersectionNormal2 = genType()); + + /// @} +}//namespace glm + +#include "intersect.inl" diff --git a/dep/glm/gtx/intersect.inl b/dep/glm/gtx/intersect.inl new file mode 100644 index 0000000..54ecb4d --- /dev/null +++ b/dep/glm/gtx/intersect.inl @@ -0,0 +1,200 @@ +/// @ref gtx_intersect + +namespace glm +{ + template + GLM_FUNC_QUALIFIER bool intersectRayPlane + ( + genType const& orig, genType const& dir, + genType const& planeOrig, genType const& planeNormal, + typename genType::value_type & intersectionDistance + ) + { + typename genType::value_type d = glm::dot(dir, planeNormal); + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + + if(glm::abs(d) > Epsilon) // if dir and planeNormal are not perpendicular + { + typename genType::value_type const tmp_intersectionDistance = glm::dot(planeOrig - orig, planeNormal) / d; + if (tmp_intersectionDistance > static_cast(0)) { // allow only intersections + intersectionDistance = tmp_intersectionDistance; + return true; + } + } + + return false; + } + + template + GLM_FUNC_QUALIFIER bool intersectRayTriangle + ( + vec<3, T, Q> const& orig, vec<3, T, Q> const& dir, + vec<3, T, Q> const& vert0, vec<3, T, Q> const& vert1, vec<3, T, Q> const& vert2, + vec<2, T, Q>& baryPosition, T& distance + ) + { + // find vectors for two edges sharing vert0 + vec<3, T, Q> const edge1 = vert1 - vert0; + vec<3, T, Q> const edge2 = vert2 - vert0; + + // begin calculating determinant - also used to calculate U parameter + vec<3, T, Q> const p = glm::cross(dir, edge2); + + // if determinant is near zero, ray lies in plane of triangle + T const det = glm::dot(edge1, p); + + vec<3, T, Q> Perpendicular(0); + + if(det > std::numeric_limits::epsilon()) + { + // calculate distance from vert0 to ray origin + vec<3, T, Q> const dist = orig - vert0; + + // calculate U parameter and test bounds + baryPosition.x = glm::dot(dist, p); + if(baryPosition.x < static_cast(0) || baryPosition.x > det) + return false; + + // prepare to test V parameter + Perpendicular = glm::cross(dist, edge1); + + // calculate V parameter and test bounds + baryPosition.y = glm::dot(dir, Perpendicular); + if((baryPosition.y < static_cast(0)) || ((baryPosition.x + baryPosition.y) > det)) + return false; + } + else if(det < -std::numeric_limits::epsilon()) + { + // calculate distance from vert0 to ray origin + vec<3, T, Q> const dist = orig - vert0; + + // calculate U parameter and test bounds + baryPosition.x = glm::dot(dist, p); + if((baryPosition.x > static_cast(0)) || (baryPosition.x < det)) + return false; + + // prepare to test V parameter + Perpendicular = glm::cross(dist, edge1); + + // calculate V parameter and test bounds + baryPosition.y = glm::dot(dir, Perpendicular); + if((baryPosition.y > static_cast(0)) || (baryPosition.x + baryPosition.y < det)) + return false; + } + else + return false; // ray is parallel to the plane of the triangle + + T inv_det = static_cast(1) / det; + + // calculate distance, ray intersects triangle + distance = glm::dot(edge2, Perpendicular) * inv_det; + baryPosition *= inv_det; + + return true; + } + + template + GLM_FUNC_QUALIFIER bool intersectLineTriangle + ( + genType const& orig, genType const& dir, + genType const& vert0, genType const& vert1, genType const& vert2, + genType & position + ) + { + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + + genType edge1 = vert1 - vert0; + genType edge2 = vert2 - vert0; + + genType Perpendicular = cross(dir, edge2); + + float det = dot(edge1, Perpendicular); + + if (det > -Epsilon && det < Epsilon) + return false; + typename genType::value_type inv_det = typename genType::value_type(1) / det; + + genType Tengant = orig - vert0; + + position.y = dot(Tengant, Perpendicular) * inv_det; + if (position.y < typename genType::value_type(0) || position.y > typename genType::value_type(1)) + return false; + + genType Cotengant = cross(Tengant, edge1); + + position.z = dot(dir, Cotengant) * inv_det; + if (position.z < typename genType::value_type(0) || position.y + position.z > typename genType::value_type(1)) + return false; + + position.x = dot(edge2, Cotengant) * inv_det; + + return true; + } + + template + GLM_FUNC_QUALIFIER bool intersectRaySphere + ( + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, const typename genType::value_type sphereRadiusSquered, + typename genType::value_type & intersectionDistance + ) + { + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + genType diff = sphereCenter - rayStarting; + typename genType::value_type t0 = dot(diff, rayNormalizedDirection); + typename genType::value_type dSquared = dot(diff, diff) - t0 * t0; + if( dSquared > sphereRadiusSquered ) + { + return false; + } + typename genType::value_type t1 = sqrt( sphereRadiusSquered - dSquared ); + intersectionDistance = t0 > t1 + Epsilon ? t0 - t1 : t0 + t1; + return intersectionDistance > Epsilon; + } + + template + GLM_FUNC_QUALIFIER bool intersectRaySphere + ( + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, const typename genType::value_type sphereRadius, + genType & intersectionPosition, genType & intersectionNormal + ) + { + typename genType::value_type distance; + if( intersectRaySphere( rayStarting, rayNormalizedDirection, sphereCenter, sphereRadius * sphereRadius, distance ) ) + { + intersectionPosition = rayStarting + rayNormalizedDirection * distance; + intersectionNormal = (intersectionPosition - sphereCenter) / sphereRadius; + return true; + } + return false; + } + + template + GLM_FUNC_QUALIFIER bool intersectLineSphere + ( + genType const& point0, genType const& point1, + genType const& sphereCenter, typename genType::value_type sphereRadius, + genType & intersectionPoint1, genType & intersectionNormal1, + genType & intersectionPoint2, genType & intersectionNormal2 + ) + { + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + genType dir = normalize(point1 - point0); + genType diff = sphereCenter - point0; + typename genType::value_type t0 = dot(diff, dir); + typename genType::value_type dSquared = dot(diff, diff) - t0 * t0; + if( dSquared > sphereRadius * sphereRadius ) + { + return false; + } + typename genType::value_type t1 = sqrt( sphereRadius * sphereRadius - dSquared ); + if( t0 < t1 + Epsilon ) + t1 = -t1; + intersectionPoint1 = point0 + dir * (t0 - t1); + intersectionNormal1 = (intersectionPoint1 - sphereCenter) / sphereRadius; + intersectionPoint2 = point0 + dir * (t0 + t1); + intersectionNormal2 = (intersectionPoint2 - sphereCenter) / sphereRadius; + return true; + } +}//namespace glm diff --git a/dep/glm/gtx/io.hpp b/dep/glm/gtx/io.hpp new file mode 100644 index 0000000..8d974f0 --- /dev/null +++ b/dep/glm/gtx/io.hpp @@ -0,0 +1,201 @@ +/// @ref gtx_io +/// @file glm/gtx/io.hpp +/// @author Jan P Springer (regnirpsj@gmail.com) +/// +/// @see core (dependence) +/// @see gtc_matrix_access (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_io GLM_GTX_io +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// std::[w]ostream support for glm types +/// +/// std::[w]ostream support for glm types + qualifier/width/etc. manipulators +/// based on howard hinnant's std::chrono io proposal +/// [http://home.roadrunner.com/~hinnant/bloomington/chrono_io.html] + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/quaternion.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_io is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_io extension included") +# endif +#endif + +#include // std::basic_ostream<> (fwd) +#include // std::locale, std::locale::facet, std::locale::id +#include // std::pair<> + +namespace glm +{ + /// @addtogroup gtx_io + /// @{ + + namespace io + { + enum order_type { column_major, row_major}; + + template + class format_punct : public std::locale::facet + { + typedef CTy char_type; + + public: + + static std::locale::id id; + + bool formatted; + unsigned precision; + unsigned width; + char_type separator; + char_type delim_left; + char_type delim_right; + char_type space; + char_type newline; + order_type order; + + GLM_FUNC_DECL explicit format_punct(size_t a = 0); + GLM_FUNC_DECL explicit format_punct(format_punct const&); + }; + + template > + class basic_state_saver { + + public: + + GLM_FUNC_DECL explicit basic_state_saver(std::basic_ios&); + GLM_FUNC_DECL ~basic_state_saver(); + + private: + + typedef ::std::basic_ios state_type; + typedef typename state_type::char_type char_type; + typedef ::std::ios_base::fmtflags flags_type; + typedef ::std::streamsize streamsize_type; + typedef ::std::locale const locale_type; + + state_type& state_; + flags_type flags_; + streamsize_type precision_; + streamsize_type width_; + char_type fill_; + locale_type locale_; + + GLM_FUNC_DECL basic_state_saver& operator=(basic_state_saver const&); + }; + + typedef basic_state_saver state_saver; + typedef basic_state_saver wstate_saver; + + template > + class basic_format_saver + { + public: + + GLM_FUNC_DECL explicit basic_format_saver(std::basic_ios&); + GLM_FUNC_DECL ~basic_format_saver(); + + private: + + basic_state_saver const bss_; + + GLM_FUNC_DECL basic_format_saver& operator=(basic_format_saver const&); + }; + + typedef basic_format_saver format_saver; + typedef basic_format_saver wformat_saver; + + struct precision + { + unsigned value; + + GLM_FUNC_DECL explicit precision(unsigned); + }; + + struct width + { + unsigned value; + + GLM_FUNC_DECL explicit width(unsigned); + }; + + template + struct delimeter + { + CTy value[3]; + + GLM_FUNC_DECL explicit delimeter(CTy /* left */, CTy /* right */, CTy /* separator */ = ','); + }; + + struct order + { + order_type value; + + GLM_FUNC_DECL explicit order(order_type); + }; + + // functions, inlined (inline) + + template + FTy const& get_facet(std::basic_ios&); + template + std::basic_ios& formatted(std::basic_ios&); + template + std::basic_ios& unformattet(std::basic_ios&); + + template + std::basic_ostream& operator<<(std::basic_ostream&, precision const&); + template + std::basic_ostream& operator<<(std::basic_ostream&, width const&); + template + std::basic_ostream& operator<<(std::basic_ostream&, delimeter const&); + template + std::basic_ostream& operator<<(std::basic_ostream&, order const&); + }//namespace io + + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, qua const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, vec<1, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, vec<2, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, vec<3, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, vec<4, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<2, 2, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<2, 3, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<2, 4, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<3, 2, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<3, 3, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<3, 4, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<4, 2, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<4, 3, T, Q> const&); + template + GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, mat<4, 4, T, Q> const&); + + template + GLM_FUNC_DECL std::basic_ostream & operator<<(std::basic_ostream &, + std::pair const, mat<4, 4, T, Q> const> const&); + + /// @} +}//namespace glm + +#include "io.inl" diff --git a/dep/glm/gtx/io.inl b/dep/glm/gtx/io.inl new file mode 100644 index 0000000..a3a1bb6 --- /dev/null +++ b/dep/glm/gtx/io.inl @@ -0,0 +1,440 @@ +/// @ref gtx_io +/// @author Jan P Springer (regnirpsj@gmail.com) + +#include // std::fixed, std::setfill<>, std::setprecision, std::right, std::setw +#include // std::basic_ostream<> +#include "../gtc/matrix_access.hpp" // glm::col, glm::row +#include "../gtx/type_trait.hpp" // glm::type<> + +namespace glm{ +namespace io +{ + template + GLM_FUNC_QUALIFIER format_punct::format_punct(size_t a) + : std::locale::facet(a) + , formatted(true) + , precision(3) + , width(1 + 4 + 1 + precision) + , separator(',') + , delim_left('[') + , delim_right(']') + , space(' ') + , newline('\n') + , order(column_major) + {} + + template + GLM_FUNC_QUALIFIER format_punct::format_punct(format_punct const& a) + : std::locale::facet(0) + , formatted(a.formatted) + , precision(a.precision) + , width(a.width) + , separator(a.separator) + , delim_left(a.delim_left) + , delim_right(a.delim_right) + , space(a.space) + , newline(a.newline) + , order(a.order) + {} + + template std::locale::id format_punct::id; + + template + GLM_FUNC_QUALIFIER basic_state_saver::basic_state_saver(std::basic_ios& a) + : state_(a) + , flags_(a.flags()) + , precision_(a.precision()) + , width_(a.width()) + , fill_(a.fill()) + , locale_(a.getloc()) + {} + + template + GLM_FUNC_QUALIFIER basic_state_saver::~basic_state_saver() + { + state_.imbue(locale_); + state_.fill(fill_); + state_.width(width_); + state_.precision(precision_); + state_.flags(flags_); + } + + template + GLM_FUNC_QUALIFIER basic_format_saver::basic_format_saver(std::basic_ios& a) + : bss_(a) + { + a.imbue(std::locale(a.getloc(), new format_punct(get_facet >(a)))); + } + + template + GLM_FUNC_QUALIFIER + basic_format_saver::~basic_format_saver() + {} + + GLM_FUNC_QUALIFIER precision::precision(unsigned a) + : value(a) + {} + + GLM_FUNC_QUALIFIER width::width(unsigned a) + : value(a) + {} + + template + GLM_FUNC_QUALIFIER delimeter::delimeter(CTy a, CTy b, CTy c) + : value() + { + value[0] = a; + value[1] = b; + value[2] = c; + } + + GLM_FUNC_QUALIFIER order::order(order_type a) + : value(a) + {} + + template + GLM_FUNC_QUALIFIER FTy const& get_facet(std::basic_ios& ios) + { + if(!std::has_facet(ios.getloc())) + ios.imbue(std::locale(ios.getloc(), new FTy)); + + return std::use_facet(ios.getloc()); + } + + template + GLM_FUNC_QUALIFIER std::basic_ios& formatted(std::basic_ios& ios) + { + const_cast&>(get_facet >(ios)).formatted = true; + return ios; + } + + template + GLM_FUNC_QUALIFIER std::basic_ios& unformatted(std::basic_ios& ios) + { + const_cast&>(get_facet >(ios)).formatted = false; + return ios; + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, precision const& a) + { + const_cast&>(get_facet >(os)).precision = a.value; + return os; + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, width const& a) + { + const_cast&>(get_facet >(os)).width = a.value; + return os; + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, delimeter const& a) + { + format_punct & fmt(const_cast&>(get_facet >(os))); + + fmt.delim_left = a.value[0]; + fmt.delim_right = a.value[1]; + fmt.separator = a.value[2]; + + return os; + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, order const& a) + { + const_cast&>(get_facet >(os)).order = a.value; + return os; + } +} // namespace io + +namespace detail +{ + template + GLM_FUNC_QUALIFIER std::basic_ostream& + print_vector_on(std::basic_ostream& os, V const& a) + { + typename std::basic_ostream::sentry const cerberus(os); + + if(cerberus) + { + io::format_punct const& fmt(io::get_facet >(os)); + + length_t const& components(type::components); + + if(fmt.formatted) + { + io::basic_state_saver const bss(os); + + os << std::fixed << std::right << std::setprecision(fmt.precision) << std::setfill(fmt.space) << fmt.delim_left; + + for(length_t i(0); i < components; ++i) + { + os << std::setw(fmt.width) << a[i]; + if(components-1 != i) + os << fmt.separator; + } + + os << fmt.delim_right; + } + else + { + for(length_t i(0); i < components; ++i) + { + os << a[i]; + + if(components-1 != i) + os << fmt.space; + } + } + } + + return os; + } +}//namespace detail + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, qua const& a) + { + return detail::print_vector_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, vec<1, T, Q> const& a) + { + return detail::print_vector_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, vec<2, T, Q> const& a) + { + return detail::print_vector_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, vec<3, T, Q> const& a) + { + return detail::print_vector_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, vec<4, T, Q> const& a) + { + return detail::print_vector_on(os, a); + } + +namespace detail +{ + template class M, length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream& print_matrix_on(std::basic_ostream& os, M const& a) + { + typename std::basic_ostream::sentry const cerberus(os); + + if(cerberus) + { + io::format_punct const& fmt(io::get_facet >(os)); + + length_t const& cols(type >::cols); + length_t const& rows(type >::rows); + + if(fmt.formatted) + { + os << fmt.newline << fmt.delim_left; + + switch(fmt.order) + { + case io::column_major: + { + for(length_t i(0); i < rows; ++i) + { + if (0 != i) + os << fmt.space; + + os << row(a, i); + + if(rows-1 != i) + os << fmt.newline; + } + } + break; + + case io::row_major: + { + for(length_t i(0); i < cols; ++i) + { + if(0 != i) + os << fmt.space; + + os << column(a, i); + + if(cols-1 != i) + os << fmt.newline; + } + } + break; + } + + os << fmt.delim_right; + } + else + { + switch (fmt.order) + { + case io::column_major: + { + for(length_t i(0); i < cols; ++i) + { + os << column(a, i); + + if(cols - 1 != i) + os << fmt.space; + } + } + break; + + case io::row_major: + { + for (length_t i(0); i < rows; ++i) + { + os << row(a, i); + + if (rows-1 != i) + os << fmt.space; + } + } + break; + } + } + } + + return os; + } +}//namespace detail + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, mat<2, 2, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, mat<2, 3, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, mat<2, 4, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, mat<3, 2, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, mat<3, 3, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, mat<3, 4, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, mat<4, 2, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, mat<4, 3, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + + template + GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, mat<4, 4, T, Q> const& a) + { + return detail::print_matrix_on(os, a); + } + +namespace detail +{ + template class M, length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream& print_matrix_pair_on(std::basic_ostream& os, std::pair const, M const> const& a) + { + typename std::basic_ostream::sentry const cerberus(os); + + if(cerberus) + { + io::format_punct const& fmt(io::get_facet >(os)); + M const& ml(a.first); + M const& mr(a.second); + length_t const& cols(type >::cols); + length_t const& rows(type >::rows); + + if(fmt.formatted) + { + os << fmt.newline << fmt.delim_left; + + switch(fmt.order) + { + case io::column_major: + { + for(length_t i(0); i < rows; ++i) + { + if(0 != i) + os << fmt.space; + + os << row(ml, i) << ((rows-1 != i) ? fmt.space : fmt.delim_right) << fmt.space << ((0 != i) ? fmt.space : fmt.delim_left) << row(mr, i); + + if(rows-1 != i) + os << fmt.newline; + } + } + break; + case io::row_major: + { + for(length_t i(0); i < cols; ++i) + { + if(0 != i) + os << fmt.space; + + os << column(ml, i) << ((cols-1 != i) ? fmt.space : fmt.delim_right) << fmt.space << ((0 != i) ? fmt.space : fmt.delim_left) << column(mr, i); + + if(cols-1 != i) + os << fmt.newline; + } + } + break; + } + + os << fmt.delim_right; + } + else + { + os << ml << fmt.space << mr; + } + } + + return os; + } +}//namespace detail + + template + GLM_FUNC_QUALIFIER std::basic_ostream& operator<<( + std::basic_ostream & os, + std::pair const, + mat<4, 4, T, Q> const> const& a) + { + return detail::print_matrix_pair_on(os, a); + } +}//namespace glm diff --git a/dep/glm/gtx/log_base.hpp b/dep/glm/gtx/log_base.hpp new file mode 100644 index 0000000..ba28c9d --- /dev/null +++ b/dep/glm/gtx/log_base.hpp @@ -0,0 +1,48 @@ +/// @ref gtx_log_base +/// @file glm/gtx/log_base.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_log_base GLM_GTX_log_base +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Logarithm for any base. base can be a vector or a scalar. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_log_base is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_log_base extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_log_base + /// @{ + + /// Logarithm for any base. + /// From GLM_GTX_log_base. + template + GLM_FUNC_DECL genType log( + genType const& x, + genType const& base); + + /// Logarithm for any base. + /// From GLM_GTX_log_base. + template + GLM_FUNC_DECL vec sign( + vec const& x, + vec const& base); + + /// @} +}//namespace glm + +#include "log_base.inl" diff --git a/dep/glm/gtx/log_base.inl b/dep/glm/gtx/log_base.inl new file mode 100644 index 0000000..4bbb8e8 --- /dev/null +++ b/dep/glm/gtx/log_base.inl @@ -0,0 +1,16 @@ +/// @ref gtx_log_base + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType log(genType const& x, genType const& base) + { + return glm::log(x) / glm::log(base); + } + + template + GLM_FUNC_QUALIFIER vec log(vec const& x, vec const& base) + { + return glm::log(x) / glm::log(base); + } +}//namespace glm diff --git a/dep/glm/gtx/matrix_cross_product.hpp b/dep/glm/gtx/matrix_cross_product.hpp new file mode 100644 index 0000000..1e585f9 --- /dev/null +++ b/dep/glm/gtx/matrix_cross_product.hpp @@ -0,0 +1,47 @@ +/// @ref gtx_matrix_cross_product +/// @file glm/gtx/matrix_cross_product.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_matrix_cross_product GLM_GTX_matrix_cross_product +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Build cross product matrices + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_cross_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_cross_product extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_cross_product + /// @{ + + //! Build a cross product matrix. + //! From GLM_GTX_matrix_cross_product extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> matrixCross3( + vec<3, T, Q> const& x); + + //! Build a cross product matrix. + //! From GLM_GTX_matrix_cross_product extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> matrixCross4( + vec<3, T, Q> const& x); + + /// @} +}//namespace glm + +#include "matrix_cross_product.inl" diff --git a/dep/glm/gtx/matrix_cross_product.inl b/dep/glm/gtx/matrix_cross_product.inl new file mode 100644 index 0000000..3a15397 --- /dev/null +++ b/dep/glm/gtx/matrix_cross_product.inl @@ -0,0 +1,37 @@ +/// @ref gtx_matrix_cross_product + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> matrixCross3 + ( + vec<3, T, Q> const& x + ) + { + mat<3, 3, T, Q> Result(T(0)); + Result[0][1] = x.z; + Result[1][0] = -x.z; + Result[0][2] = -x.y; + Result[2][0] = x.y; + Result[1][2] = x.x; + Result[2][1] = -x.x; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> matrixCross4 + ( + vec<3, T, Q> const& x + ) + { + mat<4, 4, T, Q> Result(T(0)); + Result[0][1] = x.z; + Result[1][0] = -x.z; + Result[0][2] = -x.y; + Result[2][0] = x.y; + Result[1][2] = x.x; + Result[2][1] = -x.x; + return Result; + } + +}//namespace glm diff --git a/dep/glm/gtx/matrix_decompose.hpp b/dep/glm/gtx/matrix_decompose.hpp new file mode 100644 index 0000000..acd7a7f --- /dev/null +++ b/dep/glm/gtx/matrix_decompose.hpp @@ -0,0 +1,46 @@ +/// @ref gtx_matrix_decompose +/// @file glm/gtx/matrix_decompose.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_decompose GLM_GTX_matrix_decompose +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Decomposes a model matrix to translations, rotation and scale components + +#pragma once + +// Dependencies +#include "../mat4x4.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../geometric.hpp" +#include "../gtc/quaternion.hpp" +#include "../gtc/matrix_transform.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_decompose is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_decompose extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_decompose + /// @{ + + /// Decomposes a model matrix to translations, rotation and scale components + /// @see gtx_matrix_decompose + template + GLM_FUNC_DECL bool decompose( + mat<4, 4, T, Q> const& modelMatrix, + vec<3, T, Q> & scale, qua & orientation, vec<3, T, Q> & translation, vec<3, T, Q> & skew, vec<4, T, Q> & perspective); + + /// @} +}//namespace glm + +#include "matrix_decompose.inl" diff --git a/dep/glm/gtx/matrix_decompose.inl b/dep/glm/gtx/matrix_decompose.inl new file mode 100644 index 0000000..694f5ec --- /dev/null +++ b/dep/glm/gtx/matrix_decompose.inl @@ -0,0 +1,186 @@ +/// @ref gtx_matrix_decompose + +#include "../gtc/constants.hpp" +#include "../gtc/epsilon.hpp" + +namespace glm{ +namespace detail +{ + /// Make a linear combination of two vectors and return the result. + // result = (a * ascl) + (b * bscl) + template + GLM_FUNC_QUALIFIER vec<3, T, Q> combine( + vec<3, T, Q> const& a, + vec<3, T, Q> const& b, + T ascl, T bscl) + { + return (a * ascl) + (b * bscl); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> scale(vec<3, T, Q> const& v, T desiredLength) + { + return v * desiredLength / length(v); + } +}//namespace detail + + // Matrix decompose + // http://www.opensource.apple.com/source/WebCore/WebCore-514/platform/graphics/transforms/TransformationMatrix.cpp + // Decomposes the mode matrix to translations,rotation scale components + + template + GLM_FUNC_QUALIFIER bool decompose(mat<4, 4, T, Q> const& ModelMatrix, vec<3, T, Q> & Scale, qua & Orientation, vec<3, T, Q> & Translation, vec<3, T, Q> & Skew, vec<4, T, Q> & Perspective) + { + mat<4, 4, T, Q> LocalMatrix(ModelMatrix); + + // Normalize the matrix. + if(epsilonEqual(LocalMatrix[3][3], static_cast(0), epsilon())) + return false; + + for(length_t i = 0; i < 4; ++i) + for(length_t j = 0; j < 4; ++j) + LocalMatrix[i][j] /= LocalMatrix[3][3]; + + // perspectiveMatrix is used to solve for perspective, but it also provides + // an easy way to test for singularity of the upper 3x3 component. + mat<4, 4, T, Q> PerspectiveMatrix(LocalMatrix); + + for(length_t i = 0; i < 3; i++) + PerspectiveMatrix[i][3] = static_cast(0); + PerspectiveMatrix[3][3] = static_cast(1); + + /// TODO: Fixme! + if(epsilonEqual(determinant(PerspectiveMatrix), static_cast(0), epsilon())) + return false; + + // First, isolate perspective. This is the messiest. + if( + epsilonNotEqual(LocalMatrix[0][3], static_cast(0), epsilon()) || + epsilonNotEqual(LocalMatrix[1][3], static_cast(0), epsilon()) || + epsilonNotEqual(LocalMatrix[2][3], static_cast(0), epsilon())) + { + // rightHandSide is the right hand side of the equation. + vec<4, T, Q> RightHandSide; + RightHandSide[0] = LocalMatrix[0][3]; + RightHandSide[1] = LocalMatrix[1][3]; + RightHandSide[2] = LocalMatrix[2][3]; + RightHandSide[3] = LocalMatrix[3][3]; + + // Solve the equation by inverting PerspectiveMatrix and multiplying + // rightHandSide by the inverse. (This is the easiest way, not + // necessarily the best.) + mat<4, 4, T, Q> InversePerspectiveMatrix = glm::inverse(PerspectiveMatrix);// inverse(PerspectiveMatrix, inversePerspectiveMatrix); + mat<4, 4, T, Q> TransposedInversePerspectiveMatrix = glm::transpose(InversePerspectiveMatrix);// transposeMatrix4(inversePerspectiveMatrix, transposedInversePerspectiveMatrix); + + Perspective = TransposedInversePerspectiveMatrix * RightHandSide; + // v4MulPointByMatrix(rightHandSide, transposedInversePerspectiveMatrix, perspectivePoint); + + // Clear the perspective partition + LocalMatrix[0][3] = LocalMatrix[1][3] = LocalMatrix[2][3] = static_cast(0); + LocalMatrix[3][3] = static_cast(1); + } + else + { + // No perspective. + Perspective = vec<4, T, Q>(0, 0, 0, 1); + } + + // Next take care of translation (easy). + Translation = vec<3, T, Q>(LocalMatrix[3]); + LocalMatrix[3] = vec<4, T, Q>(0, 0, 0, LocalMatrix[3].w); + + vec<3, T, Q> Row[3], Pdum3; + + // Now get scale and shear. + for(length_t i = 0; i < 3; ++i) + for(length_t j = 0; j < 3; ++j) + Row[i][j] = LocalMatrix[i][j]; + + // Compute X scale factor and normalize first row. + Scale.x = length(Row[0]);// v3Length(Row[0]); + + Row[0] = detail::scale(Row[0], static_cast(1)); + + // Compute XY shear factor and make 2nd row orthogonal to 1st. + Skew.z = dot(Row[0], Row[1]); + Row[1] = detail::combine(Row[1], Row[0], static_cast(1), -Skew.z); + + // Now, compute Y scale and normalize 2nd row. + Scale.y = length(Row[1]); + Row[1] = detail::scale(Row[1], static_cast(1)); + Skew.z /= Scale.y; + + // Compute XZ and YZ shears, orthogonalize 3rd row. + Skew.y = glm::dot(Row[0], Row[2]); + Row[2] = detail::combine(Row[2], Row[0], static_cast(1), -Skew.y); + Skew.x = glm::dot(Row[1], Row[2]); + Row[2] = detail::combine(Row[2], Row[1], static_cast(1), -Skew.x); + + // Next, get Z scale and normalize 3rd row. + Scale.z = length(Row[2]); + Row[2] = detail::scale(Row[2], static_cast(1)); + Skew.y /= Scale.z; + Skew.x /= Scale.z; + + // At this point, the matrix (in rows[]) is orthonormal. + // Check for a coordinate system flip. If the determinant + // is -1, then negate the matrix and the scaling factors. + Pdum3 = cross(Row[1], Row[2]); // v3Cross(row[1], row[2], Pdum3); + if(dot(Row[0], Pdum3) < 0) + { + for(length_t i = 0; i < 3; i++) + { + Scale[i] *= static_cast(-1); + Row[i] *= static_cast(-1); + } + } + + // Now, get the rotations out, as described in the gem. + + // FIXME - Add the ability to return either quaternions (which are + // easier to recompose with) or Euler angles (rx, ry, rz), which + // are easier for authors to deal with. The latter will only be useful + // when we fix https://bugs.webkit.org/show_bug.cgi?id=23799, so I + // will leave the Euler angle code here for now. + + // ret.rotateY = asin(-Row[0][2]); + // if (cos(ret.rotateY) != 0) { + // ret.rotateX = atan2(Row[1][2], Row[2][2]); + // ret.rotateZ = atan2(Row[0][1], Row[0][0]); + // } else { + // ret.rotateX = atan2(-Row[2][0], Row[1][1]); + // ret.rotateZ = 0; + // } + + int i, j, k = 0; + T root, trace = Row[0].x + Row[1].y + Row[2].z; + if(trace > static_cast(0)) + { + root = sqrt(trace + static_cast(1.0)); + Orientation.w = static_cast(0.5) * root; + root = static_cast(0.5) / root; + Orientation.x = root * (Row[1].z - Row[2].y); + Orientation.y = root * (Row[2].x - Row[0].z); + Orientation.z = root * (Row[0].y - Row[1].x); + } // End if > 0 + else + { + static int Next[3] = {1, 2, 0}; + i = 0; + if(Row[1].y > Row[0].x) i = 1; + if(Row[2].z > Row[i][i]) i = 2; + j = Next[i]; + k = Next[j]; + + root = sqrt(Row[i][i] - Row[j][j] - Row[k][k] + static_cast(1.0)); + + Orientation[i] = static_cast(0.5) * root; + root = static_cast(0.5) / root; + Orientation[j] = root * (Row[i][j] + Row[j][i]); + Orientation[k] = root * (Row[i][k] + Row[k][i]); + Orientation.w = root * (Row[j][k] - Row[k][j]); + } // End if <= 0 + + return true; + } +}//namespace glm diff --git a/dep/glm/gtx/matrix_factorisation.hpp b/dep/glm/gtx/matrix_factorisation.hpp new file mode 100644 index 0000000..5a975d6 --- /dev/null +++ b/dep/glm/gtx/matrix_factorisation.hpp @@ -0,0 +1,69 @@ +/// @ref gtx_matrix_factorisation +/// @file glm/gtx/matrix_factorisation.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_factorisation GLM_GTX_matrix_factorisation +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Functions to factor matrices in various forms + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_factorisation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_factorisation extension included") +# endif +#endif + +/* +Suggestions: + - Move helper functions flipud and fliplr to another file: They may be helpful in more general circumstances. + - Implement other types of matrix factorisation, such as: QL and LQ, L(D)U, eigendecompositions, etc... +*/ + +namespace glm +{ + /// @addtogroup gtx_matrix_factorisation + /// @{ + + /// Flips the matrix rows up and down. + /// + /// From GLM_GTX_matrix_factorisation extension. + template + GLM_FUNC_DECL mat flipud(mat const& in); + + /// Flips the matrix columns right and left. + /// + /// From GLM_GTX_matrix_factorisation extension. + template + GLM_FUNC_DECL mat fliplr(mat const& in); + + /// Performs QR factorisation of a matrix. + /// Returns 2 matrices, q and r, such that the columns of q are orthonormal and span the same subspace than those of the input matrix, r is an upper triangular matrix, and q*r=in. + /// Given an n-by-m input matrix, q has dimensions min(n,m)-by-m, and r has dimensions n-by-min(n,m). + /// + /// From GLM_GTX_matrix_factorisation extension. + template + GLM_FUNC_DECL void qr_decompose(mat const& in, mat<(C < R ? C : R), R, T, Q>& q, mat& r); + + /// Performs RQ factorisation of a matrix. + /// Returns 2 matrices, r and q, such that r is an upper triangular matrix, the rows of q are orthonormal and span the same subspace than those of the input matrix, and r*q=in. + /// Note that in the context of RQ factorisation, the diagonal is seen as starting in the lower-right corner of the matrix, instead of the usual upper-left. + /// Given an n-by-m input matrix, r has dimensions min(n,m)-by-m, and q has dimensions n-by-min(n,m). + /// + /// From GLM_GTX_matrix_factorisation extension. + template + GLM_FUNC_DECL void rq_decompose(mat const& in, mat<(C < R ? C : R), R, T, Q>& r, mat& q); + + /// @} +} + +#include "matrix_factorisation.inl" diff --git a/dep/glm/gtx/matrix_factorisation.inl b/dep/glm/gtx/matrix_factorisation.inl new file mode 100644 index 0000000..c479b8a --- /dev/null +++ b/dep/glm/gtx/matrix_factorisation.inl @@ -0,0 +1,84 @@ +/// @ref gtx_matrix_factorisation + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat flipud(mat const& in) + { + mat tin = transpose(in); + tin = fliplr(tin); + mat out = transpose(tin); + + return out; + } + + template + GLM_FUNC_QUALIFIER mat fliplr(mat const& in) + { + mat out; + for (length_t i = 0; i < C; i++) + { + out[i] = in[(C - i) - 1]; + } + + return out; + } + + template + GLM_FUNC_QUALIFIER void qr_decompose(mat const& in, mat<(C < R ? C : R), R, T, Q>& q, mat& r) + { + // Uses modified Gram-Schmidt method + // Source: https://en.wikipedia.org/wiki/Gram–Schmidt_process + // And https://en.wikipedia.org/wiki/QR_decomposition + + //For all the linearly independs columns of the input... + // (there can be no more linearly independents columns than there are rows.) + for (length_t i = 0; i < (C < R ? C : R); i++) + { + //Copy in Q the input's i-th column. + q[i] = in[i]; + + //j = [0,i[ + // Make that column orthogonal to all the previous ones by substracting to it the non-orthogonal projection of all the previous columns. + // Also: Fill the zero elements of R + for (length_t j = 0; j < i; j++) + { + q[i] -= dot(q[i], q[j])*q[j]; + r[j][i] = 0; + } + + //Now, Q i-th column is orthogonal to all the previous columns. Normalize it. + q[i] = normalize(q[i]); + + //j = [i,C[ + //Finally, compute the corresponding coefficients of R by computing the projection of the resulting column on the other columns of the input. + for (length_t j = i; j < C; j++) + { + r[j][i] = dot(in[j], q[i]); + } + } + } + + template + GLM_FUNC_QUALIFIER void rq_decompose(mat const& in, mat<(C < R ? C : R), R, T, Q>& r, mat& q) + { + // From https://en.wikipedia.org/wiki/QR_decomposition: + // The RQ decomposition transforms a matrix A into the product of an upper triangular matrix R (also known as right-triangular) and an orthogonal matrix Q. The only difference from QR decomposition is the order of these matrices. + // QR decomposition is Gram–Schmidt orthogonalization of columns of A, started from the first column. + // RQ decomposition is Gram–Schmidt orthogonalization of rows of A, started from the last row. + + mat tin = transpose(in); + tin = fliplr(tin); + + mat tr; + mat<(C < R ? C : R), C, T, Q> tq; + qr_decompose(tin, tq, tr); + + tr = fliplr(tr); + r = transpose(tr); + r = fliplr(r); + + tq = fliplr(tq); + q = transpose(tq); + } +} //namespace glm diff --git a/dep/glm/gtx/matrix_interpolation.hpp b/dep/glm/gtx/matrix_interpolation.hpp new file mode 100644 index 0000000..7d5ad4c --- /dev/null +++ b/dep/glm/gtx/matrix_interpolation.hpp @@ -0,0 +1,60 @@ +/// @ref gtx_matrix_interpolation +/// @file glm/gtx/matrix_interpolation.hpp +/// @author Ghenadii Ursachi (the.asteroth@gmail.com) +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_interpolation GLM_GTX_matrix_interpolation +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Allows to directly interpolate two matrices. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_interpolation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_interpolation extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_interpolation + /// @{ + + /// Get the axis and angle of the rotation from a matrix. + /// From GLM_GTX_matrix_interpolation extension. + template + GLM_FUNC_DECL void axisAngle( + mat<4, 4, T, Q> const& Mat, vec<3, T, Q> & Axis, T & Angle); + + /// Build a matrix from axis and angle. + /// From GLM_GTX_matrix_interpolation extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> axisAngleMatrix( + vec<3, T, Q> const& Axis, T const Angle); + + /// Extracts the rotation part of a matrix. + /// From GLM_GTX_matrix_interpolation extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> extractMatrixRotation( + mat<4, 4, T, Q> const& Mat); + + /// Build a interpolation of 4 * 4 matrixes. + /// From GLM_GTX_matrix_interpolation extension. + /// Warning! works only with rotation and/or translation matrixes, scale will generate unexpected results. + template + GLM_FUNC_DECL mat<4, 4, T, Q> interpolate( + mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2, T const Delta); + + /// @} +}//namespace glm + +#include "matrix_interpolation.inl" diff --git a/dep/glm/gtx/matrix_interpolation.inl b/dep/glm/gtx/matrix_interpolation.inl new file mode 100644 index 0000000..de40b7d --- /dev/null +++ b/dep/glm/gtx/matrix_interpolation.inl @@ -0,0 +1,129 @@ +/// @ref gtx_matrix_interpolation + +#include "../gtc/constants.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER void axisAngle(mat<4, 4, T, Q> const& m, vec<3, T, Q> & axis, T& angle) + { + T epsilon = static_cast(0.01); + T epsilon2 = static_cast(0.1); + + if((abs(m[1][0] - m[0][1]) < epsilon) && (abs(m[2][0] - m[0][2]) < epsilon) && (abs(m[2][1] - m[1][2]) < epsilon)) + { + if ((abs(m[1][0] + m[0][1]) < epsilon2) && (abs(m[2][0] + m[0][2]) < epsilon2) && (abs(m[2][1] + m[1][2]) < epsilon2) && (abs(m[0][0] + m[1][1] + m[2][2] - static_cast(3.0)) < epsilon2)) + { + angle = static_cast(0.0); + axis.x = static_cast(1.0); + axis.y = static_cast(0.0); + axis.z = static_cast(0.0); + return; + } + angle = static_cast(3.1415926535897932384626433832795); + T xx = (m[0][0] + static_cast(1.0)) * static_cast(0.5); + T yy = (m[1][1] + static_cast(1.0)) * static_cast(0.5); + T zz = (m[2][2] + static_cast(1.0)) * static_cast(0.5); + T xy = (m[1][0] + m[0][1]) * static_cast(0.25); + T xz = (m[2][0] + m[0][2]) * static_cast(0.25); + T yz = (m[2][1] + m[1][2]) * static_cast(0.25); + if((xx > yy) && (xx > zz)) + { + if(xx < epsilon) + { + axis.x = static_cast(0.0); + axis.y = static_cast(0.7071); + axis.z = static_cast(0.7071); + } + else + { + axis.x = sqrt(xx); + axis.y = xy / axis.x; + axis.z = xz / axis.x; + } + } + else if (yy > zz) + { + if(yy < epsilon) + { + axis.x = static_cast(0.7071); + axis.y = static_cast(0.0); + axis.z = static_cast(0.7071); + } + else + { + axis.y = sqrt(yy); + axis.x = xy / axis.y; + axis.z = yz / axis.y; + } + } + else + { + if (zz < epsilon) + { + axis.x = static_cast(0.7071); + axis.y = static_cast(0.7071); + axis.z = static_cast(0.0); + } + else + { + axis.z = sqrt(zz); + axis.x = xz / axis.z; + axis.y = yz / axis.z; + } + } + return; + } + T s = sqrt((m[2][1] - m[1][2]) * (m[2][1] - m[1][2]) + (m[2][0] - m[0][2]) * (m[2][0] - m[0][2]) + (m[1][0] - m[0][1]) * (m[1][0] - m[0][1])); + if (glm::abs(s) < T(0.001)) + s = static_cast(1); + T const angleCos = (m[0][0] + m[1][1] + m[2][2] - static_cast(1)) * static_cast(0.5); + if(angleCos - static_cast(1) < epsilon) + angle = pi() * static_cast(0.25); + else + angle = acos(angleCos); + axis.x = (m[1][2] - m[2][1]) / s; + axis.y = (m[2][0] - m[0][2]) / s; + axis.z = (m[0][1] - m[1][0]) / s; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> axisAngleMatrix(vec<3, T, Q> const& axis, T const angle) + { + T c = cos(angle); + T s = sin(angle); + T t = static_cast(1) - c; + vec<3, T, Q> n = normalize(axis); + + return mat<4, 4, T, Q>( + t * n.x * n.x + c, t * n.x * n.y + n.z * s, t * n.x * n.z - n.y * s, static_cast(0.0), + t * n.x * n.y - n.z * s, t * n.y * n.y + c, t * n.y * n.z + n.x * s, static_cast(0.0), + t * n.x * n.z + n.y * s, t * n.y * n.z - n.x * s, t * n.z * n.z + c, static_cast(0.0), + static_cast(0.0), static_cast(0.0), static_cast(0.0), static_cast(1.0)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> extractMatrixRotation(mat<4, 4, T, Q> const& m) + { + return mat<4, 4, T, Q>( + m[0][0], m[0][1], m[0][2], static_cast(0.0), + m[1][0], m[1][1], m[1][2], static_cast(0.0), + m[2][0], m[2][1], m[2][2], static_cast(0.0), + static_cast(0.0), static_cast(0.0), static_cast(0.0), static_cast(1.0)); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> interpolate(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2, T const delta) + { + mat<4, 4, T, Q> m1rot = extractMatrixRotation(m1); + mat<4, 4, T, Q> dltRotation = m2 * transpose(m1rot); + vec<3, T, Q> dltAxis; + T dltAngle; + axisAngle(dltRotation, dltAxis, dltAngle); + mat<4, 4, T, Q> out = axisAngleMatrix(dltAxis, dltAngle * delta) * m1rot; + out[3][0] = m1[3][0] + delta * (m2[3][0] - m1[3][0]); + out[3][1] = m1[3][1] + delta * (m2[3][1] - m1[3][1]); + out[3][2] = m1[3][2] + delta * (m2[3][2] - m1[3][2]); + return out; + } +}//namespace glm diff --git a/dep/glm/gtx/matrix_major_storage.hpp b/dep/glm/gtx/matrix_major_storage.hpp new file mode 100644 index 0000000..8c6bc22 --- /dev/null +++ b/dep/glm/gtx/matrix_major_storage.hpp @@ -0,0 +1,119 @@ +/// @ref gtx_matrix_major_storage +/// @file glm/gtx/matrix_major_storage.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_matrix_major_storage GLM_GTX_matrix_major_storage +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Build matrices with specific matrix order, row or column + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_major_storage is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_major_storage extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_major_storage + /// @{ + + //! Build a row major matrix from row vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> rowMajor2( + vec<2, T, Q> const& v1, + vec<2, T, Q> const& v2); + + //! Build a row major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> rowMajor2( + mat<2, 2, T, Q> const& m); + + //! Build a row major matrix from row vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> rowMajor3( + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3); + + //! Build a row major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> rowMajor3( + mat<3, 3, T, Q> const& m); + + //! Build a row major matrix from row vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> rowMajor4( + vec<4, T, Q> const& v1, + vec<4, T, Q> const& v2, + vec<4, T, Q> const& v3, + vec<4, T, Q> const& v4); + + //! Build a row major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> rowMajor4( + mat<4, 4, T, Q> const& m); + + //! Build a column major matrix from column vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> colMajor2( + vec<2, T, Q> const& v1, + vec<2, T, Q> const& v2); + + //! Build a column major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> colMajor2( + mat<2, 2, T, Q> const& m); + + //! Build a column major matrix from column vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> colMajor3( + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3); + + //! Build a column major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> colMajor3( + mat<3, 3, T, Q> const& m); + + //! Build a column major matrix from column vectors. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> colMajor4( + vec<4, T, Q> const& v1, + vec<4, T, Q> const& v2, + vec<4, T, Q> const& v3, + vec<4, T, Q> const& v4); + + //! Build a column major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> colMajor4( + mat<4, 4, T, Q> const& m); + + /// @} +}//namespace glm + +#include "matrix_major_storage.inl" diff --git a/dep/glm/gtx/matrix_major_storage.inl b/dep/glm/gtx/matrix_major_storage.inl new file mode 100644 index 0000000..279dd34 --- /dev/null +++ b/dep/glm/gtx/matrix_major_storage.inl @@ -0,0 +1,166 @@ +/// @ref gtx_matrix_major_storage + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> rowMajor2 + ( + vec<2, T, Q> const& v1, + vec<2, T, Q> const& v2 + ) + { + mat<2, 2, T, Q> Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> rowMajor2( + const mat<2, 2, T, Q>& m) + { + mat<2, 2, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rowMajor3( + const vec<3, T, Q>& v1, + const vec<3, T, Q>& v2, + const vec<3, T, Q>& v3) + { + mat<3, 3, T, Q> Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[2][0] = v1.z; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + Result[2][1] = v2.z; + Result[0][2] = v3.x; + Result[1][2] = v3.y; + Result[2][2] = v3.z; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rowMajor3( + const mat<3, 3, T, Q>& m) + { + mat<3, 3, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rowMajor4( + const vec<4, T, Q>& v1, + const vec<4, T, Q>& v2, + const vec<4, T, Q>& v3, + const vec<4, T, Q>& v4) + { + mat<4, 4, T, Q> Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[2][0] = v1.z; + Result[3][0] = v1.w; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + Result[2][1] = v2.z; + Result[3][1] = v2.w; + Result[0][2] = v3.x; + Result[1][2] = v3.y; + Result[2][2] = v3.z; + Result[3][2] = v3.w; + Result[0][3] = v4.x; + Result[1][3] = v4.y; + Result[2][3] = v4.z; + Result[3][3] = v4.w; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rowMajor4( + const mat<4, 4, T, Q>& m) + { + mat<4, 4, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[2][3] = m[3][2]; + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + Result[3][2] = m[2][3]; + Result[3][3] = m[3][3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> colMajor2( + const vec<2, T, Q>& v1, + const vec<2, T, Q>& v2) + { + return mat<2, 2, T, Q>(v1, v2); + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> colMajor2( + const mat<2, 2, T, Q>& m) + { + return mat<2, 2, T, Q>(m); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> colMajor3( + const vec<3, T, Q>& v1, + const vec<3, T, Q>& v2, + const vec<3, T, Q>& v3) + { + return mat<3, 3, T, Q>(v1, v2, v3); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> colMajor3( + const mat<3, 3, T, Q>& m) + { + return mat<3, 3, T, Q>(m); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> colMajor4( + const vec<4, T, Q>& v1, + const vec<4, T, Q>& v2, + const vec<4, T, Q>& v3, + const vec<4, T, Q>& v4) + { + return mat<4, 4, T, Q>(v1, v2, v3, v4); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> colMajor4( + const mat<4, 4, T, Q>& m) + { + return mat<4, 4, T, Q>(m); + } +}//namespace glm diff --git a/dep/glm/gtx/matrix_operation.hpp b/dep/glm/gtx/matrix_operation.hpp new file mode 100644 index 0000000..de6ff1f --- /dev/null +++ b/dep/glm/gtx/matrix_operation.hpp @@ -0,0 +1,103 @@ +/// @ref gtx_matrix_operation +/// @file glm/gtx/matrix_operation.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_operation GLM_GTX_matrix_operation +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Build diagonal matrices from vectors. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_operation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_operation extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_operation + /// @{ + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> diagonal2x2( + vec<2, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<2, 3, T, Q> diagonal2x3( + vec<2, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<2, 4, T, Q> diagonal2x4( + vec<2, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<3, 2, T, Q> diagonal3x2( + vec<2, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> diagonal3x3( + vec<3, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<3, 4, T, Q> diagonal3x4( + vec<3, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<4, 2, T, Q> diagonal4x2( + vec<2, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<4, 3, T, Q> diagonal4x3( + vec<3, T, Q> const& v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> diagonal4x4( + vec<4, T, Q> const& v); + + /// Build an adjugate matrix. + /// From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<2, 2, T, Q> adjugate(mat<2, 2, T, Q> const& m); + + /// Build an adjugate matrix. + /// From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> adjugate(mat<3, 3, T, Q> const& m); + + /// Build an adjugate matrix. + /// From GLM_GTX_matrix_operation extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> adjugate(mat<4, 4, T, Q> const& m); + + /// @} +}//namespace glm + +#include "matrix_operation.inl" diff --git a/dep/glm/gtx/matrix_operation.inl b/dep/glm/gtx/matrix_operation.inl new file mode 100644 index 0000000..9de83f8 --- /dev/null +++ b/dep/glm/gtx/matrix_operation.inl @@ -0,0 +1,176 @@ +/// @ref gtx_matrix_operation + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> diagonal2x2 + ( + vec<2, T, Q> const& v + ) + { + mat<2, 2, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> diagonal2x3 + ( + vec<2, T, Q> const& v + ) + { + mat<2, 3, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> diagonal2x4 + ( + vec<2, T, Q> const& v + ) + { + mat<2, 4, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> diagonal3x2 + ( + vec<2, T, Q> const& v + ) + { + mat<3, 2, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> diagonal3x3 + ( + vec<3, T, Q> const& v + ) + { + mat<3, 3, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> diagonal3x4 + ( + vec<3, T, Q> const& v + ) + { + mat<3, 4, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> diagonal4x4 + ( + vec<4, T, Q> const& v + ) + { + mat<4, 4, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + Result[3][3] = v[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> diagonal4x3 + ( + vec<3, T, Q> const& v + ) + { + mat<4, 3, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> diagonal4x2 + ( + vec<2, T, Q> const& v + ) + { + mat<4, 2, T, Q> Result(static_cast(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> adjugate(mat<2, 2, T, Q> const& m) + { + return mat<2, 2, T, Q>( + +m[1][1], -m[1][0], + -m[0][1], +m[0][0]); + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> adjugate(mat<3, 3, T, Q> const& m) + { + T const m00 = determinant(mat<2, 2, T, Q>(m[1][1], m[2][1], m[1][2], m[2][2])); + T const m01 = determinant(mat<2, 2, T, Q>(m[0][1], m[2][1], m[0][2], m[2][2])); + T const m02 = determinant(mat<2, 2, T, Q>(m[0][1], m[1][1], m[0][2], m[1][2])); + + T const m10 = determinant(mat<2, 2, T, Q>(m[1][0], m[2][0], m[1][2], m[2][2])); + T const m11 = determinant(mat<2, 2, T, Q>(m[0][0], m[2][0], m[0][2], m[2][2])); + T const m12 = determinant(mat<2, 2, T, Q>(m[0][0], m[1][0], m[0][2], m[1][2])); + + T const m20 = determinant(mat<2, 2, T, Q>(m[1][0], m[2][0], m[1][1], m[2][1])); + T const m21 = determinant(mat<2, 2, T, Q>(m[0][0], m[2][0], m[0][1], m[2][1])); + T const m22 = determinant(mat<2, 2, T, Q>(m[0][0], m[1][0], m[0][1], m[1][1])); + + return mat<3, 3, T, Q>( + +m00, -m01, +m02, + -m10, +m11, -m12, + +m20, -m21, +m22); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> adjugate(mat<4, 4, T, Q> const& m) + { + T const m00 = determinant(mat<3, 3, T, Q>(m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], m[3][3])); + T const m01 = determinant(mat<3, 3, T, Q>(m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], m[3][3])); + T const m02 = determinant(mat<3, 3, T, Q>(m[1][0], m[1][1], m[1][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][1], m[3][3])); + T const m03 = determinant(mat<3, 3, T, Q>(m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], m[3][2])); + + T const m10 = determinant(mat<3, 3, T, Q>(m[0][1], m[0][2], m[0][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], m[3][3])); + T const m11 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][2], m[0][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], m[3][3])); + T const m12 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][3], m[2][0], m[2][1], m[2][3], m[3][0], m[3][1], m[3][3])); + T const m13 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], m[3][2])); + + T const m20 = determinant(mat<3, 3, T, Q>(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[3][1], m[3][2], m[3][3])); + T const m21 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[3][0], m[3][2], m[3][3])); + T const m22 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[3][0], m[3][1], m[3][3])); + T const m23 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[3][0], m[3][1], m[3][2])); + + T const m30 = determinant(mat<3, 3, T, Q>(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], m[2][3])); + T const m31 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], m[2][3])); + T const m32 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[2][0], m[2][1], m[2][3])); + T const m33 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2])); + + return mat<4, 4, T, Q>( + +m00, -m01, +m02, -m03, + -m10, +m11, -m12, +m13, + +m20, -m21, +m22, -m23, + -m30, +m31, -m32, +m33); + } +}//namespace glm diff --git a/dep/glm/gtx/matrix_query.hpp b/dep/glm/gtx/matrix_query.hpp new file mode 100644 index 0000000..8011b2b --- /dev/null +++ b/dep/glm/gtx/matrix_query.hpp @@ -0,0 +1,77 @@ +/// @ref gtx_matrix_query +/// @file glm/gtx/matrix_query.hpp +/// +/// @see core (dependence) +/// @see gtx_vector_query (dependence) +/// +/// @defgroup gtx_matrix_query GLM_GTX_matrix_query +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Query to evaluate matrix properties + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/vector_query.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_query is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_query extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_query + /// @{ + + /// Return whether a matrix a null matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNull(mat<2, 2, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix a null matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNull(mat<3, 3, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix is a null matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNull(mat<4, 4, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix is an identity matrix. + /// From GLM_GTX_matrix_query extension. + template class matType> + GLM_FUNC_DECL bool isIdentity(matType const& m, T const& epsilon); + + /// Return whether a matrix is a normalized matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNormalized(mat<2, 2, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix is a normalized matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNormalized(mat<3, 3, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix is a normalized matrix. + /// From GLM_GTX_matrix_query extension. + template + GLM_FUNC_DECL bool isNormalized(mat<4, 4, T, Q> const& m, T const& epsilon); + + /// Return whether a matrix is an orthonormalized matrix. + /// From GLM_GTX_matrix_query extension. + template class matType> + GLM_FUNC_DECL bool isOrthogonal(matType const& m, T const& epsilon); + + /// @} +}//namespace glm + +#include "matrix_query.inl" diff --git a/dep/glm/gtx/matrix_query.inl b/dep/glm/gtx/matrix_query.inl new file mode 100644 index 0000000..77bd231 --- /dev/null +++ b/dep/glm/gtx/matrix_query.inl @@ -0,0 +1,113 @@ +/// @ref gtx_matrix_query + +namespace glm +{ + template + GLM_FUNC_QUALIFIER bool isNull(mat<2, 2, T, Q> const& m, T const& epsilon) + { + bool result = true; + for(length_t i = 0; result && i < m.length() ; ++i) + result = isNull(m[i], epsilon); + return result; + } + + template + GLM_FUNC_QUALIFIER bool isNull(mat<3, 3, T, Q> const& m, T const& epsilon) + { + bool result = true; + for(length_t i = 0; result && i < m.length() ; ++i) + result = isNull(m[i], epsilon); + return result; + } + + template + GLM_FUNC_QUALIFIER bool isNull(mat<4, 4, T, Q> const& m, T const& epsilon) + { + bool result = true; + for(length_t i = 0; result && i < m.length() ; ++i) + result = isNull(m[i], epsilon); + return result; + } + + template + GLM_FUNC_QUALIFIER bool isIdentity(mat const& m, T const& epsilon) + { + bool result = true; + for(length_t i = 0; result && i < m[0].length() ; ++i) + { + for(length_t j = 0; result && j < i ; ++j) + result = abs(m[i][j]) <= epsilon; + if(result) + result = abs(m[i][i] - 1) <= epsilon; + for(length_t j = i + 1; result && j < m.length(); ++j) + result = abs(m[i][j]) <= epsilon; + } + return result; + } + + template + GLM_FUNC_QUALIFIER bool isNormalized(mat<2, 2, T, Q> const& m, T const& epsilon) + { + bool result(true); + for(length_t i = 0; result && i < m.length(); ++i) + result = isNormalized(m[i], epsilon); + for(length_t i = 0; result && i < m.length(); ++i) + { + typename mat<2, 2, T, Q>::col_type v; + for(length_t j = 0; j < m.length(); ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; + } + + template + GLM_FUNC_QUALIFIER bool isNormalized(mat<3, 3, T, Q> const& m, T const& epsilon) + { + bool result(true); + for(length_t i = 0; result && i < m.length(); ++i) + result = isNormalized(m[i], epsilon); + for(length_t i = 0; result && i < m.length(); ++i) + { + typename mat<3, 3, T, Q>::col_type v; + for(length_t j = 0; j < m.length(); ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; + } + + template + GLM_FUNC_QUALIFIER bool isNormalized(mat<4, 4, T, Q> const& m, T const& epsilon) + { + bool result(true); + for(length_t i = 0; result && i < m.length(); ++i) + result = isNormalized(m[i], epsilon); + for(length_t i = 0; result && i < m.length(); ++i) + { + typename mat<4, 4, T, Q>::col_type v; + for(length_t j = 0; j < m.length(); ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; + } + + template + GLM_FUNC_QUALIFIER bool isOrthogonal(mat const& m, T const& epsilon) + { + bool result = true; + for(length_t i(0); result && i < m.length() - 1; ++i) + for(length_t j(i + 1); result && j < m.length(); ++j) + result = areOrthogonal(m[i], m[j], epsilon); + + if(result) + { + mat tmp = transpose(m); + for(length_t i(0); result && i < m.length() - 1 ; ++i) + for(length_t j(i + 1); result && j < m.length(); ++j) + result = areOrthogonal(tmp[i], tmp[j], epsilon); + } + return result; + } +}//namespace glm diff --git a/dep/glm/gtx/matrix_transform_2d.hpp b/dep/glm/gtx/matrix_transform_2d.hpp new file mode 100644 index 0000000..5f9c540 --- /dev/null +++ b/dep/glm/gtx/matrix_transform_2d.hpp @@ -0,0 +1,81 @@ +/// @ref gtx_matrix_transform_2d +/// @file glm/gtx/matrix_transform_2d.hpp +/// @author Miguel Ãngel Pérez Martínez +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_transform_2d GLM_GTX_matrix_transform_2d +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defines functions that generate common 2d transformation matrices. + +#pragma once + +// Dependency: +#include "../mat3x3.hpp" +#include "../vec2.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_matrix_transform_2d is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_matrix_transform_2d extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_transform_2d + /// @{ + + /// Builds a translation 3 * 3 matrix created from a vector of 2 components. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param v Coordinates of a translation vector. + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v); + + /// Builds a rotation 3 * 3 matrix created from an angle. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param angle Rotation angle expressed in radians. + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate( + mat<3, 3, T, Q> const& m, + T angle); + + /// Builds a scale 3 * 3 matrix created from a vector of 2 components. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param v Coordinates of a scale vector. + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v); + + /// Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param y Shear factor. + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX( + mat<3, 3, T, Q> const& m, + T y); + + /// Builds a vertical (parallel to the y axis) shear 3 * 3 matrix. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param x Shear factor. + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY( + mat<3, 3, T, Q> const& m, + T x); + + /// @} +}//namespace glm + +#include "matrix_transform_2d.inl" diff --git a/dep/glm/gtx/matrix_transform_2d.inl b/dep/glm/gtx/matrix_transform_2d.inl new file mode 100644 index 0000000..a68d24d --- /dev/null +++ b/dep/glm/gtx/matrix_transform_2d.inl @@ -0,0 +1,68 @@ +/// @ref gtx_matrix_transform_2d +/// @author Miguel Ãngel Pérez Martínez + +#include "../trigonometric.hpp" + +namespace glm +{ + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v) + { + mat<3, 3, T, Q> Result(m); + Result[2] = m[0] * v[0] + m[1] * v[1] + m[2]; + return Result; + } + + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate( + mat<3, 3, T, Q> const& m, + T angle) + { + T const a = angle; + T const c = cos(a); + T const s = sin(a); + + mat<3, 3, T, Q> Result; + Result[0] = m[0] * c + m[1] * s; + Result[1] = m[0] * -s + m[1] * c; + Result[2] = m[2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v) + { + mat<3, 3, T, Q> Result; + Result[0] = m[0] * v[0]; + Result[1] = m[1] * v[1]; + Result[2] = m[2]; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX( + mat<3, 3, T, Q> const& m, + T y) + { + mat<3, 3, T, Q> Result(1); + Result[0][1] = y; + return m * Result; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY( + mat<3, 3, T, Q> const& m, + T x) + { + mat<3, 3, T, Q> Result(1); + Result[1][0] = x; + return m * Result; + } + +}//namespace glm diff --git a/dep/glm/gtx/mixed_product.hpp b/dep/glm/gtx/mixed_product.hpp new file mode 100644 index 0000000..b242e35 --- /dev/null +++ b/dep/glm/gtx/mixed_product.hpp @@ -0,0 +1,41 @@ +/// @ref gtx_mixed_product +/// @file glm/gtx/mixed_product.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_mixed_product GLM_GTX_mixed_producte +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Mixed product of 3 vectors. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_mixed_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_mixed_product extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_mixed_product + /// @{ + + /// @brief Mixed product of 3 vectors (from GLM_GTX_mixed_product extension) + template + GLM_FUNC_DECL T mixedProduct( + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3); + + /// @} +}// namespace glm + +#include "mixed_product.inl" diff --git a/dep/glm/gtx/mixed_product.inl b/dep/glm/gtx/mixed_product.inl new file mode 100644 index 0000000..e5cdbdb --- /dev/null +++ b/dep/glm/gtx/mixed_product.inl @@ -0,0 +1,15 @@ +/// @ref gtx_mixed_product + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T mixedProduct + ( + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3 + ) + { + return dot(cross(v1, v2), v3); + } +}//namespace glm diff --git a/dep/glm/gtx/norm.hpp b/dep/glm/gtx/norm.hpp new file mode 100644 index 0000000..dfaebb7 --- /dev/null +++ b/dep/glm/gtx/norm.hpp @@ -0,0 +1,88 @@ +/// @ref gtx_norm +/// @file glm/gtx/norm.hpp +/// +/// @see core (dependence) +/// @see gtx_quaternion (dependence) +/// @see gtx_component_wise (dependence) +/// +/// @defgroup gtx_norm GLM_GTX_norm +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Various ways to compute vector norms. + +#pragma once + +// Dependency: +#include "../geometric.hpp" +#include "../gtx/quaternion.hpp" +#include "../gtx/component_wise.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_norm is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_norm extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_norm + /// @{ + + /// Returns the squared length of x. + /// From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T length2(vec const& x); + + /// Returns the squared distance between p0 and p1, i.e., length2(p0 - p1). + /// From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T distance2(vec const& p0, vec const& p1); + + //! Returns the L1 norm between x and y. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T l1Norm(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + + //! Returns the L1 norm of v. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T l1Norm(vec<3, T, Q> const& v); + + //! Returns the L2 norm between x and y. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T l2Norm(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + + //! Returns the L2 norm of v. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T l2Norm(vec<3, T, Q> const& x); + + //! Returns the L norm between x and y. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T lxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y, unsigned int Depth); + + //! Returns the L norm of v. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T lxNorm(vec<3, T, Q> const& x, unsigned int Depth); + + //! Returns the LMax norm between x and y. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T lMaxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + + //! Returns the LMax norm of v. + //! From GLM_GTX_norm extension. + template + GLM_FUNC_DECL T lMaxNorm(vec<3, T, Q> const& x); + + /// @} +}//namespace glm + +#include "norm.inl" diff --git a/dep/glm/gtx/norm.inl b/dep/glm/gtx/norm.inl new file mode 100644 index 0000000..6db561b --- /dev/null +++ b/dep/glm/gtx/norm.inl @@ -0,0 +1,95 @@ +/// @ref gtx_norm + +#include "../detail/qualifier.hpp" + +namespace glm{ +namespace detail +{ + template + struct compute_length2 + { + GLM_FUNC_QUALIFIER static T call(vec const& v) + { + return dot(v, v); + } + }; +}//namespace detail + + template + GLM_FUNC_QUALIFIER genType length2(genType x) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'length2' accepts only floating-point inputs"); + return x * x; + } + + template + GLM_FUNC_QUALIFIER T length2(vec const& v) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'length2' accepts only floating-point inputs"); + return detail::compute_length2::value>::call(v); + } + + template + GLM_FUNC_QUALIFIER T distance2(T p0, T p1) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'distance2' accepts only floating-point inputs"); + return length2(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER T distance2(vec const& p0, vec const& p1) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'distance2' accepts only floating-point inputs"); + return length2(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER T l1Norm(vec<3, T, Q> const& a, vec<3, T, Q> const& b) + { + return abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z); + } + + template + GLM_FUNC_QUALIFIER T l1Norm(vec<3, T, Q> const& v) + { + return abs(v.x) + abs(v.y) + abs(v.z); + } + + template + GLM_FUNC_QUALIFIER T l2Norm(vec<3, T, Q> const& a, vec<3, T, Q> const& b + ) + { + return length(b - a); + } + + template + GLM_FUNC_QUALIFIER T l2Norm(vec<3, T, Q> const& v) + { + return length(v); + } + + template + GLM_FUNC_QUALIFIER T lxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y, unsigned int Depth) + { + return pow(pow(abs(y.x - x.x), T(Depth)) + pow(abs(y.y - x.y), T(Depth)) + pow(abs(y.z - x.z), T(Depth)), T(1) / T(Depth)); + } + + template + GLM_FUNC_QUALIFIER T lxNorm(vec<3, T, Q> const& v, unsigned int Depth) + { + return pow(pow(abs(v.x), T(Depth)) + pow(abs(v.y), T(Depth)) + pow(abs(v.z), T(Depth)), T(1) / T(Depth)); + } + + template + GLM_FUNC_QUALIFIER T lMaxNorm(vec<3, T, Q> const& a, vec<3, T, Q> const& b) + { + return compMax(abs(b - a)); + } + + template + GLM_FUNC_QUALIFIER T lMaxNorm(vec<3, T, Q> const& v) + { + return compMax(abs(v)); + } + +}//namespace glm diff --git a/dep/glm/gtx/normal.hpp b/dep/glm/gtx/normal.hpp new file mode 100644 index 0000000..068682f --- /dev/null +++ b/dep/glm/gtx/normal.hpp @@ -0,0 +1,41 @@ +/// @ref gtx_normal +/// @file glm/gtx/normal.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_normal GLM_GTX_normal +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Compute the normal of a triangle. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_normal is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_normal extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_normal + /// @{ + + /// Computes triangle normal from triangle points. + /// + /// @see gtx_normal + template + GLM_FUNC_DECL vec<3, T, Q> triangleNormal(vec<3, T, Q> const& p1, vec<3, T, Q> const& p2, vec<3, T, Q> const& p3); + + /// @} +}//namespace glm + +#include "normal.inl" diff --git a/dep/glm/gtx/normal.inl b/dep/glm/gtx/normal.inl new file mode 100644 index 0000000..74f9fc9 --- /dev/null +++ b/dep/glm/gtx/normal.inl @@ -0,0 +1,15 @@ +/// @ref gtx_normal + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> triangleNormal + ( + vec<3, T, Q> const& p1, + vec<3, T, Q> const& p2, + vec<3, T, Q> const& p3 + ) + { + return normalize(cross(p1 - p2, p1 - p3)); + } +}//namespace glm diff --git a/dep/glm/gtx/normalize_dot.hpp b/dep/glm/gtx/normalize_dot.hpp new file mode 100644 index 0000000..5195802 --- /dev/null +++ b/dep/glm/gtx/normalize_dot.hpp @@ -0,0 +1,49 @@ +/// @ref gtx_normalize_dot +/// @file glm/gtx/normalize_dot.hpp +/// +/// @see core (dependence) +/// @see gtx_fast_square_root (dependence) +/// +/// @defgroup gtx_normalize_dot GLM_GTX_normalize_dot +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Dot product of vectors that need to be normalize with a single square root. + +#pragma once + +// Dependency: +#include "../gtx/fast_square_root.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_normalize_dot is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_normalize_dot extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_normalize_dot + /// @{ + + /// Normalize parameters and returns the dot product of x and y. + /// It's faster that dot(normalize(x), normalize(y)). + /// + /// @see gtx_normalize_dot extension. + template + GLM_FUNC_DECL T normalizeDot(vec const& x, vec const& y); + + /// Normalize parameters and returns the dot product of x and y. + /// Faster that dot(fastNormalize(x), fastNormalize(y)). + /// + /// @see gtx_normalize_dot extension. + template + GLM_FUNC_DECL T fastNormalizeDot(vec const& x, vec const& y); + + /// @} +}//namespace glm + +#include "normalize_dot.inl" diff --git a/dep/glm/gtx/normalize_dot.inl b/dep/glm/gtx/normalize_dot.inl new file mode 100644 index 0000000..7bcd9a5 --- /dev/null +++ b/dep/glm/gtx/normalize_dot.inl @@ -0,0 +1,16 @@ +/// @ref gtx_normalize_dot + +namespace glm +{ + template + GLM_FUNC_QUALIFIER T normalizeDot(vec const& x, vec const& y) + { + return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); + } + + template + GLM_FUNC_QUALIFIER T fastNormalizeDot(vec const& x, vec const& y) + { + return glm::dot(x, y) * glm::fastInverseSqrt(glm::dot(x, x) * glm::dot(y, y)); + } +}//namespace glm diff --git a/dep/glm/gtx/number_precision.hpp b/dep/glm/gtx/number_precision.hpp new file mode 100644 index 0000000..3a606bd --- /dev/null +++ b/dep/glm/gtx/number_precision.hpp @@ -0,0 +1,61 @@ +/// @ref gtx_number_precision +/// @file glm/gtx/number_precision.hpp +/// +/// @see core (dependence) +/// @see gtc_type_precision (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_number_precision GLM_GTX_number_precision +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defined size types. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/type_precision.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_number_precision is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_number_precision extension included") +# endif +#endif + +namespace glm{ +namespace gtx +{ + ///////////////////////////// + // Unsigned int vector types + + /// @addtogroup gtx_number_precision + /// @{ + + typedef u8 u8vec1; //!< \brief 8bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + typedef u16 u16vec1; //!< \brief 16bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + typedef u32 u32vec1; //!< \brief 32bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + typedef u64 u64vec1; //!< \brief 64bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + + ////////////////////// + // Float vector types + + typedef f32 f32vec1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64vec1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + + ////////////////////// + // Float matrix types + + typedef f32 f32mat1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f32 f32mat1x1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64mat1; //!< \brief Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64mat1x1; //!< \brief Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + + /// @} +}//namespace gtx +}//namespace glm + +#include "number_precision.inl" diff --git a/dep/glm/gtx/number_precision.inl b/dep/glm/gtx/number_precision.inl new file mode 100644 index 0000000..b39d71c --- /dev/null +++ b/dep/glm/gtx/number_precision.inl @@ -0,0 +1,6 @@ +/// @ref gtx_number_precision + +namespace glm +{ + +} diff --git a/dep/glm/gtx/optimum_pow.hpp b/dep/glm/gtx/optimum_pow.hpp new file mode 100644 index 0000000..9284a47 --- /dev/null +++ b/dep/glm/gtx/optimum_pow.hpp @@ -0,0 +1,54 @@ +/// @ref gtx_optimum_pow +/// @file glm/gtx/optimum_pow.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_optimum_pow GLM_GTX_optimum_pow +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Integer exponentiation of power functions. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_optimum_pow is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_optimum_pow extension included") +# endif +#endif + +namespace glm{ +namespace gtx +{ + /// @addtogroup gtx_optimum_pow + /// @{ + + /// Returns x raised to the power of 2. + /// + /// @see gtx_optimum_pow + template + GLM_FUNC_DECL genType pow2(genType const& x); + + /// Returns x raised to the power of 3. + /// + /// @see gtx_optimum_pow + template + GLM_FUNC_DECL genType pow3(genType const& x); + + /// Returns x raised to the power of 4. + /// + /// @see gtx_optimum_pow + template + GLM_FUNC_DECL genType pow4(genType const& x); + + /// @} +}//namespace gtx +}//namespace glm + +#include "optimum_pow.inl" diff --git a/dep/glm/gtx/optimum_pow.inl b/dep/glm/gtx/optimum_pow.inl new file mode 100644 index 0000000..a26c19c --- /dev/null +++ b/dep/glm/gtx/optimum_pow.inl @@ -0,0 +1,22 @@ +/// @ref gtx_optimum_pow + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType pow2(genType const& x) + { + return x * x; + } + + template + GLM_FUNC_QUALIFIER genType pow3(genType const& x) + { + return x * x * x; + } + + template + GLM_FUNC_QUALIFIER genType pow4(genType const& x) + { + return (x * x) * (x * x); + } +}//namespace glm diff --git a/dep/glm/gtx/orthonormalize.hpp b/dep/glm/gtx/orthonormalize.hpp new file mode 100644 index 0000000..3e004fb --- /dev/null +++ b/dep/glm/gtx/orthonormalize.hpp @@ -0,0 +1,49 @@ +/// @ref gtx_orthonormalize +/// @file glm/gtx/orthonormalize.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_orthonormalize GLM_GTX_orthonormalize +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Orthonormalize matrices. + +#pragma once + +// Dependency: +#include "../vec3.hpp" +#include "../mat3x3.hpp" +#include "../geometric.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_orthonormalize is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_orthonormalize extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_orthonormalize + /// @{ + + /// Returns the orthonormalized matrix of m. + /// + /// @see gtx_orthonormalize + template + GLM_FUNC_DECL mat<3, 3, T, Q> orthonormalize(mat<3, 3, T, Q> const& m); + + /// Orthonormalizes x according y. + /// + /// @see gtx_orthonormalize + template + GLM_FUNC_DECL vec<3, T, Q> orthonormalize(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + + /// @} +}//namespace glm + +#include "orthonormalize.inl" diff --git a/dep/glm/gtx/orthonormalize.inl b/dep/glm/gtx/orthonormalize.inl new file mode 100644 index 0000000..cb553ba --- /dev/null +++ b/dep/glm/gtx/orthonormalize.inl @@ -0,0 +1,29 @@ +/// @ref gtx_orthonormalize + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> orthonormalize(mat<3, 3, T, Q> const& m) + { + mat<3, 3, T, Q> r = m; + + r[0] = normalize(r[0]); + + T d0 = dot(r[0], r[1]); + r[1] -= r[0] * d0; + r[1] = normalize(r[1]); + + T d1 = dot(r[1], r[2]); + d0 = dot(r[0], r[2]); + r[2] -= r[0] * d0 + r[1] * d1; + r[2] = normalize(r[2]); + + return r; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> orthonormalize(vec<3, T, Q> const& x, vec<3, T, Q> const& y) + { + return normalize(x - y * dot(y, x)); + } +}//namespace glm diff --git a/dep/glm/gtx/perpendicular.hpp b/dep/glm/gtx/perpendicular.hpp new file mode 100644 index 0000000..72b77b6 --- /dev/null +++ b/dep/glm/gtx/perpendicular.hpp @@ -0,0 +1,41 @@ +/// @ref gtx_perpendicular +/// @file glm/gtx/perpendicular.hpp +/// +/// @see core (dependence) +/// @see gtx_projection (dependence) +/// +/// @defgroup gtx_perpendicular GLM_GTX_perpendicular +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Perpendicular of a vector from other one + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/projection.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_perpendicular is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_perpendicular extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_perpendicular + /// @{ + + //! Projects x a perpendicular axis of Normal. + //! From GLM_GTX_perpendicular extension. + template + GLM_FUNC_DECL genType perp(genType const& x, genType const& Normal); + + /// @} +}//namespace glm + +#include "perpendicular.inl" diff --git a/dep/glm/gtx/perpendicular.inl b/dep/glm/gtx/perpendicular.inl new file mode 100644 index 0000000..1e72f33 --- /dev/null +++ b/dep/glm/gtx/perpendicular.inl @@ -0,0 +1,10 @@ +/// @ref gtx_perpendicular + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType perp(genType const& x, genType const& Normal) + { + return x - proj(x, Normal); + } +}//namespace glm diff --git a/dep/glm/gtx/polar_coordinates.hpp b/dep/glm/gtx/polar_coordinates.hpp new file mode 100644 index 0000000..76beb82 --- /dev/null +++ b/dep/glm/gtx/polar_coordinates.hpp @@ -0,0 +1,48 @@ +/// @ref gtx_polar_coordinates +/// @file glm/gtx/polar_coordinates.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_polar_coordinates GLM_GTX_polar_coordinates +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Conversion from Euclidean space to polar space and revert. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_polar_coordinates is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_polar_coordinates extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_polar_coordinates + /// @{ + + /// Convert Euclidean to Polar coordinates, x is the latitude, y the longitude and z the xz distance. + /// + /// @see gtx_polar_coordinates + template + GLM_FUNC_DECL vec<3, T, Q> polar( + vec<3, T, Q> const& euclidean); + + /// Convert Polar to Euclidean coordinates. + /// + /// @see gtx_polar_coordinates + template + GLM_FUNC_DECL vec<3, T, Q> euclidean( + vec<2, T, Q> const& polar); + + /// @} +}//namespace glm + +#include "polar_coordinates.inl" diff --git a/dep/glm/gtx/polar_coordinates.inl b/dep/glm/gtx/polar_coordinates.inl new file mode 100644 index 0000000..371c8dd --- /dev/null +++ b/dep/glm/gtx/polar_coordinates.inl @@ -0,0 +1,36 @@ +/// @ref gtx_polar_coordinates + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> polar + ( + vec<3, T, Q> const& euclidean + ) + { + T const Length(length(euclidean)); + vec<3, T, Q> const tmp(euclidean / Length); + T const xz_dist(sqrt(tmp.x * tmp.x + tmp.z * tmp.z)); + + return vec<3, T, Q>( + asin(tmp.y), // latitude + atan(tmp.x, tmp.z), // longitude + xz_dist); // xz distance + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> euclidean + ( + vec<2, T, Q> const& polar + ) + { + T const latitude(polar.x); + T const longitude(polar.y); + + return vec<3, T, Q>( + cos(latitude) * sin(longitude), + sin(latitude), + cos(latitude) * cos(longitude)); + } + +}//namespace glm diff --git a/dep/glm/gtx/projection.hpp b/dep/glm/gtx/projection.hpp new file mode 100644 index 0000000..678f3ad --- /dev/null +++ b/dep/glm/gtx/projection.hpp @@ -0,0 +1,43 @@ +/// @ref gtx_projection +/// @file glm/gtx/projection.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_projection GLM_GTX_projection +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Projection of a vector to other one + +#pragma once + +// Dependency: +#include "../geometric.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_projection is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_projection extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_projection + /// @{ + + /// Projects x on Normal. + /// + /// @param[in] x A vector to project + /// @param[in] Normal A normal that doesn't need to be of unit length. + /// + /// @see gtx_projection + template + GLM_FUNC_DECL genType proj(genType const& x, genType const& Normal); + + /// @} +}//namespace glm + +#include "projection.inl" diff --git a/dep/glm/gtx/projection.inl b/dep/glm/gtx/projection.inl new file mode 100644 index 0000000..f23f884 --- /dev/null +++ b/dep/glm/gtx/projection.inl @@ -0,0 +1,10 @@ +/// @ref gtx_projection + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType proj(genType const& x, genType const& Normal) + { + return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal; + } +}//namespace glm diff --git a/dep/glm/gtx/quaternion.hpp b/dep/glm/gtx/quaternion.hpp new file mode 100644 index 0000000..5c2b5ad --- /dev/null +++ b/dep/glm/gtx/quaternion.hpp @@ -0,0 +1,174 @@ +/// @ref gtx_quaternion +/// @file glm/gtx/quaternion.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_quaternion GLM_GTX_quaternion +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Extented quaternion types and functions + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/constants.hpp" +#include "../gtc/quaternion.hpp" +#include "../ext/quaternion_exponential.hpp" +#include "../gtx/norm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_quaternion extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_quaternion + /// @{ + + /// Create an identity quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL GLM_CONSTEXPR qua quat_identity(); + + /// Compute a cross product between a quaternion and a vector. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL vec<3, T, Q> cross( + qua const& q, + vec<3, T, Q> const& v); + + //! Compute a cross product between a vector and a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL vec<3, T, Q> cross( + vec<3, T, Q> const& v, + qua const& q); + + //! Compute a point on a path according squad equation. + //! q1 and q2 are control points; s1 and s2 are intermediate control points. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua squad( + qua const& q1, + qua const& q2, + qua const& s1, + qua const& s2, + T const& h); + + //! Returns an intermediate control point for squad interpolation. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua intermediate( + qua const& prev, + qua const& curr, + qua const& next); + + //! Returns quarternion square root. + /// + /// @see gtx_quaternion + //template + //qua sqrt( + // qua const& q); + + //! Rotates a 3 components vector by a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL vec<3, T, Q> rotate( + qua const& q, + vec<3, T, Q> const& v); + + /// Rotates a 4 components vector by a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL vec<4, T, Q> rotate( + qua const& q, + vec<4, T, Q> const& v); + + /// Extract the real component of a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL T extractRealComponent( + qua const& q); + + /// Converts a quaternion to a 3 * 3 matrix. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL mat<3, 3, T, Q> toMat3( + qua const& x){return mat3_cast(x);} + + /// Converts a quaternion to a 4 * 4 matrix. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL mat<4, 4, T, Q> toMat4( + qua const& x){return mat4_cast(x);} + + /// Converts a 3 * 3 matrix to a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua toQuat( + mat<3, 3, T, Q> const& x){return quat_cast(x);} + + /// Converts a 4 * 4 matrix to a quaternion. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua toQuat( + mat<4, 4, T, Q> const& x){return quat_cast(x);} + + /// Quaternion interpolation using the rotation short path. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua shortMix( + qua const& x, + qua const& y, + T const& a); + + /// Quaternion normalized linear interpolation. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua fastMix( + qua const& x, + qua const& y, + T const& a); + + /// Compute the rotation between two vectors. + /// @param orig vector, needs to be normalized + /// @param dest vector, needs to be normalized + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL qua rotation( + vec<3, T, Q> const& orig, + vec<3, T, Q> const& dest); + + /// Returns the squared length of x. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL GLM_CONSTEXPR T length2(qua const& q); + + /// @} +}//namespace glm + +#include "quaternion.inl" diff --git a/dep/glm/gtx/quaternion.inl b/dep/glm/gtx/quaternion.inl new file mode 100644 index 0000000..d125bcc --- /dev/null +++ b/dep/glm/gtx/quaternion.inl @@ -0,0 +1,159 @@ +/// @ref gtx_quaternion + +#include +#include "../gtc/constants.hpp" + +namespace glm +{ + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua quat_identity() + { + return qua(static_cast(1), static_cast(0), static_cast(0), static_cast(0)); + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> cross(vec<3, T, Q> const& v, qua const& q) + { + return inverse(q) * v; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> cross(qua const& q, vec<3, T, Q> const& v) + { + return q * v; + } + + template + GLM_FUNC_QUALIFIER qua squad + ( + qua const& q1, + qua const& q2, + qua const& s1, + qua const& s2, + T const& h) + { + return mix(mix(q1, q2, h), mix(s1, s2, h), static_cast(2) * (static_cast(1) - h) * h); + } + + template + GLM_FUNC_QUALIFIER qua intermediate + ( + qua const& prev, + qua const& curr, + qua const& next + ) + { + qua invQuat = inverse(curr); + return exp((log(next * invQuat) + log(prev * invQuat)) / static_cast(-4)) * curr; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotate(qua const& q, vec<3, T, Q> const& v) + { + return q * v; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> rotate(qua const& q, vec<4, T, Q> const& v) + { + return q * v; + } + + template + GLM_FUNC_QUALIFIER T extractRealComponent(qua const& q) + { + T w = static_cast(1) - q.x * q.x - q.y * q.y - q.z * q.z; + if(w < T(0)) + return T(0); + else + return -sqrt(w); + } + + template + GLM_FUNC_QUALIFIER GLM_CONSTEXPR T length2(qua const& q) + { + return q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w; + } + + template + GLM_FUNC_QUALIFIER qua shortMix(qua const& x, qua const& y, T const& a) + { + if(a <= static_cast(0)) return x; + if(a >= static_cast(1)) return y; + + T fCos = dot(x, y); + qua y2(y); //BUG!!! qua y2; + if(fCos < static_cast(0)) + { + y2 = -y; + fCos = -fCos; + } + + //if(fCos > 1.0f) // problem + T k0, k1; + if(fCos > (static_cast(1) - epsilon())) + { + k0 = static_cast(1) - a; + k1 = static_cast(0) + a; //BUG!!! 1.0f + a; + } + else + { + T fSin = sqrt(T(1) - fCos * fCos); + T fAngle = atan(fSin, fCos); + T fOneOverSin = static_cast(1) / fSin; + k0 = sin((static_cast(1) - a) * fAngle) * fOneOverSin; + k1 = sin((static_cast(0) + a) * fAngle) * fOneOverSin; + } + + return qua( + k0 * x.w + k1 * y2.w, + k0 * x.x + k1 * y2.x, + k0 * x.y + k1 * y2.y, + k0 * x.z + k1 * y2.z); + } + + template + GLM_FUNC_QUALIFIER qua fastMix(qua const& x, qua const& y, T const& a) + { + return glm::normalize(x * (static_cast(1) - a) + (y * a)); + } + + template + GLM_FUNC_QUALIFIER qua rotation(vec<3, T, Q> const& orig, vec<3, T, Q> const& dest) + { + T cosTheta = dot(orig, dest); + vec<3, T, Q> rotationAxis; + + if(cosTheta >= static_cast(1) - epsilon()) { + // orig and dest point in the same direction + return quat_identity(); + } + + if(cosTheta < static_cast(-1) + epsilon()) + { + // special case when vectors in opposite directions : + // there is no "ideal" rotation axis + // So guess one; any will do as long as it's perpendicular to start + // This implementation favors a rotation around the Up axis (Y), + // since it's often what you want to do. + rotationAxis = cross(vec<3, T, Q>(0, 0, 1), orig); + if(length2(rotationAxis) < epsilon()) // bad luck, they were parallel, try again! + rotationAxis = cross(vec<3, T, Q>(1, 0, 0), orig); + + rotationAxis = normalize(rotationAxis); + return angleAxis(pi(), rotationAxis); + } + + // Implementation from Stan Melax's Game Programming Gems 1 article + rotationAxis = cross(orig, dest); + + T s = sqrt((T(1) + cosTheta) * static_cast(2)); + T invs = static_cast(1) / s; + + return qua( + s * static_cast(0.5f), + rotationAxis.x * invs, + rotationAxis.y * invs, + rotationAxis.z * invs); + } +}//namespace glm diff --git a/dep/glm/gtx/range.hpp b/dep/glm/gtx/range.hpp new file mode 100644 index 0000000..93bcb9a --- /dev/null +++ b/dep/glm/gtx/range.hpp @@ -0,0 +1,98 @@ +/// @ref gtx_range +/// @file glm/gtx/range.hpp +/// @author Joshua Moerman +/// +/// @defgroup gtx_range GLM_GTX_range +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defines begin and end for vectors and matrices. Useful for range-based for loop. +/// The range is defined over the elements, not over columns or rows (e.g. mat4 has 16 elements). + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_range is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_range extension included") +# endif +#endif + +#include "../gtc/type_ptr.hpp" +#include "../gtc/vec1.hpp" + +namespace glm +{ + /// @addtogroup gtx_range + /// @{ + +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable : 4100) // unreferenced formal parameter +# endif + + template + inline length_t components(vec<1, T, Q> const& v) + { + return v.length(); + } + + template + inline length_t components(vec<2, T, Q> const& v) + { + return v.length(); + } + + template + inline length_t components(vec<3, T, Q> const& v) + { + return v.length(); + } + + template + inline length_t components(vec<4, T, Q> const& v) + { + return v.length(); + } + + template + inline length_t components(genType const& m) + { + return m.length() * m[0].length(); + } + + template + inline typename genType::value_type const * begin(genType const& v) + { + return value_ptr(v); + } + + template + inline typename genType::value_type const * end(genType const& v) + { + return begin(v) + components(v); + } + + template + inline typename genType::value_type * begin(genType& v) + { + return value_ptr(v); + } + + template + inline typename genType::value_type * end(genType& v) + { + return begin(v) + components(v); + } + +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif + + /// @} +}//namespace glm diff --git a/dep/glm/gtx/raw_data.hpp b/dep/glm/gtx/raw_data.hpp new file mode 100644 index 0000000..86cbe77 --- /dev/null +++ b/dep/glm/gtx/raw_data.hpp @@ -0,0 +1,51 @@ +/// @ref gtx_raw_data +/// @file glm/gtx/raw_data.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_raw_data GLM_GTX_raw_data +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Projection of a vector to other one + +#pragma once + +// Dependencies +#include "../ext/scalar_uint_sized.hpp" +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_raw_data is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_raw_data extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_raw_data + /// @{ + + //! Type for byte numbers. + //! From GLM_GTX_raw_data extension. + typedef detail::uint8 byte; + + //! Type for word numbers. + //! From GLM_GTX_raw_data extension. + typedef detail::uint16 word; + + //! Type for dword numbers. + //! From GLM_GTX_raw_data extension. + typedef detail::uint32 dword; + + //! Type for qword numbers. + //! From GLM_GTX_raw_data extension. + typedef detail::uint64 qword; + + /// @} +}// namespace glm + +#include "raw_data.inl" diff --git a/dep/glm/gtx/raw_data.inl b/dep/glm/gtx/raw_data.inl new file mode 100644 index 0000000..c740317 --- /dev/null +++ b/dep/glm/gtx/raw_data.inl @@ -0,0 +1,2 @@ +/// @ref gtx_raw_data + diff --git a/dep/glm/gtx/rotate_normalized_axis.hpp b/dep/glm/gtx/rotate_normalized_axis.hpp new file mode 100644 index 0000000..2103ca0 --- /dev/null +++ b/dep/glm/gtx/rotate_normalized_axis.hpp @@ -0,0 +1,68 @@ +/// @ref gtx_rotate_normalized_axis +/// @file glm/gtx/rotate_normalized_axis.hpp +/// +/// @see core (dependence) +/// @see gtc_matrix_transform +/// @see gtc_quaternion +/// +/// @defgroup gtx_rotate_normalized_axis GLM_GTX_rotate_normalized_axis +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Quaternions and matrices rotations around normalized axis. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/epsilon.hpp" +#include "../gtc/quaternion.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_rotate_normalized_axis is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_rotate_normalized_axis extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_rotate_normalized_axis + /// @{ + + /// Builds a rotation 4 * 4 matrix created from a normalized axis and an angle. + /// + /// @param m Input matrix multiplied by this rotation matrix. + /// @param angle Rotation angle expressed in radians. + /// @param axis Rotation axis, must be normalized. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// + /// @see gtx_rotate_normalized_axis + /// @see - rotate(T angle, T x, T y, T z) + /// @see - rotate(mat<4, 4, T, Q> const& m, T angle, T x, T y, T z) + /// @see - rotate(T angle, vec<3, T, Q> const& v) + template + GLM_FUNC_DECL mat<4, 4, T, Q> rotateNormalizedAxis( + mat<4, 4, T, Q> const& m, + T const& angle, + vec<3, T, Q> const& axis); + + /// Rotates a quaternion from a vector of 3 components normalized axis and an angle. + /// + /// @param q Source orientation + /// @param angle Angle expressed in radians. + /// @param axis Normalized axis of the rotation, must be normalized. + /// + /// @see gtx_rotate_normalized_axis + template + GLM_FUNC_DECL qua rotateNormalizedAxis( + qua const& q, + T const& angle, + vec<3, T, Q> const& axis); + + /// @} +}//namespace glm + +#include "rotate_normalized_axis.inl" diff --git a/dep/glm/gtx/rotate_normalized_axis.inl b/dep/glm/gtx/rotate_normalized_axis.inl new file mode 100644 index 0000000..b2e9278 --- /dev/null +++ b/dep/glm/gtx/rotate_normalized_axis.inl @@ -0,0 +1,58 @@ +/// @ref gtx_rotate_normalized_axis + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotateNormalizedAxis + ( + mat<4, 4, T, Q> const& m, + T const& angle, + vec<3, T, Q> const& v + ) + { + T const a = angle; + T const c = cos(a); + T const s = sin(a); + + vec<3, T, Q> const axis(v); + + vec<3, T, Q> const temp((static_cast(1) - c) * axis); + + mat<4, 4, T, Q> Rotate; + Rotate[0][0] = c + temp[0] * axis[0]; + Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2]; + Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1]; + + Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2]; + Rotate[1][1] = c + temp[1] * axis[1]; + Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0]; + + Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1]; + Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0]; + Rotate[2][2] = c + temp[2] * axis[2]; + + mat<4, 4, T, Q> Result; + Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; + Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; + Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2]; + Result[3] = m[3]; + return Result; + } + + template + GLM_FUNC_QUALIFIER qua rotateNormalizedAxis + ( + qua const& q, + T const& angle, + vec<3, T, Q> const& v + ) + { + vec<3, T, Q> const Tmp(v); + + T const AngleRad(angle); + T const Sin = sin(AngleRad * T(0.5)); + + return q * qua(cos(AngleRad * static_cast(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin); + //return gtc::quaternion::cross(q, tquat(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin)); + } +}//namespace glm diff --git a/dep/glm/gtx/rotate_vector.hpp b/dep/glm/gtx/rotate_vector.hpp new file mode 100644 index 0000000..dcd5b95 --- /dev/null +++ b/dep/glm/gtx/rotate_vector.hpp @@ -0,0 +1,123 @@ +/// @ref gtx_rotate_vector +/// @file glm/gtx/rotate_vector.hpp +/// +/// @see core (dependence) +/// @see gtx_transform (dependence) +/// +/// @defgroup gtx_rotate_vector GLM_GTX_rotate_vector +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Function to directly rotate a vector + +#pragma once + +// Dependency: +#include "../gtx/transform.hpp" +#include "../gtc/epsilon.hpp" +#include "../ext/vector_relational.hpp" +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_rotate_vector is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_rotate_vector extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_rotate_vector + /// @{ + + /// Returns Spherical interpolation between two vectors + /// + /// @param x A first vector + /// @param y A second vector + /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1]. + /// + /// @see gtx_rotate_vector + template + GLM_FUNC_DECL vec<3, T, Q> slerp( + vec<3, T, Q> const& x, + vec<3, T, Q> const& y, + T const& a); + + //! Rotate a two dimensional vector. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<2, T, Q> rotate( + vec<2, T, Q> const& v, + T const& angle); + + //! Rotate a three dimensional vector around an axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<3, T, Q> rotate( + vec<3, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal); + + //! Rotate a four dimensional vector around an axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<4, T, Q> rotate( + vec<4, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal); + + //! Rotate a three dimensional vector around the X axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<3, T, Q> rotateX( + vec<3, T, Q> const& v, + T const& angle); + + //! Rotate a three dimensional vector around the Y axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<3, T, Q> rotateY( + vec<3, T, Q> const& v, + T const& angle); + + //! Rotate a three dimensional vector around the Z axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<3, T, Q> rotateZ( + vec<3, T, Q> const& v, + T const& angle); + + //! Rotate a four dimensional vector around the X axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<4, T, Q> rotateX( + vec<4, T, Q> const& v, + T const& angle); + + //! Rotate a four dimensional vector around the Y axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<4, T, Q> rotateY( + vec<4, T, Q> const& v, + T const& angle); + + //! Rotate a four dimensional vector around the Z axis. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL vec<4, T, Q> rotateZ( + vec<4, T, Q> const& v, + T const& angle); + + //! Build a rotation matrix from a normal and a up vector. + //! From GLM_GTX_rotate_vector extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> orientation( + vec<3, T, Q> const& Normal, + vec<3, T, Q> const& Up); + + /// @} +}//namespace glm + +#include "rotate_vector.inl" diff --git a/dep/glm/gtx/rotate_vector.inl b/dep/glm/gtx/rotate_vector.inl new file mode 100644 index 0000000..f8136e7 --- /dev/null +++ b/dep/glm/gtx/rotate_vector.inl @@ -0,0 +1,187 @@ +/// @ref gtx_rotate_vector + +namespace glm +{ + template + GLM_FUNC_QUALIFIER vec<3, T, Q> slerp + ( + vec<3, T, Q> const& x, + vec<3, T, Q> const& y, + T const& a + ) + { + // get cosine of angle between vectors (-1 -> 1) + T CosAlpha = dot(x, y); + // get angle (0 -> pi) + T Alpha = acos(CosAlpha); + // get sine of angle between vectors (0 -> 1) + T SinAlpha = sin(Alpha); + // this breaks down when SinAlpha = 0, i.e. Alpha = 0 or pi + T t1 = sin((static_cast(1) - a) * Alpha) / SinAlpha; + T t2 = sin(a * Alpha) / SinAlpha; + + // interpolate src vectors + return x * t1 + y * t2; + } + + template + GLM_FUNC_QUALIFIER vec<2, T, Q> rotate + ( + vec<2, T, Q> const& v, + T const& angle + ) + { + vec<2, T, Q> Result; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotate + ( + vec<3, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal + ) + { + return mat<3, 3, T, Q>(glm::rotate(angle, normal)) * v; + } + /* + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateGTX( + const vec<3, T, Q>& x, + T angle, + const vec<3, T, Q>& normal) + { + const T Cos = cos(radians(angle)); + const T Sin = sin(radians(angle)); + return x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x, normal) * Sin; + } + */ + template + GLM_FUNC_QUALIFIER vec<4, T, Q> rotate + ( + vec<4, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal + ) + { + return rotate(angle, normal) * v; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateX + ( + vec<3, T, Q> const& v, + T const& angle + ) + { + vec<3, T, Q> Result(v); + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.y = v.y * Cos - v.z * Sin; + Result.z = v.y * Sin + v.z * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateY + ( + vec<3, T, Q> const& v, + T const& angle + ) + { + vec<3, T, Q> Result = v; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.x = v.x * Cos + v.z * Sin; + Result.z = -v.x * Sin + v.z * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateZ + ( + vec<3, T, Q> const& v, + T const& angle + ) + { + vec<3, T, Q> Result = v; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> rotateX + ( + vec<4, T, Q> const& v, + T const& angle + ) + { + vec<4, T, Q> Result = v; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.y = v.y * Cos - v.z * Sin; + Result.z = v.y * Sin + v.z * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> rotateY + ( + vec<4, T, Q> const& v, + T const& angle + ) + { + vec<4, T, Q> Result = v; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.x = v.x * Cos + v.z * Sin; + Result.z = -v.x * Sin + v.z * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER vec<4, T, Q> rotateZ + ( + vec<4, T, Q> const& v, + T const& angle + ) + { + vec<4, T, Q> Result = v; + T const Cos(cos(angle)); + T const Sin(sin(angle)); + + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> orientation + ( + vec<3, T, Q> const& Normal, + vec<3, T, Q> const& Up + ) + { + if(all(equal(Normal, Up, epsilon()))) + return mat<4, 4, T, Q>(static_cast(1)); + + vec<3, T, Q> RotationAxis = cross(Up, Normal); + T Angle = acos(dot(Normal, Up)); + + return rotate(Angle, RotationAxis); + } +}//namespace glm diff --git a/dep/glm/gtx/scalar_multiplication.hpp b/dep/glm/gtx/scalar_multiplication.hpp new file mode 100644 index 0000000..496ba19 --- /dev/null +++ b/dep/glm/gtx/scalar_multiplication.hpp @@ -0,0 +1,75 @@ +/// @ref gtx +/// @file glm/gtx/scalar_multiplication.hpp +/// @author Joshua Moerman +/// +/// Include to use the features of this extension. +/// +/// Enables scalar multiplication for all types +/// +/// Since GLSL is very strict about types, the following (often used) combinations do not work: +/// double * vec4 +/// int * vec4 +/// vec4 / int +/// So we'll fix that! Of course "float * vec4" should remain the same (hence the enable_if magic) + +#pragma once + +#include "../detail/setup.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_scalar_multiplication is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_scalar_multiplication extension included") +# endif +#endif + +#include "../vec2.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../mat2x2.hpp" +#include + +namespace glm +{ + template + using return_type_scalar_multiplication = typename std::enable_if< + !std::is_same::value // T may not be a float + && std::is_arithmetic::value, Vec // But it may be an int or double (no vec3 or mat3, ...) + >::type; + +#define GLM_IMPLEMENT_SCAL_MULT(Vec) \ + template \ + return_type_scalar_multiplication \ + operator*(T const& s, Vec rh){ \ + return rh *= static_cast(s); \ + } \ + \ + template \ + return_type_scalar_multiplication \ + operator*(Vec lh, T const& s){ \ + return lh *= static_cast(s); \ + } \ + \ + template \ + return_type_scalar_multiplication \ + operator/(Vec lh, T const& s){ \ + return lh *= 1.0f / static_cast(s); \ + } + +GLM_IMPLEMENT_SCAL_MULT(vec2) +GLM_IMPLEMENT_SCAL_MULT(vec3) +GLM_IMPLEMENT_SCAL_MULT(vec4) + +GLM_IMPLEMENT_SCAL_MULT(mat2) +GLM_IMPLEMENT_SCAL_MULT(mat2x3) +GLM_IMPLEMENT_SCAL_MULT(mat2x4) +GLM_IMPLEMENT_SCAL_MULT(mat3x2) +GLM_IMPLEMENT_SCAL_MULT(mat3) +GLM_IMPLEMENT_SCAL_MULT(mat3x4) +GLM_IMPLEMENT_SCAL_MULT(mat4x2) +GLM_IMPLEMENT_SCAL_MULT(mat4x3) +GLM_IMPLEMENT_SCAL_MULT(mat4) + +#undef GLM_IMPLEMENT_SCAL_MULT +} // namespace glm diff --git a/dep/glm/gtx/scalar_relational.hpp b/dep/glm/gtx/scalar_relational.hpp new file mode 100644 index 0000000..8be9c57 --- /dev/null +++ b/dep/glm/gtx/scalar_relational.hpp @@ -0,0 +1,36 @@ +/// @ref gtx_scalar_relational +/// @file glm/gtx/scalar_relational.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_scalar_relational GLM_GTX_scalar_relational +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Extend a position from a source to a position at a defined length. + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_extend is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_extend extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_scalar_relational + /// @{ + + + + /// @} +}//namespace glm + +#include "scalar_relational.inl" diff --git a/dep/glm/gtx/scalar_relational.inl b/dep/glm/gtx/scalar_relational.inl new file mode 100644 index 0000000..c2a121c --- /dev/null +++ b/dep/glm/gtx/scalar_relational.inl @@ -0,0 +1,88 @@ +/// @ref gtx_scalar_relational + +namespace glm +{ + template + GLM_FUNC_QUALIFIER bool lessThan + ( + T const& x, + T const& y + ) + { + return x < y; + } + + template + GLM_FUNC_QUALIFIER bool lessThanEqual + ( + T const& x, + T const& y + ) + { + return x <= y; + } + + template + GLM_FUNC_QUALIFIER bool greaterThan + ( + T const& x, + T const& y + ) + { + return x > y; + } + + template + GLM_FUNC_QUALIFIER bool greaterThanEqual + ( + T const& x, + T const& y + ) + { + return x >= y; + } + + template + GLM_FUNC_QUALIFIER bool equal + ( + T const& x, + T const& y + ) + { + return detail::compute_equal::is_iec559>::call(x, y); + } + + template + GLM_FUNC_QUALIFIER bool notEqual + ( + T const& x, + T const& y + ) + { + return !detail::compute_equal::is_iec559>::call(x, y); + } + + GLM_FUNC_QUALIFIER bool any + ( + bool const& x + ) + { + return x; + } + + GLM_FUNC_QUALIFIER bool all + ( + bool const& x + ) + { + return x; + } + + GLM_FUNC_QUALIFIER bool not_ + ( + bool const& x + ) + { + return !x; + } +}//namespace glm diff --git a/dep/glm/gtx/spline.hpp b/dep/glm/gtx/spline.hpp new file mode 100644 index 0000000..731c979 --- /dev/null +++ b/dep/glm/gtx/spline.hpp @@ -0,0 +1,65 @@ +/// @ref gtx_spline +/// @file glm/gtx/spline.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_spline GLM_GTX_spline +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Spline functions + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/optimum_pow.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_spline is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_spline extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_spline + /// @{ + + /// Return a point from a catmull rom curve. + /// @see gtx_spline extension. + template + GLM_FUNC_DECL genType catmullRom( + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s); + + /// Return a point from a hermite curve. + /// @see gtx_spline extension. + template + GLM_FUNC_DECL genType hermite( + genType const& v1, + genType const& t1, + genType const& v2, + genType const& t2, + typename genType::value_type const& s); + + /// Return a point from a cubic curve. + /// @see gtx_spline extension. + template + GLM_FUNC_DECL genType cubic( + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s); + + /// @} +}//namespace glm + +#include "spline.inl" diff --git a/dep/glm/gtx/spline.inl b/dep/glm/gtx/spline.inl new file mode 100644 index 0000000..c3fd056 --- /dev/null +++ b/dep/glm/gtx/spline.inl @@ -0,0 +1,60 @@ +/// @ref gtx_spline + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType catmullRom + ( + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s + ) + { + typename genType::value_type s2 = pow2(s); + typename genType::value_type s3 = pow3(s); + + typename genType::value_type f1 = -s3 + typename genType::value_type(2) * s2 - s; + typename genType::value_type f2 = typename genType::value_type(3) * s3 - typename genType::value_type(5) * s2 + typename genType::value_type(2); + typename genType::value_type f3 = typename genType::value_type(-3) * s3 + typename genType::value_type(4) * s2 + s; + typename genType::value_type f4 = s3 - s2; + + return (f1 * v1 + f2 * v2 + f3 * v3 + f4 * v4) / typename genType::value_type(2); + + } + + template + GLM_FUNC_QUALIFIER genType hermite + ( + genType const& v1, + genType const& t1, + genType const& v2, + genType const& t2, + typename genType::value_type const& s + ) + { + typename genType::value_type s2 = pow2(s); + typename genType::value_type s3 = pow3(s); + + typename genType::value_type f1 = typename genType::value_type(2) * s3 - typename genType::value_type(3) * s2 + typename genType::value_type(1); + typename genType::value_type f2 = typename genType::value_type(-2) * s3 + typename genType::value_type(3) * s2; + typename genType::value_type f3 = s3 - typename genType::value_type(2) * s2 + s; + typename genType::value_type f4 = s3 - s2; + + return f1 * v1 + f2 * v2 + f3 * t1 + f4 * t2; + } + + template + GLM_FUNC_QUALIFIER genType cubic + ( + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s + ) + { + return ((v1 * s + v2) * s + v3) * s + v4; + } +}//namespace glm diff --git a/dep/glm/gtx/std_based_type.hpp b/dep/glm/gtx/std_based_type.hpp new file mode 100644 index 0000000..cd3be8c --- /dev/null +++ b/dep/glm/gtx/std_based_type.hpp @@ -0,0 +1,68 @@ +/// @ref gtx_std_based_type +/// @file glm/gtx/std_based_type.hpp +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_std_based_type GLM_GTX_std_based_type +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Adds vector types based on STL value types. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_std_based_type is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_std_based_type extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_std_based_type + /// @{ + + /// Vector type based of one std::size_t component. + /// @see GLM_GTX_std_based_type + typedef vec<1, std::size_t, defaultp> size1; + + /// Vector type based of two std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<2, std::size_t, defaultp> size2; + + /// Vector type based of three std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<3, std::size_t, defaultp> size3; + + /// Vector type based of four std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<4, std::size_t, defaultp> size4; + + /// Vector type based of one std::size_t component. + /// @see GLM_GTX_std_based_type + typedef vec<1, std::size_t, defaultp> size1_t; + + /// Vector type based of two std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<2, std::size_t, defaultp> size2_t; + + /// Vector type based of three std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<3, std::size_t, defaultp> size3_t; + + /// Vector type based of four std::size_t components. + /// @see GLM_GTX_std_based_type + typedef vec<4, std::size_t, defaultp> size4_t; + + /// @} +}//namespace glm + +#include "std_based_type.inl" diff --git a/dep/glm/gtx/std_based_type.inl b/dep/glm/gtx/std_based_type.inl new file mode 100644 index 0000000..9c34bdb --- /dev/null +++ b/dep/glm/gtx/std_based_type.inl @@ -0,0 +1,6 @@ +/// @ref gtx_std_based_type + +namespace glm +{ + +} diff --git a/dep/glm/gtx/string_cast.hpp b/dep/glm/gtx/string_cast.hpp new file mode 100644 index 0000000..27846bf --- /dev/null +++ b/dep/glm/gtx/string_cast.hpp @@ -0,0 +1,52 @@ +/// @ref gtx_string_cast +/// @file glm/gtx/string_cast.hpp +/// +/// @see core (dependence) +/// @see gtx_integer (dependence) +/// @see gtx_quaternion (dependence) +/// +/// @defgroup gtx_string_cast GLM_GTX_string_cast +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Setup strings for GLM type values +/// +/// This extension is not supported with CUDA + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/type_precision.hpp" +#include "../gtc/quaternion.hpp" +#include "../gtx/dual_quaternion.hpp" +#include +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_string_cast is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_string_cast extension included") +# endif +#endif + +#if(GLM_COMPILER & GLM_COMPILER_CUDA) +# error "GLM_GTX_string_cast is not supported on CUDA compiler" +#endif + +namespace glm +{ + /// @addtogroup gtx_string_cast + /// @{ + + /// Create a string from a GLM vector or matrix typed variable. + /// @see gtx_string_cast extension. + template + GLM_FUNC_DECL std::string to_string(genType const& x); + + /// @} +}//namespace glm + +#include "string_cast.inl" diff --git a/dep/glm/gtx/string_cast.inl b/dep/glm/gtx/string_cast.inl new file mode 100644 index 0000000..f67751d --- /dev/null +++ b/dep/glm/gtx/string_cast.inl @@ -0,0 +1,492 @@ +/// @ref gtx_string_cast + +#include +#include + +namespace glm{ +namespace detail +{ + template + struct cast + { + typedef T value_type; + }; + + template <> + struct cast + { + typedef double value_type; + }; + + GLM_FUNC_QUALIFIER std::string format(const char* msg, ...) + { + std::size_t const STRING_BUFFER(4096); + char text[STRING_BUFFER]; + va_list list; + + if(msg == GLM_NULLPTR) + return std::string(); + + va_start(list, msg); +# if (GLM_COMPILER & GLM_COMPILER_VC) + vsprintf_s(text, STRING_BUFFER, msg, list); +# else// + std::vsprintf(text, msg, list); +# endif// + va_end(list); + + return std::string(text); + } + + static const char* LabelTrue = "true"; + static const char* LabelFalse = "false"; + + template + struct literal + { + GLM_FUNC_QUALIFIER static char const * value() {return "%d";} + }; + + template + struct literal + { + GLM_FUNC_QUALIFIER static char const * value() {return "%f";} + }; + +# if GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC + template<> + struct literal + { + GLM_FUNC_QUALIFIER static char const * value() {return "%lld";} + }; + + template<> + struct literal + { + GLM_FUNC_QUALIFIER static char const * value() {return "%lld";} + }; +# endif//GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC + + template + struct prefix{}; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "d";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "b";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "u8";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "i8";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "u16";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "i16";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "u";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "i";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "u64";} + }; + + template<> + struct prefix + { + GLM_FUNC_QUALIFIER static char const * value() {return "i64";} + }; + + template + struct compute_to_string + {}; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<1, bool, Q> const& x) + { + return detail::format("bvec1(%s)", + x[0] ? detail::LabelTrue : detail::LabelFalse); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<2, bool, Q> const& x) + { + return detail::format("bvec2(%s, %s)", + x[0] ? detail::LabelTrue : detail::LabelFalse, + x[1] ? detail::LabelTrue : detail::LabelFalse); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<3, bool, Q> const& x) + { + return detail::format("bvec3(%s, %s, %s)", + x[0] ? detail::LabelTrue : detail::LabelFalse, + x[1] ? detail::LabelTrue : detail::LabelFalse, + x[2] ? detail::LabelTrue : detail::LabelFalse); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<4, bool, Q> const& x) + { + return detail::format("bvec4(%s, %s, %s, %s)", + x[0] ? detail::LabelTrue : detail::LabelFalse, + x[1] ? detail::LabelTrue : detail::LabelFalse, + x[2] ? detail::LabelTrue : detail::LabelFalse, + x[3] ? detail::LabelTrue : detail::LabelFalse); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<1, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%svec1(%s)", + PrefixStr, + LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<2, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%svec2(%s, %s)", + PrefixStr, + LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0]), + static_cast::value_type>(x[1])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<3, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%svec3(%s, %s, %s)", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0]), + static_cast::value_type>(x[1]), + static_cast::value_type>(x[2])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(vec<4, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%svec4(%s, %s, %s, %s)", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0]), + static_cast::value_type>(x[1]), + static_cast::value_type>(x[2]), + static_cast::value_type>(x[3])); + } + }; + + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<2, 2, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat2x2((%s, %s), (%s, %s))", + PrefixStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<2, 3, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat2x3((%s, %s, %s), (%s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<2, 4, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat2x4((%s, %s, %s, %s), (%s, %s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), static_cast::value_type>(x[0][3]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2]), static_cast::value_type>(x[1][3])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<3, 2, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat3x2((%s, %s), (%s, %s), (%s, %s))", + PrefixStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<3, 3, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat3x3((%s, %s, %s), (%s, %s, %s), (%s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1]), static_cast::value_type>(x[2][2])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<3, 4, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat3x4((%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), static_cast::value_type>(x[0][3]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2]), static_cast::value_type>(x[1][3]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1]), static_cast::value_type>(x[2][2]), static_cast::value_type>(x[2][3])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<4, 2, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat4x2((%s, %s), (%s, %s), (%s, %s), (%s, %s))", + PrefixStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr, + LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1]), + static_cast::value_type>(x[3][0]), static_cast::value_type>(x[3][1])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<4, 3, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat4x3((%s, %s, %s), (%s, %s, %s), (%s, %s, %s), (%s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1]), static_cast::value_type>(x[2][2]), + static_cast::value_type>(x[3][0]), static_cast::value_type>(x[3][1]), static_cast::value_type>(x[3][2])); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(mat<4, 4, T, Q> const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%smat4x4((%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x[0][0]), static_cast::value_type>(x[0][1]), static_cast::value_type>(x[0][2]), static_cast::value_type>(x[0][3]), + static_cast::value_type>(x[1][0]), static_cast::value_type>(x[1][1]), static_cast::value_type>(x[1][2]), static_cast::value_type>(x[1][3]), + static_cast::value_type>(x[2][0]), static_cast::value_type>(x[2][1]), static_cast::value_type>(x[2][2]), static_cast::value_type>(x[2][3]), + static_cast::value_type>(x[3][0]), static_cast::value_type>(x[3][1]), static_cast::value_type>(x[3][2]), static_cast::value_type>(x[3][3])); + } + }; + + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(qua const& q) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%squat(%s, {%s, %s, %s})", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(q.w), + static_cast::value_type>(q.x), + static_cast::value_type>(q.y), + static_cast::value_type>(q.z)); + } + }; + + template + struct compute_to_string > + { + GLM_FUNC_QUALIFIER static std::string call(tdualquat const& x) + { + char const * PrefixStr = prefix::value(); + char const * LiteralStr = literal::is_iec559>::value(); + std::string FormatStr(detail::format("%sdualquat((%s, {%s, %s, %s}), (%s, {%s, %s, %s}))", + PrefixStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr, + LiteralStr, LiteralStr, LiteralStr, LiteralStr)); + + return detail::format(FormatStr.c_str(), + static_cast::value_type>(x.real.w), + static_cast::value_type>(x.real.x), + static_cast::value_type>(x.real.y), + static_cast::value_type>(x.real.z), + static_cast::value_type>(x.dual.w), + static_cast::value_type>(x.dual.x), + static_cast::value_type>(x.dual.y), + static_cast::value_type>(x.dual.z)); + } + }; + +}//namespace detail + +template +GLM_FUNC_QUALIFIER std::string to_string(matType const& x) +{ + return detail::compute_to_string::call(x); +} + +}//namespace glm diff --git a/dep/glm/gtx/texture.hpp b/dep/glm/gtx/texture.hpp new file mode 100644 index 0000000..20585e6 --- /dev/null +++ b/dep/glm/gtx/texture.hpp @@ -0,0 +1,46 @@ +/// @ref gtx_texture +/// @file glm/gtx/texture.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_texture GLM_GTX_texture +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Wrapping mode of texture coordinates. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/integer.hpp" +#include "../gtx/component_wise.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_texture is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_texture extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_texture + /// @{ + + /// Compute the number of mipmaps levels necessary to create a mipmap complete texture + /// + /// @param Extent Extent of the texture base level mipmap + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + template + T levels(vec const& Extent); + + /// @} +}// namespace glm + +#include "texture.inl" + diff --git a/dep/glm/gtx/texture.inl b/dep/glm/gtx/texture.inl new file mode 100644 index 0000000..593c826 --- /dev/null +++ b/dep/glm/gtx/texture.inl @@ -0,0 +1,17 @@ +/// @ref gtx_texture + +namespace glm +{ + template + inline T levels(vec const& Extent) + { + return glm::log2(compMax(Extent)) + static_cast(1); + } + + template + inline T levels(T Extent) + { + return vec<1, T, defaultp>(Extent).x; + } +}//namespace glm + diff --git a/dep/glm/gtx/transform.hpp b/dep/glm/gtx/transform.hpp new file mode 100644 index 0000000..0279fc8 --- /dev/null +++ b/dep/glm/gtx/transform.hpp @@ -0,0 +1,60 @@ +/// @ref gtx_transform +/// @file glm/gtx/transform.hpp +/// +/// @see core (dependence) +/// @see gtc_matrix_transform (dependence) +/// @see gtx_transform +/// @see gtx_transform2 +/// +/// @defgroup gtx_transform GLM_GTX_transform +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Add transformation matrices + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/matrix_transform.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_transform is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_transform extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_transform + /// @{ + + /// Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars. + /// @see gtc_matrix_transform + /// @see gtx_transform + template + GLM_FUNC_DECL mat<4, 4, T, Q> translate( + vec<3, T, Q> const& v); + + /// Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in radians. + /// @see gtc_matrix_transform + /// @see gtx_transform + template + GLM_FUNC_DECL mat<4, 4, T, Q> rotate( + T angle, + vec<3, T, Q> const& v); + + /// Transforms a matrix with a scale 4 * 4 matrix created from a vector of 3 components. + /// @see gtc_matrix_transform + /// @see gtx_transform + template + GLM_FUNC_DECL mat<4, 4, T, Q> scale( + vec<3, T, Q> const& v); + + /// @} +}// namespace glm + +#include "transform.inl" diff --git a/dep/glm/gtx/transform.inl b/dep/glm/gtx/transform.inl new file mode 100644 index 0000000..48ee680 --- /dev/null +++ b/dep/glm/gtx/transform.inl @@ -0,0 +1,23 @@ +/// @ref gtx_transform + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(vec<3, T, Q> const& v) + { + return translate(mat<4, 4, T, Q>(static_cast(1)), v); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate(T angle, vec<3, T, Q> const& v) + { + return rotate(mat<4, 4, T, Q>(static_cast(1)), angle, v); + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale(vec<3, T, Q> const& v) + { + return scale(mat<4, 4, T, Q>(static_cast(1)), v); + } + +}//namespace glm diff --git a/dep/glm/gtx/transform2.hpp b/dep/glm/gtx/transform2.hpp new file mode 100644 index 0000000..0d8ba9d --- /dev/null +++ b/dep/glm/gtx/transform2.hpp @@ -0,0 +1,89 @@ +/// @ref gtx_transform2 +/// @file glm/gtx/transform2.hpp +/// +/// @see core (dependence) +/// @see gtx_transform (dependence) +/// +/// @defgroup gtx_transform2 GLM_GTX_transform2 +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Add extra transformation matrices + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtx/transform.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_transform2 is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_transform2 extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_transform2 + /// @{ + + //! Transforms a matrix with a shearing on X axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> shearX2D(mat<3, 3, T, Q> const& m, T y); + + //! Transforms a matrix with a shearing on Y axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> shearY2D(mat<3, 3, T, Q> const& m, T x); + + //! Transforms a matrix with a shearing on X axis + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> shearX3D(mat<4, 4, T, Q> const& m, T y, T z); + + //! Transforms a matrix with a shearing on Y axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> shearY3D(mat<4, 4, T, Q> const& m, T x, T z); + + //! Transforms a matrix with a shearing on Z axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> shearZ3D(mat<4, 4, T, Q> const& m, T x, T y); + + //template GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shear(const mat<4, 4, T, Q> & m, shearPlane, planePoint, angle) + // Identity + tan(angle) * cross(Normal, OnPlaneVector) 0 + // - dot(PointOnPlane, normal) * OnPlaneVector 1 + + // Reflect functions seem to don't work + //template mat<3, 3, T, Q> reflect2D(const mat<3, 3, T, Q> & m, const vec<3, T, Q>& normal){return reflect2DGTX(m, normal);} //!< \brief Build a reflection matrix (from GLM_GTX_transform2 extension) + //template mat<4, 4, T, Q> reflect3D(const mat<4, 4, T, Q> & m, const vec<3, T, Q>& normal){return reflect3DGTX(m, normal);} //!< \brief Build a reflection matrix (from GLM_GTX_transform2 extension) + + //! Build planar projection matrix along normal axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<3, 3, T, Q> proj2D(mat<3, 3, T, Q> const& m, vec<3, T, Q> const& normal); + + //! Build planar projection matrix along normal axis. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> proj3D(mat<4, 4, T, Q> const & m, vec<3, T, Q> const& normal); + + //! Build a scale bias matrix. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> scaleBias(T scale, T bias); + + //! Build a scale bias matrix. + //! From GLM_GTX_transform2 extension. + template + GLM_FUNC_DECL mat<4, 4, T, Q> scaleBias(mat<4, 4, T, Q> const& m, T scale, T bias); + + /// @} +}// namespace glm + +#include "transform2.inl" diff --git a/dep/glm/gtx/transform2.inl b/dep/glm/gtx/transform2.inl new file mode 100644 index 0000000..2b53198 --- /dev/null +++ b/dep/glm/gtx/transform2.inl @@ -0,0 +1,125 @@ +/// @ref gtx_transform2 + +namespace glm +{ + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX2D(mat<3, 3, T, Q> const& m, T s) + { + mat<3, 3, T, Q> r(1); + r[1][0] = s; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY2D(mat<3, 3, T, Q> const& m, T s) + { + mat<3, 3, T, Q> r(1); + r[0][1] = s; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearX3D(mat<4, 4, T, Q> const& m, T s, T t) + { + mat<4, 4, T, Q> r(1); + r[0][1] = s; + r[0][2] = t; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearY3D(mat<4, 4, T, Q> const& m, T s, T t) + { + mat<4, 4, T, Q> r(1); + r[1][0] = s; + r[1][2] = t; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearZ3D(mat<4, 4, T, Q> const& m, T s, T t) + { + mat<4, 4, T, Q> r(1); + r[2][0] = s; + r[2][1] = t; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> reflect2D(mat<3, 3, T, Q> const& m, vec<3, T, Q> const& normal) + { + mat<3, 3, T, Q> r(static_cast(1)); + r[0][0] = static_cast(1) - static_cast(2) * normal.x * normal.x; + r[0][1] = -static_cast(2) * normal.x * normal.y; + r[1][0] = -static_cast(2) * normal.x * normal.y; + r[1][1] = static_cast(1) - static_cast(2) * normal.y * normal.y; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> reflect3D(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& normal) + { + mat<4, 4, T, Q> r(static_cast(1)); + r[0][0] = static_cast(1) - static_cast(2) * normal.x * normal.x; + r[0][1] = -static_cast(2) * normal.x * normal.y; + r[0][2] = -static_cast(2) * normal.x * normal.z; + + r[1][0] = -static_cast(2) * normal.x * normal.y; + r[1][1] = static_cast(1) - static_cast(2) * normal.y * normal.y; + r[1][2] = -static_cast(2) * normal.y * normal.z; + + r[2][0] = -static_cast(2) * normal.x * normal.z; + r[2][1] = -static_cast(2) * normal.y * normal.z; + r[2][2] = static_cast(1) - static_cast(2) * normal.z * normal.z; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> proj2D( + const mat<3, 3, T, Q>& m, + const vec<3, T, Q>& normal) + { + mat<3, 3, T, Q> r(static_cast(1)); + r[0][0] = static_cast(1) - normal.x * normal.x; + r[0][1] = - normal.x * normal.y; + r[1][0] = - normal.x * normal.y; + r[1][1] = static_cast(1) - normal.y * normal.y; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> proj3D( + const mat<4, 4, T, Q>& m, + const vec<3, T, Q>& normal) + { + mat<4, 4, T, Q> r(static_cast(1)); + r[0][0] = static_cast(1) - normal.x * normal.x; + r[0][1] = - normal.x * normal.y; + r[0][2] = - normal.x * normal.z; + r[1][0] = - normal.x * normal.y; + r[1][1] = static_cast(1) - normal.y * normal.y; + r[1][2] = - normal.y * normal.z; + r[2][0] = - normal.x * normal.z; + r[2][1] = - normal.y * normal.z; + r[2][2] = static_cast(1) - normal.z * normal.z; + return m * r; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scaleBias(T scale, T bias) + { + mat<4, 4, T, Q> result; + result[3] = vec<4, T, Q>(vec<3, T, Q>(bias), static_cast(1)); + result[0][0] = scale; + result[1][1] = scale; + result[2][2] = scale; + return result; + } + + template + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scaleBias(mat<4, 4, T, Q> const& m, T scale, T bias) + { + return m * scaleBias(scale, bias); + } +}//namespace glm + diff --git a/dep/glm/gtx/type_aligned.hpp b/dep/glm/gtx/type_aligned.hpp new file mode 100644 index 0000000..2ae522c --- /dev/null +++ b/dep/glm/gtx/type_aligned.hpp @@ -0,0 +1,982 @@ +/// @ref gtx_type_aligned +/// @file glm/gtx/type_aligned.hpp +/// +/// @see core (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_type_aligned GLM_GTX_type_aligned +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defines aligned types. + +#pragma once + +// Dependency: +#include "../gtc/type_precision.hpp" +#include "../gtc/quaternion.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_type_aligned is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_type_aligned extension included") +# endif +#endif + +namespace glm +{ + /////////////////////////// + // Signed int vector types + + /// @addtogroup gtx_type_aligned + /// @{ + + /// Low qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int8, aligned_lowp_int8, 1); + + /// Low qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int16, aligned_lowp_int16, 2); + + /// Low qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int32, aligned_lowp_int32, 4); + + /// Low qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int64, aligned_lowp_int64, 8); + + + /// Low qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int8_t, aligned_lowp_int8_t, 1); + + /// Low qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int16_t, aligned_lowp_int16_t, 2); + + /// Low qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int32_t, aligned_lowp_int32_t, 4); + + /// Low qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_int64_t, aligned_lowp_int64_t, 8); + + + /// Low qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_i8, aligned_lowp_i8, 1); + + /// Low qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_i16, aligned_lowp_i16, 2); + + /// Low qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_i32, aligned_lowp_i32, 4); + + /// Low qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_i64, aligned_lowp_i64, 8); + + + /// Medium qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int8, aligned_mediump_int8, 1); + + /// Medium qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int16, aligned_mediump_int16, 2); + + /// Medium qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int32, aligned_mediump_int32, 4); + + /// Medium qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int64, aligned_mediump_int64, 8); + + + /// Medium qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int8_t, aligned_mediump_int8_t, 1); + + /// Medium qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int16_t, aligned_mediump_int16_t, 2); + + /// Medium qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int32_t, aligned_mediump_int32_t, 4); + + /// Medium qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_int64_t, aligned_mediump_int64_t, 8); + + + /// Medium qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_i8, aligned_mediump_i8, 1); + + /// Medium qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_i16, aligned_mediump_i16, 2); + + /// Medium qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_i32, aligned_mediump_i32, 4); + + /// Medium qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_i64, aligned_mediump_i64, 8); + + + /// High qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int8, aligned_highp_int8, 1); + + /// High qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int16, aligned_highp_int16, 2); + + /// High qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int32, aligned_highp_int32, 4); + + /// High qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int64, aligned_highp_int64, 8); + + + /// High qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int8_t, aligned_highp_int8_t, 1); + + /// High qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int16_t, aligned_highp_int16_t, 2); + + /// High qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int32_t, aligned_highp_int32_t, 4); + + /// High qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_int64_t, aligned_highp_int64_t, 8); + + + /// High qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_i8, aligned_highp_i8, 1); + + /// High qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_i16, aligned_highp_i16, 2); + + /// High qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_i32, aligned_highp_i32, 4); + + /// High qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_i64, aligned_highp_i64, 8); + + + /// Default qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int8, aligned_int8, 1); + + /// Default qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int16, aligned_int16, 2); + + /// Default qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int32, aligned_int32, 4); + + /// Default qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int64, aligned_int64, 8); + + + /// Default qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int8_t, aligned_int8_t, 1); + + /// Default qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int16_t, aligned_int16_t, 2); + + /// Default qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int32_t, aligned_int32_t, 4); + + /// Default qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(int64_t, aligned_int64_t, 8); + + + /// Default qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i8, aligned_i8, 1); + + /// Default qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i16, aligned_i16, 2); + + /// Default qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i32, aligned_i32, 4); + + /// Default qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i64, aligned_i64, 8); + + + /// Default qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(ivec1, aligned_ivec1, 4); + + /// Default qualifier 32 bit signed integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(ivec2, aligned_ivec2, 8); + + /// Default qualifier 32 bit signed integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(ivec3, aligned_ivec3, 16); + + /// Default qualifier 32 bit signed integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(ivec4, aligned_ivec4, 16); + + + /// Default qualifier 8 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i8vec1, aligned_i8vec1, 1); + + /// Default qualifier 8 bit signed integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i8vec2, aligned_i8vec2, 2); + + /// Default qualifier 8 bit signed integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i8vec3, aligned_i8vec3, 4); + + /// Default qualifier 8 bit signed integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i8vec4, aligned_i8vec4, 4); + + + /// Default qualifier 16 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i16vec1, aligned_i16vec1, 2); + + /// Default qualifier 16 bit signed integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i16vec2, aligned_i16vec2, 4); + + /// Default qualifier 16 bit signed integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i16vec3, aligned_i16vec3, 8); + + /// Default qualifier 16 bit signed integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i16vec4, aligned_i16vec4, 8); + + + /// Default qualifier 32 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i32vec1, aligned_i32vec1, 4); + + /// Default qualifier 32 bit signed integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i32vec2, aligned_i32vec2, 8); + + /// Default qualifier 32 bit signed integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i32vec3, aligned_i32vec3, 16); + + /// Default qualifier 32 bit signed integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i32vec4, aligned_i32vec4, 16); + + + /// Default qualifier 64 bit signed integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i64vec1, aligned_i64vec1, 8); + + /// Default qualifier 64 bit signed integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i64vec2, aligned_i64vec2, 16); + + /// Default qualifier 64 bit signed integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i64vec3, aligned_i64vec3, 32); + + /// Default qualifier 64 bit signed integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(i64vec4, aligned_i64vec4, 32); + + + ///////////////////////////// + // Unsigned int vector types + + /// Low qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint8, aligned_lowp_uint8, 1); + + /// Low qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint16, aligned_lowp_uint16, 2); + + /// Low qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint32, aligned_lowp_uint32, 4); + + /// Low qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint64, aligned_lowp_uint64, 8); + + + /// Low qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint8_t, aligned_lowp_uint8_t, 1); + + /// Low qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint16_t, aligned_lowp_uint16_t, 2); + + /// Low qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint32_t, aligned_lowp_uint32_t, 4); + + /// Low qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_uint64_t, aligned_lowp_uint64_t, 8); + + + /// Low qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_u8, aligned_lowp_u8, 1); + + /// Low qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_u16, aligned_lowp_u16, 2); + + /// Low qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_u32, aligned_lowp_u32, 4); + + /// Low qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(lowp_u64, aligned_lowp_u64, 8); + + + /// Medium qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint8, aligned_mediump_uint8, 1); + + /// Medium qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint16, aligned_mediump_uint16, 2); + + /// Medium qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint32, aligned_mediump_uint32, 4); + + /// Medium qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint64, aligned_mediump_uint64, 8); + + + /// Medium qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint8_t, aligned_mediump_uint8_t, 1); + + /// Medium qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint16_t, aligned_mediump_uint16_t, 2); + + /// Medium qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint32_t, aligned_mediump_uint32_t, 4); + + /// Medium qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_uint64_t, aligned_mediump_uint64_t, 8); + + + /// Medium qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_u8, aligned_mediump_u8, 1); + + /// Medium qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_u16, aligned_mediump_u16, 2); + + /// Medium qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_u32, aligned_mediump_u32, 4); + + /// Medium qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mediump_u64, aligned_mediump_u64, 8); + + + /// High qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint8, aligned_highp_uint8, 1); + + /// High qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint16, aligned_highp_uint16, 2); + + /// High qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint32, aligned_highp_uint32, 4); + + /// High qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint64, aligned_highp_uint64, 8); + + + /// High qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint8_t, aligned_highp_uint8_t, 1); + + /// High qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint16_t, aligned_highp_uint16_t, 2); + + /// High qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint32_t, aligned_highp_uint32_t, 4); + + /// High qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_uint64_t, aligned_highp_uint64_t, 8); + + + /// High qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_u8, aligned_highp_u8, 1); + + /// High qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_u16, aligned_highp_u16, 2); + + /// High qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_u32, aligned_highp_u32, 4); + + /// High qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(highp_u64, aligned_highp_u64, 8); + + + /// Default qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint8, aligned_uint8, 1); + + /// Default qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint16, aligned_uint16, 2); + + /// Default qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint32, aligned_uint32, 4); + + /// Default qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint64, aligned_uint64, 8); + + + /// Default qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint8_t, aligned_uint8_t, 1); + + /// Default qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint16_t, aligned_uint16_t, 2); + + /// Default qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint32_t, aligned_uint32_t, 4); + + /// Default qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uint64_t, aligned_uint64_t, 8); + + + /// Default qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u8, aligned_u8, 1); + + /// Default qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u16, aligned_u16, 2); + + /// Default qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u32, aligned_u32, 4); + + /// Default qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u64, aligned_u64, 8); + + + /// Default qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uvec1, aligned_uvec1, 4); + + /// Default qualifier 32 bit unsigned integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uvec2, aligned_uvec2, 8); + + /// Default qualifier 32 bit unsigned integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uvec3, aligned_uvec3, 16); + + /// Default qualifier 32 bit unsigned integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(uvec4, aligned_uvec4, 16); + + + /// Default qualifier 8 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u8vec1, aligned_u8vec1, 1); + + /// Default qualifier 8 bit unsigned integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u8vec2, aligned_u8vec2, 2); + + /// Default qualifier 8 bit unsigned integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u8vec3, aligned_u8vec3, 4); + + /// Default qualifier 8 bit unsigned integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u8vec4, aligned_u8vec4, 4); + + + /// Default qualifier 16 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u16vec1, aligned_u16vec1, 2); + + /// Default qualifier 16 bit unsigned integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u16vec2, aligned_u16vec2, 4); + + /// Default qualifier 16 bit unsigned integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u16vec3, aligned_u16vec3, 8); + + /// Default qualifier 16 bit unsigned integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u16vec4, aligned_u16vec4, 8); + + + /// Default qualifier 32 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u32vec1, aligned_u32vec1, 4); + + /// Default qualifier 32 bit unsigned integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u32vec2, aligned_u32vec2, 8); + + /// Default qualifier 32 bit unsigned integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u32vec3, aligned_u32vec3, 16); + + /// Default qualifier 32 bit unsigned integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u32vec4, aligned_u32vec4, 16); + + + /// Default qualifier 64 bit unsigned integer aligned scalar type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u64vec1, aligned_u64vec1, 8); + + /// Default qualifier 64 bit unsigned integer aligned vector of 2 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u64vec2, aligned_u64vec2, 16); + + /// Default qualifier 64 bit unsigned integer aligned vector of 3 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u64vec3, aligned_u64vec3, 32); + + /// Default qualifier 64 bit unsigned integer aligned vector of 4 components type. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(u64vec4, aligned_u64vec4, 32); + + + ////////////////////// + // Float vector types + + /// 32 bit single-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float32, aligned_float32, 4); + + /// 32 bit single-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float32_t, aligned_float32_t, 4); + + /// 32 bit single-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float32, aligned_f32, 4); + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// 64 bit double-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float64, aligned_float64, 8); + + /// 64 bit double-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float64_t, aligned_float64_t, 8); + + /// 64 bit double-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float64, aligned_f64, 8); + +# endif//GLM_FORCE_SINGLE_ONLY + + + /// Single-qualifier floating-point aligned vector of 1 component. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(vec1, aligned_vec1, 4); + + /// Single-qualifier floating-point aligned vector of 2 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(vec2, aligned_vec2, 8); + + /// Single-qualifier floating-point aligned vector of 3 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(vec3, aligned_vec3, 16); + + /// Single-qualifier floating-point aligned vector of 4 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(vec4, aligned_vec4, 16); + + + /// Single-qualifier floating-point aligned vector of 1 component. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fvec1, aligned_fvec1, 4); + + /// Single-qualifier floating-point aligned vector of 2 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fvec2, aligned_fvec2, 8); + + /// Single-qualifier floating-point aligned vector of 3 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fvec3, aligned_fvec3, 16); + + /// Single-qualifier floating-point aligned vector of 4 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fvec4, aligned_fvec4, 16); + + + /// Single-qualifier floating-point aligned vector of 1 component. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32vec1, aligned_f32vec1, 4); + + /// Single-qualifier floating-point aligned vector of 2 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32vec2, aligned_f32vec2, 8); + + /// Single-qualifier floating-point aligned vector of 3 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32vec3, aligned_f32vec3, 16); + + /// Single-qualifier floating-point aligned vector of 4 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32vec4, aligned_f32vec4, 16); + + + /// Double-qualifier floating-point aligned vector of 1 component. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(dvec1, aligned_dvec1, 8); + + /// Double-qualifier floating-point aligned vector of 2 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(dvec2, aligned_dvec2, 16); + + /// Double-qualifier floating-point aligned vector of 3 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(dvec3, aligned_dvec3, 32); + + /// Double-qualifier floating-point aligned vector of 4 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(dvec4, aligned_dvec4, 32); + + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point aligned vector of 1 component. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64vec1, aligned_f64vec1, 8); + + /// Double-qualifier floating-point aligned vector of 2 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64vec2, aligned_f64vec2, 16); + + /// Double-qualifier floating-point aligned vector of 3 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64vec3, aligned_f64vec3, 32); + + /// Double-qualifier floating-point aligned vector of 4 components. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64vec4, aligned_f64vec4, 32); + +# endif//GLM_FORCE_SINGLE_ONLY + + ////////////////////// + // Float matrix types + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef detail::tmat1 mat1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat2, aligned_mat2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat3, aligned_mat3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat4, aligned_mat4, 16); + + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef detail::tmat1x1 mat1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat2x2, aligned_mat2x2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat3x3, aligned_mat3x3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(mat4x4, aligned_mat4x4, 16); + + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef detail::tmat1x1 fmat1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4, 16); + + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef f32 fmat1x1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2x2, 16); + + /// Single-qualifier floating-point aligned 2x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat2x3, aligned_fmat2x3, 16); + + /// Single-qualifier floating-point aligned 2x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat2x4, aligned_fmat2x4, 16); + + /// Single-qualifier floating-point aligned 3x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat3x2, aligned_fmat3x2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3x3, 16); + + /// Single-qualifier floating-point aligned 3x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat3x4, aligned_fmat3x4, 16); + + /// Single-qualifier floating-point aligned 4x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat4x2, aligned_fmat4x2, 16); + + /// Single-qualifier floating-point aligned 4x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat4x3, aligned_fmat4x3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4x4, 16); + + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef detail::tmat1x1 f32mat1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4, 16); + + + /// Single-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef f32 f32mat1x1; + + /// Single-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2x2, 16); + + /// Single-qualifier floating-point aligned 2x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat2x3, aligned_f32mat2x3, 16); + + /// Single-qualifier floating-point aligned 2x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat2x4, aligned_f32mat2x4, 16); + + /// Single-qualifier floating-point aligned 3x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat3x2, aligned_f32mat3x2, 16); + + /// Single-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3x3, 16); + + /// Single-qualifier floating-point aligned 3x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat3x4, aligned_f32mat3x4, 16); + + /// Single-qualifier floating-point aligned 4x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat4x2, aligned_f32mat4x2, 16); + + /// Single-qualifier floating-point aligned 4x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat4x3, aligned_f32mat4x3, 16); + + /// Single-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4x4, 16); + + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef detail::tmat1x1 f64mat1; + + /// Double-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2, 32); + + /// Double-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3, 32); + + /// Double-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4, 32); + + + /// Double-qualifier floating-point aligned 1x1 matrix. + /// @see gtx_type_aligned + //typedef f64 f64mat1x1; + + /// Double-qualifier floating-point aligned 2x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2x2, 32); + + /// Double-qualifier floating-point aligned 2x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat2x3, aligned_f64mat2x3, 32); + + /// Double-qualifier floating-point aligned 2x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat2x4, aligned_f64mat2x4, 32); + + /// Double-qualifier floating-point aligned 3x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat3x2, aligned_f64mat3x2, 32); + + /// Double-qualifier floating-point aligned 3x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3x3, 32); + + /// Double-qualifier floating-point aligned 3x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat3x4, aligned_f64mat3x4, 32); + + /// Double-qualifier floating-point aligned 4x2 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat4x2, aligned_f64mat4x2, 32); + + /// Double-qualifier floating-point aligned 4x3 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat4x3, aligned_f64mat4x3, 32); + + /// Double-qualifier floating-point aligned 4x4 matrix. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4x4, 32); + +# endif//GLM_FORCE_SINGLE_ONLY + + + ////////////////////////// + // Quaternion types + + /// Single-qualifier floating-point aligned quaternion. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(quat, aligned_quat, 16); + + /// Single-qualifier floating-point aligned quaternion. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(quat, aligned_fquat, 16); + + /// Double-qualifier floating-point aligned quaternion. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(dquat, aligned_dquat, 32); + + /// Single-qualifier floating-point aligned quaternion. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f32quat, aligned_f32quat, 16); + +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point aligned quaternion. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(f64quat, aligned_f64quat, 32); + +# endif//GLM_FORCE_SINGLE_ONLY + + /// @} +}//namespace glm + +#include "type_aligned.inl" diff --git a/dep/glm/gtx/type_aligned.inl b/dep/glm/gtx/type_aligned.inl new file mode 100644 index 0000000..54c1b81 --- /dev/null +++ b/dep/glm/gtx/type_aligned.inl @@ -0,0 +1,6 @@ +/// @ref gtc_type_aligned + +namespace glm +{ + +} diff --git a/dep/glm/gtx/type_trait.hpp b/dep/glm/gtx/type_trait.hpp new file mode 100644 index 0000000..56685c8 --- /dev/null +++ b/dep/glm/gtx/type_trait.hpp @@ -0,0 +1,85 @@ +/// @ref gtx_type_trait +/// @file glm/gtx/type_trait.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_type_trait GLM_GTX_type_trait +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Defines traits for each type. + +#pragma once + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_type_trait is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_type_trait extension included") +# endif +#endif + +// Dependency: +#include "../detail/qualifier.hpp" +#include "../gtc/quaternion.hpp" +#include "../gtx/dual_quaternion.hpp" + +namespace glm +{ + /// @addtogroup gtx_type_trait + /// @{ + + template + struct type + { + static bool const is_vec = false; + static bool const is_mat = false; + static bool const is_quat = false; + static length_t const components = 0; + static length_t const cols = 0; + static length_t const rows = 0; + }; + + template + struct type > + { + static bool const is_vec = true; + static bool const is_mat = false; + static bool const is_quat = false; + static length_t const components = L; + }; + + template + struct type > + { + static bool const is_vec = false; + static bool const is_mat = true; + static bool const is_quat = false; + static length_t const components = C; + static length_t const cols = C; + static length_t const rows = R; + }; + + template + struct type > + { + static bool const is_vec = false; + static bool const is_mat = false; + static bool const is_quat = true; + static length_t const components = 4; + }; + + template + struct type > + { + static bool const is_vec = false; + static bool const is_mat = false; + static bool const is_quat = true; + static length_t const components = 8; + }; + + /// @} +}//namespace glm + +#include "type_trait.inl" diff --git a/dep/glm/gtx/type_trait.inl b/dep/glm/gtx/type_trait.inl new file mode 100644 index 0000000..045de95 --- /dev/null +++ b/dep/glm/gtx/type_trait.inl @@ -0,0 +1,61 @@ +/// @ref gtx_type_trait + +namespace glm +{ + template + bool const type::is_vec; + template + bool const type::is_mat; + template + bool const type::is_quat; + template + length_t const type::components; + template + length_t const type::cols; + template + length_t const type::rows; + + // vec + template + bool const type >::is_vec; + template + bool const type >::is_mat; + template + bool const type >::is_quat; + template + length_t const type >::components; + + // mat + template + bool const type >::is_vec; + template + bool const type >::is_mat; + template + bool const type >::is_quat; + template + length_t const type >::components; + template + length_t const type >::cols; + template + length_t const type >::rows; + + // tquat + template + bool const type >::is_vec; + template + bool const type >::is_mat; + template + bool const type >::is_quat; + template + length_t const type >::components; + + // tdualquat + template + bool const type >::is_vec; + template + bool const type >::is_mat; + template + bool const type >::is_quat; + template + length_t const type >::components; +}//namespace glm diff --git a/dep/glm/gtx/vec_swizzle.hpp b/dep/glm/gtx/vec_swizzle.hpp new file mode 100644 index 0000000..1c49abc --- /dev/null +++ b/dep/glm/gtx/vec_swizzle.hpp @@ -0,0 +1,2782 @@ +/// @ref gtx_vec_swizzle +/// @file glm/gtx/vec_swizzle.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_vec_swizzle GLM_GTX_vec_swizzle +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Functions to perform swizzle operation. + +#pragma once + +#include "../glm.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_vec_swizzle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_vec_swizzle extension included") +# endif +#endif + +namespace glm { + // xx + template + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<1, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + // xy + template + GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.y); + } + + template + GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.y); + } + + template + GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.y); + } + + // xz + template + GLM_INLINE glm::vec<2, T, Q> xz(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.z); + } + + template + GLM_INLINE glm::vec<2, T, Q> xz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.z); + } + + // xw + template + GLM_INLINE glm::vec<2, T, Q> xw(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.w); + } + + // yx + template + GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.x); + } + + // yy + template + GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.y); + } + + template + GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.y); + } + + template + GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.y); + } + + // yz + template + GLM_INLINE glm::vec<2, T, Q> yz(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.z); + } + + template + GLM_INLINE glm::vec<2, T, Q> yz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.z); + } + + // yw + template + GLM_INLINE glm::vec<2, T, Q> yw(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.w); + } + + // zx + template + GLM_INLINE glm::vec<2, T, Q> zx(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.x); + } + + template + GLM_INLINE glm::vec<2, T, Q> zx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.x); + } + + // zy + template + GLM_INLINE glm::vec<2, T, Q> zy(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.y); + } + + template + GLM_INLINE glm::vec<2, T, Q> zy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.y); + } + + // zz + template + GLM_INLINE glm::vec<2, T, Q> zz(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.z); + } + + template + GLM_INLINE glm::vec<2, T, Q> zz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.z); + } + + // zw + template + GLM_INLINE glm::vec<2, T, Q> zw(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.w); + } + + // wx + template + GLM_INLINE glm::vec<2, T, Q> wx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.x); + } + + // wy + template + GLM_INLINE glm::vec<2, T, Q> wy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.y); + } + + // wz + template + GLM_INLINE glm::vec<2, T, Q> wz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.z); + } + + // ww + template + GLM_INLINE glm::vec<2, T, Q> ww(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.w); + } + + // xxx + template + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<1, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + // xxy + template + GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.y); + } + + // xxz + template + GLM_INLINE glm::vec<3, T, Q> xxz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> xxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.z); + } + + // xxw + template + GLM_INLINE glm::vec<3, T, Q> xxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.w); + } + + // xyx + template + GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.x); + } + + // xyy + template + GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.y); + } + + // xyz + template + GLM_INLINE glm::vec<3, T, Q> xyz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> xyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.z); + } + + // xyw + template + GLM_INLINE glm::vec<3, T, Q> xyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.w); + } + + // xzx + template + GLM_INLINE glm::vec<3, T, Q> xzx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> xzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.x); + } + + // xzy + template + GLM_INLINE glm::vec<3, T, Q> xzy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> xzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.y); + } + + // xzz + template + GLM_INLINE glm::vec<3, T, Q> xzz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> xzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.z); + } + + // xzw + template + GLM_INLINE glm::vec<3, T, Q> xzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.w); + } + + // xwx + template + GLM_INLINE glm::vec<3, T, Q> xwx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.x); + } + + // xwy + template + GLM_INLINE glm::vec<3, T, Q> xwy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.y); + } + + // xwz + template + GLM_INLINE glm::vec<3, T, Q> xwz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.z); + } + + // xww + template + GLM_INLINE glm::vec<3, T, Q> xww(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.w); + } + + // yxx + template + GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.x); + } + + // yxy + template + GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.y); + } + + // yxz + template + GLM_INLINE glm::vec<3, T, Q> yxz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> yxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.z); + } + + // yxw + template + GLM_INLINE glm::vec<3, T, Q> yxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.w); + } + + // yyx + template + GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.x); + } + + // yyy + template + GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.y); + } + + // yyz + template + GLM_INLINE glm::vec<3, T, Q> yyz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> yyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.z); + } + + // yyw + template + GLM_INLINE glm::vec<3, T, Q> yyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.w); + } + + // yzx + template + GLM_INLINE glm::vec<3, T, Q> yzx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> yzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.x); + } + + // yzy + template + GLM_INLINE glm::vec<3, T, Q> yzy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> yzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.y); + } + + // yzz + template + GLM_INLINE glm::vec<3, T, Q> yzz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> yzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.z); + } + + // yzw + template + GLM_INLINE glm::vec<3, T, Q> yzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.w); + } + + // ywx + template + GLM_INLINE glm::vec<3, T, Q> ywx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.x); + } + + // ywy + template + GLM_INLINE glm::vec<3, T, Q> ywy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.y); + } + + // ywz + template + GLM_INLINE glm::vec<3, T, Q> ywz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.z); + } + + // yww + template + GLM_INLINE glm::vec<3, T, Q> yww(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.w); + } + + // zxx + template + GLM_INLINE glm::vec<3, T, Q> zxx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> zxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.x); + } + + // zxy + template + GLM_INLINE glm::vec<3, T, Q> zxy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> zxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.y); + } + + // zxz + template + GLM_INLINE glm::vec<3, T, Q> zxz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> zxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.z); + } + + // zxw + template + GLM_INLINE glm::vec<3, T, Q> zxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.w); + } + + // zyx + template + GLM_INLINE glm::vec<3, T, Q> zyx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> zyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.x); + } + + // zyy + template + GLM_INLINE glm::vec<3, T, Q> zyy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> zyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.y); + } + + // zyz + template + GLM_INLINE glm::vec<3, T, Q> zyz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> zyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.z); + } + + // zyw + template + GLM_INLINE glm::vec<3, T, Q> zyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.w); + } + + // zzx + template + GLM_INLINE glm::vec<3, T, Q> zzx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.x); + } + + template + GLM_INLINE glm::vec<3, T, Q> zzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.x); + } + + // zzy + template + GLM_INLINE glm::vec<3, T, Q> zzy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.y); + } + + template + GLM_INLINE glm::vec<3, T, Q> zzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.y); + } + + // zzz + template + GLM_INLINE glm::vec<3, T, Q> zzz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.z); + } + + template + GLM_INLINE glm::vec<3, T, Q> zzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.z); + } + + // zzw + template + GLM_INLINE glm::vec<3, T, Q> zzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.w); + } + + // zwx + template + GLM_INLINE glm::vec<3, T, Q> zwx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.x); + } + + // zwy + template + GLM_INLINE glm::vec<3, T, Q> zwy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.y); + } + + // zwz + template + GLM_INLINE glm::vec<3, T, Q> zwz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.z); + } + + // zww + template + GLM_INLINE glm::vec<3, T, Q> zww(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.w); + } + + // wxx + template + GLM_INLINE glm::vec<3, T, Q> wxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.x); + } + + // wxy + template + GLM_INLINE glm::vec<3, T, Q> wxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.y); + } + + // wxz + template + GLM_INLINE glm::vec<3, T, Q> wxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.z); + } + + // wxw + template + GLM_INLINE glm::vec<3, T, Q> wxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.w); + } + + // wyx + template + GLM_INLINE glm::vec<3, T, Q> wyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.x); + } + + // wyy + template + GLM_INLINE glm::vec<3, T, Q> wyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.y); + } + + // wyz + template + GLM_INLINE glm::vec<3, T, Q> wyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.z); + } + + // wyw + template + GLM_INLINE glm::vec<3, T, Q> wyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.w); + } + + // wzx + template + GLM_INLINE glm::vec<3, T, Q> wzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.x); + } + + // wzy + template + GLM_INLINE glm::vec<3, T, Q> wzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.y); + } + + // wzz + template + GLM_INLINE glm::vec<3, T, Q> wzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.z); + } + + // wzw + template + GLM_INLINE glm::vec<3, T, Q> wzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.w); + } + + // wwx + template + GLM_INLINE glm::vec<3, T, Q> wwx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.x); + } + + // wwy + template + GLM_INLINE glm::vec<3, T, Q> wwy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.y); + } + + // wwz + template + GLM_INLINE glm::vec<3, T, Q> wwz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.z); + } + + // www + template + GLM_INLINE glm::vec<3, T, Q> www(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.w); + } + + // xxxx + template + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<1, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + // xxxy + template + GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y); + } + + // xxxz + template + GLM_INLINE glm::vec<4, T, Q> xxxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.z); + } + + // xxxw + template + GLM_INLINE glm::vec<4, T, Q> xxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.w); + } + + // xxyx + template + GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x); + } + + // xxyy + template + GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y); + } + + // xxyz + template + GLM_INLINE glm::vec<4, T, Q> xxyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.z); + } + + // xxyw + template + GLM_INLINE glm::vec<4, T, Q> xxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.w); + } + + // xxzx + template + GLM_INLINE glm::vec<4, T, Q> xxzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.x); + } + + // xxzy + template + GLM_INLINE glm::vec<4, T, Q> xxzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.y); + } + + // xxzz + template + GLM_INLINE glm::vec<4, T, Q> xxzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.z); + } + + // xxzw + template + GLM_INLINE glm::vec<4, T, Q> xxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.w); + } + + // xxwx + template + GLM_INLINE glm::vec<4, T, Q> xxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.x); + } + + // xxwy + template + GLM_INLINE glm::vec<4, T, Q> xxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.y); + } + + // xxwz + template + GLM_INLINE glm::vec<4, T, Q> xxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.z); + } + + // xxww + template + GLM_INLINE glm::vec<4, T, Q> xxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.w); + } + + // xyxx + template + GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x); + } + + // xyxy + template + GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y); + } + + // xyxz + template + GLM_INLINE glm::vec<4, T, Q> xyxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.z); + } + + // xyxw + template + GLM_INLINE glm::vec<4, T, Q> xyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.w); + } + + // xyyx + template + GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x); + } + + // xyyy + template + GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y); + } + + // xyyz + template + GLM_INLINE glm::vec<4, T, Q> xyyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.z); + } + + // xyyw + template + GLM_INLINE glm::vec<4, T, Q> xyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.w); + } + + // xyzx + template + GLM_INLINE glm::vec<4, T, Q> xyzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.x); + } + + // xyzy + template + GLM_INLINE glm::vec<4, T, Q> xyzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.y); + } + + // xyzz + template + GLM_INLINE glm::vec<4, T, Q> xyzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.z); + } + + // xyzw + template + GLM_INLINE glm::vec<4, T, Q> xyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.w); + } + + // xywx + template + GLM_INLINE glm::vec<4, T, Q> xywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.x); + } + + // xywy + template + GLM_INLINE glm::vec<4, T, Q> xywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.y); + } + + // xywz + template + GLM_INLINE glm::vec<4, T, Q> xywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.z); + } + + // xyww + template + GLM_INLINE glm::vec<4, T, Q> xyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.w); + } + + // xzxx + template + GLM_INLINE glm::vec<4, T, Q> xzxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.x); + } + + // xzxy + template + GLM_INLINE glm::vec<4, T, Q> xzxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.y); + } + + // xzxz + template + GLM_INLINE glm::vec<4, T, Q> xzxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.z); + } + + // xzxw + template + GLM_INLINE glm::vec<4, T, Q> xzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.w); + } + + // xzyx + template + GLM_INLINE glm::vec<4, T, Q> xzyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.x); + } + + // xzyy + template + GLM_INLINE glm::vec<4, T, Q> xzyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.y); + } + + // xzyz + template + GLM_INLINE glm::vec<4, T, Q> xzyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.z); + } + + // xzyw + template + GLM_INLINE glm::vec<4, T, Q> xzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.w); + } + + // xzzx + template + GLM_INLINE glm::vec<4, T, Q> xzzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.x); + } + + // xzzy + template + GLM_INLINE glm::vec<4, T, Q> xzzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.y); + } + + // xzzz + template + GLM_INLINE glm::vec<4, T, Q> xzzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> xzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.z); + } + + // xzzw + template + GLM_INLINE glm::vec<4, T, Q> xzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.w); + } + + // xzwx + template + GLM_INLINE glm::vec<4, T, Q> xzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.x); + } + + // xzwy + template + GLM_INLINE glm::vec<4, T, Q> xzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.y); + } + + // xzwz + template + GLM_INLINE glm::vec<4, T, Q> xzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.z); + } + + // xzww + template + GLM_INLINE glm::vec<4, T, Q> xzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.w); + } + + // xwxx + template + GLM_INLINE glm::vec<4, T, Q> xwxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.x); + } + + // xwxy + template + GLM_INLINE glm::vec<4, T, Q> xwxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.y); + } + + // xwxz + template + GLM_INLINE glm::vec<4, T, Q> xwxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.z); + } + + // xwxw + template + GLM_INLINE glm::vec<4, T, Q> xwxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.w); + } + + // xwyx + template + GLM_INLINE glm::vec<4, T, Q> xwyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.x); + } + + // xwyy + template + GLM_INLINE glm::vec<4, T, Q> xwyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.y); + } + + // xwyz + template + GLM_INLINE glm::vec<4, T, Q> xwyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.z); + } + + // xwyw + template + GLM_INLINE glm::vec<4, T, Q> xwyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.w); + } + + // xwzx + template + GLM_INLINE glm::vec<4, T, Q> xwzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.x); + } + + // xwzy + template + GLM_INLINE glm::vec<4, T, Q> xwzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.y); + } + + // xwzz + template + GLM_INLINE glm::vec<4, T, Q> xwzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.z); + } + + // xwzw + template + GLM_INLINE glm::vec<4, T, Q> xwzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.w); + } + + // xwwx + template + GLM_INLINE glm::vec<4, T, Q> xwwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.x); + } + + // xwwy + template + GLM_INLINE glm::vec<4, T, Q> xwwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.y); + } + + // xwwz + template + GLM_INLINE glm::vec<4, T, Q> xwwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.z); + } + + // xwww + template + GLM_INLINE glm::vec<4, T, Q> xwww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.w); + } + + // yxxx + template + GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x); + } + + // yxxy + template + GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y); + } + + // yxxz + template + GLM_INLINE glm::vec<4, T, Q> yxxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.z); + } + + // yxxw + template + GLM_INLINE glm::vec<4, T, Q> yxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.w); + } + + // yxyx + template + GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x); + } + + // yxyy + template + GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y); + } + + // yxyz + template + GLM_INLINE glm::vec<4, T, Q> yxyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.z); + } + + // yxyw + template + GLM_INLINE glm::vec<4, T, Q> yxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.w); + } + + // yxzx + template + GLM_INLINE glm::vec<4, T, Q> yxzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.x); + } + + // yxzy + template + GLM_INLINE glm::vec<4, T, Q> yxzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.y); + } + + // yxzz + template + GLM_INLINE glm::vec<4, T, Q> yxzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.z); + } + + // yxzw + template + GLM_INLINE glm::vec<4, T, Q> yxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.w); + } + + // yxwx + template + GLM_INLINE glm::vec<4, T, Q> yxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.x); + } + + // yxwy + template + GLM_INLINE glm::vec<4, T, Q> yxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.y); + } + + // yxwz + template + GLM_INLINE glm::vec<4, T, Q> yxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.z); + } + + // yxww + template + GLM_INLINE glm::vec<4, T, Q> yxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.w); + } + + // yyxx + template + GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x); + } + + // yyxy + template + GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y); + } + + // yyxz + template + GLM_INLINE glm::vec<4, T, Q> yyxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.z); + } + + // yyxw + template + GLM_INLINE glm::vec<4, T, Q> yyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.w); + } + + // yyyx + template + GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x); + } + + // yyyy + template + GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y); + } + + // yyyz + template + GLM_INLINE glm::vec<4, T, Q> yyyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.z); + } + + // yyyw + template + GLM_INLINE glm::vec<4, T, Q> yyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.w); + } + + // yyzx + template + GLM_INLINE glm::vec<4, T, Q> yyzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.x); + } + + // yyzy + template + GLM_INLINE glm::vec<4, T, Q> yyzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.y); + } + + // yyzz + template + GLM_INLINE glm::vec<4, T, Q> yyzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.z); + } + + // yyzw + template + GLM_INLINE glm::vec<4, T, Q> yyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.w); + } + + // yywx + template + GLM_INLINE glm::vec<4, T, Q> yywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.x); + } + + // yywy + template + GLM_INLINE glm::vec<4, T, Q> yywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.y); + } + + // yywz + template + GLM_INLINE glm::vec<4, T, Q> yywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.z); + } + + // yyww + template + GLM_INLINE glm::vec<4, T, Q> yyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.w); + } + + // yzxx + template + GLM_INLINE glm::vec<4, T, Q> yzxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.x); + } + + // yzxy + template + GLM_INLINE glm::vec<4, T, Q> yzxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.y); + } + + // yzxz + template + GLM_INLINE glm::vec<4, T, Q> yzxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.z); + } + + // yzxw + template + GLM_INLINE glm::vec<4, T, Q> yzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.w); + } + + // yzyx + template + GLM_INLINE glm::vec<4, T, Q> yzyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.x); + } + + // yzyy + template + GLM_INLINE glm::vec<4, T, Q> yzyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.y); + } + + // yzyz + template + GLM_INLINE glm::vec<4, T, Q> yzyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.z); + } + + // yzyw + template + GLM_INLINE glm::vec<4, T, Q> yzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.w); + } + + // yzzx + template + GLM_INLINE glm::vec<4, T, Q> yzzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.x); + } + + // yzzy + template + GLM_INLINE glm::vec<4, T, Q> yzzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.y); + } + + // yzzz + template + GLM_INLINE glm::vec<4, T, Q> yzzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> yzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.z); + } + + // yzzw + template + GLM_INLINE glm::vec<4, T, Q> yzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.w); + } + + // yzwx + template + GLM_INLINE glm::vec<4, T, Q> yzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.x); + } + + // yzwy + template + GLM_INLINE glm::vec<4, T, Q> yzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.y); + } + + // yzwz + template + GLM_INLINE glm::vec<4, T, Q> yzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.z); + } + + // yzww + template + GLM_INLINE glm::vec<4, T, Q> yzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.w); + } + + // ywxx + template + GLM_INLINE glm::vec<4, T, Q> ywxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.x); + } + + // ywxy + template + GLM_INLINE glm::vec<4, T, Q> ywxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.y); + } + + // ywxz + template + GLM_INLINE glm::vec<4, T, Q> ywxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.z); + } + + // ywxw + template + GLM_INLINE glm::vec<4, T, Q> ywxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.w); + } + + // ywyx + template + GLM_INLINE glm::vec<4, T, Q> ywyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.x); + } + + // ywyy + template + GLM_INLINE glm::vec<4, T, Q> ywyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.y); + } + + // ywyz + template + GLM_INLINE glm::vec<4, T, Q> ywyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.z); + } + + // ywyw + template + GLM_INLINE glm::vec<4, T, Q> ywyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.w); + } + + // ywzx + template + GLM_INLINE glm::vec<4, T, Q> ywzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.x); + } + + // ywzy + template + GLM_INLINE glm::vec<4, T, Q> ywzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.y); + } + + // ywzz + template + GLM_INLINE glm::vec<4, T, Q> ywzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.z); + } + + // ywzw + template + GLM_INLINE glm::vec<4, T, Q> ywzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.w); + } + + // ywwx + template + GLM_INLINE glm::vec<4, T, Q> ywwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.x); + } + + // ywwy + template + GLM_INLINE glm::vec<4, T, Q> ywwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.y); + } + + // ywwz + template + GLM_INLINE glm::vec<4, T, Q> ywwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.z); + } + + // ywww + template + GLM_INLINE glm::vec<4, T, Q> ywww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.w); + } + + // zxxx + template + GLM_INLINE glm::vec<4, T, Q> zxxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.x); + } + + // zxxy + template + GLM_INLINE glm::vec<4, T, Q> zxxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.y); + } + + // zxxz + template + GLM_INLINE glm::vec<4, T, Q> zxxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.z); + } + + // zxxw + template + GLM_INLINE glm::vec<4, T, Q> zxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.w); + } + + // zxyx + template + GLM_INLINE glm::vec<4, T, Q> zxyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.x); + } + + // zxyy + template + GLM_INLINE glm::vec<4, T, Q> zxyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.y); + } + + // zxyz + template + GLM_INLINE glm::vec<4, T, Q> zxyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.z); + } + + // zxyw + template + GLM_INLINE glm::vec<4, T, Q> zxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.w); + } + + // zxzx + template + GLM_INLINE glm::vec<4, T, Q> zxzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.x); + } + + // zxzy + template + GLM_INLINE glm::vec<4, T, Q> zxzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.y); + } + + // zxzz + template + GLM_INLINE glm::vec<4, T, Q> zxzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.z); + } + + // zxzw + template + GLM_INLINE glm::vec<4, T, Q> zxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.w); + } + + // zxwx + template + GLM_INLINE glm::vec<4, T, Q> zxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.x); + } + + // zxwy + template + GLM_INLINE glm::vec<4, T, Q> zxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.y); + } + + // zxwz + template + GLM_INLINE glm::vec<4, T, Q> zxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.z); + } + + // zxww + template + GLM_INLINE glm::vec<4, T, Q> zxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.w); + } + + // zyxx + template + GLM_INLINE glm::vec<4, T, Q> zyxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.x); + } + + // zyxy + template + GLM_INLINE glm::vec<4, T, Q> zyxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.y); + } + + // zyxz + template + GLM_INLINE glm::vec<4, T, Q> zyxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.z); + } + + // zyxw + template + GLM_INLINE glm::vec<4, T, Q> zyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.w); + } + + // zyyx + template + GLM_INLINE glm::vec<4, T, Q> zyyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.x); + } + + // zyyy + template + GLM_INLINE glm::vec<4, T, Q> zyyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.y); + } + + // zyyz + template + GLM_INLINE glm::vec<4, T, Q> zyyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.z); + } + + // zyyw + template + GLM_INLINE glm::vec<4, T, Q> zyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.w); + } + + // zyzx + template + GLM_INLINE glm::vec<4, T, Q> zyzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.x); + } + + // zyzy + template + GLM_INLINE glm::vec<4, T, Q> zyzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.y); + } + + // zyzz + template + GLM_INLINE glm::vec<4, T, Q> zyzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.z); + } + + // zyzw + template + GLM_INLINE glm::vec<4, T, Q> zyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.w); + } + + // zywx + template + GLM_INLINE glm::vec<4, T, Q> zywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.x); + } + + // zywy + template + GLM_INLINE glm::vec<4, T, Q> zywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.y); + } + + // zywz + template + GLM_INLINE glm::vec<4, T, Q> zywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.z); + } + + // zyww + template + GLM_INLINE glm::vec<4, T, Q> zyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.w); + } + + // zzxx + template + GLM_INLINE glm::vec<4, T, Q> zzxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.x); + } + + // zzxy + template + GLM_INLINE glm::vec<4, T, Q> zzxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.y); + } + + // zzxz + template + GLM_INLINE glm::vec<4, T, Q> zzxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.z); + } + + // zzxw + template + GLM_INLINE glm::vec<4, T, Q> zzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.w); + } + + // zzyx + template + GLM_INLINE glm::vec<4, T, Q> zzyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.x); + } + + // zzyy + template + GLM_INLINE glm::vec<4, T, Q> zzyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.y); + } + + // zzyz + template + GLM_INLINE glm::vec<4, T, Q> zzyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.z); + } + + // zzyw + template + GLM_INLINE glm::vec<4, T, Q> zzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.w); + } + + // zzzx + template + GLM_INLINE glm::vec<4, T, Q> zzzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.x); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.x); + } + + // zzzy + template + GLM_INLINE glm::vec<4, T, Q> zzzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.y); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.y); + } + + // zzzz + template + GLM_INLINE glm::vec<4, T, Q> zzzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.z); + } + + template + GLM_INLINE glm::vec<4, T, Q> zzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.z); + } + + // zzzw + template + GLM_INLINE glm::vec<4, T, Q> zzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.w); + } + + // zzwx + template + GLM_INLINE glm::vec<4, T, Q> zzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.x); + } + + // zzwy + template + GLM_INLINE glm::vec<4, T, Q> zzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.y); + } + + // zzwz + template + GLM_INLINE glm::vec<4, T, Q> zzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.z); + } + + // zzww + template + GLM_INLINE glm::vec<4, T, Q> zzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.w); + } + + // zwxx + template + GLM_INLINE glm::vec<4, T, Q> zwxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.x); + } + + // zwxy + template + GLM_INLINE glm::vec<4, T, Q> zwxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.y); + } + + // zwxz + template + GLM_INLINE glm::vec<4, T, Q> zwxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.z); + } + + // zwxw + template + GLM_INLINE glm::vec<4, T, Q> zwxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.w); + } + + // zwyx + template + GLM_INLINE glm::vec<4, T, Q> zwyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.x); + } + + // zwyy + template + GLM_INLINE glm::vec<4, T, Q> zwyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.y); + } + + // zwyz + template + GLM_INLINE glm::vec<4, T, Q> zwyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.z); + } + + // zwyw + template + GLM_INLINE glm::vec<4, T, Q> zwyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.w); + } + + // zwzx + template + GLM_INLINE glm::vec<4, T, Q> zwzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.x); + } + + // zwzy + template + GLM_INLINE glm::vec<4, T, Q> zwzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.y); + } + + // zwzz + template + GLM_INLINE glm::vec<4, T, Q> zwzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.z); + } + + // zwzw + template + GLM_INLINE glm::vec<4, T, Q> zwzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.w); + } + + // zwwx + template + GLM_INLINE glm::vec<4, T, Q> zwwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.x); + } + + // zwwy + template + GLM_INLINE glm::vec<4, T, Q> zwwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.y); + } + + // zwwz + template + GLM_INLINE glm::vec<4, T, Q> zwwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.z); + } + + // zwww + template + GLM_INLINE glm::vec<4, T, Q> zwww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.w); + } + + // wxxx + template + GLM_INLINE glm::vec<4, T, Q> wxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.x); + } + + // wxxy + template + GLM_INLINE glm::vec<4, T, Q> wxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.y); + } + + // wxxz + template + GLM_INLINE glm::vec<4, T, Q> wxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.z); + } + + // wxxw + template + GLM_INLINE glm::vec<4, T, Q> wxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.w); + } + + // wxyx + template + GLM_INLINE glm::vec<4, T, Q> wxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.x); + } + + // wxyy + template + GLM_INLINE glm::vec<4, T, Q> wxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.y); + } + + // wxyz + template + GLM_INLINE glm::vec<4, T, Q> wxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.z); + } + + // wxyw + template + GLM_INLINE glm::vec<4, T, Q> wxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.w); + } + + // wxzx + template + GLM_INLINE glm::vec<4, T, Q> wxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.x); + } + + // wxzy + template + GLM_INLINE glm::vec<4, T, Q> wxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.y); + } + + // wxzz + template + GLM_INLINE glm::vec<4, T, Q> wxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.z); + } + + // wxzw + template + GLM_INLINE glm::vec<4, T, Q> wxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.w); + } + + // wxwx + template + GLM_INLINE glm::vec<4, T, Q> wxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.x); + } + + // wxwy + template + GLM_INLINE glm::vec<4, T, Q> wxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.y); + } + + // wxwz + template + GLM_INLINE glm::vec<4, T, Q> wxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.z); + } + + // wxww + template + GLM_INLINE glm::vec<4, T, Q> wxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.w); + } + + // wyxx + template + GLM_INLINE glm::vec<4, T, Q> wyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.x); + } + + // wyxy + template + GLM_INLINE glm::vec<4, T, Q> wyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.y); + } + + // wyxz + template + GLM_INLINE glm::vec<4, T, Q> wyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.z); + } + + // wyxw + template + GLM_INLINE glm::vec<4, T, Q> wyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.w); + } + + // wyyx + template + GLM_INLINE glm::vec<4, T, Q> wyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.x); + } + + // wyyy + template + GLM_INLINE glm::vec<4, T, Q> wyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.y); + } + + // wyyz + template + GLM_INLINE glm::vec<4, T, Q> wyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.z); + } + + // wyyw + template + GLM_INLINE glm::vec<4, T, Q> wyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.w); + } + + // wyzx + template + GLM_INLINE glm::vec<4, T, Q> wyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.x); + } + + // wyzy + template + GLM_INLINE glm::vec<4, T, Q> wyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.y); + } + + // wyzz + template + GLM_INLINE glm::vec<4, T, Q> wyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.z); + } + + // wyzw + template + GLM_INLINE glm::vec<4, T, Q> wyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.w); + } + + // wywx + template + GLM_INLINE glm::vec<4, T, Q> wywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.x); + } + + // wywy + template + GLM_INLINE glm::vec<4, T, Q> wywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.y); + } + + // wywz + template + GLM_INLINE glm::vec<4, T, Q> wywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.z); + } + + // wyww + template + GLM_INLINE glm::vec<4, T, Q> wyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.w); + } + + // wzxx + template + GLM_INLINE glm::vec<4, T, Q> wzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.x); + } + + // wzxy + template + GLM_INLINE glm::vec<4, T, Q> wzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.y); + } + + // wzxz + template + GLM_INLINE glm::vec<4, T, Q> wzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.z); + } + + // wzxw + template + GLM_INLINE glm::vec<4, T, Q> wzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.w); + } + + // wzyx + template + GLM_INLINE glm::vec<4, T, Q> wzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.x); + } + + // wzyy + template + GLM_INLINE glm::vec<4, T, Q> wzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.y); + } + + // wzyz + template + GLM_INLINE glm::vec<4, T, Q> wzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.z); + } + + // wzyw + template + GLM_INLINE glm::vec<4, T, Q> wzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.w); + } + + // wzzx + template + GLM_INLINE glm::vec<4, T, Q> wzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.x); + } + + // wzzy + template + GLM_INLINE glm::vec<4, T, Q> wzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.y); + } + + // wzzz + template + GLM_INLINE glm::vec<4, T, Q> wzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.z); + } + + // wzzw + template + GLM_INLINE glm::vec<4, T, Q> wzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.w); + } + + // wzwx + template + GLM_INLINE glm::vec<4, T, Q> wzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.x); + } + + // wzwy + template + GLM_INLINE glm::vec<4, T, Q> wzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.y); + } + + // wzwz + template + GLM_INLINE glm::vec<4, T, Q> wzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.z); + } + + // wzww + template + GLM_INLINE glm::vec<4, T, Q> wzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.w); + } + + // wwxx + template + GLM_INLINE glm::vec<4, T, Q> wwxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.x); + } + + // wwxy + template + GLM_INLINE glm::vec<4, T, Q> wwxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.y); + } + + // wwxz + template + GLM_INLINE glm::vec<4, T, Q> wwxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.z); + } + + // wwxw + template + GLM_INLINE glm::vec<4, T, Q> wwxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.w); + } + + // wwyx + template + GLM_INLINE glm::vec<4, T, Q> wwyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.x); + } + + // wwyy + template + GLM_INLINE glm::vec<4, T, Q> wwyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.y); + } + + // wwyz + template + GLM_INLINE glm::vec<4, T, Q> wwyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.z); + } + + // wwyw + template + GLM_INLINE glm::vec<4, T, Q> wwyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.w); + } + + // wwzx + template + GLM_INLINE glm::vec<4, T, Q> wwzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.x); + } + + // wwzy + template + GLM_INLINE glm::vec<4, T, Q> wwzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.y); + } + + // wwzz + template + GLM_INLINE glm::vec<4, T, Q> wwzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.z); + } + + // wwzw + template + GLM_INLINE glm::vec<4, T, Q> wwzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.w); + } + + // wwwx + template + GLM_INLINE glm::vec<4, T, Q> wwwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.x); + } + + // wwwy + template + GLM_INLINE glm::vec<4, T, Q> wwwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.y); + } + + // wwwz + template + GLM_INLINE glm::vec<4, T, Q> wwwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.z); + } + + // wwww + template + GLM_INLINE glm::vec<4, T, Q> wwww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.w); + } + +} diff --git a/dep/glm/gtx/vector_angle.hpp b/dep/glm/gtx/vector_angle.hpp new file mode 100644 index 0000000..9ae4371 --- /dev/null +++ b/dep/glm/gtx/vector_angle.hpp @@ -0,0 +1,57 @@ +/// @ref gtx_vector_angle +/// @file glm/gtx/vector_angle.hpp +/// +/// @see core (dependence) +/// @see gtx_quaternion (dependence) +/// @see gtx_epsilon (dependence) +/// +/// @defgroup gtx_vector_angle GLM_GTX_vector_angle +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Compute angle between vectors + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/epsilon.hpp" +#include "../gtx/quaternion.hpp" +#include "../gtx/rotate_vector.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_vector_angle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_vector_angle extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_vector_angle + /// @{ + + //! Returns the absolute angle between two vectors. + //! Parameters need to be normalized. + /// @see gtx_vector_angle extension. + template + GLM_FUNC_DECL T angle(vec const& x, vec const& y); + + //! Returns the oriented angle between two 2d vectors. + //! Parameters need to be normalized. + /// @see gtx_vector_angle extension. + template + GLM_FUNC_DECL T orientedAngle(vec<2, T, Q> const& x, vec<2, T, Q> const& y); + + //! Returns the oriented angle between two 3d vectors based from a reference axis. + //! Parameters need to be normalized. + /// @see gtx_vector_angle extension. + template + GLM_FUNC_DECL T orientedAngle(vec<3, T, Q> const& x, vec<3, T, Q> const& y, vec<3, T, Q> const& ref); + + /// @} +}// namespace glm + +#include "vector_angle.inl" diff --git a/dep/glm/gtx/vector_angle.inl b/dep/glm/gtx/vector_angle.inl new file mode 100644 index 0000000..a1f957a --- /dev/null +++ b/dep/glm/gtx/vector_angle.inl @@ -0,0 +1,44 @@ +/// @ref gtx_vector_angle + +namespace glm +{ + template + GLM_FUNC_QUALIFIER genType angle + ( + genType const& x, + genType const& y + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'angle' only accept floating-point inputs"); + return acos(clamp(dot(x, y), genType(-1), genType(1))); + } + + template + GLM_FUNC_QUALIFIER T angle(vec const& x, vec const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'angle' only accept floating-point inputs"); + return acos(clamp(dot(x, y), T(-1), T(1))); + } + + //! \todo epsilon is hard coded to 0.01 + template + GLM_FUNC_QUALIFIER T orientedAngle(vec<2, T, Q> const& x, vec<2, T, Q> const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'orientedAngle' only accept floating-point inputs"); + T const Angle(acos(clamp(dot(x, y), T(-1), T(1)))); + + if(all(epsilonEqual(y, glm::rotate(x, Angle), T(0.0001)))) + return Angle; + else + return -Angle; + } + + template + GLM_FUNC_QUALIFIER T orientedAngle(vec<3, T, Q> const& x, vec<3, T, Q> const& y, vec<3, T, Q> const& ref) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'orientedAngle' only accept floating-point inputs"); + + T const Angle(acos(clamp(dot(x, y), T(-1), T(1)))); + return mix(Angle, -Angle, dot(ref, cross(x, y)) < T(0)); + } +}//namespace glm diff --git a/dep/glm/gtx/vector_query.hpp b/dep/glm/gtx/vector_query.hpp new file mode 100644 index 0000000..77c7b97 --- /dev/null +++ b/dep/glm/gtx/vector_query.hpp @@ -0,0 +1,66 @@ +/// @ref gtx_vector_query +/// @file glm/gtx/vector_query.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_vector_query GLM_GTX_vector_query +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Query informations of vector types + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include +#include + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_vector_query is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_vector_query extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_vector_query + /// @{ + + //! Check whether two vectors are collinears. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL bool areCollinear(vec const& v0, vec const& v1, T const& epsilon); + + //! Check whether two vectors are orthogonals. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL bool areOrthogonal(vec const& v0, vec const& v1, T const& epsilon); + + //! Check whether a vector is normalized. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL bool isNormalized(vec const& v, T const& epsilon); + + //! Check whether a vector is null. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL bool isNull(vec const& v, T const& epsilon); + + //! Check whether a each component of a vector is null. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL vec isCompNull(vec const& v, T const& epsilon); + + //! Check whether two vectors are orthonormal. + /// @see gtx_vector_query extensions. + template + GLM_FUNC_DECL bool areOrthonormal(vec const& v0, vec const& v1, T const& epsilon); + + /// @} +}// namespace glm + +#include "vector_query.inl" diff --git a/dep/glm/gtx/vector_query.inl b/dep/glm/gtx/vector_query.inl new file mode 100644 index 0000000..d1a5c9b --- /dev/null +++ b/dep/glm/gtx/vector_query.inl @@ -0,0 +1,154 @@ +/// @ref gtx_vector_query + +#include + +namespace glm{ +namespace detail +{ + template + struct compute_areCollinear{}; + + template + struct compute_areCollinear<2, T, Q> + { + GLM_FUNC_QUALIFIER static bool call(vec<2, T, Q> const& v0, vec<2, T, Q> const& v1, T const& epsilon) + { + return length(cross(vec<3, T, Q>(v0, static_cast(0)), vec<3, T, Q>(v1, static_cast(0)))) < epsilon; + } + }; + + template + struct compute_areCollinear<3, T, Q> + { + GLM_FUNC_QUALIFIER static bool call(vec<3, T, Q> const& v0, vec<3, T, Q> const& v1, T const& epsilon) + { + return length(cross(v0, v1)) < epsilon; + } + }; + + template + struct compute_areCollinear<4, T, Q> + { + GLM_FUNC_QUALIFIER static bool call(vec<4, T, Q> const& v0, vec<4, T, Q> const& v1, T const& epsilon) + { + return length(cross(vec<3, T, Q>(v0), vec<3, T, Q>(v1))) < epsilon; + } + }; + + template + struct compute_isCompNull{}; + + template + struct compute_isCompNull<2, T, Q> + { + GLM_FUNC_QUALIFIER static vec<2, bool, Q> call(vec<2, T, Q> const& v, T const& epsilon) + { + return vec<2, bool, Q>( + (abs(v.x) < epsilon), + (abs(v.y) < epsilon)); + } + }; + + template + struct compute_isCompNull<3, T, Q> + { + GLM_FUNC_QUALIFIER static vec<3, bool, Q> call(vec<3, T, Q> const& v, T const& epsilon) + { + return vec<3, bool, Q>( + (abs(v.x) < epsilon), + (abs(v.y) < epsilon), + (abs(v.z) < epsilon)); + } + }; + + template + struct compute_isCompNull<4, T, Q> + { + GLM_FUNC_QUALIFIER static vec<4, bool, Q> call(vec<4, T, Q> const& v, T const& epsilon) + { + return vec<4, bool, Q>( + (abs(v.x) < epsilon), + (abs(v.y) < epsilon), + (abs(v.z) < epsilon), + (abs(v.w) < epsilon)); + } + }; + +}//namespace detail + + template + GLM_FUNC_QUALIFIER bool areCollinear(vec const& v0, vec const& v1, T const& epsilon) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'areCollinear' only accept floating-point inputs"); + + return detail::compute_areCollinear::call(v0, v1, epsilon); + } + + template + GLM_FUNC_QUALIFIER bool areOrthogonal(vec const& v0, vec const& v1, T const& epsilon) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'areOrthogonal' only accept floating-point inputs"); + + return abs(dot(v0, v1)) <= max( + static_cast(1), + length(v0)) * max(static_cast(1), length(v1)) * epsilon; + } + + template + GLM_FUNC_QUALIFIER bool isNormalized(vec const& v, T const& epsilon) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isNormalized' only accept floating-point inputs"); + + return abs(length(v) - static_cast(1)) <= static_cast(2) * epsilon; + } + + template + GLM_FUNC_QUALIFIER bool isNull(vec const& v, T const& epsilon) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isNull' only accept floating-point inputs"); + + return length(v) <= epsilon; + } + + template + GLM_FUNC_QUALIFIER vec isCompNull(vec const& v, T const& epsilon) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isCompNull' only accept floating-point inputs"); + + return detail::compute_isCompNull::call(v, epsilon); + } + + template + GLM_FUNC_QUALIFIER vec<2, bool, Q> isCompNull(vec<2, T, Q> const& v, T const& epsilon) + { + return vec<2, bool, Q>( + abs(v.x) < epsilon, + abs(v.y) < epsilon); + } + + template + GLM_FUNC_QUALIFIER vec<3, bool, Q> isCompNull(vec<3, T, Q> const& v, T const& epsilon) + { + return vec<3, bool, Q>( + abs(v.x) < epsilon, + abs(v.y) < epsilon, + abs(v.z) < epsilon); + } + + template + GLM_FUNC_QUALIFIER vec<4, bool, Q> isCompNull(vec<4, T, Q> const& v, T const& epsilon) + { + return vec<4, bool, Q>( + abs(v.x) < epsilon, + abs(v.y) < epsilon, + abs(v.z) < epsilon, + abs(v.w) < epsilon); + } + + template + GLM_FUNC_QUALIFIER bool areOrthonormal(vec const& v0, vec const& v1, T const& epsilon) + { + return isNormalized(v0, epsilon) && isNormalized(v1, epsilon) && (abs(dot(v0, v1)) <= epsilon); + } + +}//namespace glm diff --git a/dep/glm/gtx/wrap.hpp b/dep/glm/gtx/wrap.hpp new file mode 100644 index 0000000..ad4eb3f --- /dev/null +++ b/dep/glm/gtx/wrap.hpp @@ -0,0 +1,37 @@ +/// @ref gtx_wrap +/// @file glm/gtx/wrap.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_wrap GLM_GTX_wrap +/// @ingroup gtx +/// +/// Include to use the features of this extension. +/// +/// Wrapping mode of texture coordinates. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../ext/scalar_common.hpp" +#include "../ext/vector_common.hpp" +#include "../gtc/vec1.hpp" + +#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED) +# ifndef GLM_ENABLE_EXPERIMENTAL +# pragma message("GLM: GLM_GTX_wrap is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.") +# else +# pragma message("GLM: GLM_GTX_wrap extension included") +# endif +#endif + +namespace glm +{ + /// @addtogroup gtx_wrap + /// @{ + + /// @} +}// namespace glm + +#include "wrap.inl" diff --git a/dep/glm/gtx/wrap.inl b/dep/glm/gtx/wrap.inl new file mode 100644 index 0000000..4be3b4c --- /dev/null +++ b/dep/glm/gtx/wrap.inl @@ -0,0 +1,6 @@ +/// @ref gtx_wrap + +namespace glm +{ + +}//namespace glm diff --git a/dep/glm/integer.hpp b/dep/glm/integer.hpp new file mode 100644 index 0000000..8817db3 --- /dev/null +++ b/dep/glm/integer.hpp @@ -0,0 +1,212 @@ +/// @ref core +/// @file glm/integer.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.8 Integer Functions +/// +/// @defgroup core_func_integer Integer functions +/// @ingroup core +/// +/// Provides GLSL functions on integer types +/// +/// These all operate component-wise. The description is per component. +/// The notation [a, b] means the set of bits from bit-number a through bit-number +/// b, inclusive. The lowest-order bit is bit 0. +/// +/// Include to use these core features. + +#pragma once + +#include "detail/qualifier.hpp" +#include "common.hpp" +#include "vector_relational.hpp" + +namespace glm +{ + /// @addtogroup core_func_integer + /// @{ + + /// Adds 32-bit unsigned integer x and y, returning the sum + /// modulo pow(2, 32). The value carry is set to 0 if the sum was + /// less than pow(2, 32), or to 1 otherwise. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL uaddCarry man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec uaddCarry( + vec const& x, + vec const& y, + vec & carry); + + /// Subtracts the 32-bit unsigned integer y from x, returning + /// the difference if non-negative, or pow(2, 32) plus the difference + /// otherwise. The value borrow is set to 0 if x >= y, or to 1 otherwise. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL usubBorrow man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec usubBorrow( + vec const& x, + vec const& y, + vec & borrow); + + /// Multiplies 32-bit integers x and y, producing a 64-bit + /// result. The 32 least-significant bits are returned in lsb. + /// The 32 most-significant bits are returned in msb. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL umulExtended man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL void umulExtended( + vec const& x, + vec const& y, + vec & msb, + vec & lsb); + + /// Multiplies 32-bit integers x and y, producing a 64-bit + /// result. The 32 least-significant bits are returned in lsb. + /// The 32 most-significant bits are returned in msb. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL imulExtended man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL void imulExtended( + vec const& x, + vec const& y, + vec & msb, + vec & lsb); + + /// Extracts bits [offset, offset + bits - 1] from value, + /// returning them in the least significant bits of the result. + /// For unsigned data types, the most significant bits of the + /// result will be set to zero. For signed data types, the + /// most significant bits will be set to the value of bit offset + base - 1. + /// + /// If bits is zero, the result will be zero. The result will be + /// undefined if offset or bits is negative, or if the sum of + /// offset and bits is greater than the number of bits used + /// to store the operand. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar types. + /// + /// @see GLSL bitfieldExtract man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec bitfieldExtract( + vec const& Value, + int Offset, + int Bits); + + /// Returns the insertion the bits least-significant bits of insert into base. + /// + /// The result will have bits [offset, offset + bits - 1] taken + /// from bits [0, bits - 1] of insert, and all other bits taken + /// directly from the corresponding bits of base. If bits is + /// zero, the result will simply be base. The result will be + /// undefined if offset or bits is negative, or if the sum of + /// offset and bits is greater than the number of bits used to + /// store the operand. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar or vector types. + /// + /// @see GLSL bitfieldInsert man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec bitfieldInsert( + vec const& Base, + vec const& Insert, + int Offset, + int Bits); + + /// Returns the reversal of the bits of value. + /// The bit numbered n of the result will be taken from bit (bits - 1) - n of value, + /// where bits is the total number of bits used to represent value. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar or vector types. + /// + /// @see GLSL bitfieldReverse man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec bitfieldReverse(vec const& v); + + /// Returns the number of bits set to 1 in the binary representation of value. + /// + /// @tparam genType Signed or unsigned integer scalar or vector types. + /// + /// @see GLSL bitCount man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL int bitCount(genType v); + + /// Returns the number of bits set to 1 in the binary representation of value. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar or vector types. + /// + /// @see GLSL bitCount man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec bitCount(vec const& v); + + /// Returns the bit number of the least significant bit set to + /// 1 in the binary representation of value. + /// If value is zero, -1 will be returned. + /// + /// @tparam genIUType Signed or unsigned integer scalar types. + /// + /// @see GLSL findLSB man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL int findLSB(genIUType x); + + /// Returns the bit number of the least significant bit set to + /// 1 in the binary representation of value. + /// If value is zero, -1 will be returned. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar types. + /// + /// @see GLSL findLSB man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec findLSB(vec const& v); + + /// Returns the bit number of the most significant bit in the binary representation of value. + /// For positive integers, the result will be the bit number of the most significant bit set to 1. + /// For negative integers, the result will be the bit number of the most significant + /// bit set to 0. For a value of zero or negative one, -1 will be returned. + /// + /// @tparam genIUType Signed or unsigned integer scalar types. + /// + /// @see GLSL findMSB man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL int findMSB(genIUType x); + + /// Returns the bit number of the most significant bit in the binary representation of value. + /// For positive integers, the result will be the bit number of the most significant bit set to 1. + /// For negative integers, the result will be the bit number of the most significant + /// bit set to 0. For a value of zero or negative one, -1 will be returned. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar types. + /// + /// @see GLSL findMSB man page + /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions + template + GLM_FUNC_DECL vec findMSB(vec const& v); + + /// @} +}//namespace glm + +#include "detail/func_integer.inl" diff --git a/dep/glm/mat2x2.hpp b/dep/glm/mat2x2.hpp new file mode 100644 index 0000000..96bec96 --- /dev/null +++ b/dep/glm/mat2x2.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat2x2.hpp + +#pragma once +#include "./ext/matrix_double2x2.hpp" +#include "./ext/matrix_double2x2_precision.hpp" +#include "./ext/matrix_float2x2.hpp" +#include "./ext/matrix_float2x2_precision.hpp" + diff --git a/dep/glm/mat2x3.hpp b/dep/glm/mat2x3.hpp new file mode 100644 index 0000000..d68dc25 --- /dev/null +++ b/dep/glm/mat2x3.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat2x3.hpp + +#pragma once +#include "./ext/matrix_double2x3.hpp" +#include "./ext/matrix_double2x3_precision.hpp" +#include "./ext/matrix_float2x3.hpp" +#include "./ext/matrix_float2x3_precision.hpp" + diff --git a/dep/glm/mat2x4.hpp b/dep/glm/mat2x4.hpp new file mode 100644 index 0000000..b04b738 --- /dev/null +++ b/dep/glm/mat2x4.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat2x4.hpp + +#pragma once +#include "./ext/matrix_double2x4.hpp" +#include "./ext/matrix_double2x4_precision.hpp" +#include "./ext/matrix_float2x4.hpp" +#include "./ext/matrix_float2x4_precision.hpp" + diff --git a/dep/glm/mat3x2.hpp b/dep/glm/mat3x2.hpp new file mode 100644 index 0000000..c853153 --- /dev/null +++ b/dep/glm/mat3x2.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat3x2.hpp + +#pragma once +#include "./ext/matrix_double3x2.hpp" +#include "./ext/matrix_double3x2_precision.hpp" +#include "./ext/matrix_float3x2.hpp" +#include "./ext/matrix_float3x2_precision.hpp" + diff --git a/dep/glm/mat3x3.hpp b/dep/glm/mat3x3.hpp new file mode 100644 index 0000000..fd4fa31 --- /dev/null +++ b/dep/glm/mat3x3.hpp @@ -0,0 +1,8 @@ +/// @ref core +/// @file glm/mat3x3.hpp + +#pragma once +#include "./ext/matrix_double3x3.hpp" +#include "./ext/matrix_double3x3_precision.hpp" +#include "./ext/matrix_float3x3.hpp" +#include "./ext/matrix_float3x3_precision.hpp" diff --git a/dep/glm/mat3x4.hpp b/dep/glm/mat3x4.hpp new file mode 100644 index 0000000..6342bf5 --- /dev/null +++ b/dep/glm/mat3x4.hpp @@ -0,0 +1,8 @@ +/// @ref core +/// @file glm/mat3x4.hpp + +#pragma once +#include "./ext/matrix_double3x4.hpp" +#include "./ext/matrix_double3x4_precision.hpp" +#include "./ext/matrix_float3x4.hpp" +#include "./ext/matrix_float3x4_precision.hpp" diff --git a/dep/glm/mat4x2.hpp b/dep/glm/mat4x2.hpp new file mode 100644 index 0000000..e013e46 --- /dev/null +++ b/dep/glm/mat4x2.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat4x2.hpp + +#pragma once +#include "./ext/matrix_double4x2.hpp" +#include "./ext/matrix_double4x2_precision.hpp" +#include "./ext/matrix_float4x2.hpp" +#include "./ext/matrix_float4x2_precision.hpp" + diff --git a/dep/glm/mat4x3.hpp b/dep/glm/mat4x3.hpp new file mode 100644 index 0000000..205725a --- /dev/null +++ b/dep/glm/mat4x3.hpp @@ -0,0 +1,8 @@ +/// @ref core +/// @file glm/mat4x3.hpp + +#pragma once +#include "./ext/matrix_double4x3.hpp" +#include "./ext/matrix_double4x3_precision.hpp" +#include "./ext/matrix_float4x3.hpp" +#include "./ext/matrix_float4x3_precision.hpp" diff --git a/dep/glm/mat4x4.hpp b/dep/glm/mat4x4.hpp new file mode 100644 index 0000000..3515f7f --- /dev/null +++ b/dep/glm/mat4x4.hpp @@ -0,0 +1,9 @@ +/// @ref core +/// @file glm/mat4x4.hpp + +#pragma once +#include "./ext/matrix_double4x4.hpp" +#include "./ext/matrix_double4x4_precision.hpp" +#include "./ext/matrix_float4x4.hpp" +#include "./ext/matrix_float4x4_precision.hpp" + diff --git a/dep/glm/matrix.hpp b/dep/glm/matrix.hpp new file mode 100644 index 0000000..6badf53 --- /dev/null +++ b/dep/glm/matrix.hpp @@ -0,0 +1,161 @@ +/// @ref core +/// @file glm/matrix.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions +/// +/// @defgroup core_func_matrix Matrix functions +/// @ingroup core +/// +/// Provides GLSL matrix functions. +/// +/// Include to use these core features. + +#pragma once + +// Dependencies +#include "detail/qualifier.hpp" +#include "detail/setup.hpp" +#include "vec2.hpp" +#include "vec3.hpp" +#include "vec4.hpp" +#include "mat2x2.hpp" +#include "mat2x3.hpp" +#include "mat2x4.hpp" +#include "mat3x2.hpp" +#include "mat3x3.hpp" +#include "mat3x4.hpp" +#include "mat4x2.hpp" +#include "mat4x3.hpp" +#include "mat4x4.hpp" + +namespace glm { +namespace detail +{ + template + struct outerProduct_trait{}; + + template + struct outerProduct_trait<2, 2, T, Q> + { + typedef mat<2, 2, T, Q> type; + }; + + template + struct outerProduct_trait<2, 3, T, Q> + { + typedef mat<3, 2, T, Q> type; + }; + + template + struct outerProduct_trait<2, 4, T, Q> + { + typedef mat<4, 2, T, Q> type; + }; + + template + struct outerProduct_trait<3, 2, T, Q> + { + typedef mat<2, 3, T, Q> type; + }; + + template + struct outerProduct_trait<3, 3, T, Q> + { + typedef mat<3, 3, T, Q> type; + }; + + template + struct outerProduct_trait<3, 4, T, Q> + { + typedef mat<4, 3, T, Q> type; + }; + + template + struct outerProduct_trait<4, 2, T, Q> + { + typedef mat<2, 4, T, Q> type; + }; + + template + struct outerProduct_trait<4, 3, T, Q> + { + typedef mat<3, 4, T, Q> type; + }; + + template + struct outerProduct_trait<4, 4, T, Q> + { + typedef mat<4, 4, T, Q> type; + }; +}//namespace detail + + /// @addtogroup core_func_matrix + /// @{ + + /// Multiply matrix x by matrix y component-wise, i.e., + /// result[i][j] is the scalar product of x[i][j] and y[i][j]. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL matrixCompMult man page + /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions + template + GLM_FUNC_DECL mat matrixCompMult(mat const& x, mat const& y); + + /// Treats the first parameter c as a column vector + /// and the second parameter r as a row vector + /// and does a linear algebraic matrix multiply c * r. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL outerProduct man page + /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions + template + GLM_FUNC_DECL typename detail::outerProduct_trait::type outerProduct(vec const& c, vec const& r); + + /// Returns the transposed matrix of x + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL transpose man page + /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions + template + GLM_FUNC_DECL typename mat::transpose_type transpose(mat const& x); + + /// Return the determinant of a squared matrix. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL determinant man page + /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions + template + GLM_FUNC_DECL T determinant(mat const& m); + + /// Return the inverse of a squared matrix. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL inverse man page + /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions + template + GLM_FUNC_DECL mat inverse(mat const& m); + + /// @} +}//namespace glm + +#include "detail/func_matrix.inl" diff --git a/dep/glm/packing.hpp b/dep/glm/packing.hpp new file mode 100644 index 0000000..ca83ac1 --- /dev/null +++ b/dep/glm/packing.hpp @@ -0,0 +1,173 @@ +/// @ref core +/// @file glm/packing.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions +/// @see gtc_packing +/// +/// @defgroup core_func_packing Floating-Point Pack and Unpack Functions +/// @ingroup core +/// +/// Provides GLSL functions to pack and unpack half, single and double-precision floating point values into more compact integer types. +/// +/// These functions do not operate component-wise, rather as described in each case. +/// +/// Include to use these core features. + +#pragma once + +#include "./ext/vector_uint2.hpp" +#include "./ext/vector_float2.hpp" +#include "./ext/vector_float4.hpp" + +namespace glm +{ + /// @addtogroup core_func_packing + /// @{ + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm2x16: round(clamp(c, 0, +1) * 65535.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see GLSL packUnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint packUnorm2x16(vec2 const& v); + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm2x16: round(clamp(v, -1, +1) * 32767.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see GLSL packSnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint packSnorm2x16(vec2 const& v); + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm4x8: round(clamp(c, 0, +1) * 255.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see GLSL packUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint packUnorm4x8(vec4 const& v); + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm4x8: round(clamp(c, -1, +1) * 127.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see GLSL packSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint packSnorm4x8(vec4 const& v); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm2x16: f / 65535.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see GLSL unpackUnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec2 unpackUnorm2x16(uint p); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm2x16: clamp(f / 32767.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see GLSL unpackSnorm2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec2 unpackSnorm2x16(uint p); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm4x8: f / 255.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see GLSL unpackUnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec4 unpackUnorm4x8(uint p); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm4x8: clamp(f / 127.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see GLSL unpackSnorm4x8 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec4 unpackSnorm4x8(uint p); + + /// Returns a double-qualifier value obtained by packing the components of v into a 64-bit value. + /// If an IEEE 754 Inf or NaN is created, it will not signal, and the resulting floating point value is unspecified. + /// Otherwise, the bit- level representation of v is preserved. + /// The first vector component specifies the 32 least significant bits; + /// the second component specifies the 32 most significant bits. + /// + /// @see GLSL packDouble2x32 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL double packDouble2x32(uvec2 const& v); + + /// Returns a two-component unsigned integer vector representation of v. + /// The bit-level representation of v is preserved. + /// The first component of the vector contains the 32 least significant bits of the double; + /// the second component consists the 32 most significant bits. + /// + /// @see GLSL unpackDouble2x32 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uvec2 unpackDouble2x32(double v); + + /// Returns an unsigned integer obtained by converting the components of a two-component floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification, + /// and then packing these two 16- bit integers into a 32-bit unsigned integer. + /// The first vector component specifies the 16 least-significant bits of the result; + /// the second component specifies the 16 most-significant bits. + /// + /// @see GLSL packHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL uint packHalf2x16(vec2 const& v); + + /// Returns a two-component floating-point vector with components obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values, + /// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, + /// and converting them to 32-bit floating-point values. + /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// the second component is obtained from the 16 most-significant bits of v. + /// + /// @see GLSL unpackHalf2x16 man page + /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions + GLM_FUNC_DECL vec2 unpackHalf2x16(uint v); + + /// @} +}//namespace glm + +#include "detail/func_packing.inl" diff --git a/dep/glm/simd/common.h b/dep/glm/simd/common.h new file mode 100644 index 0000000..9b017cb --- /dev/null +++ b/dep/glm/simd/common.h @@ -0,0 +1,240 @@ +/// @ref simd +/// @file glm/simd/common.h + +#pragma once + +#include "platform.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_add(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_add_ps(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_add(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_add_ss(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_sub(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_sub_ps(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_sub(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_sub_ss(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_mul(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_mul_ps(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_mul(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_mul_ss(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_div(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_div_ps(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_div(glm_f32vec4 a, glm_f32vec4 b) +{ + return _mm_div_ss(a, b); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_div_lowp(glm_f32vec4 a, glm_f32vec4 b) +{ + return glm_vec4_mul(a, _mm_rcp_ps(b)); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_swizzle_xyzw(glm_f32vec4 a) +{ +# if GLM_ARCH & GLM_ARCH_AVX2_BIT + return _mm_permute_ps(a, _MM_SHUFFLE(3, 2, 1, 0)); +# else + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 2, 1, 0)); +# endif +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_fma(glm_f32vec4 a, glm_f32vec4 b, glm_f32vec4 c) +{ +# if (GLM_ARCH & GLM_ARCH_AVX2_BIT) && !(GLM_COMPILER & GLM_COMPILER_CLANG) + return _mm_fmadd_ss(a, b, c); +# else + return _mm_add_ss(_mm_mul_ss(a, b), c); +# endif +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_fma(glm_f32vec4 a, glm_f32vec4 b, glm_f32vec4 c) +{ +# if (GLM_ARCH & GLM_ARCH_AVX2_BIT) && !(GLM_COMPILER & GLM_COMPILER_CLANG) + return _mm_fmadd_ps(a, b, c); +# else + return glm_vec4_add(glm_vec4_mul(a, b), c); +# endif +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_abs(glm_f32vec4 x) +{ + return _mm_and_ps(x, _mm_castsi128_ps(_mm_set1_epi32(0x7FFFFFFF))); +} + +GLM_FUNC_QUALIFIER glm_ivec4 glm_ivec4_abs(glm_ivec4 x) +{ +# if GLM_ARCH & GLM_ARCH_SSSE3_BIT + return _mm_sign_epi32(x, x); +# else + glm_ivec4 const sgn0 = _mm_srai_epi32(x, 31); + glm_ivec4 const inv0 = _mm_xor_si128(x, sgn0); + glm_ivec4 const sub0 = _mm_sub_epi32(inv0, sgn0); + return sub0; +# endif +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_sign(glm_vec4 x) +{ + glm_vec4 const zro0 = _mm_setzero_ps(); + glm_vec4 const cmp0 = _mm_cmplt_ps(x, zro0); + glm_vec4 const cmp1 = _mm_cmpgt_ps(x, zro0); + glm_vec4 const and0 = _mm_and_ps(cmp0, _mm_set1_ps(-1.0f)); + glm_vec4 const and1 = _mm_and_ps(cmp1, _mm_set1_ps(1.0f)); + glm_vec4 const or0 = _mm_or_ps(and0, and1); + return or0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_round(glm_vec4 x) +{ +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + return _mm_round_ps(x, _MM_FROUND_TO_NEAREST_INT); +# else + glm_vec4 const sgn0 = _mm_castsi128_ps(_mm_set1_epi32(int(0x80000000))); + glm_vec4 const and0 = _mm_and_ps(sgn0, x); + glm_vec4 const or0 = _mm_or_ps(and0, _mm_set_ps1(8388608.0f)); + glm_vec4 const add0 = glm_vec4_add(x, or0); + glm_vec4 const sub0 = glm_vec4_sub(add0, or0); + return sub0; +# endif +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_floor(glm_vec4 x) +{ +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + return _mm_floor_ps(x); +# else + glm_vec4 const rnd0 = glm_vec4_round(x); + glm_vec4 const cmp0 = _mm_cmplt_ps(x, rnd0); + glm_vec4 const and0 = _mm_and_ps(cmp0, _mm_set1_ps(1.0f)); + glm_vec4 const sub0 = glm_vec4_sub(rnd0, and0); + return sub0; +# endif +} + +/* trunc TODO +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_trunc(glm_vec4 x) +{ + return glm_vec4(); +} +*/ + +//roundEven +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_roundEven(glm_vec4 x) +{ + glm_vec4 const sgn0 = _mm_castsi128_ps(_mm_set1_epi32(int(0x80000000))); + glm_vec4 const and0 = _mm_and_ps(sgn0, x); + glm_vec4 const or0 = _mm_or_ps(and0, _mm_set_ps1(8388608.0f)); + glm_vec4 const add0 = glm_vec4_add(x, or0); + glm_vec4 const sub0 = glm_vec4_sub(add0, or0); + return sub0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_ceil(glm_vec4 x) +{ +# if GLM_ARCH & GLM_ARCH_SSE41_BIT + return _mm_ceil_ps(x); +# else + glm_vec4 const rnd0 = glm_vec4_round(x); + glm_vec4 const cmp0 = _mm_cmpgt_ps(x, rnd0); + glm_vec4 const and0 = _mm_and_ps(cmp0, _mm_set1_ps(1.0f)); + glm_vec4 const add0 = glm_vec4_add(rnd0, and0); + return add0; +# endif +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_fract(glm_vec4 x) +{ + glm_vec4 const flr0 = glm_vec4_floor(x); + glm_vec4 const sub0 = glm_vec4_sub(x, flr0); + return sub0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_mod(glm_vec4 x, glm_vec4 y) +{ + glm_vec4 const div0 = glm_vec4_div(x, y); + glm_vec4 const flr0 = glm_vec4_floor(div0); + glm_vec4 const mul0 = glm_vec4_mul(y, flr0); + glm_vec4 const sub0 = glm_vec4_sub(x, mul0); + return sub0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_clamp(glm_vec4 v, glm_vec4 minVal, glm_vec4 maxVal) +{ + glm_vec4 const min0 = _mm_min_ps(v, maxVal); + glm_vec4 const max0 = _mm_max_ps(min0, minVal); + return max0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_mix(glm_vec4 v1, glm_vec4 v2, glm_vec4 a) +{ + glm_vec4 const sub0 = glm_vec4_sub(_mm_set1_ps(1.0f), a); + glm_vec4 const mul0 = glm_vec4_mul(v1, sub0); + glm_vec4 const mad0 = glm_vec4_fma(v2, a, mul0); + return mad0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_step(glm_vec4 edge, glm_vec4 x) +{ + glm_vec4 const cmp = _mm_cmple_ps(x, edge); + return _mm_movemask_ps(cmp) == 0 ? _mm_set1_ps(1.0f) : _mm_setzero_ps(); +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_smoothstep(glm_vec4 edge0, glm_vec4 edge1, glm_vec4 x) +{ + glm_vec4 const sub0 = glm_vec4_sub(x, edge0); + glm_vec4 const sub1 = glm_vec4_sub(edge1, edge0); + glm_vec4 const div0 = glm_vec4_sub(sub0, sub1); + glm_vec4 const clp0 = glm_vec4_clamp(div0, _mm_setzero_ps(), _mm_set1_ps(1.0f)); + glm_vec4 const mul0 = glm_vec4_mul(_mm_set1_ps(2.0f), clp0); + glm_vec4 const sub2 = glm_vec4_sub(_mm_set1_ps(3.0f), mul0); + glm_vec4 const mul1 = glm_vec4_mul(clp0, clp0); + glm_vec4 const mul2 = glm_vec4_mul(mul1, sub2); + return mul2; +} + +// Agner Fog method +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_nan(glm_vec4 x) +{ + glm_ivec4 const t1 = _mm_castps_si128(x); // reinterpret as 32-bit integer + glm_ivec4 const t2 = _mm_sll_epi32(t1, _mm_cvtsi32_si128(1)); // shift out sign bit + glm_ivec4 const t3 = _mm_set1_epi32(int(0xFF000000)); // exponent mask + glm_ivec4 const t4 = _mm_and_si128(t2, t3); // exponent + glm_ivec4 const t5 = _mm_andnot_si128(t3, t2); // fraction + glm_ivec4 const Equal = _mm_cmpeq_epi32(t3, t4); + glm_ivec4 const Nequal = _mm_cmpeq_epi32(t5, _mm_setzero_si128()); + glm_ivec4 const And = _mm_and_si128(Equal, Nequal); + return _mm_castsi128_ps(And); // exponent = all 1s and fraction != 0 +} + +// Agner Fog method +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_inf(glm_vec4 x) +{ + glm_ivec4 const t1 = _mm_castps_si128(x); // reinterpret as 32-bit integer + glm_ivec4 const t2 = _mm_sll_epi32(t1, _mm_cvtsi32_si128(1)); // shift out sign bit + return _mm_castsi128_ps(_mm_cmpeq_epi32(t2, _mm_set1_epi32(int(0xFF000000)))); // exponent is all 1s, fraction is 0 +} + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/dep/glm/simd/exponential.h b/dep/glm/simd/exponential.h new file mode 100644 index 0000000..bc351d0 --- /dev/null +++ b/dep/glm/simd/exponential.h @@ -0,0 +1,20 @@ +/// @ref simd +/// @file glm/simd/experimental.h + +#pragma once + +#include "platform.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec1_sqrt_lowp(glm_f32vec4 x) +{ + return _mm_mul_ss(_mm_rsqrt_ss(x), x); +} + +GLM_FUNC_QUALIFIER glm_f32vec4 glm_vec4_sqrt_lowp(glm_f32vec4 x) +{ + return _mm_mul_ps(_mm_rsqrt_ps(x), x); +} + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/dep/glm/simd/geometric.h b/dep/glm/simd/geometric.h new file mode 100644 index 0000000..07d7cbc --- /dev/null +++ b/dep/glm/simd/geometric.h @@ -0,0 +1,124 @@ +/// @ref simd +/// @file glm/simd/geometric.h + +#pragma once + +#include "common.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +GLM_FUNC_DECL glm_vec4 glm_vec4_dot(glm_vec4 v1, glm_vec4 v2); +GLM_FUNC_DECL glm_vec4 glm_vec1_dot(glm_vec4 v1, glm_vec4 v2); + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_length(glm_vec4 x) +{ + glm_vec4 const dot0 = glm_vec4_dot(x, x); + glm_vec4 const sqt0 = _mm_sqrt_ps(dot0); + return sqt0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_distance(glm_vec4 p0, glm_vec4 p1) +{ + glm_vec4 const sub0 = _mm_sub_ps(p0, p1); + glm_vec4 const len0 = glm_vec4_length(sub0); + return len0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_dot(glm_vec4 v1, glm_vec4 v2) +{ +# if GLM_ARCH & GLM_ARCH_AVX_BIT + return _mm_dp_ps(v1, v2, 0xff); +# elif GLM_ARCH & GLM_ARCH_SSE3_BIT + glm_vec4 const mul0 = _mm_mul_ps(v1, v2); + glm_vec4 const hadd0 = _mm_hadd_ps(mul0, mul0); + glm_vec4 const hadd1 = _mm_hadd_ps(hadd0, hadd0); + return hadd1; +# else + glm_vec4 const mul0 = _mm_mul_ps(v1, v2); + glm_vec4 const swp0 = _mm_shuffle_ps(mul0, mul0, _MM_SHUFFLE(2, 3, 0, 1)); + glm_vec4 const add0 = _mm_add_ps(mul0, swp0); + glm_vec4 const swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3)); + glm_vec4 const add1 = _mm_add_ps(add0, swp1); + return add1; +# endif +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec1_dot(glm_vec4 v1, glm_vec4 v2) +{ +# if GLM_ARCH & GLM_ARCH_AVX_BIT + return _mm_dp_ps(v1, v2, 0xff); +# elif GLM_ARCH & GLM_ARCH_SSE3_BIT + glm_vec4 const mul0 = _mm_mul_ps(v1, v2); + glm_vec4 const had0 = _mm_hadd_ps(mul0, mul0); + glm_vec4 const had1 = _mm_hadd_ps(had0, had0); + return had1; +# else + glm_vec4 const mul0 = _mm_mul_ps(v1, v2); + glm_vec4 const mov0 = _mm_movehl_ps(mul0, mul0); + glm_vec4 const add0 = _mm_add_ps(mov0, mul0); + glm_vec4 const swp1 = _mm_shuffle_ps(add0, add0, 1); + glm_vec4 const add1 = _mm_add_ss(add0, swp1); + return add1; +# endif +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_cross(glm_vec4 v1, glm_vec4 v2) +{ + glm_vec4 const swp0 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 0, 2, 1)); + glm_vec4 const swp1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 1, 0, 2)); + glm_vec4 const swp2 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 0, 2, 1)); + glm_vec4 const swp3 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 1, 0, 2)); + glm_vec4 const mul0 = _mm_mul_ps(swp0, swp3); + glm_vec4 const mul1 = _mm_mul_ps(swp1, swp2); + glm_vec4 const sub0 = _mm_sub_ps(mul0, mul1); + return sub0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_normalize(glm_vec4 v) +{ + glm_vec4 const dot0 = glm_vec4_dot(v, v); + glm_vec4 const isr0 = _mm_rsqrt_ps(dot0); + glm_vec4 const mul0 = _mm_mul_ps(v, isr0); + return mul0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_faceforward(glm_vec4 N, glm_vec4 I, glm_vec4 Nref) +{ + glm_vec4 const dot0 = glm_vec4_dot(Nref, I); + glm_vec4 const sgn0 = glm_vec4_sign(dot0); + glm_vec4 const mul0 = _mm_mul_ps(sgn0, _mm_set1_ps(-1.0f)); + glm_vec4 const mul1 = _mm_mul_ps(N, mul0); + return mul1; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_reflect(glm_vec4 I, glm_vec4 N) +{ + glm_vec4 const dot0 = glm_vec4_dot(N, I); + glm_vec4 const mul0 = _mm_mul_ps(N, dot0); + glm_vec4 const mul1 = _mm_mul_ps(mul0, _mm_set1_ps(2.0f)); + glm_vec4 const sub0 = _mm_sub_ps(I, mul1); + return sub0; +} + +GLM_FUNC_QUALIFIER __m128 glm_vec4_refract(glm_vec4 I, glm_vec4 N, glm_vec4 eta) +{ + glm_vec4 const dot0 = glm_vec4_dot(N, I); + glm_vec4 const mul0 = _mm_mul_ps(eta, eta); + glm_vec4 const mul1 = _mm_mul_ps(dot0, dot0); + glm_vec4 const sub0 = _mm_sub_ps(_mm_set1_ps(1.0f), mul0); + glm_vec4 const sub1 = _mm_sub_ps(_mm_set1_ps(1.0f), mul1); + glm_vec4 const mul2 = _mm_mul_ps(sub0, sub1); + + if(_mm_movemask_ps(_mm_cmplt_ss(mul2, _mm_set1_ps(0.0f))) == 0) + return _mm_set1_ps(0.0f); + + glm_vec4 const sqt0 = _mm_sqrt_ps(mul2); + glm_vec4 const mad0 = glm_vec4_fma(eta, dot0, sqt0); + glm_vec4 const mul4 = _mm_mul_ps(mad0, N); + glm_vec4 const mul5 = _mm_mul_ps(eta, I); + glm_vec4 const sub2 = _mm_sub_ps(mul5, mul4); + + return sub2; +} + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/dep/glm/simd/integer.h b/dep/glm/simd/integer.h new file mode 100644 index 0000000..9381418 --- /dev/null +++ b/dep/glm/simd/integer.h @@ -0,0 +1,115 @@ +/// @ref simd +/// @file glm/simd/integer.h + +#pragma once + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +GLM_FUNC_QUALIFIER glm_uvec4 glm_i128_interleave(glm_uvec4 x) +{ + glm_uvec4 const Mask4 = _mm_set1_epi32(0x0000FFFF); + glm_uvec4 const Mask3 = _mm_set1_epi32(0x00FF00FF); + glm_uvec4 const Mask2 = _mm_set1_epi32(0x0F0F0F0F); + glm_uvec4 const Mask1 = _mm_set1_epi32(0x33333333); + glm_uvec4 const Mask0 = _mm_set1_epi32(0x55555555); + + glm_uvec4 Reg1; + glm_uvec4 Reg2; + + // REG1 = x; + // REG2 = y; + //Reg1 = _mm_unpacklo_epi64(x, y); + Reg1 = x; + + //REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF); + //REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF); + Reg2 = _mm_slli_si128(Reg1, 2); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask4); + + //REG1 = ((REG1 << 8) | REG1) & glm::uint64(0x00FF00FF00FF00FF); + //REG2 = ((REG2 << 8) | REG2) & glm::uint64(0x00FF00FF00FF00FF); + Reg2 = _mm_slli_si128(Reg1, 1); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask3); + + //REG1 = ((REG1 << 4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F); + //REG2 = ((REG2 << 4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F); + Reg2 = _mm_slli_epi32(Reg1, 4); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask2); + + //REG1 = ((REG1 << 2) | REG1) & glm::uint64(0x3333333333333333); + //REG2 = ((REG2 << 2) | REG2) & glm::uint64(0x3333333333333333); + Reg2 = _mm_slli_epi32(Reg1, 2); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask1); + + //REG1 = ((REG1 << 1) | REG1) & glm::uint64(0x5555555555555555); + //REG2 = ((REG2 << 1) | REG2) & glm::uint64(0x5555555555555555); + Reg2 = _mm_slli_epi32(Reg1, 1); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask0); + + //return REG1 | (REG2 << 1); + Reg2 = _mm_slli_epi32(Reg1, 1); + Reg2 = _mm_srli_si128(Reg2, 8); + Reg1 = _mm_or_si128(Reg1, Reg2); + + return Reg1; +} + +GLM_FUNC_QUALIFIER glm_uvec4 glm_i128_interleave2(glm_uvec4 x, glm_uvec4 y) +{ + glm_uvec4 const Mask4 = _mm_set1_epi32(0x0000FFFF); + glm_uvec4 const Mask3 = _mm_set1_epi32(0x00FF00FF); + glm_uvec4 const Mask2 = _mm_set1_epi32(0x0F0F0F0F); + glm_uvec4 const Mask1 = _mm_set1_epi32(0x33333333); + glm_uvec4 const Mask0 = _mm_set1_epi32(0x55555555); + + glm_uvec4 Reg1; + glm_uvec4 Reg2; + + // REG1 = x; + // REG2 = y; + Reg1 = _mm_unpacklo_epi64(x, y); + + //REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF); + //REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF); + Reg2 = _mm_slli_si128(Reg1, 2); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask4); + + //REG1 = ((REG1 << 8) | REG1) & glm::uint64(0x00FF00FF00FF00FF); + //REG2 = ((REG2 << 8) | REG2) & glm::uint64(0x00FF00FF00FF00FF); + Reg2 = _mm_slli_si128(Reg1, 1); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask3); + + //REG1 = ((REG1 << 4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F); + //REG2 = ((REG2 << 4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F); + Reg2 = _mm_slli_epi32(Reg1, 4); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask2); + + //REG1 = ((REG1 << 2) | REG1) & glm::uint64(0x3333333333333333); + //REG2 = ((REG2 << 2) | REG2) & glm::uint64(0x3333333333333333); + Reg2 = _mm_slli_epi32(Reg1, 2); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask1); + + //REG1 = ((REG1 << 1) | REG1) & glm::uint64(0x5555555555555555); + //REG2 = ((REG2 << 1) | REG2) & glm::uint64(0x5555555555555555); + Reg2 = _mm_slli_epi32(Reg1, 1); + Reg1 = _mm_or_si128(Reg2, Reg1); + Reg1 = _mm_and_si128(Reg1, Mask0); + + //return REG1 | (REG2 << 1); + Reg2 = _mm_slli_epi32(Reg1, 1); + Reg2 = _mm_srli_si128(Reg2, 8); + Reg1 = _mm_or_si128(Reg1, Reg2); + + return Reg1; +} + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/dep/glm/simd/matrix.h b/dep/glm/simd/matrix.h new file mode 100644 index 0000000..b6c42ea --- /dev/null +++ b/dep/glm/simd/matrix.h @@ -0,0 +1,1028 @@ +/// @ref simd +/// @file glm/simd/matrix.h + +#pragma once + +#include "geometric.h" + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +GLM_FUNC_QUALIFIER void glm_mat4_matrixCompMult(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4]) +{ + out[0] = _mm_mul_ps(in1[0], in2[0]); + out[1] = _mm_mul_ps(in1[1], in2[1]); + out[2] = _mm_mul_ps(in1[2], in2[2]); + out[3] = _mm_mul_ps(in1[3], in2[3]); +} + +GLM_FUNC_QUALIFIER void glm_mat4_add(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4]) +{ + out[0] = _mm_add_ps(in1[0], in2[0]); + out[1] = _mm_add_ps(in1[1], in2[1]); + out[2] = _mm_add_ps(in1[2], in2[2]); + out[3] = _mm_add_ps(in1[3], in2[3]); +} + +GLM_FUNC_QUALIFIER void glm_mat4_sub(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4]) +{ + out[0] = _mm_sub_ps(in1[0], in2[0]); + out[1] = _mm_sub_ps(in1[1], in2[1]); + out[2] = _mm_sub_ps(in1[2], in2[2]); + out[3] = _mm_sub_ps(in1[3], in2[3]); +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_mul_vec4(glm_vec4 const m[4], glm_vec4 v) +{ + __m128 v0 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 v1 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1)); + __m128 v2 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 v3 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(m[0], v0); + __m128 m1 = _mm_mul_ps(m[1], v1); + __m128 m2 = _mm_mul_ps(m[2], v2); + __m128 m3 = _mm_mul_ps(m[3], v3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + return a2; +} + +GLM_FUNC_QUALIFIER __m128 glm_vec4_mul_mat4(glm_vec4 v, glm_vec4 const m[4]) +{ + __m128 i0 = m[0]; + __m128 i1 = m[1]; + __m128 i2 = m[2]; + __m128 i3 = m[3]; + + __m128 m0 = _mm_mul_ps(v, i0); + __m128 m1 = _mm_mul_ps(v, i1); + __m128 m2 = _mm_mul_ps(v, i2); + __m128 m3 = _mm_mul_ps(v, i3); + + __m128 u0 = _mm_unpacklo_ps(m0, m1); + __m128 u1 = _mm_unpackhi_ps(m0, m1); + __m128 a0 = _mm_add_ps(u0, u1); + + __m128 u2 = _mm_unpacklo_ps(m2, m3); + __m128 u3 = _mm_unpackhi_ps(m2, m3); + __m128 a1 = _mm_add_ps(u2, u3); + + __m128 f0 = _mm_movelh_ps(a0, a1); + __m128 f1 = _mm_movehl_ps(a1, a0); + __m128 f2 = _mm_add_ps(f0, f1); + + return f2; +} + +GLM_FUNC_QUALIFIER void glm_mat4_mul(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4]) +{ + { + __m128 e0 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[0] = a2; + } + + { + __m128 e0 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[1] = a2; + } + + { + __m128 e0 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[2] = a2; + } + + { + //(__m128&)_mm_shuffle_epi32(__m128i&)in2[0], _MM_SHUFFLE(3, 3, 3, 3)) + __m128 e0 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[3] = a2; + } +} + +GLM_FUNC_QUALIFIER void glm_mat4_transpose(glm_vec4 const in[4], glm_vec4 out[4]) +{ + __m128 tmp0 = _mm_shuffle_ps(in[0], in[1], 0x44); + __m128 tmp2 = _mm_shuffle_ps(in[0], in[1], 0xEE); + __m128 tmp1 = _mm_shuffle_ps(in[2], in[3], 0x44); + __m128 tmp3 = _mm_shuffle_ps(in[2], in[3], 0xEE); + + out[0] = _mm_shuffle_ps(tmp0, tmp1, 0x88); + out[1] = _mm_shuffle_ps(tmp0, tmp1, 0xDD); + out[2] = _mm_shuffle_ps(tmp2, tmp3, 0x88); + out[3] = _mm_shuffle_ps(tmp2, tmp3, 0xDD); +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant_highp(glm_vec4 const in[4]) +{ + __m128 Fac0; + { + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac0 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac1; + { + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac1 = _mm_sub_ps(Mul00, Mul01); + } + + + __m128 Fac2; + { + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac2 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac3; + { + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac3 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac4; + { + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac4 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac5; + { + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac5 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f); + __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f); + + // m[1][0] + // m[0][0] + // m[0][0] + // m[0][0] + __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][1] + // m[0][1] + // m[0][1] + // m[0][1] + __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][2] + // m[0][2] + // m[0][2] + // m[0][2] + __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][3] + // m[0][3] + // m[0][3] + // m[0][3] + __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0)); + + // col0 + // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]), + // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]), + // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]), + // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]), + __m128 Mul00 = _mm_mul_ps(Vec1, Fac0); + __m128 Mul01 = _mm_mul_ps(Vec2, Fac1); + __m128 Mul02 = _mm_mul_ps(Vec3, Fac2); + __m128 Sub00 = _mm_sub_ps(Mul00, Mul01); + __m128 Add00 = _mm_add_ps(Sub00, Mul02); + __m128 Inv0 = _mm_mul_ps(SignB, Add00); + + // col1 + // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]), + // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]), + // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]), + // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]), + __m128 Mul03 = _mm_mul_ps(Vec0, Fac0); + __m128 Mul04 = _mm_mul_ps(Vec2, Fac3); + __m128 Mul05 = _mm_mul_ps(Vec3, Fac4); + __m128 Sub01 = _mm_sub_ps(Mul03, Mul04); + __m128 Add01 = _mm_add_ps(Sub01, Mul05); + __m128 Inv1 = _mm_mul_ps(SignA, Add01); + + // col2 + // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]), + // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]), + // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]), + // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]), + __m128 Mul06 = _mm_mul_ps(Vec0, Fac1); + __m128 Mul07 = _mm_mul_ps(Vec1, Fac3); + __m128 Mul08 = _mm_mul_ps(Vec3, Fac5); + __m128 Sub02 = _mm_sub_ps(Mul06, Mul07); + __m128 Add02 = _mm_add_ps(Sub02, Mul08); + __m128 Inv2 = _mm_mul_ps(SignB, Add02); + + // col3 + // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]), + // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]), + // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]), + // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3])); + __m128 Mul09 = _mm_mul_ps(Vec0, Fac2); + __m128 Mul10 = _mm_mul_ps(Vec1, Fac4); + __m128 Mul11 = _mm_mul_ps(Vec2, Fac5); + __m128 Sub03 = _mm_sub_ps(Mul09, Mul10); + __m128 Add03 = _mm_add_ps(Sub03, Mul11); + __m128 Inv3 = _mm_mul_ps(SignA, Add03); + + __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0)); + + // valType Determinant = m[0][0] * Inverse[0][0] + // + m[0][1] * Inverse[1][0] + // + m[0][2] * Inverse[2][0] + // + m[0][3] * Inverse[3][0]; + __m128 Det0 = glm_vec4_dot(in[0], Row2); + return Det0; +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant_lowp(glm_vec4 const m[4]) +{ + // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128( + + //T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + //T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + //T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + //T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + //T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + //T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + + // First 2 columns + __m128 Swp2A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 1, 1, 2))); + __m128 Swp3A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(3, 2, 3, 3))); + __m128 MulA = _mm_mul_ps(Swp2A, Swp3A); + + // Second 2 columns + __m128 Swp2B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(3, 2, 3, 3))); + __m128 Swp3B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(0, 1, 1, 2))); + __m128 MulB = _mm_mul_ps(Swp2B, Swp3B); + + // Columns subtraction + __m128 SubE = _mm_sub_ps(MulA, MulB); + + // Last 2 rows + __m128 Swp2C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 0, 1, 2))); + __m128 Swp3C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(1, 2, 0, 0))); + __m128 MulC = _mm_mul_ps(Swp2C, Swp3C); + __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC); + + //vec<4, T, Q> DetCof( + // + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), + // - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), + // + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), + // - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05)); + + __m128 SubFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubE), _MM_SHUFFLE(2, 1, 0, 0))); + __m128 SwpFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(0, 0, 0, 1))); + __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA); + + __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1)); + __m128 SubFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpB), _MM_SHUFFLE(3, 1, 1, 0)));//SubF[0], SubE[3], SubE[3], SubE[1]; + __m128 SwpFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(1, 1, 2, 2))); + __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB); + + __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB); + + __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2)); + __m128 SubFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpC), _MM_SHUFFLE(3, 3, 2, 0))); + __m128 SwpFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(2, 3, 3, 3))); + __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC); + + __m128 AddRes = _mm_add_ps(SubRes, MulFacC); + __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f)); + + //return m[0][0] * DetCof[0] + // + m[0][1] * DetCof[1] + // + m[0][2] * DetCof[2] + // + m[0][3] * DetCof[3]; + + return glm_vec4_dot(m[0], DetCof); +} + +GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant(glm_vec4 const m[4]) +{ + // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(add) + + //T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + //T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + //T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + //T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + //T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + //T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + + // First 2 columns + __m128 Swp2A = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 1, 1, 2)); + __m128 Swp3A = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(3, 2, 3, 3)); + __m128 MulA = _mm_mul_ps(Swp2A, Swp3A); + + // Second 2 columns + __m128 Swp2B = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(3, 2, 3, 3)); + __m128 Swp3B = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(0, 1, 1, 2)); + __m128 MulB = _mm_mul_ps(Swp2B, Swp3B); + + // Columns subtraction + __m128 SubE = _mm_sub_ps(MulA, MulB); + + // Last 2 rows + __m128 Swp2C = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 0, 1, 2)); + __m128 Swp3C = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(1, 2, 0, 0)); + __m128 MulC = _mm_mul_ps(Swp2C, Swp3C); + __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC); + + //vec<4, T, Q> DetCof( + // + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), + // - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), + // + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), + // - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05)); + + __m128 SubFacA = _mm_shuffle_ps(SubE, SubE, _MM_SHUFFLE(2, 1, 0, 0)); + __m128 SwpFacA = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(0, 0, 0, 1)); + __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA); + + __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1)); + __m128 SubFacB = _mm_shuffle_ps(SubTmpB, SubTmpB, _MM_SHUFFLE(3, 1, 1, 0));//SubF[0], SubE[3], SubE[3], SubE[1]; + __m128 SwpFacB = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(1, 1, 2, 2)); + __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB); + + __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB); + + __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2)); + __m128 SubFacC = _mm_shuffle_ps(SubTmpC, SubTmpC, _MM_SHUFFLE(3, 3, 2, 0)); + __m128 SwpFacC = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(2, 3, 3, 3)); + __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC); + + __m128 AddRes = _mm_add_ps(SubRes, MulFacC); + __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f)); + + //return m[0][0] * DetCof[0] + // + m[0][1] * DetCof[1] + // + m[0][2] * DetCof[2] + // + m[0][3] * DetCof[3]; + + return glm_vec4_dot(m[0], DetCof); +} + +GLM_FUNC_QUALIFIER void glm_mat4_inverse(glm_vec4 const in[4], glm_vec4 out[4]) +{ + __m128 Fac0; + { + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac0 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac1; + { + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac1 = _mm_sub_ps(Mul00, Mul01); + } + + + __m128 Fac2; + { + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac2 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac3; + { + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac3 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac4; + { + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac4 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac5; + { + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac5 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f); + __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f); + + // m[1][0] + // m[0][0] + // m[0][0] + // m[0][0] + __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][1] + // m[0][1] + // m[0][1] + // m[0][1] + __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][2] + // m[0][2] + // m[0][2] + // m[0][2] + __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][3] + // m[0][3] + // m[0][3] + // m[0][3] + __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0)); + + // col0 + // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]), + // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]), + // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]), + // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]), + __m128 Mul00 = _mm_mul_ps(Vec1, Fac0); + __m128 Mul01 = _mm_mul_ps(Vec2, Fac1); + __m128 Mul02 = _mm_mul_ps(Vec3, Fac2); + __m128 Sub00 = _mm_sub_ps(Mul00, Mul01); + __m128 Add00 = _mm_add_ps(Sub00, Mul02); + __m128 Inv0 = _mm_mul_ps(SignB, Add00); + + // col1 + // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]), + // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]), + // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]), + // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]), + __m128 Mul03 = _mm_mul_ps(Vec0, Fac0); + __m128 Mul04 = _mm_mul_ps(Vec2, Fac3); + __m128 Mul05 = _mm_mul_ps(Vec3, Fac4); + __m128 Sub01 = _mm_sub_ps(Mul03, Mul04); + __m128 Add01 = _mm_add_ps(Sub01, Mul05); + __m128 Inv1 = _mm_mul_ps(SignA, Add01); + + // col2 + // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]), + // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]), + // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]), + // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]), + __m128 Mul06 = _mm_mul_ps(Vec0, Fac1); + __m128 Mul07 = _mm_mul_ps(Vec1, Fac3); + __m128 Mul08 = _mm_mul_ps(Vec3, Fac5); + __m128 Sub02 = _mm_sub_ps(Mul06, Mul07); + __m128 Add02 = _mm_add_ps(Sub02, Mul08); + __m128 Inv2 = _mm_mul_ps(SignB, Add02); + + // col3 + // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]), + // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]), + // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]), + // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3])); + __m128 Mul09 = _mm_mul_ps(Vec0, Fac2); + __m128 Mul10 = _mm_mul_ps(Vec1, Fac4); + __m128 Mul11 = _mm_mul_ps(Vec2, Fac5); + __m128 Sub03 = _mm_sub_ps(Mul09, Mul10); + __m128 Add03 = _mm_add_ps(Sub03, Mul11); + __m128 Inv3 = _mm_mul_ps(SignA, Add03); + + __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0)); + + // valType Determinant = m[0][0] * Inverse[0][0] + // + m[0][1] * Inverse[1][0] + // + m[0][2] * Inverse[2][0] + // + m[0][3] * Inverse[3][0]; + __m128 Det0 = glm_vec4_dot(in[0], Row2); + __m128 Rcp0 = _mm_div_ps(_mm_set1_ps(1.0f), Det0); + //__m128 Rcp0 = _mm_rcp_ps(Det0); + + // Inverse /= Determinant; + out[0] = _mm_mul_ps(Inv0, Rcp0); + out[1] = _mm_mul_ps(Inv1, Rcp0); + out[2] = _mm_mul_ps(Inv2, Rcp0); + out[3] = _mm_mul_ps(Inv3, Rcp0); +} + +GLM_FUNC_QUALIFIER void glm_mat4_inverse_lowp(glm_vec4 const in[4], glm_vec4 out[4]) +{ + __m128 Fac0; + { + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac0 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac1; + { + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac1 = _mm_sub_ps(Mul00, Mul01); + } + + + __m128 Fac2; + { + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac2 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac3; + { + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac3 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac4; + { + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac4 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac5; + { + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac5 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f); + __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f); + + // m[1][0] + // m[0][0] + // m[0][0] + // m[0][0] + __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][1] + // m[0][1] + // m[0][1] + // m[0][1] + __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][2] + // m[0][2] + // m[0][2] + // m[0][2] + __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][3] + // m[0][3] + // m[0][3] + // m[0][3] + __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0)); + + // col0 + // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]), + // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]), + // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]), + // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]), + __m128 Mul00 = _mm_mul_ps(Vec1, Fac0); + __m128 Mul01 = _mm_mul_ps(Vec2, Fac1); + __m128 Mul02 = _mm_mul_ps(Vec3, Fac2); + __m128 Sub00 = _mm_sub_ps(Mul00, Mul01); + __m128 Add00 = _mm_add_ps(Sub00, Mul02); + __m128 Inv0 = _mm_mul_ps(SignB, Add00); + + // col1 + // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]), + // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]), + // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]), + // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]), + __m128 Mul03 = _mm_mul_ps(Vec0, Fac0); + __m128 Mul04 = _mm_mul_ps(Vec2, Fac3); + __m128 Mul05 = _mm_mul_ps(Vec3, Fac4); + __m128 Sub01 = _mm_sub_ps(Mul03, Mul04); + __m128 Add01 = _mm_add_ps(Sub01, Mul05); + __m128 Inv1 = _mm_mul_ps(SignA, Add01); + + // col2 + // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]), + // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]), + // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]), + // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]), + __m128 Mul06 = _mm_mul_ps(Vec0, Fac1); + __m128 Mul07 = _mm_mul_ps(Vec1, Fac3); + __m128 Mul08 = _mm_mul_ps(Vec3, Fac5); + __m128 Sub02 = _mm_sub_ps(Mul06, Mul07); + __m128 Add02 = _mm_add_ps(Sub02, Mul08); + __m128 Inv2 = _mm_mul_ps(SignB, Add02); + + // col3 + // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]), + // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]), + // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]), + // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3])); + __m128 Mul09 = _mm_mul_ps(Vec0, Fac2); + __m128 Mul10 = _mm_mul_ps(Vec1, Fac4); + __m128 Mul11 = _mm_mul_ps(Vec2, Fac5); + __m128 Sub03 = _mm_sub_ps(Mul09, Mul10); + __m128 Add03 = _mm_add_ps(Sub03, Mul11); + __m128 Inv3 = _mm_mul_ps(SignA, Add03); + + __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0)); + + // valType Determinant = m[0][0] * Inverse[0][0] + // + m[0][1] * Inverse[1][0] + // + m[0][2] * Inverse[2][0] + // + m[0][3] * Inverse[3][0]; + __m128 Det0 = glm_vec4_dot(in[0], Row2); + __m128 Rcp0 = _mm_rcp_ps(Det0); + //__m128 Rcp0 = _mm_div_ps(one, Det0); + // Inverse /= Determinant; + out[0] = _mm_mul_ps(Inv0, Rcp0); + out[1] = _mm_mul_ps(Inv1, Rcp0); + out[2] = _mm_mul_ps(Inv2, Rcp0); + out[3] = _mm_mul_ps(Inv3, Rcp0); +} +/* +GLM_FUNC_QUALIFIER void glm_mat4_rotate(__m128 const in[4], float Angle, float const v[3], __m128 out[4]) +{ + float a = glm::radians(Angle); + float c = cos(a); + float s = sin(a); + + glm::vec4 AxisA(v[0], v[1], v[2], float(0)); + __m128 AxisB = _mm_set_ps(AxisA.w, AxisA.z, AxisA.y, AxisA.x); + __m128 AxisC = detail::sse_nrm_ps(AxisB); + + __m128 Cos0 = _mm_set_ss(c); + __m128 CosA = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Sin0 = _mm_set_ss(s); + __m128 SinA = _mm_shuffle_ps(Sin0, Sin0, _MM_SHUFFLE(0, 0, 0, 0)); + + // vec<3, T, Q> temp = (valType(1) - c) * axis; + __m128 Temp0 = _mm_sub_ps(one, CosA); + __m128 Temp1 = _mm_mul_ps(Temp0, AxisC); + + //Rotate[0][0] = c + temp[0] * axis[0]; + //Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2]; + //Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1]; + __m128 Axis0 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 TmpA0 = _mm_mul_ps(Axis0, AxisC); + __m128 CosA0 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 1, 0)); + __m128 TmpA1 = _mm_add_ps(CosA0, TmpA0); + __m128 SinA0 = SinA;//_mm_set_ps(0.0f, s, -s, 0.0f); + __m128 TmpA2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 1, 2, 3)); + __m128 TmpA3 = _mm_mul_ps(SinA0, TmpA2); + __m128 TmpA4 = _mm_add_ps(TmpA1, TmpA3); + + //Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2]; + //Rotate[1][1] = c + temp[1] * axis[1]; + //Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0]; + __m128 Axis1 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(1, 1, 1, 1)); + __m128 TmpB0 = _mm_mul_ps(Axis1, AxisC); + __m128 CosA1 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 0, 1)); + __m128 TmpB1 = _mm_add_ps(CosA1, TmpB0); + __m128 SinB0 = SinA;//_mm_set_ps(-s, 0.0f, s, 0.0f); + __m128 TmpB2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 0, 3, 2)); + __m128 TmpB3 = _mm_mul_ps(SinA0, TmpB2); + __m128 TmpB4 = _mm_add_ps(TmpB1, TmpB3); + + //Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1]; + //Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0]; + //Rotate[2][2] = c + temp[2] * axis[2]; + __m128 Axis2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 TmpC0 = _mm_mul_ps(Axis2, AxisC); + __m128 CosA2 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 0, 1, 1)); + __m128 TmpC1 = _mm_add_ps(CosA2, TmpC0); + __m128 SinC0 = SinA;//_mm_set_ps(s, -s, 0.0f, 0.0f); + __m128 TmpC2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 3, 0, 1)); + __m128 TmpC3 = _mm_mul_ps(SinA0, TmpC2); + __m128 TmpC4 = _mm_add_ps(TmpC1, TmpC3); + + __m128 Result[4]; + Result[0] = TmpA4; + Result[1] = TmpB4; + Result[2] = TmpC4; + Result[3] = _mm_set_ps(1, 0, 0, 0); + + //mat<4, 4, valType> Result; + //Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; + //Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; + //Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2]; + //Result[3] = m[3]; + //return Result; + sse_mul_ps(in, Result, out); +} +*/ +GLM_FUNC_QUALIFIER void glm_mat4_outerProduct(__m128 const& c, __m128 const& r, __m128 out[4]) +{ + out[0] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(0, 0, 0, 0))); + out[1] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(1, 1, 1, 1))); + out[2] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(2, 2, 2, 2))); + out[3] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(3, 3, 3, 3))); +} + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/dep/glm/simd/neon.h b/dep/glm/simd/neon.h new file mode 100644 index 0000000..6c38b06 --- /dev/null +++ b/dep/glm/simd/neon.h @@ -0,0 +1,155 @@ +/// @ref simd_neon +/// @file glm/simd/neon.h + +#pragma once + +#if GLM_ARCH & GLM_ARCH_NEON_BIT +#include + +namespace glm { + namespace neon { + static float32x4_t dupq_lane(float32x4_t vsrc, int lane) { + switch(lane) { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + case 0: return vdupq_laneq_f32(vsrc, 0); + case 1: return vdupq_laneq_f32(vsrc, 1); + case 2: return vdupq_laneq_f32(vsrc, 2); + case 3: return vdupq_laneq_f32(vsrc, 3); +#else + case 0: return vdupq_n_f32(vgetq_lane_f32(vsrc, 0)); + case 1: return vdupq_n_f32(vgetq_lane_f32(vsrc, 1)); + case 2: return vdupq_n_f32(vgetq_lane_f32(vsrc, 2)); + case 3: return vdupq_n_f32(vgetq_lane_f32(vsrc, 3)); +#endif + } + assert(!"Unreachable code executed!"); + return vdupq_n_f32(0.0f); + } + + static float32x2_t dup_lane(float32x4_t vsrc, int lane) { + switch(lane) { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + case 0: return vdup_laneq_f32(vsrc, 0); + case 1: return vdup_laneq_f32(vsrc, 1); + case 2: return vdup_laneq_f32(vsrc, 2); + case 3: return vdup_laneq_f32(vsrc, 3); +#else + case 0: return vdup_n_f32(vgetq_lane_f32(vsrc, 0)); + case 1: return vdup_n_f32(vgetq_lane_f32(vsrc, 1)); + case 2: return vdup_n_f32(vgetq_lane_f32(vsrc, 2)); + case 3: return vdup_n_f32(vgetq_lane_f32(vsrc, 3)); +#endif + } + assert(!"Unreachable code executed!"); + return vdup_n_f32(0.0f); + } + + static float32x4_t copy_lane(float32x4_t vdst, int dlane, float32x4_t vsrc, int slane) { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + switch(dlane) { + case 0: + switch(slane) { + case 0: return vcopyq_laneq_f32(vdst, 0, vsrc, 0); + case 1: return vcopyq_laneq_f32(vdst, 0, vsrc, 1); + case 2: return vcopyq_laneq_f32(vdst, 0, vsrc, 2); + case 3: return vcopyq_laneq_f32(vdst, 0, vsrc, 3); + } + assert(!"Unreachable code executed!"); + case 1: + switch(slane) { + case 0: return vcopyq_laneq_f32(vdst, 1, vsrc, 0); + case 1: return vcopyq_laneq_f32(vdst, 1, vsrc, 1); + case 2: return vcopyq_laneq_f32(vdst, 1, vsrc, 2); + case 3: return vcopyq_laneq_f32(vdst, 1, vsrc, 3); + } + assert(!"Unreachable code executed!"); + case 2: + switch(slane) { + case 0: return vcopyq_laneq_f32(vdst, 2, vsrc, 0); + case 1: return vcopyq_laneq_f32(vdst, 2, vsrc, 1); + case 2: return vcopyq_laneq_f32(vdst, 2, vsrc, 2); + case 3: return vcopyq_laneq_f32(vdst, 2, vsrc, 3); + } + assert(!"Unreachable code executed!"); + case 3: + switch(slane) { + case 0: return vcopyq_laneq_f32(vdst, 3, vsrc, 0); + case 1: return vcopyq_laneq_f32(vdst, 3, vsrc, 1); + case 2: return vcopyq_laneq_f32(vdst, 3, vsrc, 2); + case 3: return vcopyq_laneq_f32(vdst, 3, vsrc, 3); + } + assert(!"Unreachable code executed!"); + } +#else + + float l; + switch(slane) { + case 0: l = vgetq_lane_f32(vsrc, 0); break; + case 1: l = vgetq_lane_f32(vsrc, 1); break; + case 2: l = vgetq_lane_f32(vsrc, 2); break; + case 3: l = vgetq_lane_f32(vsrc, 3); break; + default: + assert(!"Unreachable code executed!"); + } + switch(dlane) { + case 0: return vsetq_lane_f32(l, vdst, 0); + case 1: return vsetq_lane_f32(l, vdst, 1); + case 2: return vsetq_lane_f32(l, vdst, 2); + case 3: return vsetq_lane_f32(l, vdst, 3); + } +#endif + assert(!"Unreachable code executed!"); + return vdupq_n_f32(0.0f); + } + + static float32x4_t mul_lane(float32x4_t v, float32x4_t vlane, int lane) { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT + switch(lane) { + case 0: return vmulq_laneq_f32(v, vlane, 0); break; + case 1: return vmulq_laneq_f32(v, vlane, 1); break; + case 2: return vmulq_laneq_f32(v, vlane, 2); break; + case 3: return vmulq_laneq_f32(v, vlane, 3); break; + default: + assert(!"Unreachable code executed!"); + } + assert(!"Unreachable code executed!"); + return vdupq_n_f32(0.0f); +#else + return vmulq_f32(v, dupq_lane(vlane, lane)); +#endif + } + + static float32x4_t madd_lane(float32x4_t acc, float32x4_t v, float32x4_t vlane, int lane) { +#if GLM_ARCH & GLM_ARCH_ARMV8_BIT +#ifdef GLM_CONFIG_FORCE_FMA +# define FMADD_LANE(acc, x, y, L) do { asm volatile ("fmla %0.4s, %1.4s, %2.4s" : "+w"(acc) : "w"(x), "w"(dup_lane(y, L))); } while(0) +#else +# define FMADD_LANE(acc, x, y, L) do { acc = vmlaq_laneq_f32(acc, x, y, L); } while(0) +#endif + + switch(lane) { + case 0: + FMADD_LANE(acc, v, vlane, 0); + return acc; + case 1: + FMADD_LANE(acc, v, vlane, 1); + return acc; + case 2: + FMADD_LANE(acc, v, vlane, 2); + return acc; + case 3: + FMADD_LANE(acc, v, vlane, 3); + return acc; + default: + assert(!"Unreachable code executed!"); + } + assert(!"Unreachable code executed!"); + return vdupq_n_f32(0.0f); +# undef FMADD_LANE +#else + return vaddq_f32(acc, vmulq_f32(v, dupq_lane(vlane, lane))); +#endif + } + } //namespace neon +} // namespace glm +#endif // GLM_ARCH & GLM_ARCH_NEON_BIT diff --git a/dep/glm/simd/packing.h b/dep/glm/simd/packing.h new file mode 100644 index 0000000..609163e --- /dev/null +++ b/dep/glm/simd/packing.h @@ -0,0 +1,8 @@ +/// @ref simd +/// @file glm/simd/packing.h + +#pragma once + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/dep/glm/simd/platform.h b/dep/glm/simd/platform.h new file mode 100644 index 0000000..ad25cc1 --- /dev/null +++ b/dep/glm/simd/platform.h @@ -0,0 +1,398 @@ +#pragma once + +/////////////////////////////////////////////////////////////////////////////////// +// Platform + +#define GLM_PLATFORM_UNKNOWN 0x00000000 +#define GLM_PLATFORM_WINDOWS 0x00010000 +#define GLM_PLATFORM_LINUX 0x00020000 +#define GLM_PLATFORM_APPLE 0x00040000 +//#define GLM_PLATFORM_IOS 0x00080000 +#define GLM_PLATFORM_ANDROID 0x00100000 +#define GLM_PLATFORM_CHROME_NACL 0x00200000 +#define GLM_PLATFORM_UNIX 0x00400000 +#define GLM_PLATFORM_QNXNTO 0x00800000 +#define GLM_PLATFORM_WINCE 0x01000000 +#define GLM_PLATFORM_CYGWIN 0x02000000 + +#ifdef GLM_FORCE_PLATFORM_UNKNOWN +# define GLM_PLATFORM GLM_PLATFORM_UNKNOWN +#elif defined(__CYGWIN__) +# define GLM_PLATFORM GLM_PLATFORM_CYGWIN +#elif defined(__QNXNTO__) +# define GLM_PLATFORM GLM_PLATFORM_QNXNTO +#elif defined(__APPLE__) +# define GLM_PLATFORM GLM_PLATFORM_APPLE +#elif defined(WINCE) +# define GLM_PLATFORM GLM_PLATFORM_WINCE +#elif defined(_WIN32) +# define GLM_PLATFORM GLM_PLATFORM_WINDOWS +#elif defined(__native_client__) +# define GLM_PLATFORM GLM_PLATFORM_CHROME_NACL +#elif defined(__ANDROID__) +# define GLM_PLATFORM GLM_PLATFORM_ANDROID +#elif defined(__linux) +# define GLM_PLATFORM GLM_PLATFORM_LINUX +#elif defined(__unix) +# define GLM_PLATFORM GLM_PLATFORM_UNIX +#else +# define GLM_PLATFORM GLM_PLATFORM_UNKNOWN +#endif// + +/////////////////////////////////////////////////////////////////////////////////// +// Compiler + +#define GLM_COMPILER_UNKNOWN 0x00000000 + +// Intel +#define GLM_COMPILER_INTEL 0x00100000 +#define GLM_COMPILER_INTEL14 0x00100040 +#define GLM_COMPILER_INTEL15 0x00100050 +#define GLM_COMPILER_INTEL16 0x00100060 +#define GLM_COMPILER_INTEL17 0x00100070 + +// Visual C++ defines +#define GLM_COMPILER_VC 0x01000000 +#define GLM_COMPILER_VC12 0x01000001 +#define GLM_COMPILER_VC14 0x01000002 +#define GLM_COMPILER_VC15 0x01000003 +#define GLM_COMPILER_VC15_3 0x01000004 +#define GLM_COMPILER_VC15_5 0x01000005 +#define GLM_COMPILER_VC15_6 0x01000006 +#define GLM_COMPILER_VC15_7 0x01000007 +#define GLM_COMPILER_VC15_8 0x01000008 +#define GLM_COMPILER_VC15_9 0x01000009 +#define GLM_COMPILER_VC16 0x0100000A + +// GCC defines +#define GLM_COMPILER_GCC 0x02000000 +#define GLM_COMPILER_GCC46 0x020000D0 +#define GLM_COMPILER_GCC47 0x020000E0 +#define GLM_COMPILER_GCC48 0x020000F0 +#define GLM_COMPILER_GCC49 0x02000100 +#define GLM_COMPILER_GCC5 0x02000200 +#define GLM_COMPILER_GCC6 0x02000300 +#define GLM_COMPILER_GCC7 0x02000400 +#define GLM_COMPILER_GCC8 0x02000500 + +// CUDA +#define GLM_COMPILER_CUDA 0x10000000 +#define GLM_COMPILER_CUDA75 0x10000001 +#define GLM_COMPILER_CUDA80 0x10000002 +#define GLM_COMPILER_CUDA90 0x10000004 + +// SYCL +#define GLM_COMPILER_SYCL 0x00300000 + +// Clang +#define GLM_COMPILER_CLANG 0x20000000 +#define GLM_COMPILER_CLANG34 0x20000050 +#define GLM_COMPILER_CLANG35 0x20000060 +#define GLM_COMPILER_CLANG36 0x20000070 +#define GLM_COMPILER_CLANG37 0x20000080 +#define GLM_COMPILER_CLANG38 0x20000090 +#define GLM_COMPILER_CLANG39 0x200000A0 +#define GLM_COMPILER_CLANG40 0x200000B0 +#define GLM_COMPILER_CLANG41 0x200000C0 +#define GLM_COMPILER_CLANG42 0x200000D0 + +// Build model +#define GLM_MODEL_32 0x00000010 +#define GLM_MODEL_64 0x00000020 + +// Force generic C++ compiler +#ifdef GLM_FORCE_COMPILER_UNKNOWN +# define GLM_COMPILER GLM_COMPILER_UNKNOWN + +#elif defined(__INTEL_COMPILER) +# if __INTEL_COMPILER >= 1700 +# define GLM_COMPILER GLM_COMPILER_INTEL17 +# elif __INTEL_COMPILER >= 1600 +# define GLM_COMPILER GLM_COMPILER_INTEL16 +# elif __INTEL_COMPILER >= 1500 +# define GLM_COMPILER GLM_COMPILER_INTEL15 +# elif __INTEL_COMPILER >= 1400 +# define GLM_COMPILER GLM_COMPILER_INTEL14 +# elif __INTEL_COMPILER < 1400 +# error "GLM requires ICC 2013 SP1 or newer" +# endif + +// 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! +# endif +# if CUDA_VERSION >= 8000 +# define GLM_COMPILER GLM_COMPILER_CUDA80 +# elif CUDA_VERSION >= 7500 +# define GLM_COMPILER GLM_COMPILER_CUDA75 +# elif CUDA_VERSION >= 7000 +# define GLM_COMPILER GLM_COMPILER_CUDA70 +# elif CUDA_VERSION < 7000 +# error "GLM requires CUDA 7.0 or higher" +# endif + +// SYCL +#elif defined(__SYCL_DEVICE_ONLY__) +# define GLM_COMPILER GLM_COMPILER_SYCL + +// Clang +#elif defined(__clang__) +# if defined(__apple_build_version__) +# if (__clang_major__ < 6) +# error "GLM requires Clang 3.4 / Apple Clang 6.0 or higher" +# elif __clang_major__ == 6 && __clang_minor__ == 0 +# define GLM_COMPILER GLM_COMPILER_CLANG35 +# elif __clang_major__ == 6 && __clang_minor__ >= 1 +# define GLM_COMPILER GLM_COMPILER_CLANG36 +# elif __clang_major__ >= 7 +# define GLM_COMPILER GLM_COMPILER_CLANG37 +# endif +# else +# if ((__clang_major__ == 3) && (__clang_minor__ < 4)) || (__clang_major__ < 3) +# error "GLM requires Clang 3.4 or higher" +# elif __clang_major__ == 3 && __clang_minor__ == 4 +# define GLM_COMPILER GLM_COMPILER_CLANG34 +# elif __clang_major__ == 3 && __clang_minor__ == 5 +# define GLM_COMPILER GLM_COMPILER_CLANG35 +# elif __clang_major__ == 3 && __clang_minor__ == 6 +# define GLM_COMPILER GLM_COMPILER_CLANG36 +# elif __clang_major__ == 3 && __clang_minor__ == 7 +# define GLM_COMPILER GLM_COMPILER_CLANG37 +# elif __clang_major__ == 3 && __clang_minor__ == 8 +# define GLM_COMPILER GLM_COMPILER_CLANG38 +# elif __clang_major__ == 3 && __clang_minor__ >= 9 +# define GLM_COMPILER GLM_COMPILER_CLANG39 +# elif __clang_major__ == 4 && __clang_minor__ == 0 +# define GLM_COMPILER GLM_COMPILER_CLANG40 +# elif __clang_major__ == 4 && __clang_minor__ == 1 +# define GLM_COMPILER GLM_COMPILER_CLANG41 +# elif __clang_major__ == 4 && __clang_minor__ >= 2 +# define GLM_COMPILER GLM_COMPILER_CLANG42 +# elif __clang_major__ >= 4 +# define GLM_COMPILER GLM_COMPILER_CLANG42 +# endif +# endif + +// Visual C++ +#elif defined(_MSC_VER) +# if _MSC_VER >= 1920 +# define GLM_COMPILER GLM_COMPILER_VC16 +# elif _MSC_VER >= 1916 +# define GLM_COMPILER GLM_COMPILER_VC15_9 +# elif _MSC_VER >= 1915 +# define GLM_COMPILER GLM_COMPILER_VC15_8 +# elif _MSC_VER >= 1914 +# define GLM_COMPILER GLM_COMPILER_VC15_7 +# elif _MSC_VER >= 1913 +# define GLM_COMPILER GLM_COMPILER_VC15_6 +# elif _MSC_VER >= 1912 +# define GLM_COMPILER GLM_COMPILER_VC15_5 +# elif _MSC_VER >= 1911 +# define GLM_COMPILER GLM_COMPILER_VC15_3 +# elif _MSC_VER >= 1910 +# define GLM_COMPILER GLM_COMPILER_VC15 +# elif _MSC_VER >= 1900 +# define GLM_COMPILER GLM_COMPILER_VC14 +# elif _MSC_VER >= 1800 +# define GLM_COMPILER GLM_COMPILER_VC12 +# elif _MSC_VER < 1800 +# error "GLM requires Visual C++ 12 - 2013 or higher" +# endif//_MSC_VER + +// G++ +#elif defined(__GNUC__) || defined(__MINGW32__) +# if __GNUC__ >= 8 +# define GLM_COMPILER GLM_COMPILER_GCC8 +# elif __GNUC__ >= 7 +# define GLM_COMPILER GLM_COMPILER_GCC7 +# elif __GNUC__ >= 6 +# define GLM_COMPILER GLM_COMPILER_GCC6 +# elif __GNUC__ >= 5 +# define GLM_COMPILER GLM_COMPILER_GCC5 +# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 9 +# define GLM_COMPILER GLM_COMPILER_GCC49 +# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 8 +# define GLM_COMPILER GLM_COMPILER_GCC48 +# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 7 +# define GLM_COMPILER GLM_COMPILER_GCC47 +# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 6 +# define GLM_COMPILER GLM_COMPILER_GCC46 +# elif ((__GNUC__ == 4) && (__GNUC_MINOR__ < 6)) || (__GNUC__ < 4) +# error "GLM requires GCC 4.6 or higher" +# endif + +#else +# define GLM_COMPILER GLM_COMPILER_UNKNOWN +#endif + +#ifndef GLM_COMPILER +# error "GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message." +#endif//GLM_COMPILER + +/////////////////////////////////////////////////////////////////////////////////// +// Instruction sets + +// User defines: GLM_FORCE_PURE GLM_FORCE_INTRINSICS GLM_FORCE_SSE2 GLM_FORCE_SSE3 GLM_FORCE_AVX GLM_FORCE_AVX2 GLM_FORCE_AVX2 + +#define GLM_ARCH_MIPS_BIT (0x10000000) +#define GLM_ARCH_PPC_BIT (0x20000000) +#define GLM_ARCH_ARM_BIT (0x40000000) +#define GLM_ARCH_ARMV8_BIT (0x01000000) +#define GLM_ARCH_X86_BIT (0x80000000) + +#define GLM_ARCH_SIMD_BIT (0x00001000) + +#define GLM_ARCH_NEON_BIT (0x00000001) +#define GLM_ARCH_SSE_BIT (0x00000002) +#define GLM_ARCH_SSE2_BIT (0x00000004) +#define GLM_ARCH_SSE3_BIT (0x00000008) +#define GLM_ARCH_SSSE3_BIT (0x00000010) +#define GLM_ARCH_SSE41_BIT (0x00000020) +#define GLM_ARCH_SSE42_BIT (0x00000040) +#define GLM_ARCH_AVX_BIT (0x00000080) +#define GLM_ARCH_AVX2_BIT (0x00000100) + +#define GLM_ARCH_UNKNOWN (0) +#define GLM_ARCH_X86 (GLM_ARCH_X86_BIT) +#define GLM_ARCH_SSE (GLM_ARCH_SSE_BIT | GLM_ARCH_SIMD_BIT | GLM_ARCH_X86) +#define GLM_ARCH_SSE2 (GLM_ARCH_SSE2_BIT | GLM_ARCH_SSE) +#define GLM_ARCH_SSE3 (GLM_ARCH_SSE3_BIT | GLM_ARCH_SSE2) +#define GLM_ARCH_SSSE3 (GLM_ARCH_SSSE3_BIT | GLM_ARCH_SSE3) +#define GLM_ARCH_SSE41 (GLM_ARCH_SSE41_BIT | GLM_ARCH_SSSE3) +#define GLM_ARCH_SSE42 (GLM_ARCH_SSE42_BIT | GLM_ARCH_SSE41) +#define GLM_ARCH_AVX (GLM_ARCH_AVX_BIT | GLM_ARCH_SSE42) +#define GLM_ARCH_AVX2 (GLM_ARCH_AVX2_BIT | GLM_ARCH_AVX) +#define GLM_ARCH_ARM (GLM_ARCH_ARM_BIT) +#define GLM_ARCH_ARMV8 (GLM_ARCH_NEON_BIT | GLM_ARCH_SIMD_BIT | GLM_ARCH_ARM | GLM_ARCH_ARMV8_BIT) +#define GLM_ARCH_NEON (GLM_ARCH_NEON_BIT | GLM_ARCH_SIMD_BIT | GLM_ARCH_ARM) +#define GLM_ARCH_MIPS (GLM_ARCH_MIPS_BIT) +#define GLM_ARCH_PPC (GLM_ARCH_PPC_BIT) + +#if defined(GLM_FORCE_ARCH_UNKNOWN) || defined(GLM_FORCE_PURE) +# define GLM_ARCH GLM_ARCH_UNKNOWN +#elif defined(GLM_FORCE_NEON) +# if __ARM_ARCH >= 8 +# define GLM_ARCH (GLM_ARCH_ARMV8) +# else +# define GLM_ARCH (GLM_ARCH_NEON) +# endif +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_AVX2) +# define GLM_ARCH (GLM_ARCH_AVX2) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_AVX) +# define GLM_ARCH (GLM_ARCH_AVX) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSE42) +# define GLM_ARCH (GLM_ARCH_SSE42) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSE41) +# define GLM_ARCH (GLM_ARCH_SSE41) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSSE3) +# define GLM_ARCH (GLM_ARCH_SSSE3) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSE3) +# define GLM_ARCH (GLM_ARCH_SSE3) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSE2) +# define GLM_ARCH (GLM_ARCH_SSE2) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_SSE) +# define GLM_ARCH (GLM_ARCH_SSE) +# define GLM_FORCE_INTRINSICS +#elif defined(GLM_FORCE_INTRINSICS) && !defined(GLM_FORCE_XYZW_ONLY) +# if defined(__AVX2__) +# define GLM_ARCH (GLM_ARCH_AVX2) +# elif defined(__AVX__) +# define GLM_ARCH (GLM_ARCH_AVX) +# elif defined(__SSE4_2__) +# define GLM_ARCH (GLM_ARCH_SSE42) +# elif defined(__SSE4_1__) +# define GLM_ARCH (GLM_ARCH_SSE41) +# elif defined(__SSSE3__) +# define GLM_ARCH (GLM_ARCH_SSSE3) +# elif defined(__SSE3__) +# define GLM_ARCH (GLM_ARCH_SSE3) +# elif defined(__SSE2__) || defined(__x86_64__) || defined(_M_X64) || defined(_M_IX86_FP) +# define GLM_ARCH (GLM_ARCH_SSE2) +# elif defined(__i386__) +# define GLM_ARCH (GLM_ARCH_X86) +# elif defined(__ARM_ARCH) && (__ARM_ARCH >= 8) +# define GLM_ARCH (GLM_ARCH_ARMV8) +# elif defined(__ARM_NEON) +# define GLM_ARCH (GLM_ARCH_ARM | GLM_ARCH_NEON) +# elif defined(__arm__ ) || defined(_M_ARM) +# define GLM_ARCH (GLM_ARCH_ARM) +# elif defined(__mips__ ) +# define GLM_ARCH (GLM_ARCH_MIPS) +# elif defined(__powerpc__ ) || defined(_M_PPC) +# define GLM_ARCH (GLM_ARCH_PPC) +# else +# define GLM_ARCH (GLM_ARCH_UNKNOWN) +# endif +#else +# if defined(__x86_64__) || defined(_M_X64) || defined(_M_IX86) || defined(__i386__) +# define GLM_ARCH (GLM_ARCH_X86) +# elif defined(__arm__) || defined(_M_ARM) +# define GLM_ARCH (GLM_ARCH_ARM) +# elif defined(__powerpc__) || defined(_M_PPC) +# define GLM_ARCH (GLM_ARCH_PPC) +# elif defined(__mips__) +# define GLM_ARCH (GLM_ARCH_MIPS) +# else +# define GLM_ARCH (GLM_ARCH_UNKNOWN) +# endif +#endif + +#if GLM_ARCH & GLM_ARCH_AVX2_BIT +# include +#elif GLM_ARCH & GLM_ARCH_AVX_BIT +# include +#elif GLM_ARCH & GLM_ARCH_SSE42_BIT +# if GLM_COMPILER & GLM_COMPILER_CLANG +# include +# endif +# include +#elif GLM_ARCH & GLM_ARCH_SSE41_BIT +# include +#elif GLM_ARCH & GLM_ARCH_SSSE3_BIT +# include +#elif GLM_ARCH & GLM_ARCH_SSE3_BIT +# include +#elif GLM_ARCH & GLM_ARCH_SSE2_BIT +# include +#elif GLM_ARCH & GLM_ARCH_NEON_BIT +# include "neon.h" +#endif//GLM_ARCH + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + typedef __m128 glm_f32vec4; + typedef __m128i glm_i32vec4; + typedef __m128i glm_u32vec4; + typedef __m128d glm_f64vec2; + typedef __m128i glm_i64vec2; + typedef __m128i glm_u64vec2; + + typedef glm_f32vec4 glm_vec4; + typedef glm_i32vec4 glm_ivec4; + typedef glm_u32vec4 glm_uvec4; + typedef glm_f64vec2 glm_dvec2; +#endif + +#if GLM_ARCH & GLM_ARCH_AVX_BIT + typedef __m256d glm_f64vec4; + typedef glm_f64vec4 glm_dvec4; +#endif + +#if GLM_ARCH & GLM_ARCH_AVX2_BIT + typedef __m256i glm_i64vec4; + typedef __m256i glm_u64vec4; +#endif + +#if GLM_ARCH & GLM_ARCH_NEON_BIT + typedef float32x4_t glm_f32vec4; + typedef int32x4_t glm_i32vec4; + typedef uint32x4_t glm_u32vec4; +#endif diff --git a/dep/glm/simd/trigonometric.h b/dep/glm/simd/trigonometric.h new file mode 100644 index 0000000..739b796 --- /dev/null +++ b/dep/glm/simd/trigonometric.h @@ -0,0 +1,9 @@ +/// @ref simd +/// @file glm/simd/trigonometric.h + +#pragma once + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT + diff --git a/dep/glm/simd/vector_relational.h b/dep/glm/simd/vector_relational.h new file mode 100644 index 0000000..f7385e9 --- /dev/null +++ b/dep/glm/simd/vector_relational.h @@ -0,0 +1,8 @@ +/// @ref simd +/// @file glm/simd/vector_relational.h + +#pragma once + +#if GLM_ARCH & GLM_ARCH_SSE2_BIT + +#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/dep/glm/trigonometric.hpp b/dep/glm/trigonometric.hpp new file mode 100644 index 0000000..fcf07f8 --- /dev/null +++ b/dep/glm/trigonometric.hpp @@ -0,0 +1,210 @@ +/// @ref core +/// @file glm/trigonometric.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions +/// +/// @defgroup core_func_trigonometric Angle and Trigonometry Functions +/// @ingroup core +/// +/// Function parameters specified as angle are assumed to be in units of radians. +/// In no case will any of these functions result in a divide by zero error. If +/// the divisor of a ratio is 0, then results will be undefined. +/// +/// These all operate component-wise. The description is per component. +/// +/// Include to use these core features. +/// +/// @see ext_vector_trigonometric + +#pragma once + +#include "detail/setup.hpp" +#include "detail/qualifier.hpp" + +namespace glm +{ + /// @addtogroup core_func_trigonometric + /// @{ + + /// Converts degrees to radians and returns the result. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL radians man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec radians(vec const& degrees); + + /// Converts radians to degrees and returns the result. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL degrees man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec degrees(vec const& radians); + + /// The standard trigonometric sine function. + /// The values returned by this function will range from [-1, 1]. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL sin man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec sin(vec const& angle); + + /// The standard trigonometric cosine function. + /// The values returned by this function will range from [-1, 1]. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL cos man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec cos(vec const& angle); + + /// The standard trigonometric tangent function. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL tan man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec tan(vec const& angle); + + /// Arc sine. Returns an angle whose sine is x. + /// The range of values returned by this function is [-PI/2, PI/2]. + /// Results are undefined if |x| > 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL asin man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec asin(vec const& x); + + /// Arc cosine. Returns an angle whose sine is x. + /// The range of values returned by this function is [0, PI]. + /// Results are undefined if |x| > 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL acos man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec acos(vec const& x); + + /// 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. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL atan man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec atan(vec const& y, vec const& x); + + /// Arc tangent. Returns an angle whose tangent is y_over_x. + /// The range of values returned by this function is [-PI/2, PI/2]. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL atan man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec atan(vec const& y_over_x); + + /// Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2 + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL sinh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec sinh(vec const& angle); + + /// Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2 + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL cosh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec cosh(vec const& angle); + + /// Returns the hyperbolic tangent function, sinh(angle) / cosh(angle) + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL tanh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec tanh(vec const& angle); + + /// Arc hyperbolic sine; returns the inverse of sinh. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL asinh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec asinh(vec const& x); + + /// Arc hyperbolic cosine; returns the non-negative inverse + /// of cosh. Results are undefined if x < 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL acosh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec acosh(vec const& x); + + /// Arc hyperbolic tangent; returns the inverse of tanh. + /// Results are undefined if abs(x) >= 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see GLSL atanh man page + /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions + template + GLM_FUNC_DECL vec atanh(vec const& x); + + /// @} +}//namespace glm + +#include "detail/func_trigonometric.inl" diff --git a/dep/glm/vec2.hpp b/dep/glm/vec2.hpp new file mode 100644 index 0000000..cd4e070 --- /dev/null +++ b/dep/glm/vec2.hpp @@ -0,0 +1,14 @@ +/// @ref core +/// @file glm/vec2.hpp + +#pragma once +#include "./ext/vector_bool2.hpp" +#include "./ext/vector_bool2_precision.hpp" +#include "./ext/vector_float2.hpp" +#include "./ext/vector_float2_precision.hpp" +#include "./ext/vector_double2.hpp" +#include "./ext/vector_double2_precision.hpp" +#include "./ext/vector_int2.hpp" +#include "./ext/vector_int2_sized.hpp" +#include "./ext/vector_uint2.hpp" +#include "./ext/vector_uint2_sized.hpp" diff --git a/dep/glm/vec3.hpp b/dep/glm/vec3.hpp new file mode 100644 index 0000000..f5a927d --- /dev/null +++ b/dep/glm/vec3.hpp @@ -0,0 +1,14 @@ +/// @ref core +/// @file glm/vec3.hpp + +#pragma once +#include "./ext/vector_bool3.hpp" +#include "./ext/vector_bool3_precision.hpp" +#include "./ext/vector_float3.hpp" +#include "./ext/vector_float3_precision.hpp" +#include "./ext/vector_double3.hpp" +#include "./ext/vector_double3_precision.hpp" +#include "./ext/vector_int3.hpp" +#include "./ext/vector_int3_sized.hpp" +#include "./ext/vector_uint3.hpp" +#include "./ext/vector_uint3_sized.hpp" diff --git a/dep/glm/vec4.hpp b/dep/glm/vec4.hpp new file mode 100644 index 0000000..c6ea9f1 --- /dev/null +++ b/dep/glm/vec4.hpp @@ -0,0 +1,15 @@ +/// @ref core +/// @file glm/vec4.hpp + +#pragma once +#include "./ext/vector_bool4.hpp" +#include "./ext/vector_bool4_precision.hpp" +#include "./ext/vector_float4.hpp" +#include "./ext/vector_float4_precision.hpp" +#include "./ext/vector_double4.hpp" +#include "./ext/vector_double4_precision.hpp" +#include "./ext/vector_int4.hpp" +#include "./ext/vector_int4_sized.hpp" +#include "./ext/vector_uint4.hpp" +#include "./ext/vector_uint4_sized.hpp" + diff --git a/dep/glm/vector_relational.hpp b/dep/glm/vector_relational.hpp new file mode 100644 index 0000000..a0fe17e --- /dev/null +++ b/dep/glm/vector_relational.hpp @@ -0,0 +1,121 @@ +/// @ref core +/// @file glm/vector_relational.hpp +/// +/// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions +/// +/// @defgroup core_func_vector_relational Vector Relational Functions +/// @ingroup core +/// +/// Relational and equality operators (<, <=, >, >=, ==, !=) are defined to +/// operate on scalars and produce scalar Boolean results. For vector results, +/// use the following built-in functions. +/// +/// In all cases, the sizes of all the input and return vectors for any particular +/// call must match. +/// +/// Include to use these core features. +/// +/// @see ext_vector_relational + +#pragma once + +#include "detail/qualifier.hpp" +#include "detail/setup.hpp" + +namespace glm +{ + /// @addtogroup core_func_vector_relational + /// @{ + + /// Returns the component-wise comparison result of x < y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see GLSL lessThan man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec lessThan(vec const& x, vec const& y); + + /// Returns the component-wise comparison of result x <= y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see GLSL lessThanEqual man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec lessThanEqual(vec const& x, vec const& y); + + /// Returns the component-wise comparison of result x > y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see GLSL greaterThan man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec greaterThan(vec const& x, vec const& y); + + /// Returns the component-wise comparison of result x >= y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see GLSL greaterThanEqual man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec greaterThanEqual(vec const& x, vec const& y); + + /// Returns the component-wise comparison of result x == y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point, integer or bool scalar type. + /// + /// @see GLSL equal man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec equal(vec const& x, vec const& y); + + /// Returns the component-wise comparison of result x != y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point, integer or bool scalar type. + /// + /// @see GLSL notEqual man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec notEqual(vec const& x, vec const& y); + + /// Returns true if any component of x is true. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL any man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR bool any(vec const& v); + + /// Returns true if all components of x are true. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL all man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR bool all(vec const& v); + + /// Returns the component-wise logical complement of x. + /// /!\ Because of language incompatibilities between C++ and GLSL, GLM defines the function not but not_ instead. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see GLSL not man page + /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions + template + GLM_FUNC_DECL GLM_CONSTEXPR vec not_(vec const& v); + + /// @} +}//namespace glm + +#include "detail/func_vector_relational.inl" diff --git a/dep/stb_image.h b/dep/stb_image.h new file mode 100644 index 0000000..a632d54 --- /dev/null +++ b/dep/stb_image.h @@ -0,0 +1,7985 @@ +/* stb_image - v2.29 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.29 (2023-05-xx) optimizations + 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff + 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes + 2.26 (2020-07-13) many minor fixes + 2.25 (2020-02-02) fix warnings + 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine Simon Breuss (16-bit PNM) + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski + Phil Jordan Dave Moore Roy Eltham + Hayaki Saito Nathan Reed Won Chun + Luke Graham Johan Duparc Nick Verigakis the Horde3D community + Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Eugene Golushkov Laurent Gomila Cort Stratton github:snagar + Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex + Cass Everitt Ryamond Barbiero github:grim210 + Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw + Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus + Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo + Julian Raschke Gregory Mullen Christian Floisand github:darealshinji + Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 + Brad Weinberger Matvey Cherevko github:mosra + Luca Sas Alexander Veselov Zack Middleton [reserved] + Ryan C. Gordon [reserved] [reserved] + DO NOT ADD YOUR NAME HERE + + Jacko Dirks + + To add your name to the credits, pick a random blank space in the middle and fill it. + 80% of merge conflicts on stb PRs are due to people adding their name at the end + of the credits. +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data); +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// To query the width, height and component count of an image without having to +// decode the full file, you can use the stbi_info family of functions: +// +// int x,y,n,ok; +// ok = stbi_info(filename, &x, &y, &n); +// // returns ok=1 and sets x, y, n if image is a supported format, +// // 0 otherwise. +// +// Note that stb_image pervasively uses ints in its public API for sizes, +// including sizes of memory buffers. This is now part of the API and thus +// hard to change without causing breakage. As a result, the various image +// loaders all have certain limits on image size; these differ somewhat +// by format but generally boil down to either just under 2GB or just under +// 1GB. When the decoded image would be larger than this, stb_image decoding +// will fail. +// +// Additionally, stb_image will reject image files that have any of their +// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, +// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, +// the only way to have an image with such dimensions load correctly +// is for it to have a rather extreme aspect ratio. Either way, the +// assumption here is that such larger images are likely to be malformed +// or malicious. If you do need to load an image with individual dimensions +// larger than that, and it still fits in the overall size limit, you can +// #define STBI_MAX_DIMENSIONS on your own to be something larger. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image supports loading HDR images in general, and currently the Radiance +// .HDR file format specifically. You can still load any file through the existing +// interface; if you attempt to load an HDR file, it will be automatically remapped +// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// We optionally support converting iPhone-formatted PNGs (which store +// premultiplied BGRA) back to RGB, even though they're internally encoded +// differently. To enable this conversion, call +// stbi_convert_iphone_png_to_rgb(1). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// +// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater +// than that size (in either width or height) without further processing. +// This is to let programs in the wild set an upper bound to prevent +// denial-of-service attacks on untrusted data, as one could generate a +// valid image of gigantic dimensions and force stb_image to allocate a +// huge block of memory and spend disproportionate time decoding it. By +// default this is set to (1 << 24), which is 16777216, but that's still +// very big. + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + +#ifdef STBI_WINDOWS_UTF8 +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// on most compilers (and ALL modern mainstream compilers) this is threadsafe +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// as above, but only applies to images loaded on the thread that calls the function +// this function is only available if your compiler supports thread-local variables; +// calling it will fail to link if your compiler doesn't +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus +#define STBI_EXTERN extern "C" +#else +#define STBI_EXTERN extern +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + +#ifndef STBI_NO_THREAD_LOCALS + #if defined(__cplusplus) && __cplusplus >= 201103L + #define STBI_THREAD_LOCAL thread_local + #elif defined(__GNUC__) && __GNUC__ < 5 + #define STBI_THREAD_LOCAL __thread + #elif defined(_MSC_VER) + #define STBI_THREAD_LOCAL __declspec(thread) + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) + #define STBI_THREAD_LOCAL _Thread_local + #endif + + #ifndef STBI_THREAD_LOCAL + #if defined(__GNUC__) + #define STBI_THREAD_LOCAL __thread + #endif + #endif +#endif + +#if defined(_MSC_VER) || defined(__SYMBIAN32__) +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +#ifdef _MSC_VER +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +#ifndef STBI_MAX_DIMENSIONS +#define STBI_MAX_DIMENSIONS (1 << 24) +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + int callback_already_read; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + int ch; + fseek((FILE*) user, n, SEEK_CUR); + ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ + if (ch != EOF) { + ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ + } +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user) || ferror((FILE *) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__pnm_is16(stbi__context *s); +#endif + +static +#ifdef STBI_THREAD_LOCAL +STBI_THREAD_LOCAL +#endif +const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +#ifndef STBI_NO_FAILURE_STRINGS +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} +#endif + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} +#endif + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} +#endif + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + +// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. +static int stbi__addints_valid(int a, int b) +{ + if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow + if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. + return a <= INT_MAX - b; +} + +// returns 1 if the product of two ints fits in a signed short, 0 on overflow. +static int stbi__mul2shorts_valid(int a, int b) +{ + if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow + if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid + if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN + return a >= SHRT_MIN / b; +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load_global = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_global = flag_true_if_should_flip; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global +#else +static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; + +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_local = flag_true_if_should_flip; + stbi__vertically_flip_on_load_set = 1; +} + +#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ + ? stbi__vertically_flip_on_load_local \ + : stbi__vertically_flip_on_load_global) +#endif // STBI_THREAD_LOCAL + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + // test the formats with a very explicit header first (at least a FOURCC + // or distinctive magic number first) + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #else + STBI_NOTUSED(bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + + // then the formats that can end up attempting to load with just 1 or 2 + // bytes matching expectations; these are prone to false positives, so + // try them later + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} +#endif + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 8) { + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 16) { + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); +#endif + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s,f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) +// nothing +#else +static void stbi__skip(stbi__context *s, int n) +{ + if (n == 0) return; // already there! + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) +// nothing +#else +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} +#endif + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + z += (stbi__uint32)stbi__get16le(s) << 16; + return z; +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + } + if (n < comp) { + for (i=0; i < x*y; ++i) { + output[i*comp + n] = data[i*comp + n]/255.0f; + } + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) { + for (j=0; j < count[i]; ++j) { + h->size[k++] = (stbi_uc) (i+1); + if(k >= 257) return stbi__err("bad size list","Corrupt JPEG"); + } + } + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + if(c < 0 || c >= 256) // symbol id out of bounds! + return -1; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + + sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & (sgn - 1)); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + diff = t ? stbi__extend_receive(j, t) : 0; + + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * (1 << j->succ_low)); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * (1 << shift)); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0]*4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values! + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios + // and I've never seen a non-corrupted JPEG file actually use them + for (i=0; i < s->img_n; ++i) { + if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); + if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) +{ + // some JPEGs have junk at end, skip over it but if we find what looks + // like a valid marker, resume there + while (!stbi__at_eof(j->s)) { + stbi_uc x = stbi__get8(j->s); + while (x == 0xff) { // might be a marker + if (stbi__at_eof(j->s)) return STBI__MARKER_none; + x = stbi__get8(j->s); + if (x != 0x00 && x != 0xff) { + // not a stuffed zero or lead-in to another marker, looks + // like an actual marker, return it + return x; + } + // stuffed zero has x=0 now which ends the loop, meaning we go + // back to regular scan loop. + // repeated 0xff keeps trying to read the next byte of the marker. + } + } + return STBI__MARKER_none; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + j->marker = stbi__skip_jpeg_junk_at_end(j); + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + m = stbi__get_marker(j); + if (STBI__RESTART(m)) + m = stbi__get_marker(j); + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + m = stbi__get_marker(j); + } else { + if (!stbi__process_marker(j, m)) return 1; + m = stbi__get_marker(j); + } + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // nothing to do if no components requested; check this now to avoid + // accessing uninitialized coutput[0] later + if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__errpuc("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) +#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[STBI__ZNSYMS]; + stbi__uint16 value[STBI__ZNSYMS]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + int hit_zeof_once; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static int stbi__zeof(stbi__zbuf *z) +{ + return (z->zbuffer >= z->zbuffer_end); +} + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + return stbi__zeof(z) ? 0 : *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + if (z->code_buffer >= (1U << z->num_bits)) { + z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ + return; + } + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s >= 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! + if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) { + if (stbi__zeof(a)) { + if (!a->hit_zeof_once) { + // This is the first time we hit eof, insert 16 extra padding btis + // to allow us to keep going; if we actually consume any of them + // though, that is invalid data. This is caught later. + a->hit_zeof_once = 1; + a->num_bits += 16; // add 16 implicit zero bits + } else { + // We already inserted our extra 16 padding bits and are again + // out, this stream is actually prematurely terminated. + return -1; + } + } else { + stbi__fill_bits(a); + } + } + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + unsigned int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (unsigned int) (z->zout - z->zout_start); + limit = old_limit = (unsigned) (z->zout_end - z->zout_start); + if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); + while (cur + n > limit) { + if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); + limit *= 2; + } + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static const int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static const int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + if (a->hit_zeof_once && a->num_bits < 16) { + // The first time we hit zeof, we inserted 16 extra zero bits into our bit + // buffer so the decoder can just do its speculative decoding. But if we + // actually consumed any of those bits (which is the case when num_bits < 16), + // the stream actually read past the end so it is malformed. + return stbi__err("unexpected end","Corrupt PNG"); + } + return 1; + } + if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (len > a->zout_end - zout) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + } else if (c == 18) { + c = stbi__zreceive(a,7)+11; + } else { + return stbi__err("bad codelengths", "Corrupt PNG"); + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + a->hit_zeof_once = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filter used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub +}; + +static int stbi__paeth(int a, int b, int c) +{ + // This formulation looks very different from the reference in the PNG spec, but is + // actually equivalent and has favorable data dependencies and admits straightforward + // generation of branch-free code, which helps performance significantly. + int thresh = c*3 - (a + b); + int lo = a < b ? a : b; + int hi = a < b ? b : a; + int t0 = (hi <= thresh) ? lo : c; + int t1 = (thresh <= lo) ? hi : t0; + return t1; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// adds an extra all-255 alpha channel +// dest == src is legal +// img_n must be 1 or 3 +static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n) +{ + int i; + // must process data backwards since we allow dest==src + if (img_n == 1) { + for (i=x-1; i >= 0; --i) { + dest[i*2+1] = 255; + dest[i*2+0] = src[i]; + } + } else { + STBI_ASSERT(img_n == 3); + for (i=x-1; i >= 0; --i) { + dest[i*4+3] = 255; + dest[i*4+2] = src[i*3+2]; + dest[i*4+1] = src[i*3+1]; + dest[i*4+0] = src[i*3+0]; + } + } +} + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16 ? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + stbi_uc *filter_buf; + int all_ok = 1; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + // note: error exits here don't need to clean up a->out individually, + // stbi__do_png always does on error. + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG"); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + // Allocate two scan lines worth of filter workspace buffer. + filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0); + if (!filter_buf) return stbi__err("outofmem", "Out of memory"); + + // Filtering for low-bit-depth images + if (depth < 8) { + filter_bytes = 1; + width = img_width_bytes; + } + + for (j=0; j < y; ++j) { + // cur/prior filter buffers alternate + stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes; + stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes; + stbi_uc *dest = a->out + stride*j; + int nk = width * filter_bytes; + int filter = *raw++; + + // check filter type + if (filter > 4) { + all_ok = stbi__err("invalid filter","Corrupt PNG"); + break; + } + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // perform actual filtering + switch (filter) { + case STBI__F_none: + memcpy(cur, raw, nk); + break; + case STBI__F_sub: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); + break; + case STBI__F_up: + for (k = 0; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); + break; + case STBI__F_avg: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); + break; + case STBI__F_paeth: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0) + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes])); + break; + case STBI__F_avg_first: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); + break; + } + + raw += nk; + + // expand decoded bits in cur to dest, also adding an extra alpha channel if desired + if (depth < 8) { + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + stbi_uc *in = cur; + stbi_uc *out = dest; + stbi_uc inb = 0; + stbi__uint32 nsmp = x*img_n; + + // expand bits to bytes first + if (depth == 4) { + for (i=0; i < nsmp; ++i) { + if ((i & 1) == 0) inb = *in++; + *out++ = scale * (inb >> 4); + inb <<= 4; + } + } else if (depth == 2) { + for (i=0; i < nsmp; ++i) { + if ((i & 3) == 0) inb = *in++; + *out++ = scale * (inb >> 6); + inb <<= 2; + } + } else { + STBI_ASSERT(depth == 1); + for (i=0; i < nsmp; ++i) { + if ((i & 7) == 0) inb = *in++; + *out++ = scale * (inb >> 7); + inb <<= 1; + } + } + + // insert alpha=255 values if desired + if (img_n != out_n) + stbi__create_png_alpha_expand8(dest, dest, x, img_n); + } else if (depth == 8) { + if (img_n == out_n) + memcpy(dest, cur, x*img_n); + else + stbi__create_png_alpha_expand8(dest, cur, x, img_n); + } else if (depth == 16) { + // convert the image data from big-endian to platform-native + stbi__uint16 *dest16 = (stbi__uint16*)dest; + stbi__uint32 nsmp = x*img_n; + + if (img_n == out_n) { + for (i = 0; i < nsmp; ++i, ++dest16, cur += 2) + *dest16 = (cur[0] << 8) | cur[1]; + } else { + STBI_ASSERT(img_n+1 == out_n); + if (img_n == 1) { + for (i = 0; i < x; ++i, dest16 += 2, cur += 2) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = 0xffff; + } + } else { + STBI_ASSERT(img_n == 3); + for (i = 0; i < x; ++i, dest16 += 4, cur += 6) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = (cur[2] << 8) | cur[3]; + dest16[2] = (cur[4] << 8) | cur[5]; + dest16[3] = 0xffff; + } + } + } + } + } + + STBI_FREE(filter_buf); + if (!all_ok) return 0; + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + if (!final) return stbi__err("outofmem", "Out of memory"); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load_global = 0; +static int stbi__de_iphone_flag_global = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_global = flag_true_if_should_convert; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global +#define stbi__de_iphone_flag stbi__de_iphone_flag_global +#else +static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; +static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; + +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_set = 1; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_local = flag_true_if_should_convert; + stbi__de_iphone_flag_set = 1; +} + +#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ + ? stbi__unpremultiply_on_load_local \ + : stbi__unpremultiply_on_load_global) +#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ + ? stbi__de_iphone_flag_local \ + : stbi__de_iphone_flag_global) +#endif // STBI_THREAD_LOCAL + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]={0}; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); + s->img_y = stbi__get32be(s); + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + } + // even with SCAN_header, have to scan to see if we have a tRNS + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. + if (scan == STBI__SCAN_header) { ++s->img_n; return 1; } + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { + // header scan definitely stops at first IDAT + if (pal_img_n) + s->img_n = pal_img_n; + return 1; + } + if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth <= 8) + ri->bits_per_channel = 8; + else if (p->depth == 16) + ri->bits_per_channel = 16; + else + return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) { n += 16; z >>= 16; } + if (z >= 0x00100) { n += 8; z >>= 8; } + if (z >= 0x00010) { n += 4; z >>= 4; } + if (z >= 0x00004) { n += 2; z >>= 2; } + if (z >= 0x00002) { n += 1;/* >>= 1;*/ } + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(unsigned int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; + int extra_read; +} stbi__bmp_data; + +static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) +{ + // BI_BITFIELDS specifies masks explicitly, don't override + if (compress == 3) + return 1; + + if (compress == 0) { + if (info->bpp == 16) { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } else if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + // otherwise, use defaults, which is all-0 + info->mr = info->mg = info->mb = info->ma = 0; + } + return 1; + } + return 0; // error +} + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + info->extra_read = 14; + + if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes + if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + stbi__bmp_set_mask_defaults(info, compress); + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->extra_read += 12; + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + // V4/V5 header + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs + stbi__bmp_set_mask_defaults(info, compress); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - info.extra_read - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - info.extra_read - info.hsz) >> 2; + } + if (psize == 0) { + // accept some number of extra bytes after the header, but if the offset points either to before + // the header ends or implies a large amount of extra data, reject the file as malformed + int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); + int header_limit = 1024; // max we actually read is below 256 bytes currently. + int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. + if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { + return stbi__errpuc("bad header", "Corrupt BMP"); + } + // we established that bytes_read_so_far is positive and sensible. + // the first half of this test rejects offsets that are either too small positives, or + // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn + // ensures the number computed in the second half of the test can't overflow. + if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } else { + stbi__skip(s, info.offset - bytes_read_so_far); + } + } + + if (info.bpp == 24 && ma == 0xff000000) + s->img_n = 3; + else + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - info.extra_read - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i]; p1[i] = p2[i]; p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + STBI_NOTUSED(tga_x_origin); // @TODO + STBI_NOTUSED(tga_y_origin); // @TODO + + if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + if (tga_palette_len == 0) { /* you have to have at least one entry! */ + STBI_FREE(tga_data); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + STBI_NOTUSED(tga_palette_start); + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + + if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + if (!result) return stbi__errpuc("outofmem", "Out of memory"); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!g) return stbi__err("outofmem", "Out of memory"); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED(req_comp); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) + return stbi__errpuc("too large", "GIF image is too large"); + pcount = g->w * g->h; + g->out = (stbi_uc *) stbi__malloc(4 * pcount); + g->background = (stbi_uc *) stbi__malloc(4 * pcount); + g->history = (stbi_uc *) stbi__malloc(pcount); + if (!g->out || !g->background || !g->history) + return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset(g->out, 0x00, 4 * pcount); + memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) + memset(g->history, 0x00, pcount); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispose of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if (w == 0) + g->cur_y = g->max_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (!o) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) +{ + STBI_FREE(g->out); + STBI_FREE(g->history); + STBI_FREE(g->background); + + if (out) STBI_FREE(out); + if (delays && *delays) STBI_FREE(*delays); + return stbi__errpuc("outofmem", "Out of memory"); +} + +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + int out_size = 0; + int delays_size = 0; + + STBI_NOTUSED(out_size); + STBI_NOTUSED(delays_size); + + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); + if (!tmp) + return stbi__load_gif_main_outofmem(&g, out, delays); + else { + out = (stbi_uc*) tmp; + out_size = layers * stride; + } + + if (delays) { + int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); + if (!new_delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + *delays = new_delays; + delays_size = layers * sizeof(int); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (!out) + return stbi__load_gif_main_outofmem(&g, out, delays); + out_size = layers * stride; + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + if (!*delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + delays_size = layers * sizeof(int); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } else if (g.out) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE(g.out); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + if (p == NULL) { + stbi__rewind( s ); + return 0; + } + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) { + if (info.bpp == 24 && info.ma == 0xff000000) + *comp = 3; + else + *comp = info.ma ? 4 : 3; + } + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + STBI_NOTUSED(stbi__get32be(s)); + STBI_NOTUSED(stbi__get32be(s)); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); + if (ri->bits_per_channel == 0) + return 0; + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { + STBI_FREE(out); + return stbi__errpuc("bad PNM", "PNM file truncated"); + } + + if (req_comp && req_comp != s->img_n) { + if (ri->bits_per_channel == 16) { + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); + } else { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + } + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + if((value > 214748364) || (value == 214748364 && *c > '7')) + return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + if(*x == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + if (*y == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + if (maxv > 65535) + return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); + else if (maxv > 255) + return 16; + else + return 8; +} + +static int stbi__pnm_is16(stbi__context *s) +{ + if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) + return 1; + return 0; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_is16(s)) return 1; + #endif + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +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. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +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 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. +------------------------------------------------------------------------------ +*/ diff --git a/funcs.cpp b/funcs.cpp new file mode 100644 index 0000000..a09df0b --- /dev/null +++ b/funcs.cpp @@ -0,0 +1,11 @@ +#include "funcs.h" + +void framebuffer_size_callback(GLFWwindow* window, int width, int height) { + glViewport(0, 0, width, height); +} + +void processInput(GLFWwindow* window) { + if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { + glfwSetWindowShouldClose(window, true); + } +} \ No newline at end of file diff --git a/include/funcs.h b/include/funcs.h new file mode 100644 index 0000000..be06d92 --- /dev/null +++ b/include/funcs.h @@ -0,0 +1,6 @@ +#include +#include + +void framebuffer_size_callback(GLFWwindow* window, int width, int height); + +void processInput(GLFWwindow* window); \ No newline at end of file diff --git a/include/shader.h b/include/shader.h new file mode 100644 index 0000000..b70f2ce --- /dev/null +++ b/include/shader.h @@ -0,0 +1,18 @@ +#pragma once +#include + +#include +#include +#include +#include + +class Shader { +public: + unsigned int id; + Shader(const char* vertexPath, const char* fragmentPath); + void use() const; + void setBool(const std::string& name, bool value) const; + void setInt(const std::string& name, int value) const; + void setFloat(const std::string& name, float value) const; + +}; \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..3f6caaf --- /dev/null +++ b/main.cpp @@ -0,0 +1,121 @@ +#define STB_IMAGE_IMPLEMENTATION + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "data.cpp" + +int main() { + // Initalize GLFW + glfwInit(); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + // Open Window + GLFWwindow* window = glfwCreateWindow(800, 600, "Howdy Naif!", NULL, NULL); + if (window == NULL) { + std::cout << "Could not open the iwndow!\n"; + glfwTerminate(); + return -1; + } + glfwMakeContextCurrent(window); + + // Start GLAD loader + if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)){ + std::cout << "Failed to initialize GLAD" << std::endl; + return -1; + } + + // Set viewport + glViewport(0, 0, 800, 600); + glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + + // Create Vertex Buffer and bind it to array buffer, then specifiy how to use that data + unsigned int VAO, VBO; + glGenVertexArrays(1, &VAO); + glGenBuffers(1, &VBO); + glBindVertexArray(VAO); + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)0); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)(3*sizeof(float))); + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)(6*sizeof(float))); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + glEnableVertexAttribArray(2); + + // Element Buffers + unsigned int EBO; + glGenBuffers(1, &EBO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + + // Use and set shader + Shader myShader("../shad/vert.vs", "../shad/frag.fs"); + myShader.use(); + + // Texture Loading + unsigned int texture1, texture2; + int width1, height1, nrChannels1, width2, height2, nrChannels2; + stbi_set_flip_vertically_on_load(true); + unsigned char* data1 = stbi_load("wall.jpg", &width1, &height1, &nrChannels1, 0); + unsigned char* data2 = stbi_load("awesomeface.png", &width2, &height2, &nrChannels2, 0); + + + if (data1 && data2) { + glActiveTexture(GL_TEXTURE0); + glGenTextures(1, &texture1); + glBindTexture(GL_TEXTURE_2D, texture1); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width1, height1, 0, GL_RGB, GL_UNSIGNED_BYTE, data1); + glGenerateMipmap(GL_TEXTURE_2D); + + glActiveTexture(GL_TEXTURE1); + glGenTextures(1, &texture2); + glBindTexture(GL_TEXTURE_2D, texture2); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width2, height2, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2); + glGenerateMipmap(GL_TEXTURE_2D); + + myShader.setInt("texture1", 0); + myShader.setInt("texture2", 1); + + } else { + std::cout << "COULD NOT LOAD TEXTUREs!\n"; + } + stbi_image_free(data1); + stbi_image_free(data2); + + // Camera Work + glm::mat4 trans = glm::rotate(glm::mat4(1.0f), (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f)); + unsigned int transLoc = glGetUniformLocation(myShader.id, "transform"); + glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(trans)); + + + // Window loop + while(!glfwWindowShouldClose(window)) { + // Input checking + processInput(window); + + // Rendering Loop + trans = glm::rotate(glm::mat4(1.0f), (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f)); + glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(trans)); + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + glBindVertexArray(VAO); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); + + // Events and buffer swap + glfwPollEvents(); + glfwSwapBuffers(window); + } + + glfwTerminate(); + return 0; +} \ No newline at end of file diff --git a/opengl.pdf - Shortcut.lnk b/opengl.pdf - Shortcut.lnk new file mode 100644 index 0000000000000000000000000000000000000000..641c0113190888a4e066be1a0f3e1d338a1beef1 GIT binary patch literal 1206 zcmb_bOK1~O6g{a$QZ1T7Ds3_CxKJxXO^XX{2^0*CNJ4@mM9M4@CX=+9&yY@(F2sNv z1vg>?5m6+ftGcO_E(%gNio4)K{2&CnvqVxy%efQmW&zXDY1pzqR z9h`x+#*C@QaH2@N_WYq!JNwm9t$TW9RVIEn_CG_bjSG&y@%FszaAPP^3s;pN13=1tIb>j>K%aQ#7(WQD$(FkOzSoV=yb_F?R?dXK$s>L}y5MQg6RX@q z2=inJBF_94c}(W+vvZfCD@!h@Mmnilg~Ys_yR5F4%c}2D``pD!KUAtsBgxgG_5_(E zcMM~Yf|sJNmWs%kMmCimF%wB(s;OK~gt>k8+C;LU)j$?0a*R-Sf=s{wktU83(oR{= z6Edz79%3JHq~}h*i)$d4OQj9PpP#*9fNkB?HO;Q8W>-PmskxinT1zb_5WqOk{@+Qh zMF+GNmHWnz=>nd;rRGsJqIx%vuhatrt{0mfvHMRq7EjTCfWQ!OkdRjXTOOd7XNL() z%5+ojl7}G9ZrO{m^%{J%JH;s}<=_JU$UGBgm{`F@T%qBXpp(R23X;4##~*b0=4Jo@ literal 0 HcmV?d00001 diff --git a/shad/frag.fs b/shad/frag.fs new file mode 100644 index 0000000..58b46b1 --- /dev/null +++ b/shad/frag.fs @@ -0,0 +1,15 @@ +#version 330 core + +in vec4 vertexColor; +in vec2 textureCoord; + +out vec4 FragColor; + +uniform sampler2D texture1; +uniform sampler2D texture2; + +void main() { + FragColor = mix(texture(texture1, textureCoord), + texture(texture2, textureCoord), 0.2); + +} \ No newline at end of file diff --git a/shad/vert.vs b/shad/vert.vs new file mode 100644 index 0000000..0185987 --- /dev/null +++ b/shad/vert.vs @@ -0,0 +1,16 @@ +#version 330 core + +layout(location=0) in vec3 aPos; +layout(location=1) in vec3 vColor; +layout(location=2) in vec2 tCoord; + +out vec4 vertexColor; +out vec2 textureCoord; + +uniform mat4 transform; + +void main() { + gl_Position = transform * vec4(aPos, 1.0); + vertexColor = vec4(vColor, 1.0); + textureCoord = tCoord; +} \ No newline at end of file diff --git a/shader.cpp b/shader.cpp new file mode 100644 index 0000000..9a59744 --- /dev/null +++ b/shader.cpp @@ -0,0 +1,77 @@ +#include "shader.h" + +Shader::Shader(const char* vertexPath, const char* fragmentPath) { + std::string vertexCode, fragmentCode; + std::ifstream vShaderFile, fShaderFile; + + vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit); + fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit); + + try { + vShaderFile.open(vertexPath); + fShaderFile.open(fragmentPath); + std::stringstream vShaderStream, fShaderStream; + vShaderStream << vShaderFile.rdbuf(); + fShaderStream << fShaderFile.rdbuf(); + vShaderFile.close(); + fShaderFile.close(); + vertexCode = vShaderStream.str(); + fragmentCode = fShaderStream.str(); + } catch (std::ifstream::failure e) { + std::cout << "COULD NOT READ SHADER FILES\n"; + } + + const char* vShaderCode = vertexCode.c_str(); + const char* fShaderCode = fragmentCode.c_str(); + + unsigned int vertex, fragment; + int success; + char infoLog[512]; + + vertex = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertex, 1, &vShaderCode, NULL); + glCompileShader(vertex); + glGetShaderiv(vertex, GL_COMPILE_STATUS, &success); + if(!success) { + glGetShaderInfoLog(vertex, 512, NULL, infoLog); + std::cout << "COULD NOT COMPILE VERTEX SHADER\n" << infoLog << "\n"; + } + + fragment = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragment, 1, &fShaderCode, NULL); + glCompileShader(fragment); + glGetShaderiv(fragment, GL_COMPILE_STATUS, &success); + if(!success) { + glGetShaderInfoLog(fragment, 512, NULL, infoLog); + std::cout << "COULD NOT COMPILE FRAGMENT SHADER\n" << infoLog << "\n"; + } + + id = glCreateProgram(); + glAttachShader(id, vertex); + glAttachShader(id, fragment); + glLinkProgram(id); + glGetProgramiv(id, GL_LINK_STATUS, &success); + if (!success) { + glGetProgramInfoLog(id, 512, NULL, infoLog); + std::cout << "COULD NOT LINK SHADER PROGRAM\n" << infoLog << "\n"; + } + + glDeleteShader(vertex); + glDeleteShader(fragment); +} + +void Shader::use() const{ + glUseProgram(id); +} + +void Shader::setBool(const std::string& name, bool value) const { + glUniform1i(glGetUniformLocation(id, name.c_str()), (int)value); +} + +void Shader::setInt(const std::string& name, int value) const { + glUniform1i(glGetUniformLocation(id, name.c_str()), (int)value); +} + +void Shader::setFloat(const std::string& name, float value) const { + glUniform1f(glGetUniformLocation(id, name.c_str()), (int)value); +} \ No newline at end of file