initial commit
This commit is contained in:
		
							
								
								
									
										172
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,172 @@ | |||||||
|  | *.locres filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.locmeta filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.ico filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.uasset filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.umap filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.udk filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.upk filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.3DS filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.ABC filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.AEP filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.AFDESIGN filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.AFPHOTO filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.AI filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.AIF filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.AVI filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.BANK filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.BGEO filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.BIN filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.BLEND filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.BMP filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.BPOLY filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.C4D filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.DOC filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.DOCX filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.DWG filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.DXF filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.EXR filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.FBX filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.GEO filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.GI filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.GI2 filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.GIF filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.GLB filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.GLTF filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.HDR filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.HIP filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.HIPLC filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.HIPNC filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.JPEG filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.JPG filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.MA filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.MAX filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.MB filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.MOV filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.MP3 filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.MP4 filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.MPEG filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.MPG filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.OBJ filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PDF filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PFM filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PIC filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PMB filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PNG filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.POLY filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PPT filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PPTX filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PROFRAW filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PRPROJ filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PSB filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PSD filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.RAR filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.RAT filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.RIB filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.SKETCH filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.STL filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.TAR filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.TAR.GZ filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.TIF filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.TIFF filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.TMP filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.UEXP filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.USD filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.USDC filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.USDZ filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.VDB filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.VOX filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.WAV filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.XCF filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.XLS filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.XLSX filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.ZIP filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.3ds filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.abc filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.aep filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.afdesign filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.afphoto filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.ai filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.aif filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.avi filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.bank filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.bgeo filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.bin filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.blend filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.bmp filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.bpoly filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.c4d filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.doc filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.docx filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.dwg filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.dxf filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.exr filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.fbx filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.geo filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.gi filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.gi2 filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.gif filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.glb filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.gltf filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.hdr filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.hip filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.hiplc filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.hipnc filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.jpeg filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.jpg filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.ma filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.max filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.mb filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.mov filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.mp3 filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.mp4 filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.mpeg filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.mpg filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.obj filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.pdf filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.pfm filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.pic filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.pmb filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.png filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.poly filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.ppt filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.pptx filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.profraw filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.prproj filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.psb filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.psd filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.rar filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.rat filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.rib filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.sketch filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.stl filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.tar filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.tar.gz filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.tif filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.tiff filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.tmp filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.uexp filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.usd filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.usdc filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.usdz filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.vdb filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.vox filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.wav filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.xcf filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.xls filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.xlsx filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.zip filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.a filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.A filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.lib filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.LIB filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.exe filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.EXE filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.dll filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.DLL filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.so filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.SO filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.dylib filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.DYLIB filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.pdb filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.PDB filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.tga filter=lfs diff=lfs merge=lfs -text | ||||||
							
								
								
									
										93
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | |||||||
|  | # Prerequisites | ||||||
|  | *.d | ||||||
|  |  | ||||||
|  | # Compiled Object files | ||||||
|  | *.slo | ||||||
|  | *.lo | ||||||
|  | *.o | ||||||
|  | *.obj | ||||||
|  | *.ko | ||||||
|  | *.elf | ||||||
|  |  | ||||||
|  | # Linker output | ||||||
|  | *.ilk | ||||||
|  | *.map | ||||||
|  | *.exp | ||||||
|  |  | ||||||
|  | # Precompiled Headers | ||||||
|  | *.gch | ||||||
|  | *.pch | ||||||
|  |  | ||||||
|  | # Compiled Dynamic libraries | ||||||
|  | *.so | ||||||
|  | *.so.* | ||||||
|  | *.dylib | ||||||
|  | *.dll | ||||||
|  |  | ||||||
|  | # Fortran module files | ||||||
|  | *.mod | ||||||
|  | *.smod | ||||||
|  |  | ||||||
|  | # Compiled Static libraries | ||||||
|  | *.lai | ||||||
|  | *.la | ||||||
|  | *.lo | ||||||
|  | *.a | ||||||
|  | *.lib | ||||||
|  |  | ||||||
|  | # Executables | ||||||
|  | *.exe | ||||||
|  | *.out | ||||||
|  | *.app | ||||||
|  | *.i*86 | ||||||
|  | *.x86_64 | ||||||
|  | *.hex | ||||||
|  |  | ||||||
|  | # Debug files | ||||||
|  | *.dSYM/ | ||||||
|  | *.su | ||||||
|  | *.idb | ||||||
|  | *.pdb | ||||||
|  |  | ||||||
|  | # Kernel Module Compile Results | ||||||
|  | *.mod* | ||||||
|  | *.cmd | ||||||
|  | .tmp_versions/ | ||||||
|  |  | ||||||
|  | # MAC OS files | ||||||
|  | .DS_Store | ||||||
|  | ._.DS_Store | ||||||
|  | **/.DS_Store | ||||||
|  | **/._.DS_Store | ||||||
|  |  | ||||||
|  | # VS files | ||||||
|  | .vs | ||||||
|  | **/.vs | ||||||
|  |  | ||||||
|  | # VS code files | ||||||
|  | .vscode | ||||||
|  | **/.vscode | ||||||
|  | *.code-workspace | ||||||
|  |  | ||||||
|  | # CLion | ||||||
|  | .idea | ||||||
|  | CMakelist.txt | ||||||
|  |  | ||||||
|  | # cache | ||||||
|  | .cache | ||||||
|  | **/.cache | ||||||
|  |  | ||||||
|  | # clangd | ||||||
|  | compile_commands.json | ||||||
|  | **/compile_commands.json | ||||||
|  | compile_flags.txt | ||||||
|  | **/compile_flags.txt | ||||||
|  |  | ||||||
|  | # Miscellaneous | ||||||
|  | modules.order | ||||||
|  | Module.symvers | ||||||
|  | Mkfile.old | ||||||
|  | dkms.conf | ||||||
|  |  | ||||||
|  | # Build directory | ||||||
|  | build/ | ||||||
							
								
								
									
										5
									
								
								data/fragment.glsl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								data/fragment.glsl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | varying vec3 fcolor; | ||||||
|  |  | ||||||
|  | void main() { | ||||||
|  | 	gl_FragColor = vec4(fcolor, 1); | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								data/vertex.glsl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								data/vertex.glsl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | uniform mat4 mvp; | ||||||
|  | attribute vec3 vpos; | ||||||
|  | attribute vec3 vcolor; | ||||||
|  | varying vec3 fcolor; | ||||||
|  |  | ||||||
|  | void main() { | ||||||
|  | 	gl_Position = mvp * vec4(vpos, 1); | ||||||
|  | 	fcolor = vcolor; | ||||||
|  | } | ||||||
							
								
								
									
										2618
									
								
								lib/glew/GL/eglew.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2618
									
								
								lib/glew/GL/eglew.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										23686
									
								
								lib/glew/GL/glew.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23686
									
								
								lib/glew/GL/glew.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1775
									
								
								lib/glew/GL/glxew.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1775
									
								
								lib/glew/GL/glxew.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1447
									
								
								lib/glew/GL/wglew.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1447
									
								
								lib/glew/GL/wglew.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										28581
									
								
								lib/glew/glew.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28581
									
								
								lib/glew/glew.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4248
									
								
								lib/glfw/glfw3.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4248
									
								
								lib/glfw/glfw3.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										456
									
								
								lib/glfw/glfw3native.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										456
									
								
								lib/glfw/glfw3native.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,456 @@ | |||||||
|  | /************************************************************************* | ||||||
|  |  * GLFW 3.2 - www.glfw.org | ||||||
|  |  * A library for OpenGL, window and input | ||||||
|  |  *------------------------------------------------------------------------ | ||||||
|  |  * Copyright (c) 2002-2006 Marcus Geelnard | ||||||
|  |  * Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org> | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  * | ||||||
|  |  *  **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 exactly one | ||||||
|  |  *  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` | ||||||
|  |  *  * `GLFW_EXPOSE_NATIVE_MIR` | ||||||
|  |  * | ||||||
|  |  *  The available context API macros are: | ||||||
|  |  *  * `GLFW_EXPOSE_NATIVE_WGL` | ||||||
|  |  *  * `GLFW_EXPOSE_NATIVE_NSGL` | ||||||
|  |  *  * `GLFW_EXPOSE_NATIVE_GLX` | ||||||
|  |  *  * `GLFW_EXPOSE_NATIVE_EGL` | ||||||
|  |  * | ||||||
|  |  *  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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************* | ||||||
|  |  * System headers and types | ||||||
|  |  *************************************************************************/ | ||||||
|  |  | ||||||
|  | #if defined(GLFW_EXPOSE_NATIVE_WIN32) | ||||||
|  |  // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for | ||||||
|  |  // example to allow applications to correctly declare a GL_ARB_debug_output | ||||||
|  |  // callback) but windows.h assumes no one will define APIENTRY before it does | ||||||
|  |  #undef APIENTRY | ||||||
|  |  #include <windows.h> | ||||||
|  | #elif defined(GLFW_EXPOSE_NATIVE_COCOA) | ||||||
|  |  #include <ApplicationServices/ApplicationServices.h> | ||||||
|  |  #if defined(__OBJC__) | ||||||
|  |   #import <Cocoa/Cocoa.h> | ||||||
|  |  #else | ||||||
|  |   typedef void* id; | ||||||
|  |  #endif | ||||||
|  | #elif defined(GLFW_EXPOSE_NATIVE_X11) | ||||||
|  |  #include <X11/Xlib.h> | ||||||
|  |  #include <X11/extensions/Xrandr.h> | ||||||
|  | #elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) | ||||||
|  |  #include <wayland-client.h> | ||||||
|  | #elif defined(GLFW_EXPOSE_NATIVE_MIR) | ||||||
|  |  #include <mir_toolkit/mir_client_library.h> | ||||||
|  | #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) | ||||||
|  |  #include <GL/glx.h> | ||||||
|  | #endif | ||||||
|  | #if defined(GLFW_EXPOSE_NATIVE_EGL) | ||||||
|  |  #include <EGL/egl.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************* | ||||||
|  |  * 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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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); | ||||||
|  | #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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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_MIR) | ||||||
|  | /*! @brief Returns the `MirConnection*` used by GLFW. | ||||||
|  |  * | ||||||
|  |  *  @return The `MirConnection*` used by GLFW, or `NULL` if an | ||||||
|  |  *  [error](@ref error_handling) occurred. | ||||||
|  |  * | ||||||
|  |  *  @thread_safety This function may be called from any thread.  Access is not | ||||||
|  |  *  synchronized. | ||||||
|  |  * | ||||||
|  |  *  @since Added in version 3.2. | ||||||
|  |  * | ||||||
|  |  *  @ingroup native | ||||||
|  |  */ | ||||||
|  | GLFWAPI MirConnection* glfwGetMirDisplay(void); | ||||||
|  |  | ||||||
|  | /*! @brief Returns the Mir output ID of the specified monitor. | ||||||
|  |  * | ||||||
|  |  *  @return The Mir output ID of the specified monitor, or zero if an | ||||||
|  |  *  [error](@ref error_handling) occurred. | ||||||
|  |  * | ||||||
|  |  *  @thread_safety This function may be called from any thread.  Access is not | ||||||
|  |  *  synchronized. | ||||||
|  |  * | ||||||
|  |  *  @since Added in version 3.2. | ||||||
|  |  * | ||||||
|  |  *  @ingroup native | ||||||
|  |  */ | ||||||
|  | GLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor); | ||||||
|  |  | ||||||
|  | /*! @brief Returns the `MirSurface*` of the specified window. | ||||||
|  |  * | ||||||
|  |  *  @return The `MirSurface*` of the specified window, or `NULL` if an | ||||||
|  |  *  [error](@ref error_handling) occurred. | ||||||
|  |  * | ||||||
|  |  *  @thread_safety This function may be called from any thread.  Access is not | ||||||
|  |  *  synchronized. | ||||||
|  |  * | ||||||
|  |  *  @since Added in version 3.2. | ||||||
|  |  * | ||||||
|  |  *  @ingroup native | ||||||
|  |  */ | ||||||
|  | GLFWAPI MirSurface* glfwGetMirWindow(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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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. | ||||||
|  |  * | ||||||
|  |  *  @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 | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif /* _glfw3_native_h_ */ | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								lib/glm/common.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								lib/glm/common.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/common.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "detail/func_common.hpp" | ||||||
							
								
								
									
										399
									
								
								lib/glm/detail/_features.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										399
									
								
								lib/glm/detail/_features.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,399 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/_features.hpp | ||||||
|  |  | ||||||
|  | #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) | ||||||
|  |  | ||||||
|  | #	if(GLM_COMPILER >= GLM_COMPILER_GCC43) | ||||||
|  | #		define GLM_CXX11_STATIC_ASSERT | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | #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) | ||||||
							
								
								
									
										30
									
								
								lib/glm/detail/_fixes.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								lib/glm/detail/_fixes.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/_fixes.hpp | ||||||
|  |  | ||||||
|  | #include <cmath> | ||||||
|  |  | ||||||
|  | //! 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 | ||||||
|  |  | ||||||
							
								
								
									
										107
									
								
								lib/glm/detail/_noise.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								lib/glm/detail/_noise.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/_noise.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "../vec2.hpp" | ||||||
|  | #include "../vec3.hpp" | ||||||
|  | #include "../vec4.hpp" | ||||||
|  | #include "../common.hpp" | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <typename T> | ||||||
|  | 	GLM_FUNC_QUALIFIER T mod289(T const & x) | ||||||
|  | 	{ | ||||||
|  | 		return x - floor(x * static_cast<T>(1.0) / static_cast<T>(289.0)) * static_cast<T>(289.0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T> | ||||||
|  | 	GLM_FUNC_QUALIFIER T permute(T const & x) | ||||||
|  | 	{ | ||||||
|  | 		return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> permute(tvec2<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> permute(tvec3<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> permute(tvec4<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x); | ||||||
|  | 	} | ||||||
|  | /* | ||||||
|  | 	template <typename T, precision P, template<typename> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> permute(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return mod289(((x * T(34)) + T(1)) * x); | ||||||
|  | 	} | ||||||
|  | */ | ||||||
|  | 	template <typename T> | ||||||
|  | 	GLM_FUNC_QUALIFIER T taylorInvSqrt(T const & r) | ||||||
|  | 	{ | ||||||
|  | 		return T(1.79284291400159) - T(0.85373472095314) * r; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> taylorInvSqrt(tvec2<T, P> const & r) | ||||||
|  | 	{ | ||||||
|  | 		return T(1.79284291400159) - T(0.85373472095314) * r; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> taylorInvSqrt(tvec3<T, P> const & r) | ||||||
|  | 	{ | ||||||
|  | 		return T(1.79284291400159) - T(0.85373472095314) * r; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> taylorInvSqrt(tvec4<T, P> const & r) | ||||||
|  | 	{ | ||||||
|  | 		return T(1.79284291400159) - T(0.85373472095314) * r; | ||||||
|  | 	} | ||||||
|  | /* | ||||||
|  | 	template <typename T, precision P, template<typename> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> taylorInvSqrt(vecType<T, P> const & r) | ||||||
|  | 	{ | ||||||
|  | 		return T(1.79284291400159) - T(0.85373472095314) * r; | ||||||
|  | 	} | ||||||
|  | */ | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> fade(tvec2<T, P> const & t) | ||||||
|  | 	{ | ||||||
|  | 		return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> fade(tvec3<T, P> const & t) | ||||||
|  | 	{ | ||||||
|  | 		return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> fade(tvec4<T, P> const & t) | ||||||
|  | 	{ | ||||||
|  | 		return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); | ||||||
|  | 	} | ||||||
|  | /* | ||||||
|  | 	template <typename T, precision P, template <typename> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> fade(vecType<T, P> const & t) | ||||||
|  | 	{ | ||||||
|  | 		return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); | ||||||
|  | 	} | ||||||
|  | */ | ||||||
|  | }//namespace detail | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
							
								
								
									
										797
									
								
								lib/glm/detail/_swizzle.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										797
									
								
								lib/glm/detail/_swizzle.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,797 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/_swizzle.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	// Internal class for implementing swizzle operators | ||||||
|  | 	template <typename T, int N> | ||||||
|  | 	struct _swizzle_base0 | ||||||
|  | 	{ | ||||||
|  | 	protected: | ||||||
|  | 		GLM_FUNC_QUALIFIER T& elem(size_t i){ return (reinterpret_cast<T*>(_buffer))[i]; } | ||||||
|  | 		GLM_FUNC_QUALIFIER T const& elem(size_t i) const{ return (reinterpret_cast<const T*>(_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 <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3, bool Aligned> | ||||||
|  | 	struct _swizzle_base1 : public _swizzle_base0<T, N> | ||||||
|  | 	{ | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, int E0, int E1, bool Aligned> | ||||||
|  | 	struct _swizzle_base1<2, T, P, vecType, E0,E1,-1,-2, Aligned> : public _swizzle_base0<T, 2> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER vecType<T, P> operator ()()  const { return vecType<T, P>(this->elem(E0), this->elem(E1)); } | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, bool Aligned> | ||||||
|  | 	struct _swizzle_base1<3, T, P, vecType, E0,E1,E2,-1, Aligned> : public _swizzle_base0<T, 3> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER vecType<T, P> operator ()()  const { return vecType<T, P>(this->elem(E0), this->elem(E1), this->elem(E2)); } | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3, bool Aligned> | ||||||
|  | 	struct _swizzle_base1<4, T, P, vecType, E0,E1,E2,E3, Aligned> : public _swizzle_base0<T, 4> | ||||||
|  | 	{  | ||||||
|  | 		GLM_FUNC_QUALIFIER vecType<T, P> operator ()()  const { return vecType<T, P>(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); } | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// Internal class for implementing swizzle operators | ||||||
|  | 	/* | ||||||
|  | 		Template parameters: | ||||||
|  |  | ||||||
|  | 		ValueType = type of scalar values (e.g. float, double) | ||||||
|  | 		VecType   = class the swizzle is applies to (e.g. tvec3<float>) | ||||||
|  | 		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 <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3, int DUPLICATE_ELEMENTS> | ||||||
|  | 	struct _swizzle_base2 : public _swizzle_base1<N, T, P, vecType, E0,E1,E2,E3, detail::is_aligned<P>::value> | ||||||
|  | 	{ | ||||||
|  | 		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= (vecType<T, P> const& that) | ||||||
|  | 		{ | ||||||
|  | 			struct op {  | ||||||
|  | 				GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e = t; }  | ||||||
|  | 			}; | ||||||
|  | 			_apply_op(that, op()); | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_QUALIFIER void operator -= (vecType<T, P> const& that) | ||||||
|  | 		{ | ||||||
|  | 			struct op {  | ||||||
|  | 				GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e -= t; }  | ||||||
|  | 			}; | ||||||
|  | 			_apply_op(that, op()); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_QUALIFIER void operator += (vecType<T, P> const& that) | ||||||
|  | 		{ | ||||||
|  | 			struct op {  | ||||||
|  | 				GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e += t; }  | ||||||
|  | 			}; | ||||||
|  | 			_apply_op(that, op()); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_QUALIFIER void operator *= (vecType<T, P> const& that) | ||||||
|  | 		{ | ||||||
|  | 			struct op {  | ||||||
|  | 				GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e *= t; }  | ||||||
|  | 			}; | ||||||
|  | 			_apply_op(that, op()); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_QUALIFIER void operator /= (vecType<T, P> const& that) | ||||||
|  | 		{ | ||||||
|  | 			struct op {  | ||||||
|  | 				GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e /= t; }  | ||||||
|  | 			}; | ||||||
|  | 			_apply_op(that, op()); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		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 <typename U> | ||||||
|  | 		GLM_FUNC_QUALIFIER void _apply_op(vecType<T, P> const& that, 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 <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3> | ||||||
|  | 	struct _swizzle_base2<N, T, P, vecType, E0,E1,E2,E3, 1> : public _swizzle_base1<N, T, P, vecType, E0,E1,E2,E3, detail::is_aligned<P>::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 <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3> | ||||||
|  | 	struct _swizzle : public _swizzle_base2<N, T, P, vecType, E0, E1, E2, E3, (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 || E1 == E3 || E2 == E3)> | ||||||
|  | 	{ | ||||||
|  | 		typedef _swizzle_base2<N, T, P, vecType, E0, E1, E2, E3, (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 || E1 == E3 || E2 == E3)> base_type; | ||||||
|  |  | ||||||
|  | 		using base_type::operator=; | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_QUALIFIER operator vecType<T, P> () const { return (*this)(); } | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // To prevent the C++ syntax from getting entirely overwhelming, define some alias macros | ||||||
|  | // | ||||||
|  | #define _GLM_SWIZZLE_TEMPLATE1   template <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3> | ||||||
|  | #define _GLM_SWIZZLE_TEMPLATE2   template <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3, int F0, int F1, int F2, int F3> | ||||||
|  | #define _GLM_SWIZZLE_TYPE1       _swizzle<N, T, P, vecType, E0, E1, E2, E3> | ||||||
|  | #define _GLM_SWIZZLE_TYPE2       _swizzle<N, T, P, vecType, F0, F1, F2, F3> | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // 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 vecType<T, P> operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b)  \ | ||||||
|  | 	{                                                                               \ | ||||||
|  | 		return a() OPERAND b();                                                     \ | ||||||
|  | 	}                                                                               \ | ||||||
|  | 	_GLM_SWIZZLE_TEMPLATE1                                                          \ | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const vecType<T, P>& b)                   \ | ||||||
|  | 	{                                                                               \ | ||||||
|  | 		return a() OPERAND b;                                                       \ | ||||||
|  | 	}                                                                               \ | ||||||
|  | 	_GLM_SWIZZLE_TEMPLATE1                                                          \ | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> operator OPERAND ( const vecType<T, P>& 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 vecType<T, P> operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const T& b)                   \ | ||||||
|  | 	{                                                                               \ | ||||||
|  | 		return a() OPERAND b;                                                       \ | ||||||
|  | 	}                                                                               \ | ||||||
|  | 	_GLM_SWIZZLE_TEMPLATE1                                                          \ | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> 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, P, V, E0,E1) \ | ||||||
|  | 	struct { detail::_swizzle<2, T, P, V, 0,0,-1,-2> E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<2, T, P, V, 0,1,-1,-2> E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<2, T, P, V, 1,0,-1,-2> E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<2, T, P, V, 1,1,-1,-2> E1 ## E1; };  | ||||||
|  |  | ||||||
|  | #define _GLM_SWIZZLE2_3_MEMBERS(T, P, V, E0,E1) \ | ||||||
|  | 	struct { detail::_swizzle<3,T, P, V, 0,0,0,-1> E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3,T, P, V, 0,0,1,-1> E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3,T, P, V, 0,1,0,-1> E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3,T, P, V, 0,1,1,-1> E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3,T, P, V, 1,0,0,-1> E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3,T, P, V, 1,0,1,-1> E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3,T, P, V, 1,1,0,-1> E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3,T, P, V, 1,1,1,-1> E1 ## E1 ## E1; };   | ||||||
|  |  | ||||||
|  | #define _GLM_SWIZZLE2_4_MEMBERS(T, P, V, E0,E1) \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; | ||||||
|  |  | ||||||
|  | #define _GLM_SWIZZLE3_2_MEMBERS(T, P, V, E0,E1,E2) \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 0,0,-1,-2> E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 0,1,-1,-2> E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 0,2,-1,-2> E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 1,0,-1,-2> E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 1,1,-1,-2> E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 1,2,-1,-2> E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 2,0,-1,-2> E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 2,1,-1,-2> E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 2,2,-1,-2> E2 ## E2; }; | ||||||
|  |  | ||||||
|  | #define _GLM_SWIZZLE3_3_MEMBERS(T, P, V ,E0,E1,E2) \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,0,0,-1> E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,0,1,-1> E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,0,2,-1> E0 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,1,0,-1> E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,1,1,-1> E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,1,2,-1> E0 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,2,0,-1> E0 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,2,1,-1> E0 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,2,2,-1> E0 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,0,0,-1> E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,0,1,-1> E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,0,2,-1> E1 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,1,0,-1> E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,1,1,-1> E1 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,1,2,-1> E1 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,2,0,-1> E1 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,2,1,-1> E1 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,2,2,-1> E1 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,0,0,-1> E2 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,0,1,-1> E2 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,0,2,-1> E2 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,1,0,-1> E2 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,1,1,-1> E2 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,1,2,-1> E2 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,2,0,-1> E2 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,2,1,-1> E2 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,2,2,-1> E2 ## E2 ## E2; }; | ||||||
|  |  | ||||||
|  | #define _GLM_SWIZZLE3_4_MEMBERS(T, P, V, E0,E1,E2) \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4,T, P, V, 2,2,2,2> E2 ## E2 ## E2 ## E2; };  | ||||||
|  |  | ||||||
|  | #define _GLM_SWIZZLE4_2_MEMBERS(T, P, V, E0,E1,E2,E3) \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 0,0,-1,-2> E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 0,1,-1,-2> E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 0,2,-1,-2> E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 0,3,-1,-2> E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 1,0,-1,-2> E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 1,1,-1,-2> E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 1,2,-1,-2> E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 1,3,-1,-2> E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 2,0,-1,-2> E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 2,1,-1,-2> E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 2,2,-1,-2> E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 2,3,-1,-2> E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 3,0,-1,-2> E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 3,1,-1,-2> E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 3,2,-1,-2> E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<2,T, P, V, 3,3,-1,-2> E3 ## E3; };  | ||||||
|  |  | ||||||
|  | #define _GLM_SWIZZLE4_3_MEMBERS(T, P, V, E0,E1,E2,E3) \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,0,0,-1> E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,0,1,-1> E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,0,2,-1> E0 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,0,3,-1> E0 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,1,0,-1> E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,1,1,-1> E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,1,2,-1> E0 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,1,3,-1> E0 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,2,0,-1> E0 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,2,1,-1> E0 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,2,2,-1> E0 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,2,3,-1> E0 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,3,0,-1> E0 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,3,1,-1> E0 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,3,2,-1> E0 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 0,3,3,-1> E0 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,0,0,-1> E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,0,1,-1> E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,0,2,-1> E1 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,0,3,-1> E1 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,1,0,-1> E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,1,1,-1> E1 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,1,2,-1> E1 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,1,3,-1> E1 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,2,0,-1> E1 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,2,1,-1> E1 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,2,2,-1> E1 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,2,3,-1> E1 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,3,0,-1> E1 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,3,1,-1> E1 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,3,2,-1> E1 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 1,3,3,-1> E1 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,0,0,-1> E2 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,0,1,-1> E2 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,0,2,-1> E2 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,0,3,-1> E2 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,1,0,-1> E2 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,1,1,-1> E2 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,1,2,-1> E2 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,1,3,-1> E2 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,2,0,-1> E2 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,2,1,-1> E2 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,2,2,-1> E2 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,2,3,-1> E2 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,3,0,-1> E2 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,3,1,-1> E2 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,3,2,-1> E2 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 2,3,3,-1> E2 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,0,0,-1> E3 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,0,1,-1> E3 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,0,2,-1> E3 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,0,3,-1> E3 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,1,0,-1> E3 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,1,1,-1> E3 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,1,2,-1> E3 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,1,3,-1> E3 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,2,0,-1> E3 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,2,1,-1> E3 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,2,2,-1> E3 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,2,3,-1> E3 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,3,0,-1> E3 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,3,1,-1> E3 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,3,2,-1> E3 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<3, T, P, V, 3,3,3,-1> E3 ## E3 ## E3; };   | ||||||
|  |  | ||||||
|  | #define _GLM_SWIZZLE4_4_MEMBERS(T, P, V, E0,E1,E2,E3) \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,0,3> E0 ## E0 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,1,3> E0 ## E0 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,2,3> E0 ## E0 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,3,0> E0 ## E0 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,3,1> E0 ## E0 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,3,2> E0 ## E0 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,0,3,3> E0 ## E0 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,0,3> E0 ## E1 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,1,3> E0 ## E1 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,2,3> E0 ## E1 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,3,0> E0 ## E1 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,3,1> E0 ## E1 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,3,2> E0 ## E1 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,1,3,3> E0 ## E1 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,0,3> E0 ## E2 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,1,3> E0 ## E2 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,2,3> E0 ## E2 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,3,0> E0 ## E2 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,3,1> E0 ## E2 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,3,2> E0 ## E2 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,2,3,3> E0 ## E2 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,0,0> E0 ## E3 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,0,1> E0 ## E3 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,0,2> E0 ## E3 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,0,3> E0 ## E3 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,1,0> E0 ## E3 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,1,1> E0 ## E3 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,1,2> E0 ## E3 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,1,3> E0 ## E3 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,2,0> E0 ## E3 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,2,1> E0 ## E3 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,2,2> E0 ## E3 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,2,3> E0 ## E3 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,3,0> E0 ## E3 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,3,1> E0 ## E3 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,3,2> E0 ## E3 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 0,3,3,3> E0 ## E3 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,0,3> E1 ## E0 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,1,3> E1 ## E0 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,2,3> E1 ## E0 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,3,0> E1 ## E0 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,3,1> E1 ## E0 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,3,2> E1 ## E0 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,0,3,3> E1 ## E0 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,0,3> E1 ## E1 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,1,3> E1 ## E1 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,2,3> E1 ## E1 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,3,0> E1 ## E1 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,3,1> E1 ## E1 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,3,2> E1 ## E1 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,1,3,3> E1 ## E1 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,0,3> E1 ## E2 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,1,3> E1 ## E2 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,2,3> E1 ## E2 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,3,0> E1 ## E2 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,3,1> E1 ## E2 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,3,2> E1 ## E2 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,2,3,3> E1 ## E2 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,0,0> E1 ## E3 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,0,1> E1 ## E3 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,0,2> E1 ## E3 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,0,3> E1 ## E3 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,1,0> E1 ## E3 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,1,1> E1 ## E3 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,1,2> E1 ## E3 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,1,3> E1 ## E3 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,2,0> E1 ## E3 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,2,1> E1 ## E3 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,2,2> E1 ## E3 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,2,3> E1 ## E3 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,3,0> E1 ## E3 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,3,1> E1 ## E3 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,3,2> E1 ## E3 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 1,3,3,3> E1 ## E3 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,0,3> E2 ## E0 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,1,3> E2 ## E0 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,2,3> E2 ## E0 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,3,0> E2 ## E0 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,3,1> E2 ## E0 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,3,2> E2 ## E0 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,0,3,3> E2 ## E0 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,0,3> E2 ## E1 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,1,3> E2 ## E1 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,2,3> E2 ## E1 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,3,0> E2 ## E1 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,3,1> E2 ## E1 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,3,2> E2 ## E1 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,1,3,3> E2 ## E1 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,0,3> E2 ## E2 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,1,3> E2 ## E2 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,2,3> E2 ## E2 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,3,0> E2 ## E2 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,3,1> E2 ## E2 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,3,2> E2 ## E2 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,2,3,3> E2 ## E2 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,0,0> E2 ## E3 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,0,1> E2 ## E3 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,0,2> E2 ## E3 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,0,3> E2 ## E3 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,1,0> E2 ## E3 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,1,1> E2 ## E3 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,1,2> E2 ## E3 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,1,3> E2 ## E3 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,2,0> E2 ## E3 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,2,1> E2 ## E3 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,2,2> E2 ## E3 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,2,3> E2 ## E3 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,3,0> E2 ## E3 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,3,1> E2 ## E3 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,3,2> E2 ## E3 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 2,3,3,3> E2 ## E3 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,0,0> E3 ## E0 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,0,1> E3 ## E0 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,0,2> E3 ## E0 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,0,3> E3 ## E0 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,1,0> E3 ## E0 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,1,1> E3 ## E0 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,1,2> E3 ## E0 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,1,3> E3 ## E0 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,2,0> E3 ## E0 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,2,1> E3 ## E0 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,2,2> E3 ## E0 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,2,3> E3 ## E0 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,3,0> E3 ## E0 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,3,1> E3 ## E0 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,3,2> E3 ## E0 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,0,3,3> E3 ## E0 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,0,0> E3 ## E1 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,0,1> E3 ## E1 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,0,2> E3 ## E1 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,0,3> E3 ## E1 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,1,0> E3 ## E1 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,1,1> E3 ## E1 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,1,2> E3 ## E1 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,1,3> E3 ## E1 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,2,0> E3 ## E1 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,2,1> E3 ## E1 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,2,2> E3 ## E1 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,2,3> E3 ## E1 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,3,0> E3 ## E1 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,3,1> E3 ## E1 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,3,2> E3 ## E1 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,1,3,3> E3 ## E1 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,0,0> E3 ## E2 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,0,1> E3 ## E2 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,0,2> E3 ## E2 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,0,3> E3 ## E2 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,1,0> E3 ## E2 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,1,1> E3 ## E2 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,1,2> E3 ## E2 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,1,3> E3 ## E2 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,2,0> E3 ## E2 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,2,1> E3 ## E2 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,2,2> E3 ## E2 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,2,3> E3 ## E2 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,3,0> E3 ## E2 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,3,1> E3 ## E2 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,3,2> E3 ## E2 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,2,3,3> E3 ## E2 ## E3 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,0,0> E3 ## E3 ## E0 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,0,1> E3 ## E3 ## E0 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,0,2> E3 ## E3 ## E0 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,0,3> E3 ## E3 ## E0 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,1,0> E3 ## E3 ## E1 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,1,1> E3 ## E3 ## E1 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,1,2> E3 ## E3 ## E1 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,1,3> E3 ## E3 ## E1 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,2,0> E3 ## E3 ## E2 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,2,1> E3 ## E3 ## E2 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,2,2> E3 ## E3 ## E2 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,2,3> E3 ## E3 ## E2 ## E3; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,3,0> E3 ## E3 ## E3 ## E0; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,3,1> E3 ## E3 ## E3 ## E1; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,3,2> E3 ## E3 ## E3 ## E2; }; \ | ||||||
|  | 	struct { detail::_swizzle<4, T, P, V, 3,3,3,3> E3 ## E3 ## E3 ## E3; }; | ||||||
							
								
								
									
										696
									
								
								lib/glm/detail/_swizzle_func.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										696
									
								
								lib/glm/detail/_swizzle_func.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,696 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/_swizzle_func.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B)	\ | ||||||
|  | 	SWIZZLED_TYPE<TMPL_TYPE, PRECISION> A ## B() CONST												\ | ||||||
|  | 	{																								\ | ||||||
|  | 		return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B);								\ | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C)		\ | ||||||
|  | 	SWIZZLED_TYPE<TMPL_TYPE, PRECISION> A ## B ## C() CONST												\ | ||||||
|  | 	{																									\ | ||||||
|  | 		return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C);							\ | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D)	\ | ||||||
|  | 	SWIZZLED_TYPE<TMPL_TYPE, PRECISION> A ## B ## C ## D() CONST										\ | ||||||
|  | 	{																									\ | ||||||
|  | 		return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C, this->D);					\ | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B)	\ | ||||||
|  | 	template <typename TMPL_TYPE>																		\ | ||||||
|  | 	SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE, PRECISION>::A ## B() CONST							\ | ||||||
|  | 	{																									\ | ||||||
|  | 		return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B);									\ | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C)		\ | ||||||
|  | 	template <typename TMPL_TYPE>																			\ | ||||||
|  | 	SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE, PRECISION>::A ## B ## C() CONST							\ | ||||||
|  | 	{																										\ | ||||||
|  | 		return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C);								\ | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D)	\ | ||||||
|  | 	template <typename TMPL_TYPE>																			\ | ||||||
|  | 	SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE, PRECISION>::A ## B ## C ## D() CONST						\ | ||||||
|  | 	{																										\ | ||||||
|  | 		return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C, this->D);						\ | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | #define GLM_MUTABLE | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_REF_FROM_VEC2(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, x, y) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, r, g) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, s, t) | ||||||
|  |  | ||||||
|  | //GLM_SWIZZLE_GEN_REF_FROM_VEC2(valType, detail::vec2, detail::ref2) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B, A) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_REF_FROM_VEC3(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, x, y, z) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, r, g, b) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, s, t, p) | ||||||
|  |  | ||||||
|  | //GLM_SWIZZLE_GEN_REF_FROM_VEC3(valType, detail::vec3, detail::ref2, detail::ref3) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, C) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C, A) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_REF_FROM_VEC4(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, p, q) | ||||||
|  |  | ||||||
|  | //GLM_SWIZZLE_GEN_REF_FROM_VEC4(valType, detail::vec4, detail::ref2, detail::ref3, detail::ref4) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE)			\ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y)	\ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g)	\ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t) | ||||||
|  |  | ||||||
|  | //GLM_SWIZZLE_GEN_VEC_FROM_VEC2(valType, detail::vec2, detail::vec2, detail::vec3, detail::vec4) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, p) | ||||||
|  |  | ||||||
|  | //GLM_SWIZZLE_GEN_VEC_FROM_VEC3(valType, detail::vec3, detail::vec2, detail::vec3, detail::vec4) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, A) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, B) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, C) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, D) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \ | ||||||
|  | 	GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, p, q) | ||||||
|  |  | ||||||
|  | //GLM_SWIZZLE_GEN_VEC_FROM_VEC4(valType, detail::vec4, detail::vec2, detail::vec3, detail::vec4) | ||||||
							
								
								
									
										131
									
								
								lib/glm/detail/_vectorize.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								lib/glm/detail/_vectorize.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,131 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/_vectorize.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "type_vec1.hpp" | ||||||
|  | #include "type_vec2.hpp" | ||||||
|  | #include "type_vec3.hpp" | ||||||
|  | #include "type_vec4.hpp" | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <typename R, typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	struct functor1{}; | ||||||
|  |  | ||||||
|  | 	template <typename R, typename T, precision P> | ||||||
|  | 	struct functor1<R, T, P, tvec1> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec1<R, P> call(R (*Func) (T x), tvec1<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			return tvec1<R, P>(Func(v.x)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename R, typename T, precision P> | ||||||
|  | 	struct functor1<R, T, P, tvec2> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec2<R, P> call(R (*Func) (T x), tvec2<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			return tvec2<R, P>(Func(v.x), Func(v.y)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename R, typename T, precision P> | ||||||
|  | 	struct functor1<R, T, P, tvec3> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec3<R, P> call(R (*Func) (T x), tvec3<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			return tvec3<R, P>(Func(v.x), Func(v.y), Func(v.z)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename R, typename T, precision P> | ||||||
|  | 	struct functor1<R, T, P, tvec4> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<R, P> call(R (*Func) (T x), tvec4<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<R, P>(Func(v.x), Func(v.y), Func(v.z), Func(v.w)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	struct functor2{}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct functor2<T, P, tvec1> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec1<T, P> call(T (*Func) (T x, T y), tvec1<T, P> const & a, tvec1<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec1<T, P>(Func(a.x, b.x)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct functor2<T, P, tvec2> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec2<T, P> call(T (*Func) (T x, T y), tvec2<T, P> const & a, tvec2<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec2<T, P>(Func(a.x, b.x), Func(a.y, b.y)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct functor2<T, P, tvec3> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec3<T, P> call(T (*Func) (T x, T y), tvec3<T, P> const & a, tvec3<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec3<T, P>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct functor2<T, P, tvec4> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(T (*Func) (T x, T y), tvec4<T, P> const & a, tvec4<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	struct functor2_vec_sca{}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct functor2_vec_sca<T, P, tvec1> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec1<T, P> call(T (*Func) (T x, T y), tvec1<T, P> const & a, T b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec1<T, P>(Func(a.x, b)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct functor2_vec_sca<T, P, tvec2> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec2<T, P> call(T (*Func) (T x, T y), tvec2<T, P> const & a, T b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec2<T, P>(Func(a.x, b), Func(a.y, b)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct functor2_vec_sca<T, P, tvec3> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec3<T, P> call(T (*Func) (T x, T y), tvec3<T, P> const & a, T b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec3<T, P>(Func(a.x, b), Func(a.y, b), Func(a.z, b)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct functor2_vec_sca<T, P, tvec4> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(T (*Func) (T x, T y), tvec4<T, P> const & a, T b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										207
									
								
								lib/glm/detail/dummy.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								lib/glm/detail/dummy.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,207 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/core/dummy.cpp | ||||||
|  | /// | ||||||
|  | /// GLM is a header only library. There is nothing to compile.  | ||||||
|  | /// dummy.cpp exist only a wordaround for CMake file. | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | #define GLM_MESSAGES | ||||||
|  | #include <glm/glm.hpp> | ||||||
|  | #include <glm/ext.hpp> | ||||||
|  | #include <limits> | ||||||
|  |  | ||||||
|  | struct material | ||||||
|  | { | ||||||
|  | 	glm::vec4 emission; // Ecm | ||||||
|  | 	glm::vec4 ambient; // Acm | ||||||
|  | 	glm::vec4 diffuse; // Dcm | ||||||
|  | 	glm::vec4 specular; // Scm | ||||||
|  | 	float shininess; // Srm | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | struct light | ||||||
|  | { | ||||||
|  | 	glm::vec4 ambient; // Acli | ||||||
|  | 	glm::vec4 diffuse; // Dcli | ||||||
|  | 	glm::vec4 specular; // Scli | ||||||
|  | 	glm::vec4 position; // Ppli | ||||||
|  | 	glm::vec4 halfVector; // Derived: Hi | ||||||
|  | 	glm::vec3 spotDirection; // Sdli | ||||||
|  | 	float spotExponent; // Srli | ||||||
|  | 	float spotCutoff; // Crli | ||||||
|  | 	// (range: [0.0,90.0], 180.0) | ||||||
|  | 	float spotCosCutoff; // Derived: cos(Crli) | ||||||
|  | 	// (range: [1.0,0.0],-1.0) | ||||||
|  | 	float constantAttenuation; // K0 | ||||||
|  | 	float linearAttenuation; // K1 | ||||||
|  | 	float quadraticAttenuation;// K2 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Sample 1 | ||||||
|  | #include <glm/vec3.hpp>// glm::vec3 | ||||||
|  | #include <glm/geometric.hpp>// glm::cross, glm::normalize | ||||||
|  |  | ||||||
|  | glm::vec3 computeNormal | ||||||
|  | ( | ||||||
|  | 	glm::vec3 const & a, | ||||||
|  | 	glm::vec3 const & b, | ||||||
|  | 	glm::vec3 const & c | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	return glm::normalize(glm::cross(c - a, b - a)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | typedef unsigned int GLuint; | ||||||
|  | #define GL_FALSE 0 | ||||||
|  | void glUniformMatrix4fv(GLuint, int, int, float*){} | ||||||
|  |  | ||||||
|  | // Sample 2 | ||||||
|  | #include <glm/vec3.hpp> // glm::vec3 | ||||||
|  | #include <glm/vec4.hpp> // glm::vec4, glm::ivec4 | ||||||
|  | #include <glm/mat4x4.hpp> // glm::mat4 | ||||||
|  | #include <glm/gtc/matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective | ||||||
|  | #include <glm/gtc/type_ptr.hpp> // glm::value_ptr | ||||||
|  | void func(GLuint LocationMVP, float Translate, glm::vec2 const & Rotate) | ||||||
|  | { | ||||||
|  | 	glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f); | ||||||
|  | 	glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate)); | ||||||
|  | 	glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f)); | ||||||
|  | 	glm::mat4 View = glm::rotate(ViewRotateX, Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f)); | ||||||
|  | 	glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f)); | ||||||
|  | 	glm::mat4 MVP = Projection * View * Model; | ||||||
|  | 	glUniformMatrix4fv(LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Sample 3 | ||||||
|  | #include <glm/vec2.hpp>// glm::vec2 | ||||||
|  | #include <glm/packing.hpp>// glm::packUnorm2x16 | ||||||
|  | #include <glm/integer.hpp>// glm::uint | ||||||
|  | #include <glm/gtc/type_precision.hpp>// glm::i8vec2, glm::i32vec2 | ||||||
|  | std::size_t const VertexCount = 4; | ||||||
|  | // Float quad geometry | ||||||
|  | std::size_t const PositionSizeF32 = VertexCount * sizeof(glm::vec2); | ||||||
|  | glm::vec2 const PositionDataF32[VertexCount] = | ||||||
|  | { | ||||||
|  | 	glm::vec2(-1.0f,-1.0f), | ||||||
|  | 	glm::vec2( 1.0f,-1.0f), | ||||||
|  | 	glm::vec2( 1.0f, 1.0f), | ||||||
|  | 	glm::vec2(-1.0f, 1.0f) | ||||||
|  | 	}; | ||||||
|  | // Half-float quad geometry | ||||||
|  | std::size_t const PositionSizeF16 = VertexCount * sizeof(glm::uint); | ||||||
|  | glm::uint const PositionDataF16[VertexCount] = | ||||||
|  | { | ||||||
|  | 	glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, -1.0f))), | ||||||
|  | 	glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, -1.0f))), | ||||||
|  | 	glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, 1.0f))), | ||||||
|  | 	glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, 1.0f))) | ||||||
|  | }; | ||||||
|  | // 8 bits signed integer quad geometry | ||||||
|  | std::size_t const PositionSizeI8 = VertexCount * sizeof(glm::i8vec2); | ||||||
|  | glm::i8vec2 const PositionDataI8[VertexCount] = | ||||||
|  | { | ||||||
|  | 	glm::i8vec2(-1,-1), | ||||||
|  | 	glm::i8vec2( 1,-1), | ||||||
|  | 	glm::i8vec2( 1, 1), | ||||||
|  | 	glm::i8vec2(-1, 1) | ||||||
|  | }; | ||||||
|  | // 32 bits signed integer quad geometry | ||||||
|  | std::size_t const PositionSizeI32 = VertexCount * sizeof(glm::i32vec2); | ||||||
|  | glm::i32vec2 const PositionDataI32[VertexCount] = | ||||||
|  | { | ||||||
|  | 	glm::i32vec2 (-1,-1), | ||||||
|  | 	glm::i32vec2 ( 1,-1), | ||||||
|  | 	glm::i32vec2 ( 1, 1), | ||||||
|  | 	glm::i32vec2 (-1, 1) | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | struct intersection | ||||||
|  | { | ||||||
|  | 	glm::vec4 position; | ||||||
|  | 	glm::vec3 normal; | ||||||
|  | }; | ||||||
|  | */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | // Sample 4 | ||||||
|  | #include <glm/vec3.hpp>// glm::vec3 | ||||||
|  | #include <glm/geometric.hpp>// glm::normalize, glm::dot, glm::reflect | ||||||
|  | #include <glm/exponential.hpp>// glm::pow | ||||||
|  | #include <glm/gtc/random.hpp>// glm::vecRand3 | ||||||
|  | glm::vec3 lighting | ||||||
|  | ( | ||||||
|  | 	intersection const & Intersection, | ||||||
|  | 	material const & Material, | ||||||
|  | 	light const & Light, | ||||||
|  | 	glm::vec3 const & View | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	glm::vec3 Color(0.0f); | ||||||
|  | 	glm::vec3 LightVertor(glm::normalize( | ||||||
|  | 		Light.position - Intersection.position + | ||||||
|  | 		glm::vecRand3(0.0f, Light.inaccuracy)); | ||||||
|  |  | ||||||
|  | 	if(!shadow(Intersection.position, Light.position, LightVertor)) | ||||||
|  | 	{ | ||||||
|  | 		float Diffuse = glm::dot(Intersection.normal, LightVector); | ||||||
|  | 		if(Diffuse <= 0.0f) | ||||||
|  | 			return Color; | ||||||
|  | 		if(Material.isDiffuse()) | ||||||
|  | 			Color += Light.color() * Material.diffuse * Diffuse; | ||||||
|  | 		if(Material.isSpecular()) | ||||||
|  | 		{ | ||||||
|  | 			glm::vec3 Reflect(glm::reflect( | ||||||
|  | 				glm::normalize(-LightVector), | ||||||
|  | 				glm::normalize(Intersection.normal))); | ||||||
|  | 			float Dot = glm::dot(Reflect, View); | ||||||
|  | 			float Base = Dot > 0.0f ? Dot : 0.0f; | ||||||
|  | 			float Specular = glm::pow(Base, Material.exponent); | ||||||
|  | 			Color += Material.specular * Specular; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return Color; | ||||||
|  | } | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | template <typename T, glm::precision P, template<typename, glm::precision> class vecType> | ||||||
|  | T normalizeDotA(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | { | ||||||
|  | 	return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #define GLM_TEMPLATE_GENTYPE typename T, glm::precision P, template<typename, glm::precision> class | ||||||
|  |  | ||||||
|  | template <GLM_TEMPLATE_GENTYPE vecType> | ||||||
|  | T normalizeDotB(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | { | ||||||
|  | 	return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vecType> | ||||||
|  | typename vecType::value_type normalizeDotC(vecType const & a, vecType const & b) | ||||||
|  | { | ||||||
|  | 	return glm::dot(a, b) * glm::inversesqrt(glm::dot(a, a) * glm::dot(b, b)); | ||||||
|  | } | ||||||
|  | */ | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  | /* | ||||||
|  | 	glm::vec1 o(1); | ||||||
|  | 	glm::vec2 a(1); | ||||||
|  | 	glm::vec3 b(1); | ||||||
|  | 	glm::vec4 c(1); | ||||||
|  |  | ||||||
|  | 	glm::quat q; | ||||||
|  | 	glm::dualquat p; | ||||||
|  |  | ||||||
|  | 	glm::mat4 m(1); | ||||||
|  |  | ||||||
|  | 	float a0 = normalizeDotA(a, a); | ||||||
|  | 	float b0 = normalizeDotB(b, b); | ||||||
|  | 	float c0 = normalizeDotC(c, c); | ||||||
|  | */ | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
							
								
								
									
										427
									
								
								lib/glm/detail/func_common.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										427
									
								
								lib/glm/detail/func_common.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,427 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_common.hpp | ||||||
|  | ///  | ||||||
|  | /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | /// | ||||||
|  | /// @defgroup core_func_common Common functions | ||||||
|  | /// @ingroup core | ||||||
|  | ///  | ||||||
|  | /// These all operate component-wise. The description is per component. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "setup.hpp" | ||||||
|  | #include "precision.hpp" | ||||||
|  | #include "type_int.hpp" | ||||||
|  | #include "_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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml">GLSL abs man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL genType abs(genType x); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> abs(vecType<T, P> const & x); | ||||||
|  |  | ||||||
|  | 	/// Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0.  | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam genType Floating-point or signed integer; scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sign.xml">GLSL sign man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> sign(vecType<T, P> const & x); | ||||||
|  |  | ||||||
|  | 	/// Returns a value equal to the nearest integer that is less then or equal to x.  | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floor.xml">GLSL floor man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> floor(vecType<T, P> 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 genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/trunc.xml">GLSL trunc man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> trunc(vecType<T, P> 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 genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml">GLSL round man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> round(vecType<T, P> 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 genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/roundEven.xml">GLSL roundEven man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	/// @see <a href="http://developer.amd.com/documentation/articles/pages/New-Round-to-Even-Technique.aspx">New round to even technique</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> roundEven(vecType<T, P> const & x); | ||||||
|  |  | ||||||
|  | 	/// Returns a value equal to the nearest integer | ||||||
|  | 	/// that is greater than or equal to x. | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/ceil.xml">GLSL ceil man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> ceil(vecType<T, P> const & x); | ||||||
|  |  | ||||||
|  | 	/// Return x - floor(x). | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml">GLSL fract man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL genType fract(genType x); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> fract(vecType<T, P> const & x); | ||||||
|  |  | ||||||
|  | 	/// Modulus. Returns x - y * floor(x / y) | ||||||
|  | 	/// for each component in x using the floating point value y. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL genType mod(genType x, genType y); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> mod(vecType<T, P> const & x, T y); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> mod(vecType<T, P> const & x, vecType<T, P> 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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/modf.xml">GLSL modf man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml">GLSL min man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL genType min(genType x, genType y); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> min(vecType<T, P> const & x, T y); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> min(vecType<T, P> const & x, vecType<T, P> const & y); | ||||||
|  |  | ||||||
|  | 	/// Returns y if x < y; otherwise, it returns x. | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam genType Floating-point or integer; scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml">GLSL max man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL genType max(genType x, genType y); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> max(vecType<T, P> const & x, T y); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> max(vecType<T, P> const & x, vecType<T, P> 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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml">GLSL clamp man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL genType clamp(genType x, genType minVal, genType maxVal); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> clamp(vecType<T, P> const & x, T minVal, T maxVal); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> clamp(vecType<T, P> const & x, vecType<T, P> const & minVal, vecType<T, P> 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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mix.xml">GLSL mix man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	///  | ||||||
|  | 	/// @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 <glm/glm.hpp> | ||||||
|  | 	/// ... | ||||||
|  | 	/// 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); // Teturns 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 <typename T, typename U, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> mix(vecType<T, P> const & x, vecType<T, P> const & y, vecType<U, P> const & a); | ||||||
|  |  | ||||||
|  | 	template <typename T, typename U, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> mix(vecType<T, P> const & x, vecType<T, P> const & y, U a); | ||||||
|  |  | ||||||
|  | 	template <typename genTypeT, typename genTypeU> | ||||||
|  | 	GLM_FUNC_DECL genTypeT mix(genTypeT x, genTypeT y, genTypeU a); | ||||||
|  |  | ||||||
|  | 	/// Returns 0.0 if x < edge, otherwise it returns 1.0 for each component of a genType. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL genType step(genType edge, genType x); | ||||||
|  |  | ||||||
|  | 	/// Returns 0.0 if x < edge, otherwise it returns 1.0. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <template <typename, precision> class vecType, typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> step(T edge, vecType<T, P> const & x); | ||||||
|  |  | ||||||
|  | 	/// Returns 0.0 if x < edge, otherwise it returns 1.0. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <template <typename, precision> class vecType, typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> step(vecType<T, P> const & edge, vecType<T, P> 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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/smoothstep.xml">GLSL smoothstep man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL genType smoothstep(genType edge0, genType edge1, genType x); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> smoothstep(T edge0, T edge1, vecType<T, P> const & x); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> smoothstep(vecType<T, P> const & edge0, vecType<T, P> const & edge1, vecType<T, P> 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 genType Floating-point scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml">GLSL isnan man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<bool, P> isnan(vecType<T, P> 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 genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/isinf.xml">GLSL isinf man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<bool, P> isinf(vecType<T, P> 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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml">GLSL floatBitsToInt man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	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. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml">GLSL floatBitsToInt man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <template <typename, precision> class vecType, precision P> | ||||||
|  | 	GLM_FUNC_DECL vecType<int, P> floatBitsToInt(vecType<float, P> 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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml">GLSL floatBitsToUint man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	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. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml">GLSL floatBitsToUint man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <template <typename, precision> class vecType, precision P> | ||||||
|  | 	GLM_FUNC_DECL vecType<uint, P> floatBitsToUint(vecType<float, P> 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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml">GLSL intBitsToFloat man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	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. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml">GLSL intBitsToFloat man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <template <typename, precision> class vecType, precision P> | ||||||
|  | 	GLM_FUNC_DECL vecType<float, P> intBitsToFloat(vecType<int, P> 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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml">GLSL uintBitsToFloat man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	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. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml">GLSL uintBitsToFloat man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <template <typename, precision> class vecType, precision P> | ||||||
|  | 	GLM_FUNC_DECL vecType<float, P> uintBitsToFloat(vecType<uint, P> const & v); | ||||||
|  |  | ||||||
|  | 	/// Computes and returns a * b + c. | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/fma.xml">GLSL fma man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/frexp.xml">GLSL frexp man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType, typename genIType> | ||||||
|  | 	GLM_FUNC_DECL genType frexp(genType const & x, genIType & 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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/ldexp.xml">GLSL ldexp man page</a>;  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> | ||||||
|  | 	template <typename genType, typename genIType> | ||||||
|  | 	GLM_FUNC_DECL genType ldexp(genType const & x, genIType const & exp); | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #include "func_common.inl" | ||||||
|  |  | ||||||
							
								
								
									
										849
									
								
								lib/glm/detail/func_common.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										849
									
								
								lib/glm/detail/func_common.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,849 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_common.inl | ||||||
|  |  | ||||||
|  | #include "func_vector_relational.hpp" | ||||||
|  | #include "type_vec2.hpp" | ||||||
|  | #include "type_vec3.hpp" | ||||||
|  | #include "type_vec4.hpp" | ||||||
|  | #include "_vectorize.hpp" | ||||||
|  | #include <limits> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	// min | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType min(genType x, genType y) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || std::numeric_limits<genType>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'min' only accept floating-point or integer inputs"); | ||||||
|  | 		return x < y ? x : y; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// max | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType max(genType x, genType y) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || std::numeric_limits<genType>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'max' only accept floating-point or integer inputs"); | ||||||
|  |  | ||||||
|  | 		return x > y ? x : y; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// abs | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER int32 abs(int32 x) | ||||||
|  | 	{ | ||||||
|  | 		int32 const y = x >> 31; | ||||||
|  | 		return (x ^ y) - y; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// round | ||||||
|  | #	if GLM_HAS_CXX11_STL | ||||||
|  | 		using ::std::round; | ||||||
|  | #	else | ||||||
|  | 		template <typename genType> | ||||||
|  | 		GLM_FUNC_QUALIFIER genType round(genType x) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'round' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 			return x < static_cast<genType>(0) ? static_cast<genType>(int(x - static_cast<genType>(0.5))) : static_cast<genType>(int(x + static_cast<genType>(0.5))); | ||||||
|  | 		} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	// trunc | ||||||
|  | #	if GLM_HAS_CXX11_STL | ||||||
|  | 		using ::std::trunc; | ||||||
|  | #	else | ||||||
|  | 		template <typename genType> | ||||||
|  | 		GLM_FUNC_QUALIFIER genType trunc(genType x) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'trunc' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 			return x < static_cast<genType>(0) ? -std::floor(-x) : std::floor(x); | ||||||
|  | 		} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <typename genFIType, bool /*signed*/> | ||||||
|  | 	struct compute_abs | ||||||
|  | 	{}; | ||||||
|  |  | ||||||
|  | 	template <typename genFIType> | ||||||
|  | 	struct compute_abs<genFIType, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static genFIType call(genFIType x) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT( | ||||||
|  | 				std::numeric_limits<genFIType>::is_iec559 || std::numeric_limits<genFIType>::is_signed || GLM_UNRESTRICTED_GENTYPE, | ||||||
|  | 				"'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<float, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static float call(float x) | ||||||
|  | 		{ | ||||||
|  | 			return fabsf(x); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | 	#endif | ||||||
|  |  | ||||||
|  | 	template <typename genFIType> | ||||||
|  | 	struct compute_abs<genFIType, false> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static genFIType call(genFIType x) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT( | ||||||
|  | 				(!std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer) || GLM_UNRESTRICTED_GENTYPE, | ||||||
|  | 				"'abs' only accept floating-point and integer scalar or vector inputs"); | ||||||
|  | 			return x; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_abs_vector | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			return detail::functor1<T, T, P, vecType>::call(abs, x); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, typename U, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_mix_vector | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y, vecType<U, P> const & a) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<U>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); | ||||||
|  |  | ||||||
|  | 			return vecType<T, P>(vecType<U, P>(x) + a * vecType<U, P>(y - x)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_mix_vector<T, bool, P, vecType, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y, vecType<bool, P> const & a) | ||||||
|  | 		{ | ||||||
|  | 			vecType<T, P> Result(uninitialize); | ||||||
|  | 			for(length_t i = 0; i < x.length(); ++i) | ||||||
|  | 				Result[i] = a[i] ? y[i] : x[i]; | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, typename U, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_mix_scalar | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y, U const & a) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<U>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); | ||||||
|  |  | ||||||
|  | 			return vecType<T, P>(vecType<U, P>(x) + a * vecType<U, P>(y - x)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_mix_scalar<T, bool, P, vecType, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y, bool const & a) | ||||||
|  | 		{ | ||||||
|  | 			return a ? y : x; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, typename U> | ||||||
|  | 	struct compute_mix | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static T call(T const & x, T const & y, U const & a) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<U>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); | ||||||
|  |  | ||||||
|  | 			return static_cast<T>(static_cast<U>(x) + a * static_cast<U>(y - x)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T> | ||||||
|  | 	struct compute_mix<T, bool> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static T call(T const & x, T const & y, bool const & a) | ||||||
|  | 		{ | ||||||
|  | 			return a ? y : x; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool isFloat, bool Aligned> | ||||||
|  | 	struct compute_sign | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			return vecType<T, P>(glm::lessThan(vecType<T, P>(0), x)) - vecType<T, P>(glm::lessThan(x, vecType<T, P>(0))); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH == GLM_ARCH_X86 | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_sign<T, P, vecType, false, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			T const Shift(static_cast<T>(sizeof(T) * 8 - 1)); | ||||||
|  | 			vecType<T, P> const y(vecType<typename make_unsigned<T>::type, P>(-x) >> typename make_unsigned<T>::type(Shift)); | ||||||
|  |  | ||||||
|  | 			return (x >> Shift) | y; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_floor | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			return detail::functor1<T, T, P, vecType>::call(std::floor, x); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_ceil | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			return detail::functor1<T, T, P, vecType>::call(std::ceil, x); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_fract | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			return x - floor(x); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_trunc | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			return detail::functor1<T, T, P, vecType>::call(trunc, x); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_round | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			return detail::functor1<T, T, P, vecType>::call(round, x); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_mod | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & a, vecType<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'mod' only accept floating-point inputs. Include <glm/gtc/integer.hpp> for integer inputs."); | ||||||
|  | 			return a - b * floor(a / b); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_min_vector | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | 		{ | ||||||
|  | 			return detail::functor2<T, P, vecType>::call(min, x, y); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_max_vector | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | 		{ | ||||||
|  | 			return detail::functor2<T, P, vecType>::call(max, x, y); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_clamp_vector | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & minVal, vecType<T, P> const & maxVal) | ||||||
|  | 		{ | ||||||
|  | 			return min(max(x, minVal), maxVal); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_step_vector | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & edge, vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			return mix(vecType<T, P>(1), vecType<T, P>(0), glm::lessThan(x, edge)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_smoothstep_vector | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & edge0, vecType<T, P> const & edge1, vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'step' only accept floating-point inputs"); | ||||||
|  | 			vecType<T, P> const tmp(clamp((x - edge0) / (edge1 - edge0), static_cast<T>(0), static_cast<T>(1))); | ||||||
|  | 			return tmp * tmp * (static_cast<T>(3) - static_cast<T>(2) * tmp); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | 	template <typename genFIType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genFIType abs(genFIType x) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_abs<genFIType, std::numeric_limits<genFIType>::is_signed>::call(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> abs(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_abs_vector<T, P, vecType, detail::is_aligned<P>::value>::call(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// sign | ||||||
|  | 	// fast and works for any type | ||||||
|  | 	template <typename genFIType>  | ||||||
|  | 	GLM_FUNC_QUALIFIER genFIType sign(genFIType x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT( | ||||||
|  | 			std::numeric_limits<genFIType>::is_iec559 || (std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer), | ||||||
|  | 			"'sign' only accept signed inputs"); | ||||||
|  | 		 | ||||||
|  | 		return detail::compute_sign<genFIType, defaultp, tvec1, std::numeric_limits<genFIType>::is_iec559, highp>::call(tvec1<genFIType>(x)).x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> sign(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT( | ||||||
|  | 			std::numeric_limits<T>::is_iec559 || (std::numeric_limits<T>::is_signed && std::numeric_limits<T>::is_integer), | ||||||
|  | 			"'sign' only accept signed inputs"); | ||||||
|  |  | ||||||
|  | 		return detail::compute_sign<T, P, vecType, std::numeric_limits<T>::is_iec559, detail::is_aligned<P>::value>::call(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// floor | ||||||
|  | 	using ::std::floor; | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> floor(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'floor' only accept floating-point inputs."); | ||||||
|  | 		return detail::compute_floor<T, P, vecType, detail::is_aligned<P>::value>::call(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> trunc(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'trunc' only accept floating-point inputs"); | ||||||
|  | 		return detail::compute_trunc<T, P, vecType, detail::is_aligned<P>::value>::call(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> round(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'round' only accept floating-point inputs"); | ||||||
|  | 		return detail::compute_round<T, P, vecType, detail::is_aligned<P>::value>::call(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | 	// roundEven | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType roundEven(genType const& x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'roundEven' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return genType(int(x + genType(int(x) % 2))); | ||||||
|  | 	} | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | 	// roundEven | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType roundEven(genType x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'roundEven' only accept floating-point inputs"); | ||||||
|  | 		 | ||||||
|  | 		int Integer = static_cast<int>(x); | ||||||
|  | 		genType IntegerPart = static_cast<genType>(Integer); | ||||||
|  | 		genType FractionalPart = fract(x); | ||||||
|  |  | ||||||
|  | 		if(FractionalPart > static_cast<genType>(0.5) || FractionalPart < static_cast<genType>(0.5)) | ||||||
|  | 		{ | ||||||
|  | 			return round(x); | ||||||
|  | 		} | ||||||
|  | 		else if((Integer % 2) == 0) | ||||||
|  | 		{ | ||||||
|  | 			return IntegerPart; | ||||||
|  | 		} | ||||||
|  | 		else if(x <= static_cast<genType>(0)) // Work around...  | ||||||
|  | 		{ | ||||||
|  | 			return IntegerPart - static_cast<genType>(1); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			return IntegerPart + static_cast<genType>(1); | ||||||
|  | 		} | ||||||
|  | 		//else // Bug on MinGW 4.5.2 | ||||||
|  | 		//{ | ||||||
|  | 		//	return mix(IntegerPart + genType(-1), IntegerPart + genType(1), x <= genType(0)); | ||||||
|  | 		//} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> roundEven(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'roundEven' only accept floating-point inputs"); | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(roundEven, x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// ceil | ||||||
|  | 	using ::std::ceil; | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> ceil(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'ceil' only accept floating-point inputs"); | ||||||
|  | 		return detail::compute_ceil<T, P, vecType, detail::is_aligned<P>::value>::call(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// fract | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType fract(genType x) | ||||||
|  | 	{ | ||||||
|  | 		return fract(tvec1<genType>(x)).x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> fract(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'fract' only accept floating-point inputs"); | ||||||
|  | 		return detail::compute_fract<T, P, vecType, detail::is_aligned<P>::value>::call(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// mod | ||||||
|  | 	template <typename genType> | ||||||
|  | 	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 | ||||||
|  | 			tvec1<genType, defaultp> Result(mod(tvec1<genType, defaultp>(x), y)); | ||||||
|  | 			return Result.x; | ||||||
|  | #		else | ||||||
|  | 			return mod(tvec1<genType, defaultp>(x), y).x; | ||||||
|  | #		endif | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> mod(vecType<T, P> const & x, T y) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_mod<T, P, vecType, detail::is_aligned<P>::value>::call(x, vecType<T, P>(y)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> mod(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_mod<T, P, vecType, detail::is_aligned<P>::value>::call(x, y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// modf | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType modf(genType x, genType & i) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'modf' only accept floating-point inputs"); | ||||||
|  | 		return std::modf(x, &i); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> modf(tvec1<T, P> const & x, tvec1<T, P> & i) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			modf(x.x, i.x)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> modf(tvec2<T, P> const & x, tvec2<T, P> & i) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			modf(x.x, i.x), | ||||||
|  | 			modf(x.y, i.y)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> modf(tvec3<T, P> const & x, tvec3<T, P> & i) | ||||||
|  | 	{ | ||||||
|  | 		return tvec3<T, P>( | ||||||
|  | 			modf(x.x, i.x), | ||||||
|  | 			modf(x.y, i.y), | ||||||
|  | 			modf(x.z, i.z)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> modf(tvec4<T, P> const & x, tvec4<T, P> & i) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>( | ||||||
|  | 			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 <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> min(vecType<T, P> const & a, T b) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'min' only accept floating-point or integer inputs"); | ||||||
|  | 		return detail::compute_min_vector<T, P, vecType, detail::is_aligned<P>::value>::call(a, vecType<T, P>(b)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> min(vecType<T, P> const & a, vecType<T, P> const & b) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_min_vector<T, P, vecType, detail::is_aligned<P>::value>::call(a, b); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// max | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> max(vecType<T, P> const & a, T b) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'max' only accept floating-point or integer inputs"); | ||||||
|  | 		return detail::compute_max_vector<T, P, vecType, detail::is_aligned<P>::value>::call(a, vecType<T, P>(b)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> max(vecType<T, P> const & a, vecType<T, P> const & b) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_max_vector<T, P, vecType, detail::is_aligned<P>::value>::call(a, b); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// clamp | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType clamp(genType x, genType minVal, genType maxVal) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || std::numeric_limits<genType>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'clamp' only accept floating-point or integer inputs"); | ||||||
|  | 		return min(max(x, minVal), maxVal); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> clamp(vecType<T, P> const & x, T minVal, T maxVal) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'clamp' only accept floating-point or integer inputs"); | ||||||
|  | 		return detail::compute_clamp_vector<T, P, vecType, detail::is_aligned<P>::value>::call(x, vecType<T, P>(minVal), vecType<T, P>(maxVal)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> clamp(vecType<T, P> const & x, vecType<T, P> const & minVal, vecType<T, P> const & maxVal) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'clamp' only accept floating-point or integer inputs"); | ||||||
|  | 		return detail::compute_clamp_vector<T, P, vecType, detail::is_aligned<P>::value>::call(x, minVal, maxVal); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genTypeT, typename genTypeU> | ||||||
|  | 	GLM_FUNC_QUALIFIER genTypeT mix(genTypeT x, genTypeT y, genTypeU a) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_mix<genTypeT, genTypeU>::call(x, y, a); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, typename U, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> mix(vecType<T, P> const & x, vecType<T, P> const & y, U a) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_mix_scalar<T, U, P, vecType, detail::is_aligned<P>::value>::call(x, y, a); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, typename U, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> mix(vecType<T, P> const & x, vecType<T, P> const & y, vecType<U, P> const & a) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_mix_vector<T, U, P, vecType, detail::is_aligned<P>::value>::call(x, y, a); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// step | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType step(genType edge, genType x) | ||||||
|  | 	{ | ||||||
|  | 		return mix(static_cast<genType>(1), static_cast<genType>(0), glm::lessThan(x, edge)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <template <typename, precision> class vecType, typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> step(T edge, vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_step_vector<T, P, vecType, detail::is_aligned<P>::value>::call(vecType<T, P>(edge), x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <template <typename, precision> class vecType, typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> step(vecType<T, P> const & edge, vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_step_vector<T, P, vecType, detail::is_aligned<P>::value>::call(edge, x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// smoothstep | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType smoothstep(genType edge0, genType edge1, genType x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || GLM_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 <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> smoothstep(T edge0, T edge1, vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_smoothstep_vector<T, P, vecType, detail::is_aligned<P>::value>::call(vecType<T, P>(edge0), vecType<T, P>(edge1), x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> smoothstep(vecType<T, P> const & edge0, vecType<T, P> const & edge1, vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_smoothstep_vector<T, P, vecType, detail::is_aligned<P>::value>::call(edge0, edge1, x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | #	if GLM_HAS_CXX11_STL | ||||||
|  | 		using std::isnan; | ||||||
|  | #	else | ||||||
|  | 		template <typename genType>  | ||||||
|  | 		GLM_FUNC_QUALIFIER bool isnan(genType x) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<genType>::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 <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> isnan(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isnan' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return detail::functor1<bool, T, P, vecType>::call(isnan, x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | #	if GLM_HAS_CXX11_STL | ||||||
|  | 		using std::isinf; | ||||||
|  | #	else | ||||||
|  | 		template <typename genType>  | ||||||
|  | 		GLM_FUNC_QUALIFIER bool isinf(genType x) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<genType>::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 <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> isinf(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isnan' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return detail::functor1<bool, T, P, vecType>::call(isinf, x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	GLM_FUNC_QUALIFIER int floatBitsToInt(float const & v) | ||||||
|  | 	{ | ||||||
|  | 		return reinterpret_cast<int&>(const_cast<float&>(v)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <template <typename, precision> class vecType, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<int, P> floatBitsToInt(vecType<float, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return reinterpret_cast<vecType<int, P>&>(const_cast<vecType<float, P>&>(v)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	GLM_FUNC_QUALIFIER uint floatBitsToUint(float const & v) | ||||||
|  | 	{ | ||||||
|  | 		return reinterpret_cast<uint&>(const_cast<float&>(v)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <template <typename, precision> class vecType, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<uint, P> floatBitsToUint(vecType<float, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return reinterpret_cast<vecType<uint, P>&>(const_cast<vecType<float, P>&>(v)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	GLM_FUNC_QUALIFIER float intBitsToFloat(int const & v) | ||||||
|  | 	{ | ||||||
|  | 		return reinterpret_cast<float&>(const_cast<int&>(v)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <template <typename, precision> class vecType, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<float, P> intBitsToFloat(vecType<int, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return reinterpret_cast<vecType<float, P>&>(const_cast<vecType<int, P>&>(v)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const & v) | ||||||
|  | 	{ | ||||||
|  | 		return reinterpret_cast<float&>(const_cast<uint&>(v)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <template <typename, precision> class vecType, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<float, P> uintBitsToFloat(vecType<uint, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return reinterpret_cast<vecType<float, P>&>(const_cast<vecType<uint, P>&>(v)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType fma(genType const & a, genType const & b, genType const & c) | ||||||
|  | 	{ | ||||||
|  | 		return a * b + c; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType frexp(genType x, int & exp) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return std::frexp(x, &exp); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> frexp(tvec1<T, P> const & x, tvec1<int, P> & exp) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return tvec1<T, P>(std::frexp(x.x, &exp.x)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> frexp(tvec2<T, P> const & x, tvec2<int, P> & exp) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			frexp(x.x, exp.x), | ||||||
|  | 			frexp(x.y, exp.y)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> frexp(tvec3<T, P> const & x, tvec3<int, P> & exp) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return tvec3<T, P>( | ||||||
|  | 			frexp(x.x, exp.x), | ||||||
|  | 			frexp(x.y, exp.y), | ||||||
|  | 			frexp(x.z, exp.z)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> frexp(tvec4<T, P> const & x, tvec4<int, P> & exp) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return tvec4<T, P>( | ||||||
|  | 			frexp(x.x, exp.x), | ||||||
|  | 			frexp(x.y, exp.y), | ||||||
|  | 			frexp(x.z, exp.z), | ||||||
|  | 			frexp(x.w, exp.w)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType ldexp(genType const & x, int const & exp) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'ldexp' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return std::ldexp(x, exp); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> ldexp(tvec1<T, P> const & x, tvec1<int, P> const & exp) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'ldexp' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			ldexp(x.x, exp.x)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> ldexp(tvec2<T, P> const & x, tvec2<int, P> const & exp) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'ldexp' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			ldexp(x.x, exp.x), | ||||||
|  | 			ldexp(x.y, exp.y)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> ldexp(tvec3<T, P> const & x, tvec3<int, P> const & exp) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'ldexp' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return tvec3<T, P>( | ||||||
|  | 			ldexp(x.x, exp.x), | ||||||
|  | 			ldexp(x.y, exp.y), | ||||||
|  | 			ldexp(x.z, exp.z)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> ldexp(tvec4<T, P> const & x, tvec4<int, P> const & exp) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'ldexp' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return tvec4<T, P>( | ||||||
|  | 			ldexp(x.x, exp.x), | ||||||
|  | 			ldexp(x.y, exp.y), | ||||||
|  | 			ldexp(x.z, exp.z), | ||||||
|  | 			ldexp(x.w, exp.w)); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #	include "func_common_simd.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										231
									
								
								lib/glm/detail/func_common_simd.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										231
									
								
								lib/glm/detail/func_common_simd.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <immintrin.h> | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_abs_vector<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_abs(v.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_abs_vector<int, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<int, P> call(tvec4<int, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<int, P> result(uninitialize); | ||||||
|  | 			result.data = glm_ivec4_abs(v.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_floor<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_floor(v.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_ceil<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_ceil(v.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_fract<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_fract(v.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_round<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_round(v.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_mod<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & x, tvec4<float, P> const & y) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_mod(x.data, y.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_min_vector<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v1, tvec4<float, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = _mm_min_ps(v1.data, v2.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_min_vector<int32, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<int32, P> call(tvec4<int32, P> const & v1, tvec4<int32, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<int32, P> result(uninitialize); | ||||||
|  | 			result.data = _mm_min_epi32(v1.data, v2.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_min_vector<uint32, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<int32, P> call(tvec4<uint32, P> const & v1, tvec4<uint32, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<uint32, P> result(uninitialize); | ||||||
|  | 			result.data = _mm_min_epu32(v1.data, v2.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_max_vector<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v1, tvec4<float, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = _mm_max_ps(v1.data, v2.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_max_vector<int32, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<int32, P> call(tvec4<int32, P> const & v1, tvec4<int32, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<int32, P> result(uninitialize); | ||||||
|  | 			result.data = _mm_max_epi32(v1.data, v2.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_max_vector<uint32, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<uint32, P> call(tvec4<uint32, P> const & v1, tvec4<uint32, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<uint32, P> result(uninitialize); | ||||||
|  | 			result.data = _mm_max_epu32(v1.data, v2.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_clamp_vector<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & x, tvec4<float, P> const & minVal, tvec4<float, P> const & maxVal) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = _mm_min_ps(_mm_max_ps(x.data, minVal.data), maxVal.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_clamp_vector<int32, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<int32, P> call(tvec4<int32, P> const & x, tvec4<int32, P> const & minVal, tvec4<int32, P> const & maxVal) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<int32, P> result(uninitialize); | ||||||
|  | 			result.data = _mm_min_epi32(_mm_max_epi32(x.data, minVal.data), maxVal.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_clamp_vector<uint32, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<uint32, P> call(tvec4<uint32, P> const & x, tvec4<uint32, P> const & minVal, tvec4<uint32, P> const & maxVal) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<uint32, P> result(uninitialize); | ||||||
|  | 			result.data = _mm_min_epu32(_mm_max_epu32(x.data, minVal.data), maxVal.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_mix_vector<float, bool, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & x, tvec4<float, P> const & y, tvec4<bool, P> const & a) | ||||||
|  | 		{ | ||||||
|  | 			__m128i const Load = _mm_set_epi32(-(int)a.w, -(int)a.z, -(int)a.y, -(int)a.x); | ||||||
|  | 			__m128 const Mask = _mm_castsi128_ps(Load); | ||||||
|  |  | ||||||
|  | 			tvec4<float, P> Result(uninitialize); | ||||||
|  | #			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 <precision P> | ||||||
|  | 	struct compute_step_vector<float, P, tvec4> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& edge, tvec4<float, P> const& x) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_step(edge.data, x.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | */ | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_smoothstep_vector<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& edge0, tvec4<float, P> const& edge1, tvec4<float, P> const& x) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_smoothstep(edge0.data, edge1.data, x.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #endif//GLM_ARCH & GLM_ARCH_SSE2_BIT | ||||||
							
								
								
									
										103
									
								
								lib/glm/detail/func_exponential.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								lib/glm/detail/func_exponential.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_exponential.hpp | ||||||
|  | ///  | ||||||
|  | /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> | ||||||
|  | /// | ||||||
|  | /// @defgroup core_func_exponential Exponential functions | ||||||
|  | /// @ingroup core | ||||||
|  | ///  | ||||||
|  | /// These all operate component-wise. The description is per component. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "type_vec1.hpp" | ||||||
|  | #include "type_vec2.hpp" | ||||||
|  | #include "type_vec3.hpp" | ||||||
|  | #include "type_vec4.hpp" | ||||||
|  | #include <cmath> | ||||||
|  |  | ||||||
|  | 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 precision. | ||||||
|  | 	/// @param exponent Floating point value representing the 'exponent'. | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/pow.xml">GLSL pow man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> pow(vecType<T, P> const & base, vecType<T, P> 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 precision. | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/exp.xml">GLSL exp man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> exp(vecType<T, P> 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 precision. | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/log.xml">GLSL log man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> log(vecType<T, P> 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 precision. | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/exp2.xml">GLSL exp2 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> exp2(vecType<T, P> 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 precision. | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/log2.xml">GLSL log2 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> log2(vecType<T, P> 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 precision. | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sqrt.xml">GLSL sqrt man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> | ||||||
|  | 	//template <typename genType> | ||||||
|  | 	//GLM_FUNC_DECL genType sqrt(genType const & x); | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> sqrt(vecType<T, P> 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 precision. | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inversesqrt.xml">GLSL inversesqrt man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> inversesqrt(vecType<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #include "func_exponential.inl" | ||||||
							
								
								
									
										146
									
								
								lib/glm/detail/func_exponential.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								lib/glm/detail/func_exponential.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_exponential.inl | ||||||
|  |  | ||||||
|  | #include "func_vector_relational.hpp" | ||||||
|  | #include "_vectorize.hpp" | ||||||
|  | #include <limits> | ||||||
|  | #include <cmath> | ||||||
|  | #include <cassert> | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | #	if GLM_HAS_CXX11_STL | ||||||
|  | 		using std::log2; | ||||||
|  | #	else | ||||||
|  | 		template <typename genType> | ||||||
|  | 		genType log2(genType Value) | ||||||
|  | 		{ | ||||||
|  | 			return std::log(Value) * static_cast<genType>(1.4426950408889634073599246810019); | ||||||
|  | 		} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <class, precision> class vecType, bool isFloat, bool Aligned> | ||||||
|  | 	struct compute_log2 | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & vec) | ||||||
|  | 		{ | ||||||
|  | 			return detail::functor1<T, T, P, vecType>::call(log2, vec); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <template <class, precision> class vecType, typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_sqrt | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			return detail::functor1<T, T, P, vecType>::call(std::sqrt, x); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <template <class, precision> class vecType, typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_inversesqrt | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) | ||||||
|  | 		{ | ||||||
|  | 			return static_cast<T>(1) / sqrt(x); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | 		 | ||||||
|  | 	template <template <class, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_inversesqrt<vecType, float, lowp, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<float, lowp> call(vecType<float, lowp> const & x) | ||||||
|  | 		{ | ||||||
|  | 			vecType<float, lowp> tmp(x); | ||||||
|  | 			vecType<float, lowp> xhalf(tmp * 0.5f); | ||||||
|  | 			vecType<uint, lowp>* p = reinterpret_cast<vecType<uint, lowp>*>(const_cast<vecType<float, lowp>*>(&x)); | ||||||
|  | 			vecType<uint, lowp> i = vecType<uint, lowp>(0x5f375a86) - (*p >> vecType<uint, lowp>(1)); | ||||||
|  | 			vecType<float, lowp>* ptmp = reinterpret_cast<vecType<float, lowp>*>(&i); | ||||||
|  | 			tmp = *ptmp; | ||||||
|  | 			tmp = tmp * (1.5f - xhalf * tmp * tmp); | ||||||
|  | 			return tmp; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | 	// pow | ||||||
|  | 	using std::pow; | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> pow(vecType<T, P> const & base, vecType<T, P> const & exponent) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor2<T, P, vecType>::call(pow, base, exponent); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// exp | ||||||
|  | 	using std::exp; | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> exp(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(exp, x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// log | ||||||
|  | 	using std::log; | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> log(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(log, x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	//exp2, ln2 = 0.69314718055994530941723212145818f | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType exp2(genType x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'exp2' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return std::exp(static_cast<genType>(0.69314718055994530941723212145818) * x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> exp2(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(exp2, x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// log2, ln2 = 0.69314718055994530941723212145818f | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType log2(genType x) | ||||||
|  | 	{ | ||||||
|  | 		return log2(tvec1<genType>(x)).x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> log2(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_log2<T, P, vecType, std::numeric_limits<T>::is_iec559, detail::is_aligned<P>::value>::call(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// sqrt | ||||||
|  | 	using std::sqrt; | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> sqrt(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'sqrt' only accept floating-point inputs"); | ||||||
|  | 		return detail::compute_sqrt<vecType, T, P, detail::is_aligned<P>::value>::call(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// inversesqrt | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType inversesqrt(genType x) | ||||||
|  | 	{ | ||||||
|  | 		return static_cast<genType>(1) / sqrt(x); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> inversesqrt(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'inversesqrt' only accept floating-point inputs"); | ||||||
|  | 		return detail::compute_inversesqrt<vecType, T, P, detail::is_aligned<P>::value>::call(x); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #	include "func_exponential_simd.inl" | ||||||
|  | #endif | ||||||
|  |  | ||||||
							
								
								
									
										35
									
								
								lib/glm/detail/func_exponential_simd.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								lib/glm/detail/func_exponential_simd.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | /// @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 <precision P> | ||||||
|  | 	struct compute_sqrt<tvec4, float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = _mm_sqrt_ps(v.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	struct compute_sqrt<tvec4, float, aligned_lowp, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, aligned_lowp> call(tvec4<float, aligned_lowp> const & v) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, aligned_lowp> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_sqrt_lowp(v.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #endif//GLM_ARCH & GLM_ARCH_SSE2_BIT | ||||||
							
								
								
									
										113
									
								
								lib/glm/detail/func_geometric.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								lib/glm/detail/func_geometric.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_geometric.hpp | ||||||
|  | /// | ||||||
|  | /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> | ||||||
|  | ///  | ||||||
|  | /// @defgroup core_func_geometric Geometric functions | ||||||
|  | /// @ingroup core | ||||||
|  | ///  | ||||||
|  | /// These operate on vectors as vectors, not component-wise. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "type_vec3.hpp" | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	/// @addtogroup core_func_geometric | ||||||
|  | 	/// @{ | ||||||
|  |  | ||||||
|  | 	/// Returns the length of x, i.e., sqrt(x * x). | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam genType Floating-point vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/length.xml">GLSL length man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL T length( | ||||||
|  | 		vecType<T, P> const & x); | ||||||
|  |  | ||||||
|  | 	/// Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/distance.xml">GLSL distance man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL T distance( | ||||||
|  | 		vecType<T, P> const & p0, | ||||||
|  | 		vecType<T, P> const & p1); | ||||||
|  |  | ||||||
|  | 	/// Returns the dot product of x and y, i.e., result = x * y. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/dot.xml">GLSL dot man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL T dot( | ||||||
|  | 		vecType<T, P> const & x, | ||||||
|  | 		vecType<T, P> const & y); | ||||||
|  |  | ||||||
|  | 	/// Returns the cross product of x and y. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam valType Floating-point scalar types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cross.xml">GLSL cross man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> cross( | ||||||
|  | 		tvec3<T, P> const & x, | ||||||
|  | 		tvec3<T, P> 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. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/normalize.xml">GLSL normalize man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> normalize( | ||||||
|  | 		vecType<T, P> const & x); | ||||||
|  |  | ||||||
|  | 	/// If dot(Nref, I) < 0.0, return N, otherwise, return -N. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/faceforward.xml">GLSL faceforward man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> faceforward( | ||||||
|  | 		vecType<T, P> const & N, | ||||||
|  | 		vecType<T, P> const & I, | ||||||
|  | 		vecType<T, P> const & Nref); | ||||||
|  |  | ||||||
|  | 	/// For the incident vector I and surface orientation N,  | ||||||
|  | 	/// returns the reflection direction : result = I - 2.0 * dot(N, I) * N. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/reflect.xml">GLSL reflect man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL genType reflect( | ||||||
|  | 		genType const & I, | ||||||
|  | 		genType const & N); | ||||||
|  |  | ||||||
|  | 	/// For the incident vector I and surface normal N,  | ||||||
|  | 	/// and the ratio of indices of refraction eta,  | ||||||
|  | 	/// return the refraction vector. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/refract.xml">GLSL refract man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> refract( | ||||||
|  | 		vecType<T, P> const & I, | ||||||
|  | 		vecType<T, P> const & N, | ||||||
|  | 		T eta); | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #include "func_geometric.inl" | ||||||
							
								
								
									
										247
									
								
								lib/glm/detail/func_geometric.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								lib/glm/detail/func_geometric.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,247 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_geometric.inl | ||||||
|  |  | ||||||
|  | #include "func_exponential.hpp" | ||||||
|  | #include "func_common.hpp" | ||||||
|  | #include "type_vec2.hpp" | ||||||
|  | #include "type_vec4.hpp" | ||||||
|  | #include "type_float.hpp" | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <template <typename, precision> class vecType, typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_length | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static T call(vecType<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			return sqrt(dot(v, v)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <template <typename, precision> class vecType, typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_distance | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static T call(vecType<T, P> const & p0, vecType<T, P> const & p1) | ||||||
|  | 		{ | ||||||
|  | 			return length(p1 - p0); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <template <class, precision> class vecType, typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_dot{}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_dot<tvec1, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static T call(tvec1<T, P> const & a, tvec1<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return a.x * b.x; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_dot<tvec2, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static T call(tvec2<T, P> const & x, tvec2<T, P> const & y) | ||||||
|  | 		{ | ||||||
|  | 			tvec2<T, P> tmp(x * y); | ||||||
|  | 			return tmp.x + tmp.y; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_dot<tvec3, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static T call(tvec3<T, P> const & x, tvec3<T, P> const & y) | ||||||
|  | 		{ | ||||||
|  | 			tvec3<T, P> tmp(x * y); | ||||||
|  | 			return tmp.x + tmp.y + tmp.z; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_dot<tvec4, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static T call(tvec4<T, P> const & x, tvec4<T, P> const & y) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> tmp(x * y); | ||||||
|  | 			return (tmp.x + tmp.y) + (tmp.z + tmp.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_cross | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec3<T, P> call(tvec3<T, P> const & x, tvec3<T, P> const & y) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'cross' accepts only floating-point inputs"); | ||||||
|  |  | ||||||
|  | 			return tvec3<T, P>( | ||||||
|  | 				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 <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_normalize | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'normalize' accepts only floating-point inputs"); | ||||||
|  |  | ||||||
|  | 			return v * inversesqrt(dot(v, v)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_faceforward | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & N, vecType<T, P> const & I, vecType<T, P> const & Nref) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'normalize' accepts only floating-point inputs"); | ||||||
|  |  | ||||||
|  | 			return dot(Nref, I) < static_cast<T>(0) ? N : -N; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_reflect | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & I, vecType<T, P> const & N) | ||||||
|  | 		{ | ||||||
|  | 			return I - N * dot(N, I) * static_cast<T>(2); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_refract | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & I, vecType<T, P> const & N, T eta) | ||||||
|  | 		{ | ||||||
|  | 			T const dotValue(dot(N, I)); | ||||||
|  | 			T const k(static_cast<T>(1) - eta * eta * (static_cast<T>(1) - dotValue * dotValue)); | ||||||
|  | 			return (eta * I - (eta * dotValue + std::sqrt(k)) * N) * static_cast<T>(k >= static_cast<T>(0)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | 	// length | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType length(genType x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'length' accepts only floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return abs(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER T length(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'length' accepts only floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return detail::compute_length<vecType, T, P, detail::is_aligned<P>::value>::call(v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// distance | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType distance(genType const & p0, genType const & p1) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'distance' accepts only floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return length(p1 - p0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER T distance(vecType<T, P> const & p0, vecType<T, P> const & p1) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_distance<vecType, T, P, detail::is_aligned<P>::value>::call(p0, p1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// dot | ||||||
|  | 	template <typename T> | ||||||
|  | 	GLM_FUNC_QUALIFIER T dot(T x, T y) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs"); | ||||||
|  | 		return x * y; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER T dot(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs"); | ||||||
|  | 		return detail::compute_dot<vecType, T, P, detail::is_aligned<P>::value>::call(x, y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// cross | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> cross(tvec3<T, P> const & x, tvec3<T, P> const & y) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_cross<T, P, detail::is_aligned<P>::value>::call(x, y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// normalize | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType normalize(genType const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'normalize' accepts only floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return x < genType(0) ? genType(-1) : genType(1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> normalize(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'normalize' accepts only floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		return detail::compute_normalize<T, P, vecType, detail::is_aligned<P>::value>::call(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// faceforward | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType faceforward(genType const & N, genType const & I, genType const & Nref) | ||||||
|  | 	{ | ||||||
|  | 		return dot(Nref, I) < static_cast<genType>(0) ? N : -N; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> faceforward(vecType<T, P> const & N, vecType<T, P> const & I, vecType<T, P> const & Nref) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_faceforward<T, P, vecType, detail::is_aligned<P>::value>::call(N, I, Nref); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// reflect | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType reflect(genType const & I, genType const & N) | ||||||
|  | 	{ | ||||||
|  | 		return I - N * dot(N, I) * genType(2); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> reflect(vecType<T, P> const & I, vecType<T, P> const & N) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_reflect<T, P, vecType, detail::is_aligned<P>::value>::call(I, N); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// refract | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType refract(genType const & I, genType const & N, genType eta) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'refract' accepts only floating-point inputs"); | ||||||
|  | 		genType const dotValue(dot(N, I)); | ||||||
|  | 		genType const k(static_cast<genType>(1) - eta * eta * (static_cast<genType>(1) - dotValue * dotValue)); | ||||||
|  | 		return (eta * I - (eta * dotValue + sqrt(k)) * N) * static_cast<genType>(k >= static_cast<genType>(0)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> refract(vecType<T, P> const & I, vecType<T, P> const & N, T eta) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'refract' accepts only floating-point inputs"); | ||||||
|  | 		return detail::compute_refract<T, P, vecType, detail::is_aligned<P>::value>::call(I, N, eta); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #	include "func_geometric_simd.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										99
									
								
								lib/glm/detail/func_geometric_simd.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								lib/glm/detail/func_geometric_simd.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | |||||||
|  | /// @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 <precision P> | ||||||
|  | 	struct compute_length<tvec4, float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static float call(tvec4<float, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			return _mm_cvtss_f32(glm_vec4_length(v.data)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_distance<tvec4, float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static float call(tvec4<float, P> const & p0, tvec4<float, P> const & p1) | ||||||
|  | 		{ | ||||||
|  | 			return _mm_cvtss_f32(glm_vec4_distance(p0.data, p1.data)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_dot<tvec4, float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static float call(tvec4<float, P> const& x, tvec4<float, P> const& y) | ||||||
|  | 		{ | ||||||
|  | 			return _mm_cvtss_f32(glm_vec1_dot(x.data, y.data)); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_cross<float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec3<float, P> call(tvec3<float, P> const & a, tvec3<float, P> 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); | ||||||
|  |  | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = xpd0; | ||||||
|  | 			return tvec3<float, P>(result); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_normalize<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_normalize(v.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_faceforward<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& N, tvec4<float, P> const& I, tvec4<float, P> const& Nref) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_faceforward(N.data, I.data, Nref.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_reflect<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& I, tvec4<float, P> const& N) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_reflect(I.data, N.data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_refract<float, P, tvec4, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& I, tvec4<float, P> const& N, float eta) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> result(uninitialize); | ||||||
|  | 			result.data = glm_vec4_refract(I.data, N.data, _mm_set1_ps(eta)); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #endif//GLM_ARCH & GLM_ARCH_SSE2_BIT | ||||||
							
								
								
									
										203
									
								
								lib/glm/detail/func_integer.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								lib/glm/detail/func_integer.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,203 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_integer.hpp | ||||||
|  | /// | ||||||
|  | /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | ///  | ||||||
|  | /// @defgroup core_func_integer Integer functions | ||||||
|  | /// @ingroup core | ||||||
|  | ///  | ||||||
|  | /// 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. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "setup.hpp" | ||||||
|  | #include "precision.hpp" | ||||||
|  | #include "func_common.hpp" | ||||||
|  | #include "func_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 genUType Unsigned integer scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uaddCarry.xml">GLSL uaddCarry man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<uint, P> uaddCarry( | ||||||
|  | 		vecType<uint, P> const & x, | ||||||
|  | 		vecType<uint, P> const & y, | ||||||
|  | 		vecType<uint, P> & 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 genUType Unsigned integer scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/usubBorrow.xml">GLSL usubBorrow man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<uint, P> usubBorrow( | ||||||
|  | 		vecType<uint, P> const & x, | ||||||
|  | 		vecType<uint, P> const & y, | ||||||
|  | 		vecType<uint, P> & 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 genUType Unsigned integer scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/umulExtended.xml">GLSL umulExtended man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL void umulExtended( | ||||||
|  | 		vecType<uint, P> const & x, | ||||||
|  | 		vecType<uint, P> const & y, | ||||||
|  | 		vecType<uint, P> & msb, | ||||||
|  | 		vecType<uint, P> & 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 genIType Signed integer scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/imulExtended.xml">GLSL imulExtended man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL void imulExtended( | ||||||
|  | 		vecType<int, P> const & x, | ||||||
|  | 		vecType<int, P> const & y, | ||||||
|  | 		vecType<int, P> & msb, | ||||||
|  | 		vecType<int, P> & 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 T Signed or unsigned integer scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldExtract.xml">GLSL bitfieldExtract man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> bitfieldExtract( | ||||||
|  | 		vecType<T, P> 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 T Signed or unsigned integer scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldInsert.xml">GLSL bitfieldInsert man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> bitfieldInsert( | ||||||
|  | 		vecType<T, P> const & Base, | ||||||
|  | 		vecType<T, P> 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 T Signed or unsigned integer scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldReverse.xml">GLSL bitfieldReverse man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> bitfieldReverse(vecType<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	/// Returns the number of bits set to 1 in the binary representation of value. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam T Signed or unsigned integer scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml">GLSL bitCount man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL int bitCount(genType v); | ||||||
|  |  | ||||||
|  | 	/// Returns the number of bits set to 1 in the binary representation of value. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam T Signed or unsigned integer scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml">GLSL bitCount man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<int, P> bitCount(vecType<T, P> 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 T Signed or unsigned integer scalar types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml">GLSL findLSB man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <typename genIUType> | ||||||
|  | 	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 T Signed or unsigned integer scalar types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml">GLSL findLSB man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<int, P> findLSB(vecType<T, P> 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 T Signed or unsigned integer scalar types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml">GLSL findMSB man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <typename genIUType> | ||||||
|  | 	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 T Signed or unsigned integer scalar types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml">GLSL findMSB man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<int, P> findMSB(vecType<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #include "func_integer.inl" | ||||||
							
								
								
									
										368
									
								
								lib/glm/detail/func_integer.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										368
									
								
								lib/glm/detail/func_integer.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,368 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_integer.inl | ||||||
|  |  | ||||||
|  | #include "type_vec2.hpp" | ||||||
|  | #include "type_vec3.hpp" | ||||||
|  | #include "type_vec4.hpp" | ||||||
|  | #include "type_int.hpp" | ||||||
|  | #include "_vectorize.hpp" | ||||||
|  | #if(GLM_ARCH & GLM_ARCH_X86 && GLM_COMPILER & GLM_COMPILER_VC) | ||||||
|  | #	include <intrin.h> | ||||||
|  | #	pragma intrinsic(_BitScanReverse) | ||||||
|  | #endif//(GLM_ARCH & GLM_ARCH_X86 && GLM_COMPILER & GLM_COMPILER_VC) | ||||||
|  | #include <limits> | ||||||
|  |  | ||||||
|  | #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 <typename T> | ||||||
|  | 	GLM_FUNC_QUALIFIER T mask(T Bits) | ||||||
|  | 	{ | ||||||
|  | 		return Bits >= sizeof(T) * 8 ? ~static_cast<T>(0) : (static_cast<T>(1) << Bits) - static_cast<T>(1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, glm::precision P, template <typename, glm::precision> class vecType, bool Aligned, bool EXEC> | ||||||
|  | 	struct compute_bitfieldReverseStep | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T, T) | ||||||
|  | 		{ | ||||||
|  | 			return v; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, glm::precision P, template <typename, glm::precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_bitfieldReverseStep<T, P, vecType, Aligned, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T Mask, T Shift) | ||||||
|  | 		{ | ||||||
|  | 			return (v & Mask) << Shift | (v & (~Mask)) >> Shift; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, glm::precision P, template <typename, glm::precision> class vecType, bool Aligned, bool EXEC> | ||||||
|  | 	struct compute_bitfieldBitCountStep | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T, T) | ||||||
|  | 		{ | ||||||
|  | 			return v; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, glm::precision P, template <typename, glm::precision> class vecType, bool Aligned> | ||||||
|  | 	struct compute_bitfieldBitCountStep<T, P, vecType, Aligned, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T Mask, T Shift) | ||||||
|  | 		{ | ||||||
|  | 			return (v & Mask) + ((v >> Shift) & Mask); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename genIUType, size_t Bits> | ||||||
|  | 	struct compute_findLSB | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static int call(genIUType Value) | ||||||
|  | 		{ | ||||||
|  | 			if(Value == 0) | ||||||
|  | 				return -1; | ||||||
|  |  | ||||||
|  | 			return glm::bitCount(~Value & (Value - static_cast<genIUType>(1))); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_HAS_BITSCAN_WINDOWS | ||||||
|  | 		template <typename genIUType> | ||||||
|  | 		struct compute_findLSB<genIUType, 32> | ||||||
|  | 		{ | ||||||
|  | 			GLM_FUNC_QUALIFIER static int call(genIUType Value) | ||||||
|  | 			{ | ||||||
|  | 				unsigned long Result(0); | ||||||
|  | 				unsigned char IsNotNull = _BitScanForward(&Result, *reinterpret_cast<unsigned long*>(&Value)); | ||||||
|  | 				return IsNotNull ? int(Result) : -1; | ||||||
|  | 			} | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | #		if !((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_MODEL == GLM_MODEL_32)) | ||||||
|  | 		template <typename genIUType> | ||||||
|  | 		struct compute_findLSB<genIUType, 64> | ||||||
|  | 		{ | ||||||
|  | 			GLM_FUNC_QUALIFIER static int call(genIUType Value) | ||||||
|  | 			{ | ||||||
|  | 				unsigned long Result(0); | ||||||
|  | 				unsigned char IsNotNull = _BitScanForward64(&Result, *reinterpret_cast<unsigned __int64*>(&Value)); | ||||||
|  | 				return IsNotNull ? int(Result) : -1; | ||||||
|  | 			} | ||||||
|  | 		}; | ||||||
|  | #		endif | ||||||
|  | #	endif//GLM_HAS_BITSCAN_WINDOWS | ||||||
|  |  | ||||||
|  | 	template <typename T, glm::precision P, template <class, glm::precision> class vecType, bool EXEC = true> | ||||||
|  | 	struct compute_findMSB_step_vec | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, T Shift) | ||||||
|  | 		{ | ||||||
|  | 			return x | (x >> Shift); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, glm::precision P, template <typename, glm::precision> class vecType> | ||||||
|  | 	struct compute_findMSB_step_vec<T, P, vecType, false> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, T) | ||||||
|  | 		{ | ||||||
|  | 			return x; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, glm::precision P, template <typename, glm::precision> class vecType, int> | ||||||
|  | 	struct compute_findMSB_vec | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<int, P> call(vecType<T, P> const & vec) | ||||||
|  | 		{ | ||||||
|  | 			vecType<T, P> x(vec); | ||||||
|  | 			x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >=  8>::call(x, static_cast<T>( 1)); | ||||||
|  | 			x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >=  8>::call(x, static_cast<T>( 2)); | ||||||
|  | 			x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >=  8>::call(x, static_cast<T>( 4)); | ||||||
|  | 			x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >= 16>::call(x, static_cast<T>( 8)); | ||||||
|  | 			x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >= 32>::call(x, static_cast<T>(16)); | ||||||
|  | 			x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >= 64>::call(x, static_cast<T>(32)); | ||||||
|  | 			return vecType<int, P>(sizeof(T) * 8 - 1) - glm::bitCount(~x); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_HAS_BITSCAN_WINDOWS | ||||||
|  | 		template <typename genIUType> | ||||||
|  | 		GLM_FUNC_QUALIFIER int compute_findMSB_32(genIUType Value) | ||||||
|  | 		{ | ||||||
|  | 			unsigned long Result(0); | ||||||
|  | 			unsigned char IsNotNull = _BitScanReverse(&Result, *reinterpret_cast<unsigned long*>(&Value)); | ||||||
|  | 			return IsNotNull ? int(Result) : -1; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		template <typename T, glm::precision P, template<typename, glm::precision> class vecType> | ||||||
|  | 		struct compute_findMSB_vec<T, P, vecType, 32> | ||||||
|  | 		{ | ||||||
|  | 			GLM_FUNC_QUALIFIER static vecType<int, P> call(vecType<T, P> const & x) | ||||||
|  | 			{ | ||||||
|  | 				return detail::functor1<int, T, P, vecType>::call(compute_findMSB_32, x); | ||||||
|  | 			} | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | #		if !((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_MODEL == GLM_MODEL_32)) | ||||||
|  | 		template <typename genIUType> | ||||||
|  | 		GLM_FUNC_QUALIFIER int compute_findMSB_64(genIUType Value) | ||||||
|  | 		{ | ||||||
|  | 			unsigned long Result(0); | ||||||
|  | 			unsigned char IsNotNull = _BitScanReverse64(&Result, *reinterpret_cast<unsigned __int64*>(&Value)); | ||||||
|  | 			return IsNotNull ? int(Result) : -1; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		template <typename T, glm::precision P, template <class, glm::precision> class vecType> | ||||||
|  | 		struct compute_findMSB_vec<T, P, vecType, 64> | ||||||
|  | 		{ | ||||||
|  | 			GLM_FUNC_QUALIFIER static vecType<int, P> call(vecType<T, P> const & x) | ||||||
|  | 			{ | ||||||
|  | 				return detail::functor1<int, T, P, vecType>::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) | ||||||
|  | 	{ | ||||||
|  | 		uint64 const Value64(static_cast<uint64>(x) + static_cast<uint64>(y)); | ||||||
|  | 		uint64 const Max32((static_cast<uint64>(1) << static_cast<uint64>(32)) - static_cast<uint64>(1)); | ||||||
|  | 		Carry = Value64 > Max32 ? 1u : 0u; | ||||||
|  | 		return static_cast<uint32>(Value64 % (Max32 + static_cast<uint64>(1))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<uint, P> uaddCarry(vecType<uint, P> const & x, vecType<uint, P> const & y, vecType<uint, P> & Carry) | ||||||
|  | 	{ | ||||||
|  | 		vecType<uint64, P> Value64(vecType<uint64, P>(x) + vecType<uint64, P>(y)); | ||||||
|  | 		vecType<uint64, P> Max32((static_cast<uint64>(1) << static_cast<uint64>(32)) - static_cast<uint64>(1)); | ||||||
|  | 		Carry = mix(vecType<uint32, P>(0), vecType<uint32, P>(1), greaterThan(Value64, Max32)); | ||||||
|  | 		return vecType<uint32,P>(Value64 % (Max32 + static_cast<uint64>(1))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// usubBorrow | ||||||
|  | 	GLM_FUNC_QUALIFIER uint usubBorrow(uint const & x, uint const & y, uint & Borrow) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32), "uint and uint32 size mismatch"); | ||||||
|  |  | ||||||
|  | 		Borrow = x >= y ? static_cast<uint32>(0) : static_cast<uint32>(1); | ||||||
|  | 		if(y >= x) | ||||||
|  | 			return y - x; | ||||||
|  | 		else | ||||||
|  | 			return static_cast<uint32>((static_cast<int64>(1) << static_cast<int64>(32)) + (static_cast<int64>(y) - static_cast<int64>(x))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<uint, P> usubBorrow(vecType<uint, P> const & x, vecType<uint, P> const & y, vecType<uint, P> & Borrow) | ||||||
|  | 	{ | ||||||
|  | 		Borrow = mix(vecType<uint, P>(1), vecType<uint, P>(0), greaterThanEqual(x, y)); | ||||||
|  | 		vecType<uint, P> const YgeX(y - x); | ||||||
|  | 		vecType<uint, P> const XgeY(vecType<uint32, P>((static_cast<int64>(1) << static_cast<int64>(32)) + (vecType<int64, P>(y) - vecType<int64, P>(x)))); | ||||||
|  | 		return mix(XgeY, YgeX, greaterThanEqual(y, x)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// umulExtended | ||||||
|  | 	GLM_FUNC_QUALIFIER void umulExtended(uint const & x, uint const & y, uint & msb, uint & lsb) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32), "uint and uint32 size mismatch"); | ||||||
|  |  | ||||||
|  | 		uint64 Value64 = static_cast<uint64>(x) * static_cast<uint64>(y); | ||||||
|  | 		msb = static_cast<uint>(Value64 >> static_cast<uint64>(32)); | ||||||
|  | 		lsb = static_cast<uint>(Value64); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER void umulExtended(vecType<uint, P> const & x, vecType<uint, P> const & y, vecType<uint, P> & msb, vecType<uint, P> & lsb) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32), "uint and uint32 size mismatch"); | ||||||
|  |  | ||||||
|  | 		vecType<uint64, P> Value64(vecType<uint64, P>(x) * vecType<uint64, P>(y)); | ||||||
|  | 		msb = vecType<uint32, P>(Value64 >> static_cast<uint64>(32)); | ||||||
|  | 		lsb = vecType<uint32, P>(Value64); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// imulExtended | ||||||
|  | 	GLM_FUNC_QUALIFIER void imulExtended(int x, int y, int & msb, int & lsb) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(sizeof(int) == sizeof(int32), "int and int32 size mismatch"); | ||||||
|  |  | ||||||
|  | 		int64 Value64 = static_cast<int64>(x) * static_cast<int64>(y); | ||||||
|  | 		msb = static_cast<int>(Value64 >> static_cast<int64>(32)); | ||||||
|  | 		lsb = static_cast<int>(Value64); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER void imulExtended(vecType<int, P> const & x, vecType<int, P> const & y, vecType<int, P> & msb, vecType<int, P> & lsb) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(sizeof(int) == sizeof(int32), "int and int32 size mismatch"); | ||||||
|  |  | ||||||
|  | 		vecType<int64, P> Value64(vecType<int64, P>(x) * vecType<int64, P>(y)); | ||||||
|  | 		lsb = vecType<int32, P>(Value64 & static_cast<int64>(0xFFFFFFFF)); | ||||||
|  | 		msb = vecType<int32, P>((Value64 >> static_cast<int64>(32)) & static_cast<int64>(0xFFFFFFFF)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// bitfieldExtract | ||||||
|  | 	template <typename genIUType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genIUType bitfieldExtract(genIUType Value, int Offset, int Bits) | ||||||
|  | 	{ | ||||||
|  | 		return bitfieldExtract(tvec1<genIUType>(Value), Offset, Bits).x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> bitfieldExtract(vecType<T, P> const & Value, int Offset, int Bits) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'bitfieldExtract' only accept integer inputs"); | ||||||
|  |  | ||||||
|  | 		return (Value >> static_cast<T>(Offset)) & static_cast<T>(detail::mask(Bits)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// bitfieldInsert | ||||||
|  | 	template <typename genIUType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genIUType bitfieldInsert(genIUType const & Base, genIUType const & Insert, int Offset, int Bits) | ||||||
|  | 	{ | ||||||
|  | 		return bitfieldInsert(tvec1<genIUType>(Base), tvec1<genIUType>(Insert), Offset, Bits).x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> bitfieldInsert(vecType<T, P> const & Base, vecType<T, P> const & Insert, int Offset, int Bits) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'bitfieldInsert' only accept integer values"); | ||||||
|  |  | ||||||
|  | 		T const Mask = static_cast<T>(detail::mask(Bits) << Offset); | ||||||
|  | 		return (Base & ~Mask) | (Insert & Mask); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// bitfieldReverse | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType bitfieldReverse(genType x) | ||||||
|  | 	{ | ||||||
|  | 		return bitfieldReverse(glm::tvec1<genType, glm::defaultp>(x)).x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, glm::precision P, template <typename, glm::precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> bitfieldReverse(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		vecType<T, P> x(v); | ||||||
|  | 		x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>=  2>::call(x, T(0x5555555555555555ull), static_cast<T>( 1)); | ||||||
|  | 		x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>=  4>::call(x, T(0x3333333333333333ull), static_cast<T>( 2)); | ||||||
|  | 		x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>=  8>::call(x, T(0x0F0F0F0F0F0F0F0Full), static_cast<T>( 4)); | ||||||
|  | 		x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 16>::call(x, T(0x00FF00FF00FF00FFull), static_cast<T>( 8)); | ||||||
|  | 		x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 32>::call(x, T(0x0000FFFF0000FFFFull), static_cast<T>(16)); | ||||||
|  | 		x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 64>::call(x, T(0x00000000FFFFFFFFull), static_cast<T>(32)); | ||||||
|  | 		return x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// bitCount | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER int bitCount(genType x) | ||||||
|  | 	{ | ||||||
|  | 		return bitCount(glm::tvec1<genType, glm::defaultp>(x)).x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, glm::precision P, template <typename, glm::precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<int, P> bitCount(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		vecType<typename detail::make_unsigned<T>::type, P> x(*reinterpret_cast<vecType<typename detail::make_unsigned<T>::type, P> const *>(&v)); | ||||||
|  | 		x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>=  2>::call(x, typename detail::make_unsigned<T>::type(0x5555555555555555ull), typename detail::make_unsigned<T>::type( 1)); | ||||||
|  | 		x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>=  4>::call(x, typename detail::make_unsigned<T>::type(0x3333333333333333ull), typename detail::make_unsigned<T>::type( 2)); | ||||||
|  | 		x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>=  8>::call(x, typename detail::make_unsigned<T>::type(0x0F0F0F0F0F0F0F0Full), typename detail::make_unsigned<T>::type( 4)); | ||||||
|  | 		x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 16>::call(x, typename detail::make_unsigned<T>::type(0x00FF00FF00FF00FFull), typename detail::make_unsigned<T>::type( 8)); | ||||||
|  | 		x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 32>::call(x, typename detail::make_unsigned<T>::type(0x0000FFFF0000FFFFull), typename detail::make_unsigned<T>::type(16)); | ||||||
|  | 		x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 64>::call(x, typename detail::make_unsigned<T>::type(0x00000000FFFFFFFFull), typename detail::make_unsigned<T>::type(32)); | ||||||
|  | 		return vecType<int, P>(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// findLSB | ||||||
|  | 	template <typename genIUType> | ||||||
|  | 	GLM_FUNC_QUALIFIER int findLSB(genIUType Value) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findLSB' only accept integer values"); | ||||||
|  |  | ||||||
|  | 		return detail::compute_findLSB<genIUType, sizeof(genIUType) * 8>::call(Value); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<int, P> findLSB(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'findLSB' only accept integer values"); | ||||||
|  |  | ||||||
|  | 		return detail::functor1<int, T, P, vecType>::call(findLSB, x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// findMSB | ||||||
|  | 	template <typename genIUType> | ||||||
|  | 	GLM_FUNC_QUALIFIER int findMSB(genIUType x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findMSB' only accept integer values"); | ||||||
|  |  | ||||||
|  | 		return findMSB(tvec1<genIUType>(x)).x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<int, P> findMSB(vecType<T, P> const & x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'findMSB' only accept integer values"); | ||||||
|  |  | ||||||
|  | 		return detail::compute_findMSB_vec<T, P, vecType, sizeof(T) * 8>::call(x); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #	include "func_integer_simd.inl" | ||||||
|  | #endif | ||||||
|  |  | ||||||
							
								
								
									
										68
									
								
								lib/glm/detail/func_integer_simd.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								lib/glm/detail/func_integer_simd.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_integer_simd.inl | ||||||
|  |  | ||||||
|  | #include "../simd/integer.h" | ||||||
|  |  | ||||||
|  | #if GLM_ARCH & GLM_ARCH_SSE2_BIT | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <glm::precision P> | ||||||
|  | 	struct compute_bitfieldReverseStep<uint32, P, tvec4, true, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<uint32, P> call(tvec4<uint32, P> const & v, uint32 Mask, uint32 Shift) | ||||||
|  | 		{ | ||||||
|  | 			__m128i const set0 = v.data; | ||||||
|  |  | ||||||
|  | 			__m128i const set1 = _mm_set1_epi32(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 <glm::precision P> | ||||||
|  | 	struct compute_bitfieldBitCountStep<uint32, P, tvec4, true, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<uint32, P> call(tvec4<uint32, P> const & v, uint32 Mask, uint32 Shift) | ||||||
|  | 		{ | ||||||
|  | 			__m128i const set0 = v.data; | ||||||
|  |  | ||||||
|  | 			__m128i const set1 = _mm_set1_epi32(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(uint32 x) | ||||||
|  | 	{ | ||||||
|  | 		return _mm_popcnt_u32(x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | #	if(GLM_MODEL == GLM_MODEL_64) | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER int bitCount(uint64 x) | ||||||
|  | 	{ | ||||||
|  | 		return static_cast<int>(_mm_popcnt_u64(x)); | ||||||
|  | 	} | ||||||
|  | #	endif//GLM_MODEL | ||||||
|  | #	endif//GLM_ARCH | ||||||
|  |  | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #endif//GLM_ARCH & GLM_ARCH_SSE2_BIT | ||||||
							
								
								
									
										149
									
								
								lib/glm/detail/func_matrix.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								lib/glm/detail/func_matrix.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,149 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_matrix.hpp | ||||||
|  | /// | ||||||
|  | /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> | ||||||
|  | ///  | ||||||
|  | /// @defgroup core_func_matrix Matrix functions | ||||||
|  | /// @ingroup core | ||||||
|  | ///  | ||||||
|  | /// For each of the following built-in matrix functions, there is both a  | ||||||
|  | /// single-precision floating point version, where all arguments and return values  | ||||||
|  | /// are single precision, and a double-precision floating version, where all  | ||||||
|  | /// arguments and return values are double precision. Only the single-precision  | ||||||
|  | /// floating point version is shown. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | // Dependencies | ||||||
|  | #include "../detail/precision.hpp" | ||||||
|  | #include "../detail/setup.hpp" | ||||||
|  | #include "../detail/type_mat.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 <typename T, precision P> | ||||||
|  | 	struct outerProduct_trait<T, P, tvec2, tvec2> | ||||||
|  | 	{ | ||||||
|  | 		typedef tmat2x2<T, P> type; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct outerProduct_trait<T, P, tvec2, tvec3> | ||||||
|  | 	{ | ||||||
|  | 		typedef tmat3x2<T, P> type; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct outerProduct_trait<T, P, tvec2, tvec4> | ||||||
|  | 	{ | ||||||
|  | 		typedef tmat4x2<T, P> type; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct outerProduct_trait<T, P, tvec3, tvec2> | ||||||
|  | 	{ | ||||||
|  | 		typedef tmat2x3<T, P> type; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct outerProduct_trait<T, P, tvec3, tvec3> | ||||||
|  | 	{ | ||||||
|  | 		typedef tmat3x3<T, P> type; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct outerProduct_trait<T, P, tvec3, tvec4> | ||||||
|  | 	{ | ||||||
|  | 		typedef tmat4x3<T, P> type; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct outerProduct_trait<T, P, tvec4, tvec2> | ||||||
|  | 	{ | ||||||
|  | 		typedef tmat2x4<T, P> type; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct outerProduct_trait<T, P, tvec4, tvec3> | ||||||
|  | 	{ | ||||||
|  | 		typedef tmat3x4<T, P> type; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct outerProduct_trait<T, P, tvec4, tvec4> | ||||||
|  | 	{ | ||||||
|  | 		typedef tmat4x4<T, P> 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 matType Floating-point matrix types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/matrixCompMult.xml">GLSL matrixCompMult man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class matType> | ||||||
|  | 	GLM_FUNC_DECL matType<T, P> matrixCompMult(matType<T, P> const & x, matType<T, P> 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 matType Floating-point matrix types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/outerProduct.xml">GLSL outerProduct man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecTypeA, template <typename, precision> class vecTypeB> | ||||||
|  | 	GLM_FUNC_DECL typename detail::outerProduct_trait<T, P, vecTypeA, vecTypeB>::type outerProduct(vecTypeA<T, P> const & c, vecTypeB<T, P> const & r); | ||||||
|  |  | ||||||
|  | 	/// Returns the transposed matrix of x | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam matType Floating-point matrix types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/transpose.xml">GLSL transpose man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> | ||||||
|  | #	if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC11)) | ||||||
|  | 		template <typename T, precision P, template <typename, precision> class matType> | ||||||
|  | 		GLM_FUNC_DECL typename matType<T, P>::transpose_type transpose(matType<T, P> const & x); | ||||||
|  | #	endif | ||||||
|  | 	 | ||||||
|  | 	/// Return the determinant of a squared matrix. | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam valType Floating-point scalar types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml">GLSL determinant man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a>	 | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class matType> | ||||||
|  | 	GLM_FUNC_DECL T determinant(matType<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	/// Return the inverse of a squared matrix. | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam valType Floating-point scalar types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml">GLSL inverse man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a>	  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class matType> | ||||||
|  | 	GLM_FUNC_DECL matType<T, P> inverse(matType<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #include "func_matrix.inl" | ||||||
							
								
								
									
										401
									
								
								lib/glm/detail/func_matrix.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										401
									
								
								lib/glm/detail/func_matrix.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,401 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_matrix.inl | ||||||
|  |  | ||||||
|  | #include "../geometric.hpp" | ||||||
|  | #include <limits> | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <template <typename, precision> class matType, typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_matrixCompMult | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static matType<T, P> call(matType<T, P> const& x, matType<T, P> const& y) | ||||||
|  | 		{ | ||||||
|  | 			matType<T, P> result(uninitialize); | ||||||
|  | 			for(length_t i = 0; i < result.length(); ++i) | ||||||
|  | 				result[i] = x[i] * y[i]; | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <template <class, precision> class matType, typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_transpose{}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_transpose<tmat2x2, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat2x2<T, P> call(tmat2x2<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			tmat2x2<T, P> result(uninitialize); | ||||||
|  | 			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 <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_transpose<tmat2x3, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat3x2<T, P> call(tmat2x3<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			tmat3x2<T, P> result(uninitialize); | ||||||
|  | 			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 <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_transpose<tmat2x4, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat4x2<T, P> call(tmat2x4<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			tmat4x2<T, P> result(uninitialize); | ||||||
|  | 			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 <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_transpose<tmat3x2, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat2x3<T, P> call(tmat3x2<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			tmat2x3<T, P> result(uninitialize); | ||||||
|  | 			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 <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_transpose<tmat3x3, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat3x3<T, P> call(tmat3x3<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			tmat3x3<T, P> result(uninitialize); | ||||||
|  | 			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 <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_transpose<tmat3x4, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat4x3<T, P> call(tmat3x4<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			tmat4x3<T, P> result(uninitialize); | ||||||
|  | 			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 <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_transpose<tmat4x2, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat2x4<T, P> call(tmat4x2<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			tmat2x4<T, P> result(uninitialize); | ||||||
|  | 			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 <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_transpose<tmat4x3, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat3x4<T, P> call(tmat4x3<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			tmat3x4<T, P> result(uninitialize); | ||||||
|  | 			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 <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_transpose<tmat4x4, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat4x4<T, P> call(tmat4x4<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			tmat4x4<T, P> result(uninitialize); | ||||||
|  | 			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 <template <typename, precision> class matType, typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_determinant{}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_determinant<tmat2x2, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static T call(tmat2x2<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			return m[0][0] * m[1][1] - m[1][0] * m[0][1]; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_determinant<tmat3x3, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static T call(tmat3x3<T, P> 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 <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_determinant<tmat4x4, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static T call(tmat4x4<T, P> 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]; | ||||||
|  |  | ||||||
|  | 			tvec4<T, P> 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 <template <typename, precision> class matType, typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_inverse{}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_inverse<tmat2x2, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat2x2<T, P> call(tmat2x2<T, P> const& m) | ||||||
|  | 		{ | ||||||
|  | 			T OneOverDeterminant = static_cast<T>(1) / ( | ||||||
|  | 				+ m[0][0] * m[1][1] | ||||||
|  | 				- m[1][0] * m[0][1]); | ||||||
|  |  | ||||||
|  | 			tmat2x2<T, P> Inverse( | ||||||
|  | 				+ m[1][1] * OneOverDeterminant, | ||||||
|  | 				- m[0][1] * OneOverDeterminant, | ||||||
|  | 				- m[1][0] * OneOverDeterminant, | ||||||
|  | 				+ m[0][0] * OneOverDeterminant); | ||||||
|  |  | ||||||
|  | 			return Inverse; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_inverse<tmat3x3, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat3x3<T, P> call(tmat3x3<T, P> const& m) | ||||||
|  | 		{ | ||||||
|  | 			T OneOverDeterminant = static_cast<T>(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])); | ||||||
|  |  | ||||||
|  | 			tmat3x3<T, P> Inverse(uninitialize); | ||||||
|  | 			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 <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_inverse<tmat4x4, T, P, Aligned> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat4x4<T, P> call(tmat4x4<T, P> 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]; | ||||||
|  |  | ||||||
|  | 			tvec4<T, P> Fac0(Coef00, Coef00, Coef02, Coef03); | ||||||
|  | 			tvec4<T, P> Fac1(Coef04, Coef04, Coef06, Coef07); | ||||||
|  | 			tvec4<T, P> Fac2(Coef08, Coef08, Coef10, Coef11); | ||||||
|  | 			tvec4<T, P> Fac3(Coef12, Coef12, Coef14, Coef15); | ||||||
|  | 			tvec4<T, P> Fac4(Coef16, Coef16, Coef18, Coef19); | ||||||
|  | 			tvec4<T, P> Fac5(Coef20, Coef20, Coef22, Coef23); | ||||||
|  |  | ||||||
|  | 			tvec4<T, P> Vec0(m[1][0], m[0][0], m[0][0], m[0][0]); | ||||||
|  | 			tvec4<T, P> Vec1(m[1][1], m[0][1], m[0][1], m[0][1]); | ||||||
|  | 			tvec4<T, P> Vec2(m[1][2], m[0][2], m[0][2], m[0][2]); | ||||||
|  | 			tvec4<T, P> Vec3(m[1][3], m[0][3], m[0][3], m[0][3]); | ||||||
|  |  | ||||||
|  | 			tvec4<T, P> Inv0(Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2); | ||||||
|  | 			tvec4<T, P> Inv1(Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4); | ||||||
|  | 			tvec4<T, P> Inv2(Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5); | ||||||
|  | 			tvec4<T, P> Inv3(Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5); | ||||||
|  |  | ||||||
|  | 			tvec4<T, P> SignA(+1, -1, +1, -1); | ||||||
|  | 			tvec4<T, P> SignB(-1, +1, -1, +1); | ||||||
|  | 			tmat4x4<T, P> Inverse(Inv0 * SignA, Inv1 * SignB, Inv2 * SignA, Inv3 * SignB); | ||||||
|  |  | ||||||
|  | 			tvec4<T, P> Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0], Inverse[3][0]); | ||||||
|  |  | ||||||
|  | 			tvec4<T, P> Dot0(m[0] * Row0); | ||||||
|  | 			T Dot1 = (Dot0.x + Dot0.y) + (Dot0.z + Dot0.w); | ||||||
|  |  | ||||||
|  | 			T OneOverDeterminant = static_cast<T>(1) / Dot1; | ||||||
|  |  | ||||||
|  | 			return Inverse * OneOverDeterminant; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class matType> | ||||||
|  | 	GLM_FUNC_QUALIFIER matType<T, P> matrixCompMult(matType<T, P> const & x, matType<T, P> const & y) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'matrixCompMult' only accept floating-point inputs"); | ||||||
|  | 		return detail::compute_matrixCompMult<matType, T, P, detail::is_aligned<P>::value>::call(x, y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template<typename T, precision P, template <typename, precision> class vecTypeA, template <typename, precision> class vecTypeB> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename detail::outerProduct_trait<T, P, vecTypeA, vecTypeB>::type outerProduct(vecTypeA<T, P> const & c, vecTypeB<T, P> const & r) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'outerProduct' only accept floating-point inputs"); | ||||||
|  |  | ||||||
|  | 		typename detail::outerProduct_trait<T, P, vecTypeA, vecTypeB>::type m(uninitialize); | ||||||
|  | 		for(length_t i = 0; i < m.length(); ++i) | ||||||
|  | 			m[i] = c * r[i]; | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class matType> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename matType<T, P>::transpose_type transpose(matType<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'transpose' only accept floating-point inputs"); | ||||||
|  | 		return detail::compute_transpose<matType, T, P, detail::is_aligned<P>::value>::call(m); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class matType> | ||||||
|  | 	GLM_FUNC_QUALIFIER T determinant(matType<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'determinant' only accept floating-point inputs"); | ||||||
|  | 		return detail::compute_determinant<matType, T, P, detail::is_aligned<P>::value>::call(m); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class matType> | ||||||
|  | 	GLM_FUNC_QUALIFIER matType<T, P> inverse(matType<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'inverse' only accept floating-point inputs"); | ||||||
|  | 		return detail::compute_inverse<matType, T, P, detail::is_aligned<P>::value>::call(m); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #	include "func_matrix_simd.inl" | ||||||
|  | #endif | ||||||
|  |  | ||||||
							
								
								
									
										88
									
								
								lib/glm/detail/func_matrix_simd.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								lib/glm/detail/func_matrix_simd.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_matrix_simd.inl | ||||||
|  |  | ||||||
|  | #if GLM_ARCH & GLM_ARCH_SSE2_BIT | ||||||
|  |  | ||||||
|  | #include "type_mat4x4.hpp" | ||||||
|  | #include "func_geometric.hpp" | ||||||
|  | #include "../simd/matrix.h" | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_matrixCompMult<tmat4x4, float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(detail::is_aligned<P>::value, "Specialization requires aligned"); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat4x4<float, P> call(tmat4x4<float, P> const & x, tmat4x4<float, P> const & y) | ||||||
|  | 		{ | ||||||
|  | 			tmat4x4<float, P> result(uninitialize); | ||||||
|  | 			glm_mat4_matrixCompMult( | ||||||
|  | 				*(glm_vec4 const (*)[4])&x[0].data, | ||||||
|  | 				*(glm_vec4 const (*)[4])&y[0].data, | ||||||
|  | 				*(glm_vec4(*)[4])&result[0].data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_transpose<tmat4x4, float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat4x4<float, P> call(tmat4x4<float, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			tmat4x4<float, P> result(uninitialize); | ||||||
|  | 			glm_mat4_transpose( | ||||||
|  | 				*(glm_vec4 const (*)[4])&m[0].data, | ||||||
|  | 				*(glm_vec4(*)[4])&result[0].data); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_determinant<tmat4x4, float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static float call(tmat4x4<float, P> const& m) | ||||||
|  | 		{ | ||||||
|  | 			return _mm_cvtss_f32(glm_mat4_determinant(*reinterpret_cast<__m128 const(*)[4]>(&m[0].data))); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_inverse<tmat4x4, float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tmat4x4<float, P> call(tmat4x4<float, P> const& m) | ||||||
|  | 		{ | ||||||
|  | 			tmat4x4<float, P> Result(uninitialize); | ||||||
|  | 			glm_mat4_inverse(*reinterpret_cast<__m128 const(*)[4]>(&m[0].data), *reinterpret_cast<__m128(*)[4]>(&Result[0].data)); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | 	template<> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<float, aligned_lowp> outerProduct<float, aligned_lowp, tvec4, tvec4>(tvec4<float, aligned_lowp> const & c, tvec4<float, aligned_lowp> const & r) | ||||||
|  | 	{ | ||||||
|  | 		tmat4x4<float, aligned_lowp> m(uninitialize); | ||||||
|  | 		glm_mat4_outerProduct(c.data, r.data, *reinterpret_cast<__m128(*)[4]>(&m[0].data)); | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template<> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<float, aligned_mediump> outerProduct<float, aligned_mediump, tvec4, tvec4>(tvec4<float, aligned_mediump> const & c, tvec4<float, aligned_mediump> const & r) | ||||||
|  | 	{ | ||||||
|  | 		tmat4x4<float, aligned_mediump> m(uninitialize); | ||||||
|  | 		glm_mat4_outerProduct(c.data, r.data, *reinterpret_cast<__m128(*)[4]>(&m[0].data)); | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template<> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<float, aligned_highp> outerProduct<float, aligned_highp, tvec4, tvec4>(tvec4<float, aligned_highp> const & c, tvec4<float, aligned_highp> const & r) | ||||||
|  | 	{ | ||||||
|  | 		tmat4x4<float, aligned_highp> m(uninitialize); | ||||||
|  | 		glm_mat4_outerProduct(c.data, r.data, *reinterpret_cast<__m128(*)[4]>(&m[0].data)); | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										168
									
								
								lib/glm/detail/func_packing.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								lib/glm/detail/func_packing.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,168 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_packing.hpp | ||||||
|  | /// | ||||||
|  | /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | /// @see gtc_packing | ||||||
|  | /// | ||||||
|  | /// @defgroup core_func_packing Floating-Point Pack and Unpack Functions | ||||||
|  | /// @ingroup core | ||||||
|  | /// | ||||||
|  | /// These functions do not operate component-wise, rather as described in each case. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "type_vec2.hpp" | ||||||
|  | #include "type_vec4.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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm2x16.xml">GLSL packUnorm2x16 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm2x16.xml">GLSL packSnorm2x16 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml">GLSL unpackUnorm2x16 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml">GLSL unpackSnorm2x16 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml">GLSL unpackUnorm4x8 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml">GLSL unpackSnorm4x8 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	GLM_FUNC_DECL vec4 unpackSnorm4x8(uint p); | ||||||
|  |  | ||||||
|  | 	/// Returns a double-precision 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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packDouble2x32.xml">GLSL packDouble2x32 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackDouble2x32.xml">GLSL unpackDouble2x32 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml">GLSL packHalf2x16 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	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 <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml">GLSL unpackHalf2x16 man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> | ||||||
|  | 	GLM_FUNC_DECL vec2 unpackHalf2x16(uint v); | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #include "func_packing.inl" | ||||||
							
								
								
									
										190
									
								
								lib/glm/detail/func_packing.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								lib/glm/detail/func_packing.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,190 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_packing.inl | ||||||
|  |  | ||||||
|  | #include "func_common.hpp" | ||||||
|  | #include "type_half.hpp" | ||||||
|  | #include "../fwd.hpp" | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	GLM_FUNC_QUALIFIER uint packUnorm2x16(vec2 const & v) | ||||||
|  | 	{ | ||||||
|  | 		union | ||||||
|  | 		{ | ||||||
|  | 			u16  in[2]; | ||||||
|  | 			uint out; | ||||||
|  | 		} u; | ||||||
|  |  | ||||||
|  | 		u16vec2 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; | ||||||
|  | 			u16  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 | ||||||
|  | 		{ | ||||||
|  | 			i16  in[2]; | ||||||
|  | 			uint out; | ||||||
|  | 		} u; | ||||||
|  |  | ||||||
|  | 		i16vec2 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; | ||||||
|  | 			i16  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 | ||||||
|  | 		{ | ||||||
|  | 			u8   in[4]; | ||||||
|  | 			uint out; | ||||||
|  | 		} u; | ||||||
|  |  | ||||||
|  | 		u8vec4 result(round(clamp(v, 0.0f, 1.0f) * 255.0f)); | ||||||
|  |  | ||||||
|  | 		u.in[0] = result[0]; | ||||||
|  | 		u.in[1] = result[1]; | ||||||
|  | 		u.in[2] = result[2]; | ||||||
|  | 		u.in[3] = result[3]; | ||||||
|  |  | ||||||
|  | 		return u.out; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	GLM_FUNC_QUALIFIER vec4 unpackUnorm4x8(uint p) | ||||||
|  | 	{ | ||||||
|  | 		union | ||||||
|  | 		{ | ||||||
|  | 			uint in; | ||||||
|  | 			u8   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 | ||||||
|  | 		{ | ||||||
|  | 			i8   in[4]; | ||||||
|  | 			uint out; | ||||||
|  | 		} u; | ||||||
|  |  | ||||||
|  | 		i8vec4 result(round(clamp(v, -1.0f, 1.0f) * 127.0f)); | ||||||
|  |  | ||||||
|  | 		u.in[0] = result[0]; | ||||||
|  | 		u.in[1] = result[1]; | ||||||
|  | 		u.in[2] = result[2]; | ||||||
|  | 		u.in[3] = result[3]; | ||||||
|  |  | ||||||
|  | 		return u.out; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	GLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint p) | ||||||
|  | 	{ | ||||||
|  | 		union | ||||||
|  | 		{ | ||||||
|  | 			uint in; | ||||||
|  | 			i8   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 | ||||||
|  | 		{ | ||||||
|  | 			i16  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; | ||||||
|  | 			i16  out[2]; | ||||||
|  | 		} u; | ||||||
|  |  | ||||||
|  | 		u.in = v; | ||||||
|  |  | ||||||
|  | 		return vec2( | ||||||
|  | 			detail::toFloat32(u.out[0]), | ||||||
|  | 			detail::toFloat32(u.out[1])); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #	include "func_packing_simd.inl" | ||||||
|  | #endif | ||||||
|  |  | ||||||
							
								
								
									
										9
									
								
								lib/glm/detail/func_packing_simd.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								lib/glm/detail/func_packing_simd.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_packing_simd.inl | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  |  | ||||||
|  | }//namespace detail | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										176
									
								
								lib/glm/detail/func_trigonometric.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								lib/glm/detail/func_trigonometric.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_trigonometric.hpp | ||||||
|  | /// | ||||||
|  | /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | ///  | ||||||
|  | /// @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. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "setup.hpp" | ||||||
|  | #include "precision.hpp" | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	/// @addtogroup core_func_trigonometric | ||||||
|  | 	/// @{ | ||||||
|  |  | ||||||
|  | 	/// Converts degrees to radians and returns the result. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/radians.xml">GLSL radians man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR vecType<T, P> radians(vecType<T, P> const & degrees); | ||||||
|  |  | ||||||
|  | 	/// Converts radians to degrees and returns the result. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/degrees.xml">GLSL degrees man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR vecType<T, P> degrees(vecType<T, P> const & radians); | ||||||
|  |  | ||||||
|  | 	/// The standard trigonometric sine function.  | ||||||
|  | 	/// The values returned by this function will range from [-1, 1]. | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sin.xml">GLSL sin man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> sin(vecType<T, P> const & angle); | ||||||
|  |  | ||||||
|  | 	/// The standard trigonometric cosine function.  | ||||||
|  | 	/// The values returned by this function will range from [-1, 1]. | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cos.xml">GLSL cos man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> cos(vecType<T, P> const & angle); | ||||||
|  |  | ||||||
|  | 	/// The standard trigonometric tangent function. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/tan.xml">GLSL tan man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> tan(vecType<T, P> 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 genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/asin.xml">GLSL asin man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> asin(vecType<T, P> 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 genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/acos.xml">GLSL acos man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> acos(vecType<T, P> 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 genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml">GLSL atan man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> atan(vecType<T, P> const & y, vecType<T, P> 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 genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml">GLSL atan man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> atan(vecType<T, P> const & y_over_x); | ||||||
|  |  | ||||||
|  | 	/// Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2 | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sinh.xml">GLSL sinh man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> sinh(vecType<T, P> const & angle); | ||||||
|  |  | ||||||
|  | 	/// Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2 | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cosh.xml">GLSL cosh man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> cosh(vecType<T, P> const & angle); | ||||||
|  |  | ||||||
|  | 	/// Returns the hyperbolic tangent function, sinh(angle) / cosh(angle) | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/tanh.xml">GLSL tanh man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> tanh(vecType<T, P> const & angle); | ||||||
|  |  | ||||||
|  | 	/// Arc hyperbolic sine; returns the inverse of sinh. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/asinh.xml">GLSL asinh man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> asinh(vecType<T, P> const & x); | ||||||
|  | 	 | ||||||
|  | 	/// Arc hyperbolic cosine; returns the non-negative inverse | ||||||
|  | 	/// of cosh. Results are undefined if x < 1. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/acosh.xml">GLSL acosh man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> acosh(vecType<T, P> const & x); | ||||||
|  |  | ||||||
|  | 	/// Arc hyperbolic tangent; returns the inverse of tanh. | ||||||
|  | 	/// Results are undefined if abs(x) >= 1. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam genType Floating-point scalar or vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atanh.xml">GLSL atanh man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> atanh(vecType<T, P> const & x); | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #include "func_trigonometric.inl" | ||||||
							
								
								
									
										200
									
								
								lib/glm/detail/func_trigonometric.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								lib/glm/detail/func_trigonometric.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,200 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_trigonometric.inl | ||||||
|  |  | ||||||
|  | #include "_vectorize.hpp" | ||||||
|  | #include <cmath> | ||||||
|  | #include <limits> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	// radians | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType radians(genType degrees) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'radians' only accept floating-point input"); | ||||||
|  |  | ||||||
|  | 		return degrees * static_cast<genType>(0.01745329251994329576923690768489); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vecType<T, P> radians(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(radians, v); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	// degrees | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType degrees(genType radians) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'degrees' only accept floating-point input"); | ||||||
|  |  | ||||||
|  | 		return radians * static_cast<genType>(57.295779513082320876798154814105); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vecType<T, P> degrees(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(degrees, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// sin | ||||||
|  | 	using ::std::sin; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> sin(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(sin, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// cos | ||||||
|  | 	using std::cos; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> cos(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(cos, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// tan | ||||||
|  | 	using std::tan; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> tan(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(tan, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// asin | ||||||
|  | 	using std::asin; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> asin(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(asin, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// acos | ||||||
|  | 	using std::acos; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> acos(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(acos, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// atan | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genType atan(genType y, genType x) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'atan' only accept floating-point input"); | ||||||
|  |  | ||||||
|  | 		return ::std::atan2(y, x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> atan(vecType<T, P> const & a, vecType<T, P> const & b) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor2<T, P, vecType>::call(::std::atan2, a, b); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	using std::atan; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> atan(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(atan, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// sinh | ||||||
|  | 	using std::sinh; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> sinh(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(sinh, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// cosh | ||||||
|  | 	using std::cosh; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> cosh(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(cosh, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// tanh | ||||||
|  | 	using std::tanh; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> tanh(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(tanh, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// asinh | ||||||
|  | #	if GLM_HAS_CXX11_STL | ||||||
|  | 		using std::asinh; | ||||||
|  | #	else | ||||||
|  | 		template <typename genType> | ||||||
|  | 		GLM_FUNC_QUALIFIER genType asinh(genType x) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'asinh' only accept floating-point input"); | ||||||
|  |  | ||||||
|  | 			return (x < static_cast<genType>(0) ? static_cast<genType>(-1) : (x > static_cast<genType>(0) ? static_cast<genType>(1) : static_cast<genType>(0))) * log(std::abs(x) + sqrt(static_cast<genType>(1) + x * x)); | ||||||
|  | 		} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> asinh(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(asinh, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// acosh | ||||||
|  | #	if GLM_HAS_CXX11_STL | ||||||
|  | 		using std::acosh; | ||||||
|  | #	else | ||||||
|  | 		template <typename genType>  | ||||||
|  | 		GLM_FUNC_QUALIFIER genType acosh(genType x) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'acosh' only accept floating-point input"); | ||||||
|  |  | ||||||
|  | 			if(x < static_cast<genType>(1)) | ||||||
|  | 				return static_cast<genType>(0); | ||||||
|  | 			return log(x + sqrt(x * x - static_cast<genType>(1))); | ||||||
|  | 		} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> acosh(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(acosh, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// atanh | ||||||
|  | #	if GLM_HAS_CXX11_STL | ||||||
|  | 		using std::atanh; | ||||||
|  | #	else | ||||||
|  | 		template <typename genType> | ||||||
|  | 		GLM_FUNC_QUALIFIER genType atanh(genType x) | ||||||
|  | 		{ | ||||||
|  | 			GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'atanh' only accept floating-point input"); | ||||||
|  | 		 | ||||||
|  | 			if(std::abs(x) >= static_cast<genType>(1)) | ||||||
|  | 				return 0; | ||||||
|  | 			return static_cast<genType>(0.5) * log((static_cast<genType>(1) + x) / (static_cast<genType>(1) - x)); | ||||||
|  | 		} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> atanh(vecType<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::functor1<T, T, P, vecType>::call(atanh, v); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #	include "func_trigonometric_simd.inl" | ||||||
|  | #endif | ||||||
|  |  | ||||||
							
								
								
									
										0
									
								
								lib/glm/detail/func_trigonometric_simd.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								lib/glm/detail/func_trigonometric_simd.inl
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										111
									
								
								lib/glm/detail/func_vector_relational.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								lib/glm/detail/func_vector_relational.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,111 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_vector_relational.hpp | ||||||
|  | /// | ||||||
|  | /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> | ||||||
|  | ///  | ||||||
|  | /// @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. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "precision.hpp" | ||||||
|  | #include "setup.hpp" | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	/// @addtogroup core_func_vector_relational | ||||||
|  | 	/// @{ | ||||||
|  |  | ||||||
|  | 	/// Returns the component-wise comparison result of x < y. | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam vecType Floating-point or integer vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThan.xml">GLSL lessThan man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<bool, P> lessThan(vecType<T, P> const & x, vecType<T, P> const & y); | ||||||
|  |  | ||||||
|  | 	/// Returns the component-wise comparison of result x <= y. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam vecType Floating-point or integer vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThanEqual.xml">GLSL lessThanEqual man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<bool, P> lessThanEqual(vecType<T, P> const & x, vecType<T, P> const & y); | ||||||
|  |  | ||||||
|  | 	/// Returns the component-wise comparison of result x > y. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam vecType Floating-point or integer vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThan.xml">GLSL greaterThan man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<bool, P> greaterThan(vecType<T, P> const & x, vecType<T, P> const & y); | ||||||
|  |  | ||||||
|  | 	/// Returns the component-wise comparison of result x >= y. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam vecType Floating-point or integer vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThanEqual.xml">GLSL greaterThanEqual man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<bool, P> greaterThanEqual(vecType<T, P> const & x, vecType<T, P> const & y); | ||||||
|  |  | ||||||
|  | 	/// Returns the component-wise comparison of result x == y. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam vecType Floating-point, integer or boolean vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/equal.xml">GLSL equal man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<bool, P> equal(vecType<T, P> const & x, vecType<T, P> const & y); | ||||||
|  |  | ||||||
|  | 	/// Returns the component-wise comparison of result x != y. | ||||||
|  | 	///  | ||||||
|  | 	/// @tparam vecType Floating-point, integer or boolean vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/notEqual.xml">GLSL notEqual man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<bool, P> notEqual(vecType<T, P> const & x, vecType<T, P> const & y); | ||||||
|  |  | ||||||
|  | 	/// Returns true if any component of x is true. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam vecType Boolean vector types. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/any.xml">GLSL any man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL bool any(vecType<bool, P> const & v); | ||||||
|  |  | ||||||
|  | 	/// Returns true if all components of x are true. | ||||||
|  | 	/// | ||||||
|  | 	/// @tparam vecType Boolean vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/all.xml">GLSL all man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL bool all(vecType<bool, P> 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 vecType Boolean vector types. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/not.xml">GLSL not man page</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<bool, P> not_(vecType<bool, P> const & v); | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #include "func_vector_relational.inl" | ||||||
							
								
								
									
										105
									
								
								lib/glm/detail/func_vector_relational.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								lib/glm/detail/func_vector_relational.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_vector_relational.inl | ||||||
|  |  | ||||||
|  | #include <limits> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> lessThan(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | 	{ | ||||||
|  | 		assert(x.length() == y.length()); | ||||||
|  |  | ||||||
|  | 		vecType<bool, P> Result(uninitialize); | ||||||
|  | 		for(length_t i = 0; i < x.length(); ++i) | ||||||
|  | 			Result[i] = x[i] < y[i]; | ||||||
|  |  | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> lessThanEqual(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | 	{ | ||||||
|  | 		assert(x.length() == y.length()); | ||||||
|  |  | ||||||
|  | 		vecType<bool, P> Result(uninitialize); | ||||||
|  | 		for(length_t i = 0; i < x.length(); ++i) | ||||||
|  | 			Result[i] = x[i] <= y[i]; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> greaterThan(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | 	{ | ||||||
|  | 		assert(x.length() == y.length()); | ||||||
|  |  | ||||||
|  | 		vecType<bool, P> Result(uninitialize); | ||||||
|  | 		for(length_t i = 0; i < x.length(); ++i) | ||||||
|  | 			Result[i] = x[i] > y[i]; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> greaterThanEqual(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | 	{ | ||||||
|  | 		assert(x.length() == y.length()); | ||||||
|  |  | ||||||
|  | 		vecType<bool, P> Result(uninitialize); | ||||||
|  | 		for(length_t i = 0; i < x.length(); ++i) | ||||||
|  | 			Result[i] = x[i] >= y[i]; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> equal(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | 	{ | ||||||
|  | 		assert(x.length() == y.length()); | ||||||
|  |  | ||||||
|  | 		vecType<bool, P> Result(uninitialize); | ||||||
|  | 		for(length_t i = 0; i < x.length(); ++i) | ||||||
|  | 			Result[i] = x[i] == y[i]; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> notEqual(vecType<T, P> const & x, vecType<T, P> const & y) | ||||||
|  | 	{ | ||||||
|  | 		assert(x.length() == y.length()); | ||||||
|  |  | ||||||
|  | 		vecType<bool, P> Result(uninitialize); | ||||||
|  | 		for(length_t i = 0; i < x.length(); ++i) | ||||||
|  | 			Result[i] = x[i] != y[i]; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool any(vecType<bool, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		bool Result = false; | ||||||
|  | 		for(length_t i = 0; i < v.length(); ++i) | ||||||
|  | 			Result = Result || v[i]; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool all(vecType<bool, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		bool Result = true; | ||||||
|  | 		for(length_t i = 0; i < v.length(); ++i) | ||||||
|  | 			Result = Result && v[i]; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> not_(vecType<bool, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		vecType<bool, P> Result(uninitialize); | ||||||
|  | 		for(length_t i = 0; i < v.length(); ++i) | ||||||
|  | 			Result[i] = !v[i]; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #	include "func_vector_relational_simd.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										9
									
								
								lib/glm/detail/func_vector_relational_simd.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								lib/glm/detail/func_vector_relational_simd.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/func_vector_relational_simd.inl | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  |  | ||||||
|  | }//namespace detail | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										257
									
								
								lib/glm/detail/glm.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										257
									
								
								lib/glm/detail/glm.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,257 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/glm.cpp | ||||||
|  |  | ||||||
|  | #include <glm/glm.hpp> | ||||||
|  | #include <glm/gtc/quaternion.hpp> | ||||||
|  | #include <glm/gtx/dual_quaternion.hpp> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | // tvec1 type explicit instantiation | ||||||
|  | template struct tvec1<uint8, lowp>; | ||||||
|  | template struct tvec1<uint16, lowp>; | ||||||
|  | template struct tvec1<uint32, lowp>; | ||||||
|  | template struct tvec1<uint64, lowp>; | ||||||
|  | template struct tvec1<int8, lowp>; | ||||||
|  | template struct tvec1<int16, lowp>; | ||||||
|  | template struct tvec1<int32, lowp>; | ||||||
|  | template struct tvec1<int64, lowp>; | ||||||
|  | template struct tvec1<float32, lowp>; | ||||||
|  | template struct tvec1<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tvec1<uint8, mediump>; | ||||||
|  | template struct tvec1<uint16, mediump>; | ||||||
|  | template struct tvec1<uint32, mediump>; | ||||||
|  | template struct tvec1<uint64, mediump>; | ||||||
|  | template struct tvec1<int8, mediump>; | ||||||
|  | template struct tvec1<int16, mediump>; | ||||||
|  | template struct tvec1<int32, mediump>; | ||||||
|  | template struct tvec1<int64, mediump>; | ||||||
|  | template struct tvec1<float32, mediump>; | ||||||
|  | template struct tvec1<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tvec1<uint8, highp>; | ||||||
|  | template struct tvec1<uint16, highp>; | ||||||
|  | template struct tvec1<uint32, highp>; | ||||||
|  | template struct tvec1<uint64, highp>; | ||||||
|  | template struct tvec1<int8, highp>; | ||||||
|  | template struct tvec1<int16, highp>; | ||||||
|  | template struct tvec1<int32, highp>; | ||||||
|  | template struct tvec1<int64, highp>; | ||||||
|  | template struct tvec1<float32, highp>; | ||||||
|  | template struct tvec1<float64, highp>; | ||||||
|  |  | ||||||
|  | // tvec2 type explicit instantiation | ||||||
|  | template struct tvec2<uint8, lowp>; | ||||||
|  | template struct tvec2<uint16, lowp>; | ||||||
|  | template struct tvec2<uint32, lowp>; | ||||||
|  | template struct tvec2<uint64, lowp>; | ||||||
|  | template struct tvec2<int8, lowp>; | ||||||
|  | template struct tvec2<int16, lowp>; | ||||||
|  | template struct tvec2<int32, lowp>; | ||||||
|  | template struct tvec2<int64, lowp>; | ||||||
|  | template struct tvec2<float32, lowp>; | ||||||
|  | template struct tvec2<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tvec2<uint8, mediump>; | ||||||
|  | template struct tvec2<uint16, mediump>; | ||||||
|  | template struct tvec2<uint32, mediump>; | ||||||
|  | template struct tvec2<uint64, mediump>; | ||||||
|  | template struct tvec2<int8, mediump>; | ||||||
|  | template struct tvec2<int16, mediump>; | ||||||
|  | template struct tvec2<int32, mediump>; | ||||||
|  | template struct tvec2<int64, mediump>; | ||||||
|  | template struct tvec2<float32, mediump>; | ||||||
|  | template struct tvec2<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tvec2<uint8, highp>; | ||||||
|  | template struct tvec2<uint16, highp>; | ||||||
|  | template struct tvec2<uint32, highp>; | ||||||
|  | template struct tvec2<uint64, highp>; | ||||||
|  | template struct tvec2<int8, highp>; | ||||||
|  | template struct tvec2<int16, highp>; | ||||||
|  | template struct tvec2<int32, highp>; | ||||||
|  | template struct tvec2<int64, highp>; | ||||||
|  | template struct tvec2<float32, highp>; | ||||||
|  | template struct tvec2<float64, highp>; | ||||||
|  |  | ||||||
|  | // tvec3 type explicit instantiation | ||||||
|  | template struct tvec3<uint8, lowp>; | ||||||
|  | template struct tvec3<uint16, lowp>; | ||||||
|  | template struct tvec3<uint32, lowp>; | ||||||
|  | template struct tvec3<uint64, lowp>; | ||||||
|  | template struct tvec3<int8, lowp>; | ||||||
|  | template struct tvec3<int16, lowp>; | ||||||
|  | template struct tvec3<int32, lowp>; | ||||||
|  | template struct tvec3<int64, lowp>; | ||||||
|  | template struct tvec3<float32, lowp>; | ||||||
|  | template struct tvec3<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tvec3<uint8, mediump>; | ||||||
|  | template struct tvec3<uint16, mediump>; | ||||||
|  | template struct tvec3<uint32, mediump>; | ||||||
|  | template struct tvec3<uint64, mediump>; | ||||||
|  | template struct tvec3<int8, mediump>; | ||||||
|  | template struct tvec3<int16, mediump>; | ||||||
|  | template struct tvec3<int32, mediump>; | ||||||
|  | template struct tvec3<int64, mediump>; | ||||||
|  | template struct tvec3<float32, mediump>; | ||||||
|  | template struct tvec3<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tvec3<uint8, highp>; | ||||||
|  | template struct tvec3<uint16, highp>; | ||||||
|  | template struct tvec3<uint32, highp>; | ||||||
|  | template struct tvec3<uint64, highp>; | ||||||
|  | template struct tvec3<int8, highp>; | ||||||
|  | template struct tvec3<int16, highp>; | ||||||
|  | template struct tvec3<int32, highp>; | ||||||
|  | template struct tvec3<int64, highp>; | ||||||
|  | template struct tvec3<float32, highp>; | ||||||
|  | template struct tvec3<float64, highp>; | ||||||
|  |  | ||||||
|  | // tvec4 type explicit instantiation | ||||||
|  | template struct tvec4<uint8, lowp>; | ||||||
|  | template struct tvec4<uint16, lowp>; | ||||||
|  | template struct tvec4<uint32, lowp>; | ||||||
|  | template struct tvec4<uint64, lowp>; | ||||||
|  | template struct tvec4<int8, lowp>; | ||||||
|  | template struct tvec4<int16, lowp>; | ||||||
|  | template struct tvec4<int32, lowp>; | ||||||
|  | template struct tvec4<int64, lowp>; | ||||||
|  | template struct tvec4<float32, lowp>; | ||||||
|  | template struct tvec4<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tvec4<uint8, mediump>; | ||||||
|  | template struct tvec4<uint16, mediump>; | ||||||
|  | template struct tvec4<uint32, mediump>; | ||||||
|  | template struct tvec4<uint64, mediump>; | ||||||
|  | template struct tvec4<int8, mediump>; | ||||||
|  | template struct tvec4<int16, mediump>; | ||||||
|  | template struct tvec4<int32, mediump>; | ||||||
|  | template struct tvec4<int64, mediump>; | ||||||
|  | template struct tvec4<float32, mediump>; | ||||||
|  | template struct tvec4<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tvec4<uint8, highp>; | ||||||
|  | template struct tvec4<uint16, highp>; | ||||||
|  | template struct tvec4<uint32, highp>; | ||||||
|  | template struct tvec4<uint64, highp>; | ||||||
|  | template struct tvec4<int8, highp>; | ||||||
|  | template struct tvec4<int16, highp>; | ||||||
|  | template struct tvec4<int32, highp>; | ||||||
|  | template struct tvec4<int64, highp>; | ||||||
|  | template struct tvec4<float32, highp>; | ||||||
|  | template struct tvec4<float64, highp>; | ||||||
|  |  | ||||||
|  | // tmat2x2 type explicit instantiation | ||||||
|  | template struct tmat2x2<float32, lowp>; | ||||||
|  | template struct tmat2x2<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tmat2x2<float32, mediump>; | ||||||
|  | template struct tmat2x2<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tmat2x2<float32, highp>; | ||||||
|  | template struct tmat2x2<float64, highp>; | ||||||
|  |  | ||||||
|  | // tmat2x3 type explicit instantiation | ||||||
|  | template struct tmat2x3<float32, lowp>; | ||||||
|  | template struct tmat2x3<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tmat2x3<float32, mediump>; | ||||||
|  | template struct tmat2x3<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tmat2x3<float32, highp>; | ||||||
|  | template struct tmat2x3<float64, highp>; | ||||||
|  |  | ||||||
|  | // tmat2x4 type explicit instantiation | ||||||
|  | template struct tmat2x4<float32, lowp>; | ||||||
|  | template struct tmat2x4<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tmat2x4<float32, mediump>; | ||||||
|  | template struct tmat2x4<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tmat2x4<float32, highp>; | ||||||
|  | template struct tmat2x4<float64, highp>; | ||||||
|  |  | ||||||
|  | // tmat3x2 type explicit instantiation | ||||||
|  | template struct tmat3x2<float32, lowp>; | ||||||
|  | template struct tmat3x2<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tmat3x2<float32, mediump>; | ||||||
|  | template struct tmat3x2<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tmat3x2<float32, highp>; | ||||||
|  | template struct tmat3x2<float64, highp>; | ||||||
|  |  | ||||||
|  | // tmat3x3 type explicit instantiation | ||||||
|  | template struct tmat3x3<float32, lowp>; | ||||||
|  | template struct tmat3x3<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tmat3x3<float32, mediump>; | ||||||
|  | template struct tmat3x3<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tmat3x3<float32, highp>; | ||||||
|  | template struct tmat3x3<float64, highp>; | ||||||
|  |  | ||||||
|  | // tmat3x4 type explicit instantiation | ||||||
|  | template struct tmat3x4<float32, lowp>; | ||||||
|  | template struct tmat3x4<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tmat3x4<float32, mediump>; | ||||||
|  | template struct tmat3x4<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tmat3x4<float32, highp>; | ||||||
|  | template struct tmat3x4<float64, highp>; | ||||||
|  |  | ||||||
|  | // tmat4x2 type explicit instantiation | ||||||
|  | template struct tmat4x2<float32, lowp>; | ||||||
|  | template struct tmat4x2<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tmat4x2<float32, mediump>; | ||||||
|  | template struct tmat4x2<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tmat4x2<float32, highp>; | ||||||
|  | template struct tmat4x2<float64, highp>; | ||||||
|  |  | ||||||
|  | // tmat4x3 type explicit instantiation | ||||||
|  | template struct tmat4x3<float32, lowp>; | ||||||
|  | template struct tmat4x3<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tmat4x3<float32, mediump>; | ||||||
|  | template struct tmat4x3<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tmat4x3<float32, highp>; | ||||||
|  | template struct tmat4x3<float64, highp>; | ||||||
|  |  | ||||||
|  | // tmat4x4 type explicit instantiation | ||||||
|  | template struct tmat4x4<float32, lowp>; | ||||||
|  | template struct tmat4x4<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tmat4x4<float32, mediump>; | ||||||
|  | template struct tmat4x4<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tmat4x4<float32, highp>; | ||||||
|  | template struct tmat4x4<float64, highp>; | ||||||
|  |  | ||||||
|  | // tquat type explicit instantiation | ||||||
|  | template struct tquat<float32, lowp>; | ||||||
|  | template struct tquat<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tquat<float32, mediump>; | ||||||
|  | template struct tquat<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tquat<float32, highp>; | ||||||
|  | template struct tquat<float64, highp>; | ||||||
|  |  | ||||||
|  | //tdualquat type explicit instantiation | ||||||
|  | template struct tdualquat<float32, lowp>; | ||||||
|  | template struct tdualquat<float64, lowp>; | ||||||
|  |  | ||||||
|  | template struct tdualquat<float32, mediump>; | ||||||
|  | template struct tdualquat<float64, mediump>; | ||||||
|  |  | ||||||
|  | template struct tdualquat<float32, highp>; | ||||||
|  | template struct tdualquat<float64, highp>; | ||||||
|  |  | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
							
								
								
									
										63
									
								
								lib/glm/detail/precision.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								lib/glm/detail/precision.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/precision.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "setup.hpp" | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	enum precision | ||||||
|  | 	{ | ||||||
|  | 		packed_highp, | ||||||
|  | 		packed_mediump, | ||||||
|  | 		packed_lowp, | ||||||
|  |  | ||||||
|  | #		if GLM_HAS_ALIGNED_TYPE | ||||||
|  | 			aligned_highp, | ||||||
|  | 			aligned_mediump, | ||||||
|  | 			aligned_lowp, | ||||||
|  | 			aligned = aligned_highp, | ||||||
|  | #		endif | ||||||
|  |  | ||||||
|  | 		highp = packed_highp, | ||||||
|  | 		mediump = packed_mediump, | ||||||
|  | 		lowp = packed_lowp, | ||||||
|  | 		packed = packed_highp, | ||||||
|  |  | ||||||
|  | #		if GLM_HAS_ALIGNED_TYPE && defined(GLM_FORCE_ALIGNED) | ||||||
|  | 			defaultp = aligned_highp | ||||||
|  | #		else | ||||||
|  | 			defaultp = highp | ||||||
|  | #		endif | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <glm::precision P> | ||||||
|  | 	struct is_aligned | ||||||
|  | 	{ | ||||||
|  | 		static const bool value = false; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_HAS_ALIGNED_TYPE | ||||||
|  | 		template<> | ||||||
|  | 		struct is_aligned<glm::aligned_lowp> | ||||||
|  | 		{ | ||||||
|  | 			static const bool value = true; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template<> | ||||||
|  | 		struct is_aligned<glm::aligned_mediump> | ||||||
|  | 		{ | ||||||
|  | 			static const bool value = true; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template<> | ||||||
|  | 		struct is_aligned<glm::aligned_highp> | ||||||
|  | 		{ | ||||||
|  | 			static const bool value = true; | ||||||
|  | 		}; | ||||||
|  | #	endif | ||||||
|  | }//namespace detail | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										828
									
								
								lib/glm/detail/setup.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										828
									
								
								lib/glm/detail/setup.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,828 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/setup.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #if (defined(GLM_FORCE_SWIZZLE) || defined(GLM_SWIZZLE)) && defined(GLM_FORCE_UNRESTRICTED_GENTYPE) | ||||||
|  | #	error "Both GLM_FORCE_SWIZZLE and GLM_FORCE_UNRESTRICTED_GENTYPE can't be defined at the same time" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Messages | ||||||
|  |  | ||||||
|  | #ifdef GLM_MESSAGES | ||||||
|  | #	pragma message("GLM: GLM_MESSAGES is deprecated, use GLM_FORCE_MESSAGES instead") | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define GLM_MESSAGES_ENABLED 1 | ||||||
|  | #define GLM_MESSAGES_DISABLE 0 | ||||||
|  |  | ||||||
|  | #if defined(GLM_FORCE_MESSAGES) || defined(GLM_MESSAGES) | ||||||
|  | #	undef GLM_MESSAGES | ||||||
|  | #	define GLM_MESSAGES GLM_MESSAGES_ENABLED | ||||||
|  | #else | ||||||
|  | #	undef GLM_MESSAGES | ||||||
|  | #	define GLM_MESSAGES GLM_MESSAGES_DISABLE | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <cassert> | ||||||
|  | #include <cstddef> | ||||||
|  | #include "../simd/platform.h" | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Version | ||||||
|  |  | ||||||
|  | #define GLM_VERSION					98 | ||||||
|  | #define GLM_VERSION_MAJOR			0 | ||||||
|  | #define GLM_VERSION_MINOR			9 | ||||||
|  | #define GLM_VERSION_PATCH			8 | ||||||
|  | #define GLM_VERSION_REVISION		5 | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_VERSION_DISPLAYED) | ||||||
|  | #	define GLM_MESSAGE_VERSION_DISPLAYED | ||||||
|  | #	pragma message ("GLM: version 0.9.8.5") | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | // Report compiler detection | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_COMPILER_DISPLAYED) | ||||||
|  | #	define GLM_MESSAGE_COMPILER_DISPLAYED | ||||||
|  | #	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 | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Build model | ||||||
|  |  | ||||||
|  | #if defined(__arch64__) || defined(__LP64__) || defined(_M_X64) || defined(__ppc64__) || defined(__x86_64__) | ||||||
|  | #	define GLM_MODEL	GLM_MODEL_64 | ||||||
|  | #elif defined(__i386__) || defined(__ppc__) | ||||||
|  | #	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 | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_MODEL_DISPLAYED) | ||||||
|  | #	define GLM_MESSAGE_MODEL_DISPLAYED | ||||||
|  | #	if(GLM_MODEL == GLM_MODEL_64) | ||||||
|  | #		pragma message("GLM: 64 bits model") | ||||||
|  | #	elif(GLM_MODEL == GLM_MODEL_32) | ||||||
|  | #		pragma message("GLM: 32 bits model") | ||||||
|  | #	endif//GLM_MODEL | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_ARCH_DISPLAYED) | ||||||
|  | #	define GLM_MESSAGE_ARCH_DISPLAYED | ||||||
|  | #	if(GLM_ARCH == GLM_ARCH_PURE) | ||||||
|  | #		pragma message("GLM: Platform independent code") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_AVX2) | ||||||
|  | #		pragma message("GLM: AVX2 instruction set") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_AVX) | ||||||
|  | #		pragma message("GLM: AVX instruction set") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_SSE42) | ||||||
|  | #		pragma message("GLM: SSE4.2 instruction set") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_SSE41) | ||||||
|  | #		pragma message("GLM: SSE4.1 instruction set") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_SSSE3) | ||||||
|  | #		pragma message("GLM: SSSE3 instruction set") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_SSE3) | ||||||
|  | #		pragma message("GLM: SSE3 instruction set") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_SSE2) | ||||||
|  | #		pragma message("GLM: SSE2 instruction set") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_X86) | ||||||
|  | #		pragma message("GLM: x86 instruction set") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_NEON) | ||||||
|  | #		pragma message("GLM: NEON instruction set") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_ARM) | ||||||
|  | #		pragma message("GLM: ARM instruction set") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_MIPS) | ||||||
|  | #		pragma message("GLM: MIPS instruction set") | ||||||
|  | #	elif(GLM_ARCH == GLM_ARCH_PPC) | ||||||
|  | #		pragma message("GLM: PowerPC architechture") | ||||||
|  | #	endif//GLM_ARCH | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // C++ Version | ||||||
|  |  | ||||||
|  | // User defines: GLM_FORCE_CXX98, GLM_FORCE_CXX03, GLM_FORCE_CXX11, GLM_FORCE_CXX14 | ||||||
|  |  | ||||||
|  | #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_CXX1Y_FLAG			(1 << 5) | ||||||
|  | #define GLM_LANG_CXX14_FLAG			(1 << 6) | ||||||
|  | #define GLM_LANG_CXX1Z_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_CXX1Y			(GLM_LANG_CXX11 | GLM_LANG_CXX1Y_FLAG) | ||||||
|  | #define GLM_LANG_CXX14			(GLM_LANG_CXX1Y | GLM_LANG_CXX14_FLAG) | ||||||
|  | #define GLM_LANG_CXX1Z			(GLM_LANG_CXX14 | GLM_LANG_CXX1Z_FLAG) | ||||||
|  | #define GLM_LANG_CXXMS			GLM_LANG_CXXMS_FLAG | ||||||
|  | #define GLM_LANG_CXXGNU			GLM_LANG_CXXGNU_FLAG | ||||||
|  |  | ||||||
|  | #if defined(GLM_FORCE_CXX14) | ||||||
|  | #	if((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER <= GLM_COMPILER_GCC50)) || ((GLM_COMPILER & GLM_COMPILER_CLANG) && (GLM_COMPILER <= GLM_COMPILER_CLANG34)) | ||||||
|  | #			pragma message("GLM: Using GLM_FORCE_CXX14 with a compiler that doesn't fully support C++14") | ||||||
|  | #	elif GLM_COMPILER & GLM_COMPILER_VC | ||||||
|  | #			pragma message("GLM: Using GLM_FORCE_CXX14 but there is no known version of Visual C++ compiler that fully supports C++14") | ||||||
|  | #	elif GLM_COMPILER & GLM_COMPILER_INTEL | ||||||
|  | #			pragma message("GLM: Using GLM_FORCE_CXX14 but there is no known version of ICC compiler that fully supports C++14") | ||||||
|  | #	endif | ||||||
|  | #	define GLM_LANG GLM_LANG_CXX14 | ||||||
|  | #	define GLM_LANG_STL11_FORCED | ||||||
|  | #elif defined(GLM_FORCE_CXX11) | ||||||
|  | #	if((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER <= GLM_COMPILER_GCC48)) || ((GLM_COMPILER & GLM_COMPILER_CLANG) && (GLM_COMPILER <= GLM_COMPILER_CLANG33)) | ||||||
|  | #			pragma message("GLM: Using GLM_FORCE_CXX11 with a compiler that doesn't fully support C++11") | ||||||
|  | #	elif GLM_COMPILER & GLM_COMPILER_VC | ||||||
|  | #			pragma message("GLM: Using GLM_FORCE_CXX11 but there is no known version of Visual C++ compiler that fully supports C++11") | ||||||
|  | #	elif GLM_COMPILER & GLM_COMPILER_INTEL | ||||||
|  | #			pragma message("GLM: Using GLM_FORCE_CXX11 but there is no known version of ICC compiler that fully supports C++11") | ||||||
|  | #	endif | ||||||
|  | #	define GLM_LANG GLM_LANG_CXX11 | ||||||
|  | #	define GLM_LANG_STL11_FORCED | ||||||
|  | #elif defined(GLM_FORCE_CXX03) | ||||||
|  | #	define GLM_LANG GLM_LANG_CXX03 | ||||||
|  | #elif defined(GLM_FORCE_CXX98) | ||||||
|  | #	define GLM_LANG GLM_LANG_CXX98 | ||||||
|  | #else | ||||||
|  | #	if GLM_COMPILER & GLM_COMPILER_CLANG | ||||||
|  | #		if __cplusplus >= 201402L // GLM_COMPILER_CLANG34 + -std=c++14 | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX14 | ||||||
|  | #		elif __has_feature(cxx_decltype_auto) && __has_feature(cxx_aggregate_nsdmi) // GLM_COMPILER_CLANG33 + -std=c++1y | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX1Y | ||||||
|  | #		elif __cplusplus >= 201103L // GLM_COMPILER_CLANG33 + -std=c++11 | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX11 | ||||||
|  | #		elif __has_feature(cxx_static_assert) // GLM_COMPILER_CLANG29 + -std=c++11 | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX0X | ||||||
|  | #		elif __cplusplus >= 199711L | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX98 | ||||||
|  | #		else | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX | ||||||
|  | #		endif | ||||||
|  | #	elif GLM_COMPILER & GLM_COMPILER_GCC | ||||||
|  | #		if __cplusplus >= 201402L | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX14 | ||||||
|  | #		elif __cplusplus >= 201103L | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX11 | ||||||
|  | #		elif defined(__GXX_EXPERIMENTAL_CXX0X__) | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX0X | ||||||
|  | #		else | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX98 | ||||||
|  | #		endif | ||||||
|  | #	elif GLM_COMPILER & GLM_COMPILER_VC | ||||||
|  | #		ifdef _MSC_EXTENSIONS | ||||||
|  | #			if __cplusplus >= 201402L | ||||||
|  | #				define GLM_LANG (GLM_LANG_CXX14 | GLM_LANG_CXXMS_FLAG) | ||||||
|  | //#			elif GLM_COMPILER >= GLM_COMPILER_VC14 | ||||||
|  | //#				define GLM_LANG (GLM_LANG_CXX1Y | GLM_LANG_CXXMS_FLAG) | ||||||
|  | #			elif __cplusplus >= 201103L | ||||||
|  | #				define GLM_LANG (GLM_LANG_CXX11 | GLM_LANG_CXXMS_FLAG) | ||||||
|  | #			elif GLM_COMPILER >= GLM_COMPILER_VC10 | ||||||
|  | #				define GLM_LANG (GLM_LANG_CXX0X | GLM_LANG_CXXMS_FLAG) | ||||||
|  | #			elif __cplusplus >= 199711L | ||||||
|  | #				define GLM_LANG (GLM_LANG_CXX98 | GLM_LANG_CXXMS_FLAG) | ||||||
|  | #			else | ||||||
|  | #				define GLM_LANG (GLM_LANG_CXX | GLM_LANG_CXXMS_FLAG) | ||||||
|  | #			endif | ||||||
|  | #		else | ||||||
|  | #			if __cplusplus >= 201402L | ||||||
|  | #				define GLM_LANG GLM_LANG_CXX14 | ||||||
|  | #			elif __cplusplus >= 201103L | ||||||
|  | #				define GLM_LANG GLM_LANG_CXX11 | ||||||
|  | #			elif GLM_COMPILER >= GLM_COMPILER_VC10 | ||||||
|  | #				define GLM_LANG GLM_LANG_CXX0X | ||||||
|  | #			elif __cplusplus >= 199711L | ||||||
|  | #				define GLM_LANG GLM_LANG_CXX98 | ||||||
|  | #			else | ||||||
|  | #				define GLM_LANG GLM_LANG_CXX | ||||||
|  | #			endif | ||||||
|  | #		endif | ||||||
|  | #	elif GLM_COMPILER & GLM_COMPILER_INTEL | ||||||
|  | #		ifdef _MSC_EXTENSIONS | ||||||
|  | #			define GLM_MSC_EXT GLM_LANG_CXXMS_FLAG | ||||||
|  | #		else | ||||||
|  | #			define GLM_MSC_EXT 0 | ||||||
|  | #		endif | ||||||
|  | #		if __cplusplus >= 201402L | ||||||
|  | #			define GLM_LANG (GLM_LANG_CXX14 | GLM_MSC_EXT) | ||||||
|  | #		elif __cplusplus >= 201103L | ||||||
|  | #			define GLM_LANG (GLM_LANG_CXX11 | GLM_MSC_EXT) | ||||||
|  | #		elif __INTEL_CXX11_MODE__ | ||||||
|  | #			define GLM_LANG (GLM_LANG_CXX0X | GLM_MSC_EXT) | ||||||
|  | #		elif __cplusplus >= 199711L | ||||||
|  | #			define GLM_LANG (GLM_LANG_CXX98 | GLM_MSC_EXT) | ||||||
|  | #		else | ||||||
|  | #			define GLM_LANG (GLM_LANG_CXX | GLM_MSC_EXT) | ||||||
|  | #		endif | ||||||
|  | #	elif GLM_COMPILER & GLM_COMPILER_CUDA | ||||||
|  | #		ifdef _MSC_EXTENSIONS | ||||||
|  | #			define GLM_MSC_EXT GLM_LANG_CXXMS_FLAG | ||||||
|  | #		else | ||||||
|  | #			define GLM_MSC_EXT 0 | ||||||
|  | #		endif | ||||||
|  | #		if GLM_COMPILER >= GLM_COMPILER_CUDA75 | ||||||
|  | #			define GLM_LANG (GLM_LANG_CXX0X | GLM_MSC_EXT) | ||||||
|  | #		else | ||||||
|  | #			define GLM_LANG (GLM_LANG_CXX98 | GLM_MSC_EXT) | ||||||
|  | #		endif | ||||||
|  | #	else // Unknown compiler | ||||||
|  | #		if __cplusplus >= 201402L | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX14 | ||||||
|  | #		elif __cplusplus >= 201103L | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX11 | ||||||
|  | #		elif __cplusplus >= 199711L | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX98 | ||||||
|  | #		else | ||||||
|  | #			define GLM_LANG GLM_LANG_CXX // Good luck with that! | ||||||
|  | #		endif | ||||||
|  | #		ifndef GLM_FORCE_PURE | ||||||
|  | #			define GLM_FORCE_PURE | ||||||
|  | #		endif | ||||||
|  | #	endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_LANG_DISPLAYED) | ||||||
|  | #	define GLM_MESSAGE_LANG_DISPLAYED | ||||||
|  |  | ||||||
|  | #	if GLM_LANG & GLM_LANG_CXX1Z_FLAG | ||||||
|  | #		pragma message("GLM: C++1z") | ||||||
|  | #	elif GLM_LANG & GLM_LANG_CXX14_FLAG | ||||||
|  | #		pragma message("GLM: C++14") | ||||||
|  | #	elif GLM_LANG & GLM_LANG_CXX1Y_FLAG | ||||||
|  | #		pragma message("GLM: C++1y") | ||||||
|  | #	elif GLM_LANG & GLM_LANG_CXX11_FLAG | ||||||
|  | #		pragma message("GLM: C++11") | ||||||
|  | #	elif GLM_LANG & GLM_LANG_CXX0X_FLAG | ||||||
|  | #		pragma message("GLM: C++0x") | ||||||
|  | #	elif GLM_LANG & GLM_LANG_CXX03_FLAG | ||||||
|  | #		pragma message("GLM: C++03") | ||||||
|  | #	elif GLM_LANG & GLM_LANG_CXX98_FLAG | ||||||
|  | #		pragma message("GLM: C++98") | ||||||
|  | #	else | ||||||
|  | #		pragma message("GLM: C++ language undetected") | ||||||
|  | #	endif//GLM_LANG | ||||||
|  |  | ||||||
|  | #	if GLM_LANG & (GLM_LANG_CXXGNU_FLAG | GLM_LANG_CXXMS_FLAG) | ||||||
|  | #		pragma message("GLM: Language extensions enabled") | ||||||
|  | #	endif//GLM_LANG | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // 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 | ||||||
|  | #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_GCC)) || \ | ||||||
|  | 		((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_COMPILER >= GLM_COMPILER_VC11)) || \ | ||||||
|  | 		((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CUDA)) || \ | ||||||
|  | 		((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC)) || \ | ||||||
|  | 		((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CLANG))) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | // N2235 | ||||||
|  | #if GLM_COMPILER & GLM_COMPILER_CLANG | ||||||
|  | #	define GLM_HAS_CONSTEXPR __has_feature(cxx_constexpr) | ||||||
|  | #	define GLM_HAS_CONSTEXPR_PARTIAL GLM_HAS_CONSTEXPR | ||||||
|  | #elif GLM_LANG & GLM_LANG_CXX11_FLAG | ||||||
|  | #	define GLM_HAS_CONSTEXPR 1 | ||||||
|  | #	define GLM_HAS_CONSTEXPR_PARTIAL GLM_HAS_CONSTEXPR | ||||||
|  | #else | ||||||
|  | #	define GLM_HAS_CONSTEXPR ((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_GCC48)))) // GCC 4.6 support constexpr but there is a compiler bug causing a crash | ||||||
|  | #	define GLM_HAS_CONSTEXPR_PARTIAL (GLM_HAS_CONSTEXPR || ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14))) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | // N2672 | ||||||
|  | #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_GCC)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA75)))) | ||||||
|  | #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 | GLM_LANG_CXXMS_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_LANG & GLM_LANG_CXXMS_FLAG)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA75)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46))) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | // N2346 | ||||||
|  | #if defined(GLM_FORCE_UNRESTRICTED_GENTYPE) | ||||||
|  | #	define GLM_HAS_DEFAULTED_FUNCTIONS 0 | ||||||
|  | #elif 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_GCC)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL12)) || \ | ||||||
|  | 		(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_GCC)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC11)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA50)))) | ||||||
|  | #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_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC45)) || \ | ||||||
|  | 		((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) && (GLM_COMPILER >= GLM_COMPILER_CUDA50)))) | ||||||
|  | #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_INTEL12_1)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC47)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA50)))) | ||||||
|  | #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_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL13)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC11)) || \ | ||||||
|  | 		((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA50)))) | ||||||
|  | #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(c_alignof) | ||||||
|  | #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_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)) || \ | ||||||
|  | 		((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) && (GLM_COMPILER >= GLM_COMPILER_CUDA70)))) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define GLM_HAS_ONLY_XYZW ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER < GLM_COMPILER_GCC46)) | ||||||
|  | #if GLM_HAS_ONLY_XYZW | ||||||
|  | #	pragma message("GLM: GCC older than 4.6 has a bug presenting the use of rgba and stpq components") | ||||||
|  | #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) && (GLM_COMPILER >= GLM_COMPILER_CUDA50)))) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if GLM_ARCH == GLM_ARCH_PURE | ||||||
|  | #	define GLM_HAS_BITSCAN_WINDOWS 0 | ||||||
|  | #else | ||||||
|  | #	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)))) | ||||||
|  | #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 | ||||||
|  | #		elif GLM_COMPILER >= GLM_COMPILER_GCC44 | ||||||
|  | #			define GLM_HAS_OPENMP 30 | ||||||
|  | #		elif GLM_COMPILER >= GLM_COMPILER_GCC42 | ||||||
|  | #			define GLM_HAS_OPENMP 25 | ||||||
|  | #		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 | ||||||
|  | #		if GLM_COMPILER >= GLM_COMPILER_VC10 | ||||||
|  | #			define GLM_HAS_OPENMP 20 | ||||||
|  | #		else | ||||||
|  | #			define GLM_HAS_OPENMP 0 | ||||||
|  | #		endif | ||||||
|  | #	elif GLM_COMPILER & GLM_COMPILER_INTEL | ||||||
|  | #		if GLM_COMPILER >= GLM_COMPILER_INTEL16 | ||||||
|  | #			define GLM_HAS_OPENMP 40 | ||||||
|  | #		elif GLM_COMPILER >= GLM_COMPILER_INTEL12 | ||||||
|  | #			define GLM_HAS_OPENMP 31 | ||||||
|  | #		else | ||||||
|  | #			define GLM_HAS_OPENMP 0 | ||||||
|  | #		endif | ||||||
|  | #	else | ||||||
|  | #		define GLM_HAS_OPENMP 0 | ||||||
|  | #	endif// GLM_COMPILER & GLM_COMPILER_VC | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Static assert | ||||||
|  |  | ||||||
|  | #if GLM_HAS_STATIC_ASSERT | ||||||
|  | #	define GLM_STATIC_ASSERT(x, message) static_assert(x, message) | ||||||
|  | #elif defined(BOOST_STATIC_ASSERT) | ||||||
|  | #	define GLM_STATIC_ASSERT(x, message) BOOST_STATIC_ASSERT(x) | ||||||
|  | #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) | ||||||
|  | #	define GLM_STATIC_ASSERT_NULL | ||||||
|  | #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 GLM_COMPILER & GLM_COMPILER_GCC | ||||||
|  | #	define GLM_VAR_USED __attribute__ ((unused)) | ||||||
|  | #else | ||||||
|  | #	define GLM_VAR_USED | ||||||
|  | #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 | ||||||
|  |  | ||||||
|  | #ifdef GLM_SWIZZLE | ||||||
|  | #	pragma message("GLM: GLM_SWIZZLE is deprecated, use GLM_FORCE_SWIZZLE instead") | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define GLM_SWIZZLE_ENABLED 1 | ||||||
|  | #define GLM_SWIZZLE_DISABLE 0 | ||||||
|  |  | ||||||
|  | #if defined(GLM_FORCE_SWIZZLE) || defined(GLM_SWIZZLE) | ||||||
|  | #	undef GLM_SWIZZLE | ||||||
|  | #	define GLM_SWIZZLE GLM_SWIZZLE_ENABLED | ||||||
|  | #else | ||||||
|  | #	undef GLM_SWIZZLE | ||||||
|  | #	define GLM_SWIZZLE GLM_SWIZZLE_DISABLE | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_SWIZZLE_DISPLAYED) | ||||||
|  | #	define GLM_MESSAGE_SWIZZLE_DISPLAYED | ||||||
|  | #	if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | #		pragma message("GLM: Swizzling operators enabled") | ||||||
|  | #	else | ||||||
|  | #		pragma message("GLM: Swizzling operators disabled, #define GLM_SWIZZLE to enable swizzle operators") | ||||||
|  | #	endif | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Allows using not basic types as genType | ||||||
|  |  | ||||||
|  | // #define GLM_FORCE_UNRESTRICTED_GENTYPE | ||||||
|  |  | ||||||
|  | #ifdef GLM_FORCE_UNRESTRICTED_GENTYPE | ||||||
|  | #	define GLM_UNRESTRICTED_GENTYPE 1 | ||||||
|  | #else | ||||||
|  | #	define GLM_UNRESTRICTED_GENTYPE 0 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_UNRESTRICTED_GENTYPE_DISPLAYED) | ||||||
|  | #	define GLM_MESSAGE_UNRESTRICTED_GENTYPE_DISPLAYED | ||||||
|  | #	ifdef GLM_FORCE_UNRESTRICTED_GENTYPE | ||||||
|  | #		pragma message("GLM: Use unrestricted genType") | ||||||
|  | #	endif | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Clip control | ||||||
|  |  | ||||||
|  | #ifdef GLM_DEPTH_ZERO_TO_ONE // Legacy 0.9.8 development | ||||||
|  | #	error Define GLM_FORCE_DEPTH_ZERO_TO_ONE instead of GLM_DEPTH_ZERO_TO_ONE to use 0 to 1 clip space. | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define GLM_DEPTH_ZERO_TO_ONE				0x00000001 | ||||||
|  | #define GLM_DEPTH_NEGATIVE_ONE_TO_ONE		0x00000002 | ||||||
|  |  | ||||||
|  | #ifdef GLM_FORCE_DEPTH_ZERO_TO_ONE | ||||||
|  | #	define GLM_DEPTH_CLIP_SPACE GLM_DEPTH_ZERO_TO_ONE | ||||||
|  | #else | ||||||
|  | #	define GLM_DEPTH_CLIP_SPACE GLM_DEPTH_NEGATIVE_ONE_TO_ONE | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_DEPTH_DISPLAYED) | ||||||
|  | #	define GLM_MESSAGE_DEPTH_DISPLAYED | ||||||
|  | #	if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE | ||||||
|  | #		pragma message("GLM: Depth clip space: Zero to one") | ||||||
|  | #	else | ||||||
|  | #		pragma message("GLM: Depth clip space: negative one to one") | ||||||
|  | #	endif | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Coordinate system, define GLM_FORCE_LEFT_HANDED before including GLM | ||||||
|  | // to use left handed coordinate system by default. | ||||||
|  |  | ||||||
|  | #ifdef GLM_LEFT_HANDED // Legacy 0.9.8 development | ||||||
|  | #	error Define GLM_FORCE_LEFT_HANDED instead of GLM_LEFT_HANDED left handed coordinate system by default. | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define GLM_LEFT_HANDED				0x00000001	// For DirectX, Metal, Vulkan | ||||||
|  | #define GLM_RIGHT_HANDED			0x00000002	// For OpenGL, default in GLM | ||||||
|  |  | ||||||
|  | #ifdef GLM_FORCE_LEFT_HANDED | ||||||
|  | #	define GLM_COORDINATE_SYSTEM GLM_LEFT_HANDED | ||||||
|  | #else | ||||||
|  | #	define GLM_COORDINATE_SYSTEM GLM_RIGHT_HANDED | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_HANDED_DISPLAYED) | ||||||
|  | #	define GLM_MESSAGE_HANDED_DISPLAYED | ||||||
|  | #	if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED | ||||||
|  | #		pragma message("GLM: Coordinate system: left handed") | ||||||
|  | #	else | ||||||
|  | #		pragma message("GLM: Coordinate system: right handed") | ||||||
|  | #	endif | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Qualifiers | ||||||
|  |  | ||||||
|  | #if (GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)) | ||||||
|  | #	define GLM_DEPRECATED __declspec(deprecated) | ||||||
|  | #	define GLM_ALIGN(x) __declspec(align(x)) | ||||||
|  | #	define GLM_ALIGNED_STRUCT(x) struct __declspec(align(x)) | ||||||
|  | #	define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef __declspec(align(alignment)) type name | ||||||
|  | #	define GLM_RESTRICT_FUNC __declspec(restrict) | ||||||
|  | #	define GLM_RESTRICT __restrict | ||||||
|  | #	if GLM_COMPILER >= GLM_COMPILER_VC12 | ||||||
|  | #		define GLM_VECTOR_CALL __vectorcall | ||||||
|  | #	else | ||||||
|  | #		define GLM_VECTOR_CALL | ||||||
|  | #	endif | ||||||
|  | #elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG | GLM_COMPILER_INTEL) | ||||||
|  | #	define GLM_DEPRECATED __attribute__((__deprecated__)) | ||||||
|  | #	define GLM_ALIGN(x) __attribute__((aligned(x))) | ||||||
|  | #	define GLM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x))) | ||||||
|  | #	define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __attribute__((aligned(alignment))) | ||||||
|  | #	define GLM_RESTRICT_FUNC __restrict__ | ||||||
|  | #	define GLM_RESTRICT __restrict__ | ||||||
|  | #	if GLM_COMPILER & GLM_COMPILER_CLANG | ||||||
|  | #		if GLM_COMPILER >= GLM_COMPILER_CLANG37 | ||||||
|  | #			define GLM_VECTOR_CALL __vectorcall | ||||||
|  | #		else | ||||||
|  | #			define GLM_VECTOR_CALL | ||||||
|  | #		endif | ||||||
|  | #	else | ||||||
|  | #		define GLM_VECTOR_CALL | ||||||
|  | #	endif | ||||||
|  | #elif GLM_COMPILER & GLM_COMPILER_CUDA | ||||||
|  | #	define GLM_DEPRECATED | ||||||
|  | #	define GLM_ALIGN(x) __align__(x) | ||||||
|  | #	define GLM_ALIGNED_STRUCT(x) struct __align__(x) | ||||||
|  | #	define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __align__(x) | ||||||
|  | #	define GLM_RESTRICT_FUNC __restrict__ | ||||||
|  | #	define GLM_RESTRICT __restrict__ | ||||||
|  | #	define GLM_VECTOR_CALL | ||||||
|  | #else | ||||||
|  | #	define GLM_DEPRECATED | ||||||
|  | #	define GLM_ALIGN | ||||||
|  | #	define GLM_ALIGNED_STRUCT(x) struct | ||||||
|  | #	define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name | ||||||
|  | #	define GLM_RESTRICT_FUNC | ||||||
|  | #	define GLM_RESTRICT | ||||||
|  | #	define GLM_VECTOR_CALL | ||||||
|  | #endif//GLM_COMPILER | ||||||
|  |  | ||||||
|  | #if GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | #	define GLM_DEFAULT = default | ||||||
|  | #	ifdef GLM_FORCE_NO_CTOR_INIT | ||||||
|  | #		define GLM_DEFAULT_CTOR = default | ||||||
|  | #	else | ||||||
|  | #		define GLM_DEFAULT_CTOR | ||||||
|  | #	endif | ||||||
|  | #else | ||||||
|  | #	define GLM_DEFAULT | ||||||
|  | #	define GLM_DEFAULT_CTOR | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if GLM_HAS_CONSTEXPR || GLM_HAS_CONSTEXPR_PARTIAL | ||||||
|  | #	define GLM_CONSTEXPR constexpr | ||||||
|  | #	if GLM_COMPILER & GLM_COMPILER_VC // Visual C++ has a bug #594 https://github.com/g-truc/glm/issues/594 | ||||||
|  | #		define GLM_CONSTEXPR_CTOR | ||||||
|  | #	else | ||||||
|  | #		define GLM_CONSTEXPR_CTOR constexpr | ||||||
|  | #	endif | ||||||
|  | #else | ||||||
|  | #	define GLM_CONSTEXPR | ||||||
|  | #	define GLM_CONSTEXPR_CTOR | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if GLM_HAS_CONSTEXPR | ||||||
|  | #	define GLM_RELAXED_CONSTEXPR constexpr | ||||||
|  | #else | ||||||
|  | #	define GLM_RELAXED_CONSTEXPR const | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if GLM_ARCH == GLM_ARCH_PURE | ||||||
|  | #	define GLM_CONSTEXPR_SIMD GLM_CONSTEXPR_CTOR | ||||||
|  | #else | ||||||
|  | #	define GLM_CONSTEXPR_SIMD | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef GLM_FORCE_EXPLICIT_CTOR | ||||||
|  | #	define GLM_EXPLICIT explicit | ||||||
|  | #else | ||||||
|  | #	define GLM_EXPLICIT | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | #define GLM_HAS_ALIGNED_TYPE GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Length type | ||||||
|  |  | ||||||
|  | // User defines: GLM_FORCE_SIZE_T_LENGTH GLM_FORCE_SIZE_FUNC | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	using std::size_t; | ||||||
|  | #	if defined(GLM_FORCE_SIZE_T_LENGTH) | ||||||
|  | 		typedef size_t length_t; | ||||||
|  | #	else | ||||||
|  | 		typedef int length_t; | ||||||
|  | #	endif | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_FORCE_SIZE_T_LENGTH) | ||||||
|  | #	define GLM_MESSAGE_FORCE_SIZE_T_LENGTH | ||||||
|  | #	if defined GLM_FORCE_SIZE_T_LENGTH | ||||||
|  | #		pragma message("GLM: .length() returns glm::length_t, a typedef of std::size_t") | ||||||
|  | #	else | ||||||
|  | #		pragma message("GLM: .length() returns glm::length_t, a typedef of int following the GLSL specification") | ||||||
|  | #	endif | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // countof | ||||||
|  |  | ||||||
|  | #ifndef __has_feature | ||||||
|  | #	define __has_feature(x) 0 // Compatibility with non-clang compilers. | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if GLM_HAS_CONSTEXPR_PARTIAL | ||||||
|  | 	namespace glm | ||||||
|  | 	{ | ||||||
|  | 		template <typename T, std::size_t N> | ||||||
|  | 		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_COUNTOF(arr) _countof(arr) | ||||||
|  | #else | ||||||
|  | #	define GLM_COUNTOF(arr) sizeof(arr) / sizeof(arr[0]) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Uninitialize constructors | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	enum ctor{uninitialize}; | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										67
									
								
								lib/glm/detail/type_float.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								lib/glm/detail/type_float.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_float.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "setup.hpp" | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	typedef float				float32; | ||||||
|  | 	typedef double				float64; | ||||||
|  | }//namespace detail | ||||||
|  | 	 | ||||||
|  | 	typedef float				lowp_float_t; | ||||||
|  | 	typedef float				mediump_float_t; | ||||||
|  | 	typedef double				highp_float_t; | ||||||
|  |  | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  |  | ||||||
|  | 	/// Low precision floating-point numbers.  | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.4 Floats</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef lowp_float_t		lowp_float; | ||||||
|  |  | ||||||
|  | 	/// Medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.4 Floats</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef mediump_float_t		mediump_float; | ||||||
|  |  | ||||||
|  | 	/// High precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.4 Floats</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef highp_float_t		highp_float; | ||||||
|  |  | ||||||
|  | #if(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) | ||||||
|  | 	typedef mediump_float		float_t; | ||||||
|  | #elif(defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) | ||||||
|  | 	typedef highp_float			float_t; | ||||||
|  | #elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) | ||||||
|  | 	typedef mediump_float		float_t; | ||||||
|  | #elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && defined(GLM_PRECISION_LOWP_FLOAT)) | ||||||
|  | 	typedef lowp_float			float_t; | ||||||
|  | #else | ||||||
|  | #	error "GLM error: multiple default precision requested for floating-point types" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | 	typedef float				float32; | ||||||
|  | 	typedef double				float64; | ||||||
|  |  | ||||||
|  | //////////////////// | ||||||
|  | // check type sizes | ||||||
|  | #ifndef GLM_STATIC_ASSERT_NULL | ||||||
|  | 	GLM_STATIC_ASSERT(sizeof(glm::float32) == 4, "float32 size isn't 4 bytes on this platform"); | ||||||
|  | 	GLM_STATIC_ASSERT(sizeof(glm::float64) == 8, "float64 size isn't 8 bytes on this platform"); | ||||||
|  | #endif//GLM_STATIC_ASSERT_NULL | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  |  | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										195
									
								
								lib/glm/detail/type_gentype.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								lib/glm/detail/type_gentype.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,195 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_gentype.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	enum profile | ||||||
|  | 	{ | ||||||
|  | 		nice, | ||||||
|  | 		fast, | ||||||
|  | 		simd | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	typedef std::size_t sizeType; | ||||||
|  | 	 | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template | ||||||
|  | 	< | ||||||
|  | 		typename VALTYPE,  | ||||||
|  | 		template <typename> class TYPE | ||||||
|  | 	> | ||||||
|  | 	struct genType | ||||||
|  | 	{ | ||||||
|  | 	public: | ||||||
|  | 		enum ctor{null}; | ||||||
|  |  | ||||||
|  | 		typedef VALTYPE value_type; | ||||||
|  | 		typedef VALTYPE & value_reference; | ||||||
|  | 		typedef VALTYPE * value_pointer; | ||||||
|  | 		typedef VALTYPE const * value_const_pointer; | ||||||
|  | 		typedef TYPE<bool> bool_type; | ||||||
|  |  | ||||||
|  | 		typedef sizeType size_type; | ||||||
|  | 		static bool is_vector(); | ||||||
|  | 		static bool is_matrix(); | ||||||
|  | 		 | ||||||
|  | 		typedef TYPE<VALTYPE> type; | ||||||
|  | 		typedef TYPE<VALTYPE> * pointer; | ||||||
|  | 		typedef TYPE<VALTYPE> const * const_pointer; | ||||||
|  | 		typedef TYPE<VALTYPE> const * const const_pointer_const; | ||||||
|  | 		typedef TYPE<VALTYPE> * const pointer_const; | ||||||
|  | 		typedef TYPE<VALTYPE> & reference; | ||||||
|  | 		typedef TYPE<VALTYPE> const & const_reference; | ||||||
|  | 		typedef TYPE<VALTYPE> const & param_type; | ||||||
|  |  | ||||||
|  | 		////////////////////////////////////// | ||||||
|  | 		// Address (Implementation details) | ||||||
|  |  | ||||||
|  | 		value_const_pointer value_address() const{return value_pointer(this);} | ||||||
|  | 		value_pointer value_address(){return value_pointer(this);} | ||||||
|  |  | ||||||
|  | 	//protected: | ||||||
|  | 	//	enum kind | ||||||
|  | 	//	{ | ||||||
|  | 	//		GEN_TYPE, | ||||||
|  | 	//		VEC_TYPE, | ||||||
|  | 	//		MAT_TYPE | ||||||
|  | 	//	}; | ||||||
|  |  | ||||||
|  | 	//	typedef typename TYPE::kind kind; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template | ||||||
|  | 	< | ||||||
|  | 		typename VALTYPE,  | ||||||
|  | 		template <typename> class TYPE | ||||||
|  | 	> | ||||||
|  | 	bool genType<VALTYPE, TYPE>::is_vector() | ||||||
|  | 	{ | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  | /* | ||||||
|  | 	template <typename valTypeT, unsigned int colT, unsigned int rowT, profile proT = nice> | ||||||
|  | 	class base | ||||||
|  | 	{ | ||||||
|  | 	public: | ||||||
|  | 		////////////////////////////////////// | ||||||
|  | 		// Traits | ||||||
|  |  | ||||||
|  | 		typedef sizeType							size_type; | ||||||
|  | 		typedef valTypeT							value_type; | ||||||
|  |  | ||||||
|  | 		typedef base<value_type, colT, rowT>		class_type; | ||||||
|  |  | ||||||
|  | 		typedef base<bool, colT, rowT>				bool_type; | ||||||
|  | 		typedef base<value_type, rowT, 1>			col_type; | ||||||
|  | 		typedef base<value_type, colT, 1>			row_type; | ||||||
|  | 		typedef base<value_type, rowT, colT>		transpose_type; | ||||||
|  |  | ||||||
|  | 		static size_type							col_size(); | ||||||
|  | 		static size_type							row_size(); | ||||||
|  | 		static size_type							value_size(); | ||||||
|  | 		static bool									is_scalar(); | ||||||
|  | 		static bool									is_vector(); | ||||||
|  | 		static bool									is_matrix(); | ||||||
|  |  | ||||||
|  | 	private: | ||||||
|  | 		// Data  | ||||||
|  | 		col_type value[colT];		 | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		////////////////////////////////////// | ||||||
|  | 		// Constructors | ||||||
|  | 		base(); | ||||||
|  | 		base(class_type const & m); | ||||||
|  |  | ||||||
|  | 		explicit base(T const & x); | ||||||
|  | 		explicit base(value_type const * const x); | ||||||
|  | 		explicit base(col_type const * const x); | ||||||
|  |  | ||||||
|  | 		////////////////////////////////////// | ||||||
|  | 		// Conversions | ||||||
|  | 		template <typename vU, uint cU, uint rU, profile pU> | ||||||
|  | 		explicit base(base<vU, cU, rU, pU> const & m); | ||||||
|  |  | ||||||
|  | 		////////////////////////////////////// | ||||||
|  | 		// Accesses | ||||||
|  | 		col_type& operator[](size_type i); | ||||||
|  | 		col_type const & operator[](size_type i) const; | ||||||
|  |  | ||||||
|  | 		////////////////////////////////////// | ||||||
|  | 		// Unary updatable operators | ||||||
|  | 		class_type& operator=  (class_type const & x); | ||||||
|  | 		class_type& operator+= (T const & x); | ||||||
|  | 		class_type& operator+= (class_type const & x); | ||||||
|  | 		class_type& operator-= (T const & x); | ||||||
|  | 		class_type& operator-= (class_type const & x); | ||||||
|  | 		class_type& operator*= (T const & x); | ||||||
|  | 		class_type& operator*= (class_type const & x); | ||||||
|  | 		class_type& operator/= (T const & x); | ||||||
|  | 		class_type& operator/= (class_type const & x); | ||||||
|  | 		class_type& operator++ (); | ||||||
|  | 		class_type& operator-- (); | ||||||
|  | 	}; | ||||||
|  | */ | ||||||
|  | 	 | ||||||
|  | 	//template <typename T> | ||||||
|  | 	//struct traits | ||||||
|  | 	//{ | ||||||
|  | 	//	static const bool is_signed = false; | ||||||
|  | 	//	static const bool is_float = false; | ||||||
|  | 	//	static const bool is_vector = false; | ||||||
|  | 	//	static const bool is_matrix = false; | ||||||
|  | 	//	static const bool is_genType = false; | ||||||
|  | 	//	static const bool is_genIType = false; | ||||||
|  | 	//	static const bool is_genUType = false; | ||||||
|  | 	//}; | ||||||
|  | 	 | ||||||
|  | 	//template <> | ||||||
|  | 	//struct traits<half> | ||||||
|  | 	//{ | ||||||
|  | 	//	static const bool is_float = true; | ||||||
|  | 	//	static const bool is_genType = true; | ||||||
|  | 	//}; | ||||||
|  | 	 | ||||||
|  | 	//template <> | ||||||
|  | 	//struct traits<float> | ||||||
|  | 	//{ | ||||||
|  | 	//	static const bool is_float = true; | ||||||
|  | 	//	static const bool is_genType = true; | ||||||
|  | 	//}; | ||||||
|  | 	 | ||||||
|  | 	//template <> | ||||||
|  | 	//struct traits<double> | ||||||
|  | 	//{ | ||||||
|  | 	//	static const bool is_float = true; | ||||||
|  | 	//	static const bool is_genType = true; | ||||||
|  | 	//}; | ||||||
|  | 	 | ||||||
|  | 	//template <typename genType> | ||||||
|  | 	//struct desc | ||||||
|  | 	//{ | ||||||
|  | 	//	typedef genType							type; | ||||||
|  | 	//	typedef genType *						pointer; | ||||||
|  | 	//	typedef genType const*					const_pointer; | ||||||
|  | 	//	typedef genType const *const			const_pointer_const; | ||||||
|  | 	//	typedef genType *const					pointer_const; | ||||||
|  | 	//	typedef genType &						reference; | ||||||
|  | 	//	typedef genType const&					const_reference; | ||||||
|  | 	//	typedef genType const&					param_type; | ||||||
|  | 	 | ||||||
|  | 	//	typedef typename genType::value_type	value_type; | ||||||
|  | 	//	typedef typename genType::size_type		size_type; | ||||||
|  | 	//	static const typename size_type			value_size; | ||||||
|  | 	//}; | ||||||
|  | 	 | ||||||
|  | 	//template <typename genType> | ||||||
|  | 	//const typename desc<genType>::size_type desc<genType>::value_size = genType::value_size(); | ||||||
|  | 	 | ||||||
|  | }//namespace detail | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | //#include "type_gentype.inl" | ||||||
							
								
								
									
										341
									
								
								lib/glm/detail/type_gentype.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										341
									
								
								lib/glm/detail/type_gentype.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,341 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_gentype.inl | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail{ | ||||||
|  |  | ||||||
|  | ///////////////////////////////// | ||||||
|  | // Static functions | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::col_size() | ||||||
|  | { | ||||||
|  | 	return cT; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::row_size() | ||||||
|  | { | ||||||
|  | 	return rT; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::value_size() | ||||||
|  | { | ||||||
|  | 	return rT * cT; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | bool base<vT, cT, rT, pT>::is_scalar() | ||||||
|  | { | ||||||
|  | 	return rT == 1 && cT == 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | bool base<vT, cT, rT, pT>::is_vector() | ||||||
|  | { | ||||||
|  | 	return rT == 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | bool base<vT, cT, rT, pT>::is_matrix() | ||||||
|  | { | ||||||
|  | 	return rT != 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ///////////////////////////////// | ||||||
|  | // Constructor | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | base<vT, cT, rT, pT>::base() | ||||||
|  | { | ||||||
|  | 	memset(&this->value, 0, cT * rT * sizeof(vT)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | base<vT, cT, rT, pT>::base | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::class_type const & m | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	for | ||||||
|  | 	( | ||||||
|  | 		typename genType<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0); | ||||||
|  | 		i < base<vT, cT, rT, pT>::col_size(); | ||||||
|  | 		++i | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[i] = m[i]; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | base<vT, cT, rT, pT>::base | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::T const & x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	if(rT == 1) // vector | ||||||
|  | 	{ | ||||||
|  | 		for | ||||||
|  | 		( | ||||||
|  | 			typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0); | ||||||
|  | 			i < base<vT, cT, rT, pT>::col_size(); | ||||||
|  | 			++i | ||||||
|  | 		) | ||||||
|  | 		{ | ||||||
|  | 			this->value[i][rT] = x; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else // matrix | ||||||
|  | 	{ | ||||||
|  | 		memset(&this->value, 0, cT * rT * sizeof(vT)); | ||||||
|  |  | ||||||
|  | 		typename base<vT, cT, rT, pT>::size_type stop = cT < rT ? cT : rT; | ||||||
|  |  | ||||||
|  | 		for | ||||||
|  | 		( | ||||||
|  | 			typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0); | ||||||
|  | 			i < stop; | ||||||
|  | 			++i | ||||||
|  | 		) | ||||||
|  | 		{ | ||||||
|  | 			this->value[i][i] = x; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | base<vT, cT, rT, pT>::base | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::value_type const * const x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	memcpy(&this->value, &x.value, cT * rT * sizeof(vT)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | base<vT, cT, rT, pT>::base | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::col_type const * const x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	for | ||||||
|  | 	( | ||||||
|  | 		typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0); | ||||||
|  | 		i < base<vT, cT, rT, pT>::col_size(); | ||||||
|  | 		++i | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[i] = x[i]; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | template <typename vU, uint cU, uint rU, profile pU> | ||||||
|  | base<vT, cT, rT, pT>::base | ||||||
|  | ( | ||||||
|  | 	base<vU, cU, rU, pU> const & m | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	for | ||||||
|  | 	( | ||||||
|  | 		typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0); | ||||||
|  | 		i < base<vT, cT, rT, pT>::col_size(); | ||||||
|  | 		++i | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[i] = base<vT, cT, rT, pT>(m[i]); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ////////////////////////////////////// | ||||||
|  | // Accesses | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::col_type& base<vT, cT, rT, pT>::operator[] | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type i | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	return this->value[i]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::col_type const & base<vT, cT, rT, pT>::operator[] | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type i | ||||||
|  | ) const | ||||||
|  | { | ||||||
|  | 	return this->value[i]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ////////////////////////////////////// | ||||||
|  | // Unary updatable operators | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator=  | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::class_type const & x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	memcpy(&this->value, &x.value, cT * rT * sizeof(vT)); | ||||||
|  | 	return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+=  | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::T const & x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); | ||||||
|  |  | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) | ||||||
|  | 		this->value[j][i] += x; | ||||||
|  |  | ||||||
|  | 	return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+=  | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::class_type const & x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); | ||||||
|  |  | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) | ||||||
|  | 		this->value[j][i] += x[j][i]; | ||||||
|  |  | ||||||
|  | 	return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-=  | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::T const & x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); | ||||||
|  |  | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) | ||||||
|  | 		this->value[j][i] -= x; | ||||||
|  |  | ||||||
|  | 	return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-=  | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::class_type const & x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); | ||||||
|  |  | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) | ||||||
|  | 		this->value[j][i] -= x[j][i]; | ||||||
|  |  | ||||||
|  | 	return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*=  | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::T const & x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); | ||||||
|  |  | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) | ||||||
|  | 		this->value[j][i] *= x; | ||||||
|  |  | ||||||
|  | 	return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*=  | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::class_type const & x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); | ||||||
|  |  | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) | ||||||
|  | 		this->value[j][i] *= x[j][i]; | ||||||
|  |  | ||||||
|  | 	return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/=  | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::T const & x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); | ||||||
|  |  | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) | ||||||
|  | 		this->value[j][i] /= x; | ||||||
|  |  | ||||||
|  | 	return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/=  | ||||||
|  | ( | ||||||
|  | 	typename base<vT, cT, rT, pT>::class_type const & x | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); | ||||||
|  |  | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) | ||||||
|  | 		this->value[j][i] /= x[j][i]; | ||||||
|  |  | ||||||
|  | 	return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator++ () | ||||||
|  | { | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_col = col_size(); | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_row = row_size(); | ||||||
|  |  | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) | ||||||
|  | 		++this->value[j][i]; | ||||||
|  |  | ||||||
|  | 	return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename vT, uint cT, uint rT, profile pT> | ||||||
|  | typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-- () | ||||||
|  | { | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_col = col_size(); | ||||||
|  | 	typename base<vT, cT, rT, pT>::size_type stop_row = row_size(); | ||||||
|  |  | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) | ||||||
|  | 	for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) | ||||||
|  | 		--this->value[j][i]; | ||||||
|  |  | ||||||
|  | 	return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } //namespace detail | ||||||
|  | } //namespace glm | ||||||
							
								
								
									
										19
									
								
								lib/glm/detail/type_half.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								lib/glm/detail/type_half.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_half.hpp | ||||||
|  |  | ||||||
|  | #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" | ||||||
							
								
								
									
										244
									
								
								lib/glm/detail/type_half.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								lib/glm/detail/type_half.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,244 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_half.inl | ||||||
|  |  | ||||||
|  | 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(uint32 i_) : | ||||||
|  | 			i(i_) | ||||||
|  | 		{} | ||||||
|  |  | ||||||
|  | 		float f; | ||||||
|  | 		uint32 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 = (unsigned int)(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 = (unsigned int)((s << 31) | 0x7f800000); | ||||||
|  | 				return result.f; | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
|  | 				// | ||||||
|  | 				// Nan -- preserve sign and significand bits | ||||||
|  | 				// | ||||||
|  |  | ||||||
|  | 				uif32 result; | ||||||
|  | 				result.i = (unsigned int)((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 = (unsigned int)((s << 31) | (e << 23) | m); | ||||||
|  | 		return Result.f; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	GLM_FUNC_QUALIFIER hdata toFloat16(float const & f) | ||||||
|  | 	{ | ||||||
|  | 		uif32 Entry; | ||||||
|  | 		Entry.f = f; | ||||||
|  | 		int i = (int)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 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 | ||||||
							
								
								
									
										306
									
								
								lib/glm/detail/type_int.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								lib/glm/detail/type_int.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,306 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_int.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "setup.hpp" | ||||||
|  | #if GLM_HAS_MAKE_SIGNED | ||||||
|  | #	include <type_traits> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if GLM_HAS_EXTENDED_INTEGER_TYPE | ||||||
|  | #	include <cstdint> | ||||||
|  | #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; | ||||||
|  | 		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 | ||||||
|  | #		if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available | ||||||
|  | 			typedef int64_t					sint64; | ||||||
|  | 			typedef uint64_t				uint64; | ||||||
|  | 	 | ||||||
|  | #		elif GLM_COMPILER & GLM_COMPILER_VC | ||||||
|  | 			typedef signed __int64			sint64; | ||||||
|  | 			typedef unsigned __int64		uint64; | ||||||
|  | 	 | ||||||
|  | #		elif GLM_COMPILER & GLM_COMPILER_GCC | ||||||
|  | #			pragma GCC diagnostic ignored "-Wlong-long" | ||||||
|  | 			__extension__ typedef signed long long		sint64; | ||||||
|  | 			__extension__ typedef unsigned long long	uint64; | ||||||
|  | 	 | ||||||
|  | #		elif (GLM_COMPILER & GLM_COMPILER_CLANG) | ||||||
|  | #			pragma clang diagnostic ignored "-Wc++11-long-long" | ||||||
|  | 			typedef signed long	long		sint64; | ||||||
|  | 			typedef unsigned long long		uint64; | ||||||
|  | 	 | ||||||
|  | #		else//unknown compiler | ||||||
|  | 			typedef signed long	long		sint64; | ||||||
|  | 			typedef unsigned long long		uint64; | ||||||
|  | #		endif//GLM_COMPILER | ||||||
|  | 		 | ||||||
|  | 		typedef signed char					int8; | ||||||
|  | 		typedef signed short				int16; | ||||||
|  | 		typedef signed int					int32; | ||||||
|  | 		typedef sint64						int64; | ||||||
|  | 	 | ||||||
|  | 		typedef unsigned char				uint8; | ||||||
|  | 		typedef unsigned short				uint16; | ||||||
|  | 		typedef unsigned int				uint32; | ||||||
|  | 		typedef uint64						uint64; | ||||||
|  | #endif// | ||||||
|  | 	 | ||||||
|  | 	typedef signed int						lowp_int_t; | ||||||
|  | 	typedef signed int						mediump_int_t; | ||||||
|  | 	typedef signed int						highp_int_t; | ||||||
|  | 	 | ||||||
|  | 	typedef unsigned int					lowp_uint_t; | ||||||
|  | 	typedef unsigned int					mediump_uint_t; | ||||||
|  | 	typedef unsigned int					highp_uint_t; | ||||||
|  |  | ||||||
|  | #	if GLM_HAS_MAKE_SIGNED | ||||||
|  | 		using std::make_signed; | ||||||
|  | 		using std::make_unsigned; | ||||||
|  |  | ||||||
|  | #	else//GLM_HAS_MAKE_SIGNED | ||||||
|  | 		template <typename genType> | ||||||
|  | 		struct make_signed | ||||||
|  | 		{}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_signed<char> | ||||||
|  | 		{ | ||||||
|  | 			typedef char type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_signed<short> | ||||||
|  | 		{ | ||||||
|  | 			typedef short type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_signed<int> | ||||||
|  | 		{ | ||||||
|  | 			typedef int type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_signed<long> | ||||||
|  | 		{ | ||||||
|  | 			typedef long type; | ||||||
|  | 		}; | ||||||
|  | 	 | ||||||
|  | 		template <> | ||||||
|  | 		struct make_signed<unsigned char> | ||||||
|  | 		{ | ||||||
|  | 			typedef char type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_signed<unsigned short> | ||||||
|  | 		{ | ||||||
|  | 			typedef short type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_signed<unsigned int> | ||||||
|  | 		{ | ||||||
|  | 			typedef int type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_signed<unsigned long> | ||||||
|  | 		{ | ||||||
|  | 			typedef long type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <typename genType> | ||||||
|  | 		struct make_unsigned | ||||||
|  | 		{}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_unsigned<char> | ||||||
|  | 		{ | ||||||
|  | 			typedef unsigned char type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_unsigned<short> | ||||||
|  | 		{ | ||||||
|  | 			typedef unsigned short type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_unsigned<int> | ||||||
|  | 		{ | ||||||
|  | 			typedef unsigned int type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_unsigned<long> | ||||||
|  | 		{ | ||||||
|  | 			typedef unsigned long type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_unsigned<unsigned char> | ||||||
|  | 		{ | ||||||
|  | 			typedef unsigned char type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_unsigned<unsigned short> | ||||||
|  | 		{ | ||||||
|  | 			typedef unsigned short type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_unsigned<unsigned int> | ||||||
|  | 		{ | ||||||
|  | 			typedef unsigned int type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_unsigned<unsigned long> | ||||||
|  | 		{ | ||||||
|  | 			typedef unsigned long type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct make_signed<long long> | ||||||
|  | 		{ | ||||||
|  | 			typedef long long type; | ||||||
|  | 		}; | ||||||
|  | 	 | ||||||
|  | 		template <> | ||||||
|  | 		struct make_signed<unsigned long long> | ||||||
|  | 		{ | ||||||
|  | 			typedef long long type; | ||||||
|  | 		}; | ||||||
|  | 	 | ||||||
|  | 		template <> | ||||||
|  | 		struct make_unsigned<long long> | ||||||
|  | 		{ | ||||||
|  | 			typedef unsigned long long type; | ||||||
|  | 		}; | ||||||
|  | 	 | ||||||
|  | 		template <> | ||||||
|  | 		struct make_unsigned<unsigned long long> | ||||||
|  | 		{ | ||||||
|  | 			typedef unsigned long long type; | ||||||
|  | 		}; | ||||||
|  | #	endif//GLM_HAS_MAKE_SIGNED | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | 	typedef detail::int8					int8; | ||||||
|  | 	typedef detail::int16					int16; | ||||||
|  | 	typedef detail::int32					int32; | ||||||
|  | 	typedef detail::int64					int64; | ||||||
|  | 	 | ||||||
|  | 	typedef detail::uint8					uint8; | ||||||
|  | 	typedef detail::uint16					uint16; | ||||||
|  | 	typedef detail::uint32					uint32; | ||||||
|  | 	typedef detail::uint64					uint64; | ||||||
|  |  | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  |  | ||||||
|  | 	/// Low precision signed integer.  | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef detail::lowp_int_t				lowp_int; | ||||||
|  |  | ||||||
|  | 	/// Medium precision signed integer.  | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef detail::mediump_int_t			mediump_int; | ||||||
|  |  | ||||||
|  | 	/// High precision signed integer. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef detail::highp_int_t				highp_int; | ||||||
|  |  | ||||||
|  | 	/// Low precision unsigned integer.  | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef detail::lowp_uint_t				lowp_uint; | ||||||
|  |  | ||||||
|  | 	/// Medium precision unsigned integer.  | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef detail::mediump_uint_t			mediump_uint; | ||||||
|  |  | ||||||
|  | 	/// High precision unsigned integer.  | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef detail::highp_uint_t			highp_uint; | ||||||
|  |  | ||||||
|  | #if(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT)) | ||||||
|  | 	typedef mediump_int					int_t; | ||||||
|  | #elif(defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT)) | ||||||
|  | 	typedef highp_int					int_t; | ||||||
|  | #elif(!defined(GLM_PRECISION_HIGHP_INT) && defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT)) | ||||||
|  | 	typedef mediump_int					int_t; | ||||||
|  | #elif(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && defined(GLM_PRECISION_LOWP_INT)) | ||||||
|  | 	typedef lowp_int					int_t; | ||||||
|  | #else | ||||||
|  | #	error "GLM error: multiple default precision requested for signed integer types" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT)) | ||||||
|  | 	typedef mediump_uint				uint_t; | ||||||
|  | #elif(defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT)) | ||||||
|  | 	typedef highp_uint					uint_t; | ||||||
|  | #elif(!defined(GLM_PRECISION_HIGHP_UINT) && defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT)) | ||||||
|  | 	typedef mediump_uint				uint_t; | ||||||
|  | #elif(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && defined(GLM_PRECISION_LOWP_UINT)) | ||||||
|  | 	typedef lowp_uint					uint_t; | ||||||
|  | #else | ||||||
|  | #	error "GLM error: multiple default precision requested for unsigned integer types" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | 	/// Unsigned integer type. | ||||||
|  | 	///  | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> | ||||||
|  | 	typedef unsigned int				uint; | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  |  | ||||||
|  | //////////////////// | ||||||
|  | // check type sizes | ||||||
|  | #ifndef GLM_STATIC_ASSERT_NULL | ||||||
|  | 	GLM_STATIC_ASSERT(sizeof(glm::int8) == 1, "int8 size isn't 1 byte on this platform"); | ||||||
|  | 	GLM_STATIC_ASSERT(sizeof(glm::int16) == 2, "int16 size isn't 2 bytes on this platform"); | ||||||
|  | 	GLM_STATIC_ASSERT(sizeof(glm::int32) == 4, "int32 size isn't 4 bytes on this platform"); | ||||||
|  | 	GLM_STATIC_ASSERT(sizeof(glm::int64) == 8, "int64 size isn't 8 bytes on this platform"); | ||||||
|  |  | ||||||
|  | 	GLM_STATIC_ASSERT(sizeof(glm::uint8) == 1, "uint8 size isn't 1 byte on this platform"); | ||||||
|  | 	GLM_STATIC_ASSERT(sizeof(glm::uint16) == 2, "uint16 size isn't 2 bytes on this platform"); | ||||||
|  | 	GLM_STATIC_ASSERT(sizeof(glm::uint32) == 4, "uint32 size isn't 4 bytes on this platform"); | ||||||
|  | 	GLM_STATIC_ASSERT(sizeof(glm::uint64) == 8, "uint64 size isn't 8 bytes on this platform"); | ||||||
|  | #endif//GLM_STATIC_ASSERT_NULL | ||||||
|  |  | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										767
									
								
								lib/glm/detail/type_mat.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										767
									
								
								lib/glm/detail/type_mat.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,767 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "precision.hpp" | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P, template <class, precision> class colType, template <class, precision> class rowType> | ||||||
|  | 	struct outerProduct_trait{}; | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> struct tvec2; | ||||||
|  | 	template <typename T, precision P> struct tvec3; | ||||||
|  | 	template <typename T, precision P> struct tvec4; | ||||||
|  | 	template <typename T, precision P> struct tmat2x2; | ||||||
|  | 	template <typename T, precision P> struct tmat2x3; | ||||||
|  | 	template <typename T, precision P> struct tmat2x4; | ||||||
|  | 	template <typename T, precision P> struct tmat3x2; | ||||||
|  | 	template <typename T, precision P> struct tmat3x3; | ||||||
|  | 	template <typename T, precision P> struct tmat3x4; | ||||||
|  | 	template <typename T, precision P> struct tmat4x2; | ||||||
|  | 	template <typename T, precision P> struct tmat4x3; | ||||||
|  | 	template <typename T, precision P> struct tmat4x4; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class matType> | ||||||
|  | 	GLM_FUNC_DECL matType<T, P> inverse(matType<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<float, lowp>		lowp_mat2; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<float, mediump>		mediump_mat2; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<float, highp>		highp_mat2; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<float, lowp>		lowp_mat2x2; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<float, mediump>		mediump_mat2x2; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<float, highp>		highp_mat2x2; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 3 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x3<float, lowp>		lowp_mat2x3; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 3 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x3<float, mediump>		mediump_mat2x3; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 3 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x3<float, highp>		highp_mat2x3; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 4 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x4<float, lowp>		lowp_mat2x4; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 4 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x4<float, mediump>		mediump_mat2x4; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 4 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x4<float, highp>		highp_mat2x4; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 2 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x2<float, lowp>		lowp_mat3x2; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 2 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x2<float, mediump>		mediump_mat3x2; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 2 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x2<float, highp>		highp_mat3x2; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<float, lowp>		lowp_mat3; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<float, mediump>		mediump_mat3; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<float, highp>		highp_mat3; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<float, lowp>		lowp_mat3x3; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<float, mediump>		mediump_mat3x3; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<float, highp>		highp_mat3x3; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 4 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x4<float, lowp>		lowp_mat3x4; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 4 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x4<float, mediump>		mediump_mat3x4; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 4 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x4<float, highp>		highp_mat3x4; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 2 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x2<float, lowp>		lowp_mat4x2; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 2 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x2<float, mediump>		mediump_mat4x2; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 2 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x2<float, highp>		highp_mat4x2; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 3 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x3<float, lowp>		lowp_mat4x3; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 3 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x3<float, mediump>		mediump_mat4x3; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 3 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x3<float, highp>		highp_mat4x3; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<float, lowp>		lowp_mat4; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<float, mediump>		mediump_mat4; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<float, highp>		highp_mat4; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<float, lowp>		lowp_mat4x4; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<float, mediump>		mediump_mat4x4; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<float, highp>		highp_mat4x4; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_types | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	////////////////////////// | ||||||
|  | 	// Float definition | ||||||
|  | 	 | ||||||
|  | #if(defined(GLM_PRECISION_LOWP_FLOAT)) | ||||||
|  | 	typedef lowp_mat2x2			mat2x2; | ||||||
|  | 	typedef lowp_mat2x3			mat2x3; | ||||||
|  | 	typedef lowp_mat2x4			mat2x4; | ||||||
|  | 	typedef lowp_mat3x2			mat3x2; | ||||||
|  | 	typedef lowp_mat3x3			mat3x3; | ||||||
|  | 	typedef lowp_mat3x4			mat3x4; | ||||||
|  | 	typedef lowp_mat4x2			mat4x2; | ||||||
|  | 	typedef lowp_mat4x3			mat4x3; | ||||||
|  | 	typedef lowp_mat4x4			mat4x4; | ||||||
|  | #elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) | ||||||
|  | 	typedef mediump_mat2x2		mat2x2; | ||||||
|  | 	typedef mediump_mat2x3		mat2x3; | ||||||
|  | 	typedef mediump_mat2x4		mat2x4; | ||||||
|  | 	typedef mediump_mat3x2		mat3x2; | ||||||
|  | 	typedef mediump_mat3x3		mat3x3; | ||||||
|  | 	typedef mediump_mat3x4		mat3x4; | ||||||
|  | 	typedef mediump_mat4x2		mat4x2; | ||||||
|  | 	typedef mediump_mat4x3		mat4x3; | ||||||
|  | 	typedef mediump_mat4x4		mat4x4; | ||||||
|  | #else	 | ||||||
|  | 	//! 2 columns of 2 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_mat2x2			mat2x2; | ||||||
|  | 	 | ||||||
|  | 	//! 2 columns of 3 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_mat2x3			mat2x3; | ||||||
|  | 	 | ||||||
|  | 	//! 2 columns of 4 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_mat2x4			mat2x4; | ||||||
|  | 	 | ||||||
|  | 	//! 3 columns of 2 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_mat3x2			mat3x2; | ||||||
|  | 	 | ||||||
|  | 	//! 3 columns of 3 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_mat3x3			mat3x3; | ||||||
|  | 	 | ||||||
|  | 	//! 3 columns of 4 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_mat3x4			mat3x4; | ||||||
|  | 	 | ||||||
|  | 	//! 4 columns of 2 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_mat4x2			mat4x2; | ||||||
|  | 	 | ||||||
|  | 	//! 4 columns of 3 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_mat4x3			mat4x3; | ||||||
|  | 	 | ||||||
|  | 	//! 4 columns of 4 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_mat4x4			mat4x4; | ||||||
|  | 	 | ||||||
|  | #endif//GLM_PRECISION | ||||||
|  | 	 | ||||||
|  | 	//! 2 columns of 2 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef mat2x2					mat2; | ||||||
|  | 	 | ||||||
|  | 	//! 3 columns of 3 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef mat3x3					mat3; | ||||||
|  | 	 | ||||||
|  | 	//! 4 columns of 4 components matrix of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef mat4x4					mat4; | ||||||
|  | 		 | ||||||
|  | 	////////////////////////// | ||||||
|  | 	// Double definition | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<double, lowp>		lowp_dmat2; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<double, mediump>	mediump_dmat2; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<double, highp>		highp_dmat2; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<double, lowp>		lowp_dmat2x2; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<double, mediump>	mediump_dmat2x2; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 2 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x2<double, highp>		highp_dmat2x2; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 3 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x3<double, lowp>		lowp_dmat2x3; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 3 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x3<double, mediump>	mediump_dmat2x3; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 3 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x3<double, highp>		highp_dmat2x3; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 4 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x4<double, lowp>		lowp_dmat2x4; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 4 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x4<double, mediump>	mediump_dmat2x4; | ||||||
|  | 	 | ||||||
|  | 	/// 2 columns of 4 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat2x4<double, highp>		highp_dmat2x4; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 2 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x2<double, lowp>		lowp_dmat3x2; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 2 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x2<double, mediump>	mediump_dmat3x2; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 2 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x2<double, highp>		highp_dmat3x2; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<float, lowp>		lowp_dmat3; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<double, mediump>	mediump_dmat3; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<double, highp>		highp_dmat3; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<double, lowp>		lowp_dmat3x3; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<double, mediump>	mediump_dmat3x3; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 3 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x3<double, highp>		highp_dmat3x3; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 4 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x4<double, lowp>		lowp_dmat3x4; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 4 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x4<double, mediump>	mediump_dmat3x4; | ||||||
|  | 	 | ||||||
|  | 	/// 3 columns of 4 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat3x4<double, highp>		highp_dmat3x4; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 2 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x2<double, lowp>		lowp_dmat4x2; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 2 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x2<double, mediump>	mediump_dmat4x2; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 2 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x2<double, highp>		highp_dmat4x2; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 3 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x3<double, lowp>		lowp_dmat4x3; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 3 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x3<double, mediump>	mediump_dmat4x3; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 3 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x3<double, highp>		highp_dmat4x3; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<double, lowp>		lowp_dmat4; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<double, mediump>	mediump_dmat4; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<double, highp>		highp_dmat4; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of low precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<double, lowp>		lowp_dmat4x4; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of medium precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<double, mediump>	mediump_dmat4x4; | ||||||
|  | 	 | ||||||
|  | 	/// 4 columns of 4 components matrix of high precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tmat4x4<double, highp>		highp_dmat4x4; | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | 	 | ||||||
|  | #if(defined(GLM_PRECISION_LOWP_DOUBLE)) | ||||||
|  | 	typedef lowp_dmat2x2		dmat2x2; | ||||||
|  | 	typedef lowp_dmat2x3		dmat2x3; | ||||||
|  | 	typedef lowp_dmat2x4		dmat2x4; | ||||||
|  | 	typedef lowp_dmat3x2		dmat3x2; | ||||||
|  | 	typedef lowp_dmat3x3		dmat3x3; | ||||||
|  | 	typedef lowp_dmat3x4		dmat3x4; | ||||||
|  | 	typedef lowp_dmat4x2		dmat4x2; | ||||||
|  | 	typedef lowp_dmat4x3		dmat4x3; | ||||||
|  | 	typedef lowp_dmat4x4		dmat4x4; | ||||||
|  | #elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE)) | ||||||
|  | 	typedef mediump_dmat2x2		dmat2x2; | ||||||
|  | 	typedef mediump_dmat2x3		dmat2x3; | ||||||
|  | 	typedef mediump_dmat2x4		dmat2x4; | ||||||
|  | 	typedef mediump_dmat3x2		dmat3x2; | ||||||
|  | 	typedef mediump_dmat3x3		dmat3x3; | ||||||
|  | 	typedef mediump_dmat3x4		dmat3x4; | ||||||
|  | 	typedef mediump_dmat4x2		dmat4x2; | ||||||
|  | 	typedef mediump_dmat4x3		dmat4x3; | ||||||
|  | 	typedef mediump_dmat4x4		dmat4x4; | ||||||
|  | #else //defined(GLM_PRECISION_HIGHP_DOUBLE) | ||||||
|  | 	 | ||||||
|  | 	//! 2 * 2 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat2x2		dmat2; | ||||||
|  | 	 | ||||||
|  | 	//! 3 * 3 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat3x3		dmat3; | ||||||
|  | 	 | ||||||
|  | 	//! 4 * 4 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat4x4		dmat4; | ||||||
|  | 	 | ||||||
|  | 	//! 2 * 2 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat2x2		dmat2x2; | ||||||
|  | 	 | ||||||
|  | 	//! 2 * 3 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat2x3		dmat2x3; | ||||||
|  | 	 | ||||||
|  | 	//! 2 * 4 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat2x4		dmat2x4; | ||||||
|  | 	 | ||||||
|  | 	//! 3 * 2 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat3x2		dmat3x2; | ||||||
|  | 	 | ||||||
|  | 	/// 3 * 3 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat3x3		dmat3x3; | ||||||
|  | 	 | ||||||
|  | 	/// 3 * 4 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat3x4		dmat3x4; | ||||||
|  | 	 | ||||||
|  | 	/// 4 * 2 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat4x2		dmat4x2; | ||||||
|  | 	 | ||||||
|  | 	/// 4 * 3 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat4x3		dmat4x3; | ||||||
|  | 	 | ||||||
|  | 	/// 4 * 4 matrix of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> | ||||||
|  | 	typedef highp_dmat4x4		dmat4x4; | ||||||
|  |  | ||||||
|  | #endif//GLM_PRECISION | ||||||
|  | 	 | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										3
									
								
								lib/glm/detail/type_mat.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								lib/glm/detail/type_mat.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat.inl | ||||||
|  |  | ||||||
							
								
								
									
										183
									
								
								lib/glm/detail/type_mat2x2.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								lib/glm/detail/type_mat2x2.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,183 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat2x2.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "../fwd.hpp" | ||||||
|  | #include "type_vec2.hpp" | ||||||
|  | #include "type_mat.hpp" | ||||||
|  | #include <limits> | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tmat2x2 | ||||||
|  | 	{ | ||||||
|  | 		typedef tvec2<T, P> col_type; | ||||||
|  | 		typedef tvec2<T, P> row_type; | ||||||
|  | 		typedef tmat2x2<T, P> type; | ||||||
|  | 		typedef tmat2x2<T, P> transpose_type; | ||||||
|  | 		typedef T value_type; | ||||||
|  |  | ||||||
|  | 	private: | ||||||
|  | 		col_type value[2]; | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		// -- Constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat2x2() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL tmat2x2(tmat2x2<T, P> const & m) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2(tmat2x2<T, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat2x2(ctor); | ||||||
|  | 		GLM_FUNC_DECL explicit tmat2x2(T scalar); | ||||||
|  | 		GLM_FUNC_DECL tmat2x2( | ||||||
|  | 			T const & x1, T const & y1, | ||||||
|  | 			T const & x2, T const & y2); | ||||||
|  | 		GLM_FUNC_DECL tmat2x2( | ||||||
|  | 			col_type const & v1, | ||||||
|  | 			col_type const & v2); | ||||||
|  |  | ||||||
|  | 		// -- Conversions -- | ||||||
|  |  | ||||||
|  | 		template <typename U, typename V, typename M, typename N> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2( | ||||||
|  | 			U const & x1, V const & y1, | ||||||
|  | 			M const & x2, N const & y2); | ||||||
|  |  | ||||||
|  | 		template <typename U, typename V> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2( | ||||||
|  | 			tvec2<U, P> const & v1, | ||||||
|  | 			tvec2<V, P> const & v2); | ||||||
|  |  | ||||||
|  | 		// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat2x2<U, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat3x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat4x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat2x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat3x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat2x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat4x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat3x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat4x3<T, P> const & x); | ||||||
|  |  | ||||||
|  | 		// -- Accesses -- | ||||||
|  |  | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 2;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL col_type & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL col_type const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator=(tmat2x2<T, P> const & v) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator=(tmat2x2<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator+=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator+=(tmat2x2<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator-=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator-=(tmat2x2<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator*=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator*=(tmat2x2<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator/=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator/=(tmat2x2<U, P> const & m); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator++ (); | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> & operator-- (); | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tmat2x2<T, P> operator--(int); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator+(tmat2x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator-(tmat2x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator+(tmat2x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator+(T scalar, tmat2x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator+(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator-(tmat2x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator-(T scalar, tmat2x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator-(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator*(tmat2x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator*(T scalar, tmat2x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat2x2<T, P>::col_type operator*(tmat2x2<T, P> const & m, typename tmat2x2<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat2x2<T, P>::row_type operator*(typename tmat2x2<T, P>::col_type const & v, tmat2x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat3x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat4x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator/(tmat2x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator/(T scalar, tmat2x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat2x2<T, P>::col_type operator/(tmat2x2<T, P> const & m, typename tmat2x2<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat2x2<T, P>::row_type operator/(typename tmat2x2<T, P>::col_type const & v, tmat2x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator/(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); | ||||||
|  | } //namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_mat2x2.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										484
									
								
								lib/glm/detail/type_mat2x2.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										484
									
								
								lib/glm/detail/type_mat2x2.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,484 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat2x2.inl | ||||||
|  |  | ||||||
|  | #include "func_matrix.hpp" | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	// -- Constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2() | ||||||
|  | 		{ | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT  | ||||||
|  | 				this->value[0] = col_type(1, 0); | ||||||
|  | 				this->value[1] = col_type(0, 1); | ||||||
|  | #			endif | ||||||
|  | 		} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x2<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m.value[0]; | ||||||
|  | 			this->value[1] = m.value[1]; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x2<T, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m.value[0]; | ||||||
|  | 		this->value[1] = m.value[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat2x2<T, P>::tmat2x2(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(T scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(scalar, 0); | ||||||
|  | 		this->value[1] = col_type(0, scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2 | ||||||
|  | 	( | ||||||
|  | 		T const & x0, T const & y0, | ||||||
|  | 		T const & x1, T const & y1 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(x0, y0); | ||||||
|  | 		this->value[1] = col_type(x1, y1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(col_type const & v0, col_type const & v1) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = v0; | ||||||
|  | 		this->value[1] = v1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Conversion constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename X1, typename Y1, typename X2, typename Y2> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2 | ||||||
|  | 	( | ||||||
|  | 		X1 const & x1, Y1 const & y1, | ||||||
|  | 		X2 const & x2, Y2 const & y2 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(static_cast<T>(x1), value_type(y1)); | ||||||
|  | 		this->value[1] = col_type(static_cast<T>(x2), value_type(y2)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename V1, typename V2> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tvec2<V1, P> const & v1, tvec2<V2, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(v1); | ||||||
|  | 		this->value[1] = col_type(v2); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- mat2x2 matrix conversions -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x2<U, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type & tmat2x2<T, P>::operator[](typename tmat2x2<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type const & tmat2x2<T, P>::operator[](typename tmat2x2<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary updatable operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator=(tmat2x2<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m[0]; | ||||||
|  | 			this->value[1] = m[1]; | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator=(tmat2x2<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator+=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += scalar; | ||||||
|  | 		this->value[1] += scalar; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator+=(tmat2x2<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += m[0]; | ||||||
|  | 		this->value[1] += m[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator-=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= scalar; | ||||||
|  | 		this->value[1] -= scalar; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator-=(tmat2x2<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= m[0]; | ||||||
|  | 		this->value[1] -= m[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator*=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] *= scalar; | ||||||
|  | 		this->value[1] *= scalar; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator*=(tmat2x2<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = *this * m); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator/=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] /= scalar; | ||||||
|  | 		this->value[1] /= scalar; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator/=(tmat2x2<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return *this *= inverse(m); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->value[0]; | ||||||
|  | 		++this->value[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->value[0]; | ||||||
|  | 		--this->value[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> tmat2x2<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat2x2<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> tmat2x2<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat2x2<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator+(tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator-(tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			-m[0],  | ||||||
|  | 			-m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator+(tmat2x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			m[0] + scalar, | ||||||
|  | 			m[1] + scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator+(T scalar, tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			m[0] + scalar, | ||||||
|  | 			m[1] + scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator+(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			m1[0] + m2[0], | ||||||
|  | 			m1[1] + m2[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator-(tmat2x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			m[0] - scalar, | ||||||
|  | 			m[1] - scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator-(T scalar, tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			scalar - m[0], | ||||||
|  | 			scalar - m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator-(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			m1[0] - m2[0], | ||||||
|  | 			m1[1] - m2[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat2x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(T scalar, tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type operator* | ||||||
|  | 	( | ||||||
|  | 		tmat2x2<T, P> const & m, | ||||||
|  | 		typename tmat2x2<T, P>::row_type const & v | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			m[0][0] * v.x + m[1][0] * v.y, | ||||||
|  | 			m[0][1] * v.x + m[1][1] * v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::row_type operator* | ||||||
|  | 	( | ||||||
|  | 		typename tmat2x2<T, P>::col_type const & v, | ||||||
|  | 		tmat2x2<T, P> const & m | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v.x * m[0][0] + v.y * m[0][1], | ||||||
|  | 			v.x * m[1][0] + v.y * m[1][1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat3x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat4x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			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 <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator/(tmat2x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			m[0] / scalar, | ||||||
|  | 			m[1] / scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator/(T scalar, tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x2<T, P>( | ||||||
|  | 			scalar / m[0], | ||||||
|  | 			scalar / m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type operator/(tmat2x2<T, P> const & m, typename tmat2x2<T, P>::row_type const & v) | ||||||
|  | 	{ | ||||||
|  | 		return inverse(m) * v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::row_type operator/(typename tmat2x2<T, P>::col_type const & v, tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return v *  inverse(m); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator/(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) | ||||||
|  | 	{	 | ||||||
|  | 		tmat2x2<T, P> m1_copy(m1); | ||||||
|  | 		return m1_copy /= m2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] == m2[0]) && (m1[1] == m2[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] != m2[0]) || (m1[1] != m2[1]); | ||||||
|  | 	} | ||||||
|  | } //namespace glm | ||||||
							
								
								
									
										165
									
								
								lib/glm/detail/type_mat2x3.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								lib/glm/detail/type_mat2x3.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,165 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat2x3.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "../fwd.hpp" | ||||||
|  | #include "type_vec2.hpp" | ||||||
|  | #include "type_vec3.hpp" | ||||||
|  | #include "type_mat.hpp" | ||||||
|  | #include <limits> | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tmat2x3 | ||||||
|  | 	{ | ||||||
|  | 		typedef tvec3<T, P> col_type; | ||||||
|  | 		typedef tvec2<T, P> row_type; | ||||||
|  | 		typedef tmat2x3<T, P> type; | ||||||
|  | 		typedef tmat3x2<T, P> transpose_type; | ||||||
|  | 		typedef T value_type; | ||||||
|  |  | ||||||
|  | 	private: | ||||||
|  | 		col_type value[2]; | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		// -- Constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat2x3() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL tmat2x3(tmat2x3<T, P> const & m) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL tmat2x3(tmat2x3<T, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat2x3(ctor); | ||||||
|  | 		GLM_FUNC_DECL explicit tmat2x3(T scalar); | ||||||
|  | 		GLM_FUNC_DECL tmat2x3( | ||||||
|  | 			T x0, T y0, T z0, | ||||||
|  | 			T x1, T y1, T z1); | ||||||
|  | 		GLM_FUNC_DECL tmat2x3( | ||||||
|  | 			col_type const & v0, | ||||||
|  | 			col_type const & v1); | ||||||
|  |  | ||||||
|  | 		// -- Conversions -- | ||||||
|  |  | ||||||
|  | 		template <typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2> | ||||||
|  | 		GLM_FUNC_DECL tmat2x3( | ||||||
|  | 			X1 x1, Y1 y1, Z1 z1, | ||||||
|  | 			X2 x2, Y2 y2, Z2 z2); | ||||||
|  |  | ||||||
|  | 		template <typename U, typename V> | ||||||
|  | 		GLM_FUNC_DECL tmat2x3( | ||||||
|  | 			tvec3<U, P> const & v1, | ||||||
|  | 			tvec3<V, P> const & v2); | ||||||
|  |  | ||||||
|  | 		// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat2x3<U, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat2x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat3x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat4x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat2x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat3x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat3x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat4x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat4x3<T, P> const & x); | ||||||
|  |  | ||||||
|  | 		// -- Accesses -- | ||||||
|  |  | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 2;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL col_type & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL col_type const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> & operator=(tmat2x3<T, P> const & m) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> & operator=(tmat2x3<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> & operator+=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> & operator+=(tmat2x3<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> & operator-=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> & operator-=(tmat2x3<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> & operator*=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> & operator/=(U s); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> & operator++ (); | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> & operator-- (); | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tmat2x3<T, P> operator--(int); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator+(tmat2x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator-(tmat2x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator+(tmat2x3<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator+(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator-(tmat2x3<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator-(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator*(tmat2x3<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator*(T scalar, tmat2x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat2x3<T, P>::col_type operator*(tmat2x3<T, P> const & m, typename tmat2x3<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat2x3<T, P>::row_type operator*(typename tmat2x3<T, P>::col_type const & v, tmat2x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat2x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat3x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat4x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator/(tmat2x3<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator/(T scalar, tmat2x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2); | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_mat2x3.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										458
									
								
								lib/glm/detail/type_mat2x3.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										458
									
								
								lib/glm/detail/type_mat2x3.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,458 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat2x3.inl | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	// -- Constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P>  | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3() | ||||||
|  | 		{ | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT  | ||||||
|  | 				this->value[0] = col_type(1, 0, 0); | ||||||
|  | 				this->value[1] = col_type(0, 1, 0); | ||||||
|  | #			endif | ||||||
|  | 		} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x3<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m.value[0]; | ||||||
|  | 			this->value[1] = m.value[1]; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x3<T, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m.value[0]; | ||||||
|  | 		this->value[1] = m.value[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat2x3<T, P>::tmat2x3(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(T scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(scalar, 0, 0); | ||||||
|  | 		this->value[1] = col_type(0, scalar, 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3 | ||||||
|  | 	( | ||||||
|  | 		T x0, T y0, T z0, | ||||||
|  | 		T x1, T y1, T z1 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(x0, y0, z0); | ||||||
|  | 		this->value[1] = col_type(x1, y1, z1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(col_type const & v0, col_type const & v1) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = v0; | ||||||
|  | 		this->value[1] = v1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Conversion constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template < | ||||||
|  | 		typename X1, typename Y1, typename Z1, | ||||||
|  | 		typename X2, typename Y2, typename Z2> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3 | ||||||
|  | 	( | ||||||
|  | 		X1 x1, Y1 y1, Z1 z1, | ||||||
|  | 		X2 x2, Y2 y2, Z2 z2 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1)); | ||||||
|  | 		this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename V1, typename V2> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tvec3<V1, P> const & v1, tvec3<V2, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(v1); | ||||||
|  | 		this->value[1] = col_type(v2); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x3<U, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER  tmat2x3<T, P>::tmat2x3(tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x3<T, P>::col_type & tmat2x3<T, P>::operator[](typename tmat2x3<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x3<T, P>::col_type const & tmat2x3<T, P>::operator[](typename tmat2x3<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary updatable operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator=(tmat2x3<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m[0]; | ||||||
|  | 			this->value[1] = m[1]; | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator=(tmat2x3<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> & tmat2x3<T, P>::operator+=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += s; | ||||||
|  | 		this->value[1] += s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator+=(tmat2x3<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += m[0]; | ||||||
|  | 		this->value[1] += m[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator-=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= s; | ||||||
|  | 		this->value[1] -= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator-=(tmat2x3<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= m[0]; | ||||||
|  | 		this->value[1] -= m[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator*=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] *= s; | ||||||
|  | 		this->value[1] *= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> & tmat2x3<T, P>::operator/=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] /= s; | ||||||
|  | 		this->value[1] /= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> & tmat2x3<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->value[0]; | ||||||
|  | 		++this->value[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> & tmat2x3<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->value[0]; | ||||||
|  | 		--this->value[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> tmat2x3<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat2x3<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> tmat2x3<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat2x3<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator+(tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator-(tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			-m[0], | ||||||
|  | 			-m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator+(tmat2x3<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			m[0] + scalar, | ||||||
|  | 			m[1] + scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator+(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			m1[0] + m2[0], | ||||||
|  | 			m1[1] + m2[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator-(tmat2x3<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			m[0] - scalar, | ||||||
|  | 			m[1] - scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator-(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			m1[0] - m2[0], | ||||||
|  | 			m1[1] - m2[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat2x3<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(T scalar, tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x3<T, P>::col_type operator* | ||||||
|  | 	( | ||||||
|  | 		tmat2x3<T, P> const & m, | ||||||
|  | 		typename tmat2x3<T, P>::row_type const & v) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat2x3<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x3<T, P>::row_type operator* | ||||||
|  | 	( | ||||||
|  | 		typename tmat2x3<T, P>::col_type const & v, | ||||||
|  | 		tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat2x3<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat2x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat3x2<T, P> 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]; | ||||||
|  |  | ||||||
|  | 		tmat3x3<T, P> Result(uninitialize); | ||||||
|  | 		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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat4x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator/(tmat2x3<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			m[0] / scalar, | ||||||
|  | 			m[1] / scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator/(T scalar, tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			scalar / m[0], | ||||||
|  | 			scalar / m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] == m2[0]) && (m1[1] == m2[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] != m2[0]) || (m1[1] != m2[1]); | ||||||
|  | 	} | ||||||
|  | } //namespace glm | ||||||
							
								
								
									
										167
									
								
								lib/glm/detail/type_mat2x4.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								lib/glm/detail/type_mat2x4.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,167 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat2x4.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "../fwd.hpp" | ||||||
|  | #include "type_vec2.hpp" | ||||||
|  | #include "type_vec4.hpp" | ||||||
|  | #include "type_mat.hpp" | ||||||
|  | #include <limits> | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tmat2x4 | ||||||
|  | 	{ | ||||||
|  | 		typedef tvec4<T, P> col_type; | ||||||
|  | 		typedef tvec2<T, P> row_type; | ||||||
|  | 		typedef tmat2x4<T, P> type; | ||||||
|  | 		typedef tmat4x2<T, P> transpose_type; | ||||||
|  | 		typedef T value_type; | ||||||
|  |  | ||||||
|  | 	private: | ||||||
|  | 		col_type value[2]; | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		// -- Constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat2x4() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL tmat2x4(tmat2x4<T, P> const & m) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL tmat2x4(tmat2x4<T, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat2x4(ctor); | ||||||
|  | 		GLM_FUNC_DECL explicit tmat2x4(T scalar); | ||||||
|  | 		GLM_FUNC_DECL tmat2x4( | ||||||
|  | 			T x0, T y0, T z0, T w0, | ||||||
|  | 			T x1, T y1, T z1, T w1); | ||||||
|  | 		GLM_FUNC_DECL tmat2x4( | ||||||
|  | 			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 tmat2x4( | ||||||
|  | 			X1 x1, Y1 y1, Z1 z1, W1 w1, | ||||||
|  | 			X2 x2, Y2 y2, Z2 z2, W2 w2); | ||||||
|  |  | ||||||
|  | 		template <typename U, typename V> | ||||||
|  | 		GLM_FUNC_DECL tmat2x4( | ||||||
|  | 			tvec4<U, P> const & v1, | ||||||
|  | 			tvec4<V, P> const & v2); | ||||||
|  |  | ||||||
|  | 		// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat2x4<U, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat2x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat3x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat4x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat2x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat3x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat3x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat4x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat4x3<T, P> const & x); | ||||||
|  |  | ||||||
|  | 		// -- Accesses -- | ||||||
|  |  | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 2;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL col_type & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL col_type const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> & operator=(tmat2x4<T, P> const & m) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> & operator=(tmat2x4<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> & operator+=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> & operator+=(tmat2x4<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> & operator-=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> & operator-=(tmat2x4<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> & operator*=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> & operator/=(U s); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> & operator++ (); | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> & operator-- (); | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tmat2x4<T, P> operator--(int); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator+(tmat2x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator-(tmat2x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator+(tmat2x4<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator+(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator-(tmat2x4<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator-(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator*(tmat2x4<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator*(T scalar, tmat2x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat2x4<T, P>::col_type operator*(tmat2x4<T, P> const & m, typename tmat2x4<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat2x4<T, P>::row_type operator*(typename tmat2x4<T, P>::col_type const & v, tmat2x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat4x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat2x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat3x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator/(tmat2x4<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator/(T scalar, tmat2x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2); | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_mat2x4.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										467
									
								
								lib/glm/detail/type_mat2x4.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										467
									
								
								lib/glm/detail/type_mat2x4.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,467 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat2x4.inl | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	// -- Constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4() | ||||||
|  | 		{ | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT  | ||||||
|  | 				this->value[0] = col_type(1, 0, 0, 0); | ||||||
|  | 				this->value[1] = col_type(0, 1, 0, 0); | ||||||
|  | #			endif | ||||||
|  | 		} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x4<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m.value[0]; | ||||||
|  | 			this->value[1] = m.value[1]; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x4<T, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m.value[0]; | ||||||
|  | 		this->value[1] = m.value[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat2x4<T, P>::tmat2x4(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(T scalar) | ||||||
|  | 	{ | ||||||
|  | 		value_type const Zero(0); | ||||||
|  | 		this->value[0] = col_type(scalar, Zero, Zero, Zero); | ||||||
|  | 		this->value[1] = col_type(Zero, scalar, Zero, Zero); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4 | ||||||
|  | 	( | ||||||
|  | 		T x0, T y0, T z0, T w0, | ||||||
|  | 		T x1, T y1, T z1, T w1 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(x0, y0, z0, w0); | ||||||
|  | 		this->value[1] = col_type(x1, y1, z1, w1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(col_type const & v0, col_type const & v1) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = v0; | ||||||
|  | 		this->value[1] = v1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Conversion constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template < | ||||||
|  | 		typename X1, typename Y1, typename Z1, typename W1, | ||||||
|  | 		typename X2, typename Y2, typename Z2, typename W2> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4 | ||||||
|  | 	( | ||||||
|  | 		X1 x1, Y1 y1, Z1 z1, W1 w1, | ||||||
|  | 		X2 x2, Y2 y2, Z2 z2, W2 w2 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1), value_type(w1)); | ||||||
|  | 		this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2), value_type(w2)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename V1, typename V2> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tvec4<V1, P> const & v1, tvec4<V2, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(v1); | ||||||
|  | 		this->value[1] = col_type(v2); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x4<U, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0, 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0, 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0, 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0, 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0, 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0, 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x4<T, P>::col_type & tmat2x4<T, P>::operator[](typename tmat2x4<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x4<T, P>::col_type const & tmat2x4<T, P>::operator[](typename tmat2x4<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary updatable operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator=(tmat2x4<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m[0]; | ||||||
|  | 			this->value[1] = m[1]; | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator=(tmat2x4<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator+=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += s; | ||||||
|  | 		this->value[1] += s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator+=(tmat2x4<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += m[0]; | ||||||
|  | 		this->value[1] += m[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator-=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= s; | ||||||
|  | 		this->value[1] -= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator-=(tmat2x4<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= m[0]; | ||||||
|  | 		this->value[1] -= m[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator*=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] *= s; | ||||||
|  | 		this->value[1] *= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> & tmat2x4<T, P>::operator/=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] /= s; | ||||||
|  | 		this->value[1] /= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->value[0]; | ||||||
|  | 		++this->value[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->value[0]; | ||||||
|  | 		--this->value[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> tmat2x4<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat2x4<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> tmat2x4<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat2x4<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator+(tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator-(tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			-m[0],  | ||||||
|  | 			-m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator+(tmat2x4<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			m[0] + scalar, | ||||||
|  | 			m[1] + scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator+(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			m1[0] + m2[0], | ||||||
|  | 			m1[1] + m2[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator-(tmat2x4<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			m[0] - scalar, | ||||||
|  | 			m[1] - scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator-(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			m1[0] - m2[0], | ||||||
|  | 			m1[1] - m2[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat2x4<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(T scalar, tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x4<T, P>::col_type operator*(tmat2x4<T, P> const & m, typename tmat2x4<T, P>::row_type const & v) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat2x4<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat2x4<T, P>::row_type operator*(typename tmat2x4<T, P>::col_type const & v, tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat2x4<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat4x2<T, P> 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]; | ||||||
|  |  | ||||||
|  | 		tmat4x4<T, P> Result(uninitialize); | ||||||
|  | 		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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat2x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat3x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			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 <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator/(tmat2x4<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			m[0] / scalar, | ||||||
|  | 			m[1] / scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator/(T scalar, tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			scalar / m[0], | ||||||
|  | 			scalar / m[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] == m2[0]) && (m1[1] == m2[1]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] != m2[0]) || (m1[1] != m2[1]); | ||||||
|  | 	} | ||||||
|  | } //namespace glm | ||||||
							
								
								
									
										173
									
								
								lib/glm/detail/type_mat3x2.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								lib/glm/detail/type_mat3x2.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,173 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat3x2.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "../fwd.hpp" | ||||||
|  | #include "type_vec2.hpp" | ||||||
|  | #include "type_vec3.hpp" | ||||||
|  | #include "type_mat.hpp" | ||||||
|  | #include <limits> | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tmat3x2 | ||||||
|  | 	{ | ||||||
|  | 		typedef tvec2<T, P> col_type; | ||||||
|  | 		typedef tvec3<T, P> row_type; | ||||||
|  | 		typedef tmat3x2<T, P> type; | ||||||
|  | 		typedef tmat2x3<T, P> transpose_type; | ||||||
|  | 		typedef T value_type; | ||||||
|  |  | ||||||
|  | 	private: | ||||||
|  | 		col_type value[3]; | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		// -- Constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat3x2() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL tmat3x2(tmat3x2<T, P> const & m) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL tmat3x2(tmat3x2<T, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat3x2(ctor); | ||||||
|  | 		GLM_FUNC_DECL explicit tmat3x2(T scalar); | ||||||
|  | 		GLM_FUNC_DECL tmat3x2( | ||||||
|  | 			T x0, T y0, | ||||||
|  | 			T x1, T y1, | ||||||
|  | 			T x2, T y2); | ||||||
|  | 		GLM_FUNC_DECL tmat3x2( | ||||||
|  | 			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 tmat3x2( | ||||||
|  | 			X1 x1, Y1 y1, | ||||||
|  | 			X2 x2, Y2 y2, | ||||||
|  | 			X3 x3, Y3 y3); | ||||||
|  |  | ||||||
|  | 		template <typename V1, typename V2, typename V3> | ||||||
|  | 		GLM_FUNC_DECL tmat3x2( | ||||||
|  | 			tvec2<V1, P> const & v1, | ||||||
|  | 			tvec2<V2, P> const & v2, | ||||||
|  | 			tvec2<V3, P> const & v3); | ||||||
|  |  | ||||||
|  | 		// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat3x2<U, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat2x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat3x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat4x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat2x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat2x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat3x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat4x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat4x3<T, P> const & x); | ||||||
|  |  | ||||||
|  | 		// -- Accesses -- | ||||||
|  |  | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 3;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL col_type & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL col_type const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> & operator=(tmat3x2<T, P> const & m) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> & operator=(tmat3x2<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> & operator+=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> & operator+=(tmat3x2<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> & operator-=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> & operator-=(tmat3x2<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> & operator*=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> & operator/=(U s); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> & operator++ (); | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> & operator-- (); | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tmat3x2<T, P> operator--(int); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator+(tmat3x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator-(tmat3x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator+(tmat3x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator+(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator-(tmat3x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator-(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator*(tmat3x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator*(T scalar, tmat3x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat3x2<T, P>::col_type operator*(tmat3x2<T, P> const & m, typename tmat3x2<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat3x2<T, P>::row_type operator*(typename tmat3x2<T, P>::col_type const & v, tmat3x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat2x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat3x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat4x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator/(tmat3x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator/(T scalar, tmat3x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_mat3x2.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										492
									
								
								lib/glm/detail/type_mat3x2.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										492
									
								
								lib/glm/detail/type_mat3x2.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,492 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat3x2.inl | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	// -- Constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P>  | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2() | ||||||
|  | 		{ | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT  | ||||||
|  | 				this->value[0] = col_type(1, 0); | ||||||
|  | 				this->value[1] = col_type(0, 1); | ||||||
|  | 				this->value[2] = col_type(0, 0); | ||||||
|  | #			endif | ||||||
|  | 		} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x2<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m.value[0]; | ||||||
|  | 			this->value[1] = m.value[1]; | ||||||
|  | 			this->value[2] = m.value[2]; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x2<T, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m.value[0]; | ||||||
|  | 		this->value[1] = m.value[1]; | ||||||
|  | 		this->value[2] = m.value[2]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat3x2<T, P>::tmat3x2(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(T scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(scalar, 0); | ||||||
|  | 		this->value[1] = col_type(0, scalar); | ||||||
|  | 		this->value[2] = col_type(0, 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 | ||||||
|  | 	( | ||||||
|  | 		T x0, T y0, | ||||||
|  | 		T x1, T y1, | ||||||
|  | 		T x2, T y2 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(x0, y0); | ||||||
|  | 		this->value[1] = col_type(x1, y1); | ||||||
|  | 		this->value[2] = col_type(x2, y2); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 | ||||||
|  | 	( | ||||||
|  | 		col_type const & v0, | ||||||
|  | 		col_type const & v1, | ||||||
|  | 		col_type const & v2 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = v0; | ||||||
|  | 		this->value[1] = v1; | ||||||
|  | 		this->value[2] = v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Conversion constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template < | ||||||
|  | 		typename X1, typename Y1, | ||||||
|  | 		typename X2, typename Y2, | ||||||
|  | 		typename X3, typename Y3> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 | ||||||
|  | 	( | ||||||
|  | 		X1 x1, Y1 y1, | ||||||
|  | 		X2 x2, Y2 y2, | ||||||
|  | 		X3 x3, Y3 y3 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(static_cast<T>(x1), value_type(y1)); | ||||||
|  | 		this->value[1] = col_type(static_cast<T>(x2), value_type(y2)); | ||||||
|  | 		this->value[2] = col_type(static_cast<T>(x3), value_type(y3)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename V1, typename V2, typename V3> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 | ||||||
|  | 	( | ||||||
|  | 		tvec2<V1, P> const & v1, | ||||||
|  | 		tvec2<V2, P> const & v2, | ||||||
|  | 		tvec2<V3, P> const & v3 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(v1); | ||||||
|  | 		this->value[1] = col_type(v2); | ||||||
|  | 		this->value[2] = col_type(v3); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x2<U, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		this->value[2] = col_type(0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(T(0)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(T(0)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		this->value[2] = m[2]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type & tmat3x2<T, P>::operator[](typename tmat3x2<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type const & tmat3x2<T, P>::operator[](typename tmat3x2<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary updatable operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator=(tmat3x2<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m[0]; | ||||||
|  | 			this->value[1] = m[1]; | ||||||
|  | 			this->value[2] = m[2]; | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator=(tmat3x2<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		this->value[2] = m[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator+=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += s; | ||||||
|  | 		this->value[1] += s; | ||||||
|  | 		this->value[2] += s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator+=(tmat3x2<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += m[0]; | ||||||
|  | 		this->value[1] += m[1]; | ||||||
|  | 		this->value[2] += m[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator-=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= s; | ||||||
|  | 		this->value[1] -= s; | ||||||
|  | 		this->value[2] -= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator-=(tmat3x2<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= m[0]; | ||||||
|  | 		this->value[1] -= m[1]; | ||||||
|  | 		this->value[2] -= m[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator*=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] *= s; | ||||||
|  | 		this->value[1] *= s; | ||||||
|  | 		this->value[2] *= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> & tmat3x2<T, P>::operator/=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] /= s; | ||||||
|  | 		this->value[1] /= s; | ||||||
|  | 		this->value[2] /= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->value[0]; | ||||||
|  | 		++this->value[1]; | ||||||
|  | 		++this->value[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->value[0]; | ||||||
|  | 		--this->value[1]; | ||||||
|  | 		--this->value[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> tmat3x2<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat3x2<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> tmat3x2<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat3x2<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator+(tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator-(tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			-m[0], | ||||||
|  | 			-m[1], | ||||||
|  | 			-m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator+(tmat3x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			m[0] + scalar, | ||||||
|  | 			m[1] + scalar, | ||||||
|  | 			m[2] + scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator+(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			m1[0] + m2[0], | ||||||
|  | 			m1[1] + m2[1], | ||||||
|  | 			m1[2] + m2[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator-(tmat3x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			m[0] - scalar, | ||||||
|  | 			m[1] - scalar, | ||||||
|  | 			m[2] - scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator-(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			m1[0] - m2[0], | ||||||
|  | 			m1[1] - m2[1], | ||||||
|  | 			m1[2] - m2[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat3x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar, | ||||||
|  | 			m[2] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(T scalar, tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar, | ||||||
|  | 			m[2] * scalar); | ||||||
|  | 	} | ||||||
|  |     | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type operator*(tmat3x2<T, P> const & m, typename tmat3x2<T, P>::row_type const & v) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat3x2<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::row_type operator*(typename tmat3x2<T, P>::col_type const & v, tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat3x2<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat2x3<T, P> 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]; | ||||||
|  |  | ||||||
|  | 		tmat2x2<T, P> Result(uninitialize); | ||||||
|  | 		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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat3x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat4x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator/(tmat3x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			m[0] / scalar, | ||||||
|  | 			m[1] / scalar, | ||||||
|  | 			m[2] / scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator/(T scalar, tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			scalar / m[0], | ||||||
|  | 			scalar / m[1], | ||||||
|  | 			scalar / m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); | ||||||
|  | 	} | ||||||
|  | } //namespace glm | ||||||
							
								
								
									
										190
									
								
								lib/glm/detail/type_mat3x3.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								lib/glm/detail/type_mat3x3.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,190 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat3x3.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "../fwd.hpp" | ||||||
|  | #include "type_vec3.hpp" | ||||||
|  | #include "type_mat.hpp" | ||||||
|  | #include <limits> | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tmat3x3 | ||||||
|  | 	{ | ||||||
|  | 		typedef tvec3<T, P> col_type; | ||||||
|  | 		typedef tvec3<T, P> row_type; | ||||||
|  | 		typedef tmat3x3<T, P> type; | ||||||
|  | 		typedef tmat3x3<T, P> transpose_type; | ||||||
|  | 		typedef T value_type; | ||||||
|  |  | ||||||
|  | 	private: | ||||||
|  | 		col_type value[3]; | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		// -- Constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat3x3() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL tmat3x3(tmat3x3<T, P> const & m) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL tmat3x3(tmat3x3<T, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat3x3(ctor); | ||||||
|  | 		GLM_FUNC_DECL explicit tmat3x3(T scalar); | ||||||
|  | 		GLM_FUNC_DECL tmat3x3( | ||||||
|  | 			T x0, T y0, T z0, | ||||||
|  | 			T x1, T y1, T z1, | ||||||
|  | 			T x2, T y2, T z2); | ||||||
|  | 		GLM_FUNC_DECL tmat3x3( | ||||||
|  | 			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 tmat3x3( | ||||||
|  | 			X1 x1, Y1 y1, Z1 z1, | ||||||
|  | 			X2 x2, Y2 y2, Z2 z2, | ||||||
|  | 			X3 x3, Y3 y3, Z3 z3); | ||||||
|  |  | ||||||
|  | 		template <typename V1, typename V2, typename V3> | ||||||
|  | 		GLM_FUNC_DECL tmat3x3( | ||||||
|  | 			tvec3<V1, P> const & v1, | ||||||
|  | 			tvec3<V2, P> const & v2, | ||||||
|  | 			tvec3<V3, P> const & v3); | ||||||
|  |  | ||||||
|  | 		// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat3x3<U, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat2x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat4x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat2x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat3x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat2x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat4x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat3x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat4x3<T, P> const & x); | ||||||
|  |  | ||||||
|  | 		// -- Accesses -- | ||||||
|  |  | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 3;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL col_type & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL col_type const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator=(tmat3x3<T, P> const & m) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator=(tmat3x3<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator+=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator+=(tmat3x3<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator-=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator-=(tmat3x3<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator*=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator*=(tmat3x3<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator/=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator/=(tmat3x3<U, P> const & m); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator++(); | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> & operator--(); | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tmat3x3<T, P> operator--(int); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator+(tmat3x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator-(tmat3x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator+(tmat3x3<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator+(T scalar, tmat3x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator+(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator-(tmat3x3<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator-(T scalar, tmat3x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator-(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator*(tmat3x3<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator*(T scalar, tmat3x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat3x3<T, P>::col_type operator*(tmat3x3<T, P> const & m, typename tmat3x3<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat3x3<T, P>::row_type operator*(typename tmat3x3<T, P>::col_type const & v, tmat3x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat2x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat4x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator/(tmat3x3<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator/(T scalar, tmat3x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat3x3<T, P>::col_type operator/(tmat3x3<T, P> const & m, typename tmat3x3<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat3x3<T, P>::row_type operator/(typename tmat3x3<T, P>::col_type const & v, tmat3x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator/(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_mat3x3.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										561
									
								
								lib/glm/detail/type_mat3x3.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										561
									
								
								lib/glm/detail/type_mat3x3.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,561 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat3x3.inl | ||||||
|  |  | ||||||
|  | #include "func_matrix.hpp" | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	// -- Constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3() | ||||||
|  | 		{ | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT  | ||||||
|  | 				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 | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x3<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m.value[0]; | ||||||
|  | 			this->value[1] = m.value[1]; | ||||||
|  | 			this->value[2] = m.value[2]; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x3<T, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m.value[0]; | ||||||
|  | 		this->value[1] = m.value[1]; | ||||||
|  | 		this->value[2] = m.value[2]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat3x3<T, P>::tmat3x3(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(T scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(scalar, 0, 0); | ||||||
|  | 		this->value[1] = col_type(0, scalar, 0); | ||||||
|  | 		this->value[2] = col_type(0, 0, scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3 | ||||||
|  | 	( | ||||||
|  | 		T x0, T y0, T z0, | ||||||
|  | 		T x1, T y1, T z1, | ||||||
|  | 		T x2, T y2, T z2 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(x0, y0, z0); | ||||||
|  | 		this->value[1] = col_type(x1, y1, z1); | ||||||
|  | 		this->value[2] = col_type(x2, y2, z2); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3 | ||||||
|  | 	( | ||||||
|  | 		col_type const & v0, | ||||||
|  | 		col_type const & v1, | ||||||
|  | 		col_type const & v2 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = v0; | ||||||
|  | 		this->value[1] = v1; | ||||||
|  | 		this->value[2] = v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Conversion constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template < | ||||||
|  | 		typename X1, typename Y1, typename Z1, | ||||||
|  | 		typename X2, typename Y2, typename Z2, | ||||||
|  | 		typename X3, typename Y3, typename Z3> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3 | ||||||
|  | 	( | ||||||
|  | 		X1 x1, Y1 y1, Z1 z1, | ||||||
|  | 		X2 x2, Y2 y2, Z2 z2, | ||||||
|  | 		X3 x3, Y3 y3, Z3 z3 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1)); | ||||||
|  | 		this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2)); | ||||||
|  | 		this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename V1, typename V2, typename V3> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3 | ||||||
|  | 	( | ||||||
|  | 		tvec3<V1, P> const & v1, | ||||||
|  | 		tvec3<V2, P> const & v2, | ||||||
|  | 		tvec3<V3, P> const & v3 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(v1); | ||||||
|  | 		this->value[1] = col_type(v2); | ||||||
|  | 		this->value[2] = col_type(v3); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x3<U, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0); | ||||||
|  | 		this->value[2] = col_type(0, 0, 1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		this->value[2] = col_type(0, 0, 1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0); | ||||||
|  | 		this->value[2] = col_type(m[2], 1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(0, 0, 1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0); | ||||||
|  | 		this->value[2] = col_type(m[2], 1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		this->value[2] = m[2]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type & tmat3x3<T, P>::operator[](typename tmat3x3<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type const & tmat3x3<T, P>::operator[](typename tmat3x3<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary updatable operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator=(tmat3x3<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m[0]; | ||||||
|  | 			this->value[1] = m[1]; | ||||||
|  | 			this->value[2] = m[2]; | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator=(tmat3x3<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		this->value[2] = m[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator+=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += s; | ||||||
|  | 		this->value[1] += s; | ||||||
|  | 		this->value[2] += s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator+=(tmat3x3<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += m[0]; | ||||||
|  | 		this->value[1] += m[1]; | ||||||
|  | 		this->value[2] += m[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator-=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= s; | ||||||
|  | 		this->value[1] -= s; | ||||||
|  | 		this->value[2] -= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator-=(tmat3x3<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= m[0]; | ||||||
|  | 		this->value[1] -= m[1]; | ||||||
|  | 		this->value[2] -= m[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator*=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] *= s; | ||||||
|  | 		this->value[1] *= s; | ||||||
|  | 		this->value[2] *= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator*=(tmat3x3<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = *this * m); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator/=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] /= s; | ||||||
|  | 		this->value[1] /= s; | ||||||
|  | 		this->value[2] /= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator/=(tmat3x3<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return *this *= inverse(m); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->value[0]; | ||||||
|  | 		++this->value[1]; | ||||||
|  | 		++this->value[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->value[0]; | ||||||
|  | 		--this->value[1]; | ||||||
|  | 		--this->value[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> tmat3x3<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat3x3<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> tmat3x3<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat3x3<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator+(tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator-(tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x3<T, P>( | ||||||
|  | 			-m[0],  | ||||||
|  | 			-m[1], | ||||||
|  | 			-m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator+(tmat3x3<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x3<T, P>( | ||||||
|  | 			m[0] + scalar, | ||||||
|  | 			m[1] + scalar, | ||||||
|  | 			m[2] + scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator+(T scalar, tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x3<T, P>( | ||||||
|  | 			m[0] + scalar, | ||||||
|  | 			m[1] + scalar, | ||||||
|  | 			m[2] + scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator+(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x3<T, P>( | ||||||
|  | 			m1[0] + m2[0], | ||||||
|  | 			m1[1] + m2[1], | ||||||
|  | 			m1[2] + m2[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator-(tmat3x3<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x3<T, P>( | ||||||
|  | 			m[0] - scalar, | ||||||
|  | 			m[1] - scalar, | ||||||
|  | 			m[2] - scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator-(T scalar, tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x3<T, P>( | ||||||
|  | 			scalar - m[0], | ||||||
|  | 			scalar - m[1], | ||||||
|  | 			scalar - m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator-(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x3<T, P>( | ||||||
|  | 			m1[0] - m2[0], | ||||||
|  | 			m1[1] - m2[1], | ||||||
|  | 			m1[2] - m2[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat3x3<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x3<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar, | ||||||
|  | 			m[2] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(T scalar, tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x3<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar, | ||||||
|  | 			m[2] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type operator*(tmat3x3<T, P> const & m, typename tmat3x3<T, P>::row_type const & v) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat3x3<T, P>::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 <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::row_type operator*(typename tmat3x3<T, P>::col_type const & v, tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat3x3<T, P>::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 <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat3x3<T, P> 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]; | ||||||
|  |  | ||||||
|  | 		tmat3x3<T, P> Result(uninitialize); | ||||||
|  | 		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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat2x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat4x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator/(tmat3x3<T, P> const & m,	T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x3<T, P>( | ||||||
|  | 			m[0] / scalar, | ||||||
|  | 			m[1] / scalar, | ||||||
|  | 			m[2] / scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator/(T scalar, tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x3<T, P>( | ||||||
|  | 			scalar / m[0], | ||||||
|  | 			scalar / m[1], | ||||||
|  | 			scalar / m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type operator/(tmat3x3<T, P> const & m, typename tmat3x3<T, P>::row_type const & v) | ||||||
|  | 	{ | ||||||
|  | 		return  inverse(m) * v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::row_type operator/(typename tmat3x3<T, P>::col_type const & v, tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return v * inverse(m); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator/(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		tmat3x3<T, P> m1_copy(m1); | ||||||
|  | 		return m1_copy /= m2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); | ||||||
|  | 	} | ||||||
|  | } //namespace glm | ||||||
							
								
								
									
										172
									
								
								lib/glm/detail/type_mat3x4.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								lib/glm/detail/type_mat3x4.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,172 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat3x4.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "../fwd.hpp" | ||||||
|  | #include "type_vec3.hpp" | ||||||
|  | #include "type_vec4.hpp" | ||||||
|  | #include "type_mat.hpp" | ||||||
|  | #include <limits> | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tmat3x4 | ||||||
|  | 	{ | ||||||
|  | 		typedef tvec4<T, P> col_type; | ||||||
|  | 		typedef tvec3<T, P> row_type; | ||||||
|  | 		typedef tmat3x4<T, P> type; | ||||||
|  | 		typedef tmat4x3<T, P> transpose_type; | ||||||
|  | 		typedef T value_type; | ||||||
|  |  | ||||||
|  | 	private: | ||||||
|  | 		col_type value[3]; | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		// -- Constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat3x4() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL tmat3x4(tmat3x4<T, P> const & m) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL tmat3x4(tmat3x4<T, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat3x4(ctor); | ||||||
|  | 		GLM_FUNC_DECL explicit tmat3x4(T scalar); | ||||||
|  | 		GLM_FUNC_DECL tmat3x4( | ||||||
|  | 			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 tmat3x4( | ||||||
|  | 			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 tmat3x4( | ||||||
|  | 			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 <typename V1, typename V2, typename V3> | ||||||
|  | 		GLM_FUNC_DECL tmat3x4( | ||||||
|  | 			tvec4<V1, P> const & v1, | ||||||
|  | 			tvec4<V2, P> const & v2, | ||||||
|  | 			tvec4<V3, P> const & v3); | ||||||
|  |  | ||||||
|  | 		// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat3x4<U, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat2x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat3x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat4x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat2x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat3x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat2x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat4x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat4x3<T, P> const & x); | ||||||
|  |  | ||||||
|  | 		// -- Accesses -- | ||||||
|  |  | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 3;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL col_type & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL col_type const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> & operator=(tmat3x4<T, P> const & m) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> & operator=(tmat3x4<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> & operator+=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> & operator+=(tmat3x4<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> & operator-=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> & operator-=(tmat3x4<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> & operator*=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> & operator/=(U s); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> & operator++(); | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> & operator--(); | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tmat3x4<T, P> operator--(int); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator+(tmat3x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator-(tmat3x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator+(tmat3x4<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator+(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator-(tmat3x4<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator-(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator*(tmat3x4<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator*(T scalar, tmat3x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat3x4<T, P>::col_type operator*(tmat3x4<T, P> const & m, typename tmat3x4<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat3x4<T, P>::row_type operator*(typename tmat3x4<T, P>::col_type const & v, tmat3x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator*(tmat3x4<T, P> const & m1,	tmat4x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator*(tmat3x4<T, P> const & m1, tmat2x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator*(tmat3x4<T, P> const & m1,	tmat3x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator/(tmat3x4<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator/(T scalar, tmat3x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2); | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_mat3x4.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										532
									
								
								lib/glm/detail/type_mat3x4.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										532
									
								
								lib/glm/detail/type_mat3x4.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,532 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat3x4.inl | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	// -- Constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4() | ||||||
|  | 		{ | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT  | ||||||
|  | 				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 | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x4<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m.value[0]; | ||||||
|  | 			this->value[1] = m.value[1]; | ||||||
|  | 			this->value[2] = m.value[2]; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x4<T, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m.value[0]; | ||||||
|  | 		this->value[1] = m.value[1]; | ||||||
|  | 		this->value[2] = m.value[2]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat3x4<T, P>::tmat3x4(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(T scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(scalar, 0, 0, 0); | ||||||
|  | 		this->value[1] = col_type(0, scalar, 0, 0); | ||||||
|  | 		this->value[2] = col_type(0, 0, scalar, 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4 | ||||||
|  | 	( | ||||||
|  | 		T x0, T y0, T z0, T w0, | ||||||
|  | 		T x1, T y1, T z1, T w1, | ||||||
|  | 		T x2, T y2, T z2, T w2 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4 | ||||||
|  | 	( | ||||||
|  | 		col_type const & v0, | ||||||
|  | 		col_type const & v1, | ||||||
|  | 		col_type const & v2 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = v0; | ||||||
|  | 		this->value[1] = v1; | ||||||
|  | 		this->value[2] = v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Conversion constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	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_QUALIFIER tmat3x4<T, P>::tmat3x4 | ||||||
|  | 	( | ||||||
|  | 		X1 x1, Y1 y1, Z1 z1, W1 w1, | ||||||
|  | 		X2 x2, Y2 y2, Z2 z2, W2 w2, | ||||||
|  | 		X3 x3, Y3 y3, Z3 z3, W3 w3 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1), value_type(w1)); | ||||||
|  | 		this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2), value_type(w2)); | ||||||
|  | 		this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3), value_type(w3)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename V1, typename V2, typename V3> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4 | ||||||
|  | 	( | ||||||
|  | 		tvec4<V1, P> const & v1, | ||||||
|  | 		tvec4<V2, P> const & v2, | ||||||
|  | 		tvec4<V3, P> const & v3 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(v1); | ||||||
|  | 		this->value[1] = col_type(v2); | ||||||
|  | 		this->value[2] = col_type(v3); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x4<U, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0); | ||||||
|  | 		this->value[2] = col_type(m[2], 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0]); | ||||||
|  | 		this->value[1] = col_type(m[1]); | ||||||
|  | 		this->value[2] = col_type(0, 0, 1, 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(m[0], 0); | ||||||
|  | 		this->value[1] = col_type(m[1], 0); | ||||||
|  | 		this->value[2] = col_type(m[2], 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x4<T, P>::col_type & tmat3x4<T, P>::operator[](typename tmat3x4<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x4<T, P>::col_type const & tmat3x4<T, P>::operator[](typename tmat3x4<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary updatable operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator=(tmat3x4<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m[0]; | ||||||
|  | 			this->value[1] = m[1]; | ||||||
|  | 			this->value[2] = m[2]; | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator=(tmat3x4<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		this->value[2] = m[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator+=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += s; | ||||||
|  | 		this->value[1] += s; | ||||||
|  | 		this->value[2] += s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator+=(tmat3x4<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += m[0]; | ||||||
|  | 		this->value[1] += m[1]; | ||||||
|  | 		this->value[2] += m[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator-=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= s; | ||||||
|  | 		this->value[1] -= s; | ||||||
|  | 		this->value[2] -= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator-=(tmat3x4<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= m[0]; | ||||||
|  | 		this->value[1] -= m[1]; | ||||||
|  | 		this->value[2] -= m[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator*=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] *= s; | ||||||
|  | 		this->value[1] *= s; | ||||||
|  | 		this->value[2] *= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> & tmat3x4<T, P>::operator/=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] /= s; | ||||||
|  | 		this->value[1] /= s; | ||||||
|  | 		this->value[2] /= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->value[0]; | ||||||
|  | 		++this->value[1]; | ||||||
|  | 		++this->value[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->value[0]; | ||||||
|  | 		--this->value[1]; | ||||||
|  | 		--this->value[2]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> tmat3x4<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat3x4<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> tmat3x4<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat3x4<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator+(tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator-(tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			-m[0], | ||||||
|  | 			-m[1], | ||||||
|  | 			-m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator+(tmat3x4<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			m[0] + scalar, | ||||||
|  | 			m[1] + scalar, | ||||||
|  | 			m[2] + scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator+(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			m1[0] + m2[0], | ||||||
|  | 			m1[1] + m2[1], | ||||||
|  | 			m1[2] + m2[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator-(tmat3x4<T, P> const & m,	T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			m[0] - scalar, | ||||||
|  | 			m[1] - scalar, | ||||||
|  | 			m[2] - scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator-(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			m1[0] - m2[0], | ||||||
|  | 			m1[1] - m2[1], | ||||||
|  | 			m1[2] - m2[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat3x4<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar, | ||||||
|  | 			m[2] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(T scalar, tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar, | ||||||
|  | 			m[2] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x4<T, P>::col_type operator* | ||||||
|  | 	( | ||||||
|  | 		tmat3x4<T, P> const & m, | ||||||
|  | 		typename tmat3x4<T, P>::row_type const & v | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat3x4<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat3x4<T, P>::row_type operator* | ||||||
|  | 	( | ||||||
|  | 		typename tmat3x4<T, P>::col_type const & v, | ||||||
|  | 		tmat3x4<T, P> const & m | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat3x4<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat3x4<T, P> const & m1, tmat4x3<T, P> 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]; | ||||||
|  |  | ||||||
|  | 		tmat4x4<T, P> Result(uninitialize); | ||||||
|  | 		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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat3x4<T, P> const & m1, tmat2x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat3x4<T, P> const & m1, tmat3x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator/(tmat3x4<T, P> const & m,	T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			m[0] / scalar, | ||||||
|  | 			m[1] / scalar, | ||||||
|  | 			m[2] / scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator/(T scalar, tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			scalar / m[0], | ||||||
|  | 			scalar / m[1], | ||||||
|  | 			scalar / m[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); | ||||||
|  | 	} | ||||||
|  | } //namespace glm | ||||||
							
								
								
									
										177
									
								
								lib/glm/detail/type_mat4x2.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								lib/glm/detail/type_mat4x2.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat4x2.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "../fwd.hpp" | ||||||
|  | #include "type_vec2.hpp" | ||||||
|  | #include "type_vec4.hpp" | ||||||
|  | #include "type_mat.hpp" | ||||||
|  | #include <limits> | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tmat4x2 | ||||||
|  | 	{ | ||||||
|  | 		typedef tvec2<T, P> col_type; | ||||||
|  | 		typedef tvec4<T, P> row_type; | ||||||
|  | 		typedef tmat4x2<T, P> type; | ||||||
|  | 		typedef tmat2x4<T, P> transpose_type; | ||||||
|  | 		typedef T value_type; | ||||||
|  |  | ||||||
|  | 	private: | ||||||
|  | 		col_type value[4]; | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		// -- Constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat4x2() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL tmat4x2(tmat4x2<T, P> const & m) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL tmat4x2(tmat4x2<T, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat4x2(ctor); | ||||||
|  | 		GLM_FUNC_DECL explicit tmat4x2(T scalar); | ||||||
|  | 		GLM_FUNC_DECL tmat4x2( | ||||||
|  | 			T x0, T y0, | ||||||
|  | 			T x1, T y1, | ||||||
|  | 			T x2, T y2, | ||||||
|  | 			T x3, T y3); | ||||||
|  | 		GLM_FUNC_DECL tmat4x2( | ||||||
|  | 			col_type const & v0, | ||||||
|  | 			col_type const & v1, | ||||||
|  | 			col_type const & v2, | ||||||
|  | 			col_type const & v3); | ||||||
|  |  | ||||||
|  | 		// -- Conversions -- | ||||||
|  |  | ||||||
|  | 		template < | ||||||
|  | 			typename X1, typename Y1, | ||||||
|  | 			typename X2, typename Y2, | ||||||
|  | 			typename X3, typename Y3, | ||||||
|  | 			typename X4, typename Y4> | ||||||
|  | 		GLM_FUNC_DECL tmat4x2( | ||||||
|  | 			X1 x1, Y1 y1, | ||||||
|  | 			X2 x2, Y2 y2, | ||||||
|  | 			X3 x3, Y3 y3, | ||||||
|  | 			X4 x4, Y4 y4); | ||||||
|  |  | ||||||
|  | 		template <typename V1, typename V2, typename V3, typename V4> | ||||||
|  | 		GLM_FUNC_DECL tmat4x2( | ||||||
|  | 			tvec2<V1, P> const & v1, | ||||||
|  | 			tvec2<V2, P> const & v2, | ||||||
|  | 			tvec2<V3, P> const & v3, | ||||||
|  | 			tvec2<V4, P> const & v4); | ||||||
|  |  | ||||||
|  | 		// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat4x2<U, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat2x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat3x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat4x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat2x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat3x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat2x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat4x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat3x4<T, P> const & x); | ||||||
|  |  | ||||||
|  | 		// -- Accesses -- | ||||||
|  |  | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 4;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL col_type & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL col_type const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> & operator=(tmat4x2<T, P> const & m) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> & operator=(tmat4x2<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> & operator+=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> & operator+=(tmat4x2<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> & operator-=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> & operator-=(tmat4x2<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> & operator*=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> & operator/=(U s); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> & operator++ (); | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> & operator-- (); | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tmat4x2<T, P> operator--(int); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator+(tmat4x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator-(tmat4x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator+(tmat4x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator+(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator-(tmat4x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator-(tmat4x2<T, P> const & m1,	tmat4x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator*(tmat4x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator*(T scalar, tmat4x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat4x2<T, P>::col_type operator*(tmat4x2<T, P> const & m, typename tmat4x2<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat4x2<T, P>::row_type operator*(typename tmat4x2<T, P>::col_type const & v, tmat4x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat2x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat3x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat4x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator/(tmat4x2<T, P> const & m, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x2<T, P> operator/(T scalar, tmat4x2<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2); | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_mat4x2.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										545
									
								
								lib/glm/detail/type_mat4x2.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										545
									
								
								lib/glm/detail/type_mat4x2.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,545 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat4x2.inl | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | #	ifdef GLM_STATIC_CONST_MEMBERS | ||||||
|  | 		template<typename T, precision P> | ||||||
|  | 		const tmat4x2<T, P> tmat4x2<T, P>::ZERO(static_cast<T>(0)); | ||||||
|  |  | ||||||
|  | 		template<typename T, precision P> | ||||||
|  | 		const tmat4x2<T, P> tmat4x2<T, P>::IDENTITY(static_cast<T>(1)); | ||||||
|  | #	endif | ||||||
|  | 	// -- Constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P>  | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2() | ||||||
|  | 		{ | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT  | ||||||
|  | 				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 | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x2<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m.value[0]; | ||||||
|  | 			this->value[1] = m.value[1]; | ||||||
|  | 			this->value[2] = m.value[2]; | ||||||
|  | 			this->value[3] = m.value[3]; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x2<T, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m.value[0]; | ||||||
|  | 		this->value[1] = m.value[1]; | ||||||
|  | 		this->value[2] = m.value[2]; | ||||||
|  | 		this->value[3] = m.value[3]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat4x2<T, P>::tmat4x2(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(T scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(scalar, 0); | ||||||
|  | 		this->value[1] = col_type(0, scalar); | ||||||
|  | 		this->value[2] = col_type(0, 0); | ||||||
|  | 		this->value[3] = col_type(0, 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2 | ||||||
|  | 	( | ||||||
|  | 		T x0, T y0, | ||||||
|  | 		T x1, T y1, | ||||||
|  | 		T x2, T y2, | ||||||
|  | 		T x3, T y3 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2 | ||||||
|  | 	( | ||||||
|  | 		col_type const & v0, | ||||||
|  | 		col_type const & v1, | ||||||
|  | 		col_type const & v2, | ||||||
|  | 		col_type const & v3 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = v0; | ||||||
|  | 		this->value[1] = v1; | ||||||
|  | 		this->value[2] = v2; | ||||||
|  | 		this->value[3] = v3; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Conversion constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template < | ||||||
|  | 		typename X1, typename Y1, | ||||||
|  | 		typename X2, typename Y2, | ||||||
|  | 		typename X3, typename Y3, | ||||||
|  | 		typename X4, typename Y4> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2 | ||||||
|  | 	( | ||||||
|  | 		X1 x1, Y1 y1, | ||||||
|  | 		X2 x2, Y2 y2, | ||||||
|  | 		X3 x3, Y3 y3, | ||||||
|  | 		X4 x4, Y4 y4 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(static_cast<T>(x1), value_type(y1)); | ||||||
|  | 		this->value[1] = col_type(static_cast<T>(x2), value_type(y2)); | ||||||
|  | 		this->value[2] = col_type(static_cast<T>(x3), value_type(y3)); | ||||||
|  | 		this->value[3] = col_type(static_cast<T>(x4), value_type(y4)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename V1, typename V2, typename V3, typename V4> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2 | ||||||
|  | 	( | ||||||
|  | 		tvec2<V1, P> const & v1, | ||||||
|  | 		tvec2<V2, P> const & v2, | ||||||
|  | 		tvec2<V3, P> const & v3, | ||||||
|  | 		tvec2<V4, P> const & v4 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(v1); | ||||||
|  | 		this->value[1] = col_type(v2); | ||||||
|  | 		this->value[2] = col_type(v3); | ||||||
|  | 		this->value[3] = col_type(v4); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Conversion -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x2<U, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x2<T, P>::col_type & tmat4x2<T, P>::operator[](typename tmat4x2<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x2<T, P>::col_type const & tmat4x2<T, P>::operator[](typename tmat4x2<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary updatable operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator=(tmat4x2<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m[0]; | ||||||
|  | 			this->value[1] = m[1]; | ||||||
|  | 			this->value[2] = m[2]; | ||||||
|  | 			this->value[3] = m[3]; | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator=(tmat4x2<U, P> 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 <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator+=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += s; | ||||||
|  | 		this->value[1] += s; | ||||||
|  | 		this->value[2] += s; | ||||||
|  | 		this->value[3] += s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator+=(tmat4x2<U, P> 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 <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator-=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= s; | ||||||
|  | 		this->value[1] -= s; | ||||||
|  | 		this->value[2] -= s; | ||||||
|  | 		this->value[3] -= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator-=(tmat4x2<U, P> 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 <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator*=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] *= s; | ||||||
|  | 		this->value[1] *= s; | ||||||
|  | 		this->value[2] *= s; | ||||||
|  | 		this->value[3] *= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->value[0]; | ||||||
|  | 		++this->value[1]; | ||||||
|  | 		++this->value[2]; | ||||||
|  | 		++this->value[3]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->value[0]; | ||||||
|  | 		--this->value[1]; | ||||||
|  | 		--this->value[2]; | ||||||
|  | 		--this->value[3]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> tmat4x2<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat4x2<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> tmat4x2<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat4x2<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator+(tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator-(tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			-m[0], | ||||||
|  | 			-m[1], | ||||||
|  | 			-m[2], | ||||||
|  | 			-m[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator+(tmat4x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			m[0] + scalar, | ||||||
|  | 			m[1] + scalar, | ||||||
|  | 			m[2] + scalar, | ||||||
|  | 			m[3] + scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator+(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			m1[0] + m2[0], | ||||||
|  | 			m1[1] + m2[1], | ||||||
|  | 			m1[2] + m2[2], | ||||||
|  | 			m1[3] + m2[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator-(tmat4x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			m[0] - scalar, | ||||||
|  | 			m[1] - scalar, | ||||||
|  | 			m[2] - scalar, | ||||||
|  | 			m[3] - scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator-(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			m1[0] - m2[0], | ||||||
|  | 			m1[1] - m2[1], | ||||||
|  | 			m1[2] - m2[2], | ||||||
|  | 			m1[3] - m2[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat4x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar, | ||||||
|  | 			m[2] * scalar, | ||||||
|  | 			m[3] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(T scalar, tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			m[0] * scalar, | ||||||
|  | 			m[1] * scalar, | ||||||
|  | 			m[2] * scalar, | ||||||
|  | 			m[3] * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x2<T, P>::col_type operator*(tmat4x2<T, P> const & m, typename tmat4x2<T, P>::row_type const & v) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat4x2<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x2<T, P>::row_type operator*(typename tmat4x2<T, P>::col_type const & v, tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat4x2<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat2x4<T, P> 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]; | ||||||
|  |  | ||||||
|  | 		tmat2x2<T, P> Result(uninitialize); | ||||||
|  | 		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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat3x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x2<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat4x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator/(tmat4x2<T, P> const & m, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			m[0] / scalar, | ||||||
|  | 			m[1] / scalar, | ||||||
|  | 			m[2] / scalar, | ||||||
|  | 			m[3] / scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x2<T, P> operator/(T scalar, tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x2<T, P>( | ||||||
|  | 			scalar / m[0], | ||||||
|  | 			scalar / m[1], | ||||||
|  | 			scalar / m[2], | ||||||
|  | 			scalar / m[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); | ||||||
|  | 	} | ||||||
|  | } //namespace glm | ||||||
							
								
								
									
										177
									
								
								lib/glm/detail/type_mat4x3.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								lib/glm/detail/type_mat4x3.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat4x3.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "../fwd.hpp" | ||||||
|  | #include "type_vec3.hpp" | ||||||
|  | #include "type_vec4.hpp" | ||||||
|  | #include "type_mat.hpp" | ||||||
|  | #include <limits> | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tmat4x3 | ||||||
|  | 	{ | ||||||
|  | 		typedef tvec3<T, P> col_type; | ||||||
|  | 		typedef tvec4<T, P> row_type; | ||||||
|  | 		typedef tmat4x3<T, P> type; | ||||||
|  | 		typedef tmat3x4<T, P> transpose_type; | ||||||
|  | 		typedef T value_type; | ||||||
|  |  | ||||||
|  | 	private: | ||||||
|  | 		col_type value[4]; | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		// -- Constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat4x3() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL tmat4x3(tmat4x3<T, P> const & m) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL tmat4x3(tmat4x3<T, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat4x3(ctor); | ||||||
|  | 		GLM_FUNC_DECL explicit tmat4x3(T const & x); | ||||||
|  | 		GLM_FUNC_DECL tmat4x3( | ||||||
|  | 			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 tmat4x3( | ||||||
|  | 			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 tmat4x3( | ||||||
|  | 			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 <typename V1, typename V2, typename V3, typename V4> | ||||||
|  | 		GLM_FUNC_DECL tmat4x3( | ||||||
|  | 			tvec3<V1, P> const & v1, | ||||||
|  | 			tvec3<V2, P> const & v2, | ||||||
|  | 			tvec3<V3, P> const & v3, | ||||||
|  | 			tvec3<V4, P> const & v4); | ||||||
|  |  | ||||||
|  | 		// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat4x3<U, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat2x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat3x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat4x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat2x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat3x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat2x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat4x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat3x4<T, P> const & x); | ||||||
|  |  | ||||||
|  | 		// -- Accesses -- | ||||||
|  |  | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 4;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL col_type & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL col_type const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> & operator=(tmat4x3<T, P> const & m) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> & operator=(tmat4x3<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> & operator+=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> & operator+=(tmat4x3<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> & operator-=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> & operator-=(tmat4x3<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> & operator*=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> & operator/=(U s); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> & operator++(); | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> & operator--(); | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tmat4x3<T, P> operator--(int); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator+(tmat4x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator-(tmat4x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator+(tmat4x3<T, P> const & m, T const & s); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator+(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator-(tmat4x3<T, P> const & m, T const & s); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator-(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator*(tmat4x3<T, P> const & m, T const & s); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator*(T const & s, tmat4x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat4x3<T, P>::col_type operator*(tmat4x3<T, P> const & m, typename tmat4x3<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat4x3<T, P>::row_type operator*(typename tmat4x3<T, P>::col_type const & v, tmat4x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x3<T, P> operator*(tmat4x3<T, P> const & m1, tmat2x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x3<T, P> operator*(tmat4x3<T, P> const & m1,	tmat3x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator*(tmat4x3<T, P> const & m1, tmat4x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator/(tmat4x3<T, P> const & m, T const & s); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x3<T, P> operator/(T const & s, tmat4x3<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2); | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_mat4x3.inl" | ||||||
|  | #endif //GLM_EXTERNAL_TEMPLATE | ||||||
							
								
								
									
										562
									
								
								lib/glm/detail/type_mat4x3.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										562
									
								
								lib/glm/detail/type_mat4x3.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,562 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat4x3.inl | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	// -- Constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3() | ||||||
|  | 		{ | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT  | ||||||
|  | 				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 | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x3<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m.value[0]; | ||||||
|  | 			this->value[1] = m.value[1]; | ||||||
|  | 			this->value[2] = m.value[2]; | ||||||
|  | 			this->value[3] = m.value[3]; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x3<T, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m.value[0]; | ||||||
|  | 		this->value[1] = m.value[1]; | ||||||
|  | 		this->value[2] = m.value[2]; | ||||||
|  | 		this->value[3] = m.value[3]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat4x3<T, P>::tmat4x3(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(T const & s) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3 | ||||||
|  | 	( | ||||||
|  | 		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 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3 | ||||||
|  | 	( | ||||||
|  | 		col_type const & v0, | ||||||
|  | 		col_type const & v1, | ||||||
|  | 		col_type const & v2, | ||||||
|  | 		col_type const & v3 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = v0; | ||||||
|  | 		this->value[1] = v1; | ||||||
|  | 		this->value[2] = v2; | ||||||
|  | 		this->value[3] = v3; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Conversion constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	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_QUALIFIER tmat4x3<T, P>::tmat4x3 | ||||||
|  | 	( | ||||||
|  | 		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 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1)); | ||||||
|  | 		this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2)); | ||||||
|  | 		this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3)); | ||||||
|  | 		this->value[3] = col_type(static_cast<T>(x4), value_type(y4), value_type(z4)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename V1, typename V2, typename V3, typename V4> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3 | ||||||
|  | 	( | ||||||
|  | 		tvec3<V1, P> const & v1, | ||||||
|  | 		tvec3<V2, P> const & v2, | ||||||
|  | 		tvec3<V3, P> const & v3, | ||||||
|  | 		tvec3<V4, P> const & v4 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = col_type(v1); | ||||||
|  | 		this->value[1] = col_type(v2); | ||||||
|  | 		this->value[2] = col_type(v3); | ||||||
|  | 		this->value[3] = col_type(v4); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x3<U, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x3<T, P>::col_type & tmat4x3<T, P>::operator[](typename tmat4x3<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x3<T, P>::col_type const & tmat4x3<T, P>::operator[](typename tmat4x3<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary updatable operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator=(tmat4x3<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m[0]; | ||||||
|  | 			this->value[1] = m[1]; | ||||||
|  | 			this->value[2] = m[2]; | ||||||
|  | 			this->value[3] = m[3]; | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator=(tmat4x3<U, P> 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 <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator+=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += s; | ||||||
|  | 		this->value[1] += s; | ||||||
|  | 		this->value[2] += s; | ||||||
|  | 		this->value[3] += s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator+=(tmat4x3<U, P> 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 <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator-=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= s; | ||||||
|  | 		this->value[1] -= s; | ||||||
|  | 		this->value[2] -= s; | ||||||
|  | 		this->value[3] -= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator-=(tmat4x3<U, P> 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 <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator*=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] *= s; | ||||||
|  | 		this->value[1] *= s; | ||||||
|  | 		this->value[2] *= s; | ||||||
|  | 		this->value[3] *= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->value[0]; | ||||||
|  | 		++this->value[1]; | ||||||
|  | 		++this->value[2]; | ||||||
|  | 		++this->value[3]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->value[0]; | ||||||
|  | 		--this->value[1]; | ||||||
|  | 		--this->value[2]; | ||||||
|  | 		--this->value[3]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> tmat4x3<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat4x3<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> tmat4x3<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat4x3<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator+(tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator-(tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			-m[0], | ||||||
|  | 			-m[1], | ||||||
|  | 			-m[2], | ||||||
|  | 			-m[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator+(tmat4x3<T, P> const & m, T const & s) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			m[0] + s, | ||||||
|  | 			m[1] + s, | ||||||
|  | 			m[2] + s, | ||||||
|  | 			m[3] + s); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator+(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			m1[0] + m2[0], | ||||||
|  | 			m1[1] + m2[1], | ||||||
|  | 			m1[2] + m2[2], | ||||||
|  | 			m1[3] + m2[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator-(tmat4x3<T, P> const & m, T const & s) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			m[0] - s, | ||||||
|  | 			m[1] - s, | ||||||
|  | 			m[2] - s, | ||||||
|  | 			m[3] - s); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator-(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			m1[0] - m2[0], | ||||||
|  | 			m1[1] - m2[1], | ||||||
|  | 			m1[2] - m2[2], | ||||||
|  | 			m1[3] - m2[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat4x3<T, P> const & m, T const & s) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			m[0] * s, | ||||||
|  | 			m[1] * s, | ||||||
|  | 			m[2] * s, | ||||||
|  | 			m[3] * s); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(T const & s, tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			m[0] * s, | ||||||
|  | 			m[1] * s, | ||||||
|  | 			m[2] * s, | ||||||
|  | 			m[3] * s); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x3<T, P>::col_type operator* | ||||||
|  | 	( | ||||||
|  | 		tmat4x3<T, P> const & m, | ||||||
|  | 		typename tmat4x3<T, P>::row_type const & v) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat4x3<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x3<T, P>::row_type operator* | ||||||
|  | 	( | ||||||
|  | 		typename tmat4x3<T, P>::col_type const & v, | ||||||
|  | 		tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat4x3<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat4x3<T, P> const & m1, tmat2x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x3<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat4x3<T, P> const & m1, tmat3x4<T, P> 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]; | ||||||
|  |  | ||||||
|  | 		tmat3x3<T, P> Result(uninitialize); | ||||||
|  | 		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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat4x3<T, P> const & m1, tmat4x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator/(tmat4x3<T, P> const & m, T const & s) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			m[0] / s, | ||||||
|  | 			m[1] / s, | ||||||
|  | 			m[2] / s, | ||||||
|  | 			m[3] / s); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x3<T, P> operator/(T const & s, tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x3<T, P>( | ||||||
|  | 			s / m[0], | ||||||
|  | 			s / m[1], | ||||||
|  | 			s / m[2], | ||||||
|  | 			s / m[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); | ||||||
|  | 	} | ||||||
|  | } //namespace glm | ||||||
							
								
								
									
										195
									
								
								lib/glm/detail/type_mat4x4.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								lib/glm/detail/type_mat4x4.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,195 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat4x4.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "../fwd.hpp" | ||||||
|  | #include "type_vec4.hpp" | ||||||
|  | #include "type_mat.hpp" | ||||||
|  | #include <limits> | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tmat4x4 | ||||||
|  | 	{ | ||||||
|  | 		typedef tvec4<T, P> col_type; | ||||||
|  | 		typedef tvec4<T, P> row_type; | ||||||
|  | 		typedef tmat4x4<T, P> type; | ||||||
|  | 		typedef tmat4x4<T, P> transpose_type; | ||||||
|  | 		typedef T value_type; | ||||||
|  |  | ||||||
|  | 	private: | ||||||
|  | 		col_type value[4]; | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		// -- Constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat4x4() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL tmat4x4(tmat4x4<T, P> const & m) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL tmat4x4(tmat4x4<T, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL explicit tmat4x4(ctor); | ||||||
|  | 		GLM_FUNC_DECL explicit tmat4x4(T const & x); | ||||||
|  | 		GLM_FUNC_DECL tmat4x4( | ||||||
|  | 			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 tmat4x4( | ||||||
|  | 			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 tmat4x4( | ||||||
|  | 			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 <typename V1, typename V2, typename V3, typename V4> | ||||||
|  | 		GLM_FUNC_DECL tmat4x4( | ||||||
|  | 			tvec4<V1, P> const & v1, | ||||||
|  | 			tvec4<V2, P> const & v2, | ||||||
|  | 			tvec4<V3, P> const & v3, | ||||||
|  | 			tvec4<V4, P> const & v4); | ||||||
|  |  | ||||||
|  | 		// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat4x4<U, Q> const & m); | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat2x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat3x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat2x3<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat3x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat2x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat4x2<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat3x4<T, P> const & x); | ||||||
|  | 		GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat4x3<T, P> const & x); | ||||||
|  |  | ||||||
|  | 		// -- Accesses -- | ||||||
|  |  | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 4;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL col_type & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL col_type const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator=(tmat4x4<T, P> const & m) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator=(tmat4x4<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator+=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator+=(tmat4x4<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator-=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator-=(tmat4x4<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator*=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator*=(tmat4x4<U, P> const & m); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator/=(U s); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator/=(tmat4x4<U, P> const & m); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator++(); | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> & operator--(); | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tmat4x4<T, P> operator--(int); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator+(tmat4x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator-(tmat4x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator+(tmat4x4<T, P> const & m, T const & s); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator+(T const & s, tmat4x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator+(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator-(tmat4x4<T, P> const & m, T const & s); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator-(T const & s, tmat4x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator-(tmat4x4<T, P> const & m1,	tmat4x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator*(tmat4x4<T, P> const & m, T const & s); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator*(T const & s, tmat4x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat4x4<T, P>::col_type operator*(tmat4x4<T, P> const & m, typename tmat4x4<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat4x4<T, P>::row_type operator*(typename tmat4x4<T, P>::col_type const & v, tmat4x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat2x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat2x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat3x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat3x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator/(tmat4x4<T, P> const & m, T const & s); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator/(T const & s, tmat4x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat4x4<T, P>::col_type operator/(tmat4x4<T, P> const & m, typename tmat4x4<T, P>::row_type const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL typename tmat4x4<T, P>::row_type operator/(typename tmat4x4<T, P>::col_type const & v, tmat4x4<T, P> const & m); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tmat4x4<T, P> operator/(tmat4x4<T, P> const & m1,	tmat4x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2); | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_mat4x4.inl" | ||||||
|  | #endif//GLM_EXTERNAL_TEMPLATE | ||||||
							
								
								
									
										671
									
								
								lib/glm/detail/type_mat4x4.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										671
									
								
								lib/glm/detail/type_mat4x4.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,671 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat4x4.inl | ||||||
|  |  | ||||||
|  | #include "func_matrix.hpp" | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	// -- Constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4() | ||||||
|  | 		{ | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT  | ||||||
|  | 				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 | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x4<T, P> const & m) | ||||||
|  | 		{ | ||||||
|  | 			this->value[0] = m[0]; | ||||||
|  | 			this->value[1] = m[1]; | ||||||
|  | 			this->value[2] = m[2]; | ||||||
|  | 			this->value[3] = m[3]; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x4<T, Q> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		this->value[2] = m[2]; | ||||||
|  | 		this->value[3] = m[3]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(T const & s) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4 | ||||||
|  | 	( | ||||||
|  | 		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 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4 | ||||||
|  | 	( | ||||||
|  | 		col_type const & v0, | ||||||
|  | 		col_type const & v1, | ||||||
|  | 		col_type const & v2, | ||||||
|  | 		col_type const & v3 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = v0; | ||||||
|  | 		this->value[1] = v1; | ||||||
|  | 		this->value[2] = v2; | ||||||
|  | 		this->value[3] = v3; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4 | ||||||
|  | 	( | ||||||
|  | 		tmat4x4<U, Q> const & m | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		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]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Conversions -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	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 tmat4x4<T, P>::tmat4x4 | ||||||
|  | 	( | ||||||
|  | 		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 | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<X1>::is_iec559 || std::numeric_limits<X1>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<Y1>::is_iec559 || std::numeric_limits<Y1>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<Z1>::is_iec559 || std::numeric_limits<Z1>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<W1>::is_iec559 || std::numeric_limits<W1>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 4th parameter type invalid."); | ||||||
|  |  | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<X2>::is_iec559 || std::numeric_limits<X2>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 5th parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<Y2>::is_iec559 || std::numeric_limits<Y2>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 6th parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<Z2>::is_iec559 || std::numeric_limits<Z2>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 7th parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<W2>::is_iec559 || std::numeric_limits<W2>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 8th parameter type invalid."); | ||||||
|  |  | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<X3>::is_iec559 || std::numeric_limits<X3>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 9th parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<Y3>::is_iec559 || std::numeric_limits<Y3>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 10th parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<Z3>::is_iec559 || std::numeric_limits<Z3>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 11th parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<W3>::is_iec559 || std::numeric_limits<W3>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 12th parameter type invalid."); | ||||||
|  |  | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<X4>::is_iec559 || std::numeric_limits<X4>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 13th parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<Y4>::is_iec559 || std::numeric_limits<Y4>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 14th parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<Z4>::is_iec559 || std::numeric_limits<Z4>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 15th parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<W4>::is_iec559 || std::numeric_limits<W4>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 16th parameter type invalid."); | ||||||
|  |  | ||||||
|  | 		this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1), value_type(w1)); | ||||||
|  | 		this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2), value_type(w2)); | ||||||
|  | 		this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3), value_type(w3)); | ||||||
|  | 		this->value[3] = col_type(static_cast<T>(x4), value_type(y4), value_type(z4), value_type(w4)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename V1, typename V2, typename V3, typename V4> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4 | ||||||
|  | 	( | ||||||
|  | 		tvec4<V1, P> const & v1, | ||||||
|  | 		tvec4<V2, P> const & v2, | ||||||
|  | 		tvec4<V3, P> const & v3, | ||||||
|  | 		tvec4<V4, P> const & v4 | ||||||
|  | 	)		 | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<V1>::is_iec559 || std::numeric_limits<V1>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<V2>::is_iec559 || std::numeric_limits<V2>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<V3>::is_iec559 || std::numeric_limits<V3>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid."); | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<V4>::is_iec559 || std::numeric_limits<V4>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 4th parameter type invalid."); | ||||||
|  |  | ||||||
|  | 		this->value[0] = col_type(v1); | ||||||
|  | 		this->value[1] = col_type(v2); | ||||||
|  | 		this->value[2] = col_type(v3); | ||||||
|  | 		this->value[3] = col_type(v4); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Matrix conversions -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat2x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat3x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat2x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat3x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat2x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x2<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat3x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] = m[0]; | ||||||
|  | 		this->value[1] = m[1]; | ||||||
|  | 		this->value[2] = m[2]; | ||||||
|  | 		this->value[3] = col_type(0, 0, 0, 1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x3<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		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); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type & tmat4x4<T, P>::operator[](typename tmat4x4<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type const & tmat4x4<T, P>::operator[](typename tmat4x4<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i < this->length()); | ||||||
|  | 		return this->value[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator=(tmat4x4<T, P> 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; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator=(tmat4x4<U, P> 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 <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator+=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] += s; | ||||||
|  | 		this->value[1] += s; | ||||||
|  | 		this->value[2] += s; | ||||||
|  | 		this->value[3] += s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator+=(tmat4x4<U, P> 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 <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator-=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] -= s; | ||||||
|  | 		this->value[1] -= s; | ||||||
|  | 		this->value[2] -= s; | ||||||
|  | 		this->value[3] -= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator-=(tmat4x4<U, P> 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 <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator*=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] *= s; | ||||||
|  | 		this->value[1] *= s; | ||||||
|  | 		this->value[2] *= s; | ||||||
|  | 		this->value[3] *= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator*=(tmat4x4<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = *this * m); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator/=(U s) | ||||||
|  | 	{ | ||||||
|  | 		this->value[0] /= s; | ||||||
|  | 		this->value[1] /= s; | ||||||
|  | 		this->value[2] /= s; | ||||||
|  | 		this->value[3] /= s; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator/=(tmat4x4<U, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return *this *= inverse(m); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->value[0]; | ||||||
|  | 		++this->value[1]; | ||||||
|  | 		++this->value[2]; | ||||||
|  | 		++this->value[3]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->value[0]; | ||||||
|  | 		--this->value[1]; | ||||||
|  | 		--this->value[2]; | ||||||
|  | 		--this->value[3]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> tmat4x4<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat4x4<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> tmat4x4<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tmat4x4<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary constant operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator+(tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return m; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator-(tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x4<T, P>( | ||||||
|  | 			-m[0], | ||||||
|  | 			-m[1], | ||||||
|  | 			-m[2], | ||||||
|  | 			-m[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator+(tmat4x4<T, P> const & m, T const & s) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x4<T, P>( | ||||||
|  | 			m[0] + s, | ||||||
|  | 			m[1] + s, | ||||||
|  | 			m[2] + s, | ||||||
|  | 			m[3] + s); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator+(T const & s, tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x4<T, P>( | ||||||
|  | 			m[0] + s, | ||||||
|  | 			m[1] + s, | ||||||
|  | 			m[2] + s, | ||||||
|  | 			m[3] + s); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator+(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x4<T, P>( | ||||||
|  | 			m1[0] + m2[0], | ||||||
|  | 			m1[1] + m2[1], | ||||||
|  | 			m1[2] + m2[2], | ||||||
|  | 			m1[3] + m2[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator-(tmat4x4<T, P> const & m, T const & s) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x4<T, P>( | ||||||
|  | 			m[0] - s, | ||||||
|  | 			m[1] - s, | ||||||
|  | 			m[2] - s, | ||||||
|  | 			m[3] - s); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator-(T const & s, tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x4<T, P>( | ||||||
|  | 			s - m[0], | ||||||
|  | 			s - m[1], | ||||||
|  | 			s - m[2], | ||||||
|  | 			s - m[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator-(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x4<T, P>( | ||||||
|  | 			m1[0] - m2[0], | ||||||
|  | 			m1[1] - m2[1], | ||||||
|  | 			m1[2] - m2[2], | ||||||
|  | 			m1[3] - m2[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat4x4<T, P> const & m, T const  & s) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x4<T, P>( | ||||||
|  | 			m[0] * s, | ||||||
|  | 			m[1] * s, | ||||||
|  | 			m[2] * s, | ||||||
|  | 			m[3] * s); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(T const & s, tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x4<T, P>( | ||||||
|  | 			m[0] * s, | ||||||
|  | 			m[1] * s, | ||||||
|  | 			m[2] * s, | ||||||
|  | 			m[3] * s); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type operator* | ||||||
|  | 	( | ||||||
|  | 		tmat4x4<T, P> const & m, | ||||||
|  | 		typename tmat4x4<T, P>::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 tmat4x4<T, P>::col_type(a2); | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | 		typename tmat4x4<T, P>::col_type const Mov0(v[0]); | ||||||
|  | 		typename tmat4x4<T, P>::col_type const Mov1(v[1]); | ||||||
|  | 		typename tmat4x4<T, P>::col_type const Mul0 = m[0] * Mov0; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const Mul1 = m[1] * Mov1; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const Add0 = Mul0 + Mul1; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const Mov2(v[2]); | ||||||
|  | 		typename tmat4x4<T, P>::col_type const Mov3(v[3]); | ||||||
|  | 		typename tmat4x4<T, P>::col_type const Mul2 = m[2] * Mov2; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const Mul3 = m[3] * Mov3; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const Add1 = Mul2 + Mul3; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const Add2 = Add0 + Add1; | ||||||
|  | 		return Add2; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | 		return typename tmat4x4<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::row_type operator* | ||||||
|  | 	( | ||||||
|  | 		typename tmat4x4<T, P>::col_type const & v, | ||||||
|  | 		tmat4x4<T, P> const & m | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		return typename tmat4x4<T, P>::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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat2x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat2x4<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat3x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return tmat3x4<T, P>( | ||||||
|  | 			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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		typename tmat4x4<T, P>::col_type const SrcA0 = m1[0]; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const SrcA1 = m1[1]; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const SrcA2 = m1[2]; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const SrcA3 = m1[3]; | ||||||
|  |  | ||||||
|  | 		typename tmat4x4<T, P>::col_type const SrcB0 = m2[0]; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const SrcB1 = m2[1]; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const SrcB2 = m2[2]; | ||||||
|  | 		typename tmat4x4<T, P>::col_type const SrcB3 = m2[3]; | ||||||
|  |  | ||||||
|  | 		tmat4x4<T, P> Result(uninitialize); | ||||||
|  | 		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 <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator/(tmat4x4<T, P> const & m, T const & s) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x4<T, P>( | ||||||
|  | 			m[0] / s, | ||||||
|  | 			m[1] / s, | ||||||
|  | 			m[2] / s, | ||||||
|  | 			m[3] / s); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator/(T const & s,	tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return tmat4x4<T, P>( | ||||||
|  | 			s / m[0], | ||||||
|  | 			s / m[1], | ||||||
|  | 			s / m[2], | ||||||
|  | 			s / m[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type operator/(tmat4x4<T, P> const & m, typename tmat4x4<T, P>::row_type const & v) | ||||||
|  | 	{ | ||||||
|  | 		return inverse(m) * v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::row_type operator/(typename tmat4x4<T, P>::col_type const & v, tmat4x4<T, P> const & m) | ||||||
|  | 	{ | ||||||
|  | 		return v * inverse(m); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tmat4x4<T, P> operator/(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		tmat4x4<T, P> m1_copy(m1); | ||||||
|  | 		return m1_copy /= m2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) | ||||||
|  | 	{ | ||||||
|  | 		return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #if GLM_ARCH != GLM_ARCH_PURE | ||||||
|  | #	include "type_mat4x4_simd.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										7
									
								
								lib/glm/detail/type_mat4x4_simd.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								lib/glm/detail/type_mat4x4_simd.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_mat4x4_sse2.inl | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  |  | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										576
									
								
								lib/glm/detail/type_vec.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										576
									
								
								lib/glm/detail/type_vec.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,576 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_vec.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "precision.hpp" | ||||||
|  | #include "type_int.hpp" | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <typename T, std::size_t size, bool aligned> | ||||||
|  | 	struct storage | ||||||
|  | 	{ | ||||||
|  | 		typedef struct type { | ||||||
|  | 			uint8 data[size]; | ||||||
|  | 		} type; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	#define GLM_ALIGNED_STORAGE_TYPE_STRUCT(x) \ | ||||||
|  | 		template <typename T> \ | ||||||
|  | 		struct storage<T, x, true> { \ | ||||||
|  | 			GLM_ALIGNED_STRUCT(x) type { \ | ||||||
|  | 				uint8 data[x]; \ | ||||||
|  | 			}; \ | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 	GLM_ALIGNED_STORAGE_TYPE_STRUCT(1) | ||||||
|  | 	GLM_ALIGNED_STORAGE_TYPE_STRUCT(2) | ||||||
|  | 	GLM_ALIGNED_STORAGE_TYPE_STRUCT(4) | ||||||
|  | 	GLM_ALIGNED_STORAGE_TYPE_STRUCT(8) | ||||||
|  | 	GLM_ALIGNED_STORAGE_TYPE_STRUCT(16) | ||||||
|  | 	GLM_ALIGNED_STORAGE_TYPE_STRUCT(32) | ||||||
|  | 	GLM_ALIGNED_STORAGE_TYPE_STRUCT(64) | ||||||
|  | 		 | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_SSE2_BIT | ||||||
|  | 		template <> | ||||||
|  | 		struct storage<float, 16, true> | ||||||
|  | 		{ | ||||||
|  | 			typedef glm_vec4 type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct storage<int, 16, true> | ||||||
|  | 		{ | ||||||
|  | 			typedef glm_ivec4 type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct storage<unsigned int, 16, true> | ||||||
|  | 		{ | ||||||
|  | 			typedef glm_uvec4 type; | ||||||
|  | 		}; | ||||||
|  | /* | ||||||
|  | #	else | ||||||
|  | 		typedef union __declspec(align(16)) glm_128 | ||||||
|  | 		{ | ||||||
|  | 			unsigned __int8 data[16]; | ||||||
|  | 		} glm_128; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct storage<float, 16, true> | ||||||
|  | 		{ | ||||||
|  | 			typedef glm_128 type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct storage<int, 16, true> | ||||||
|  | 		{ | ||||||
|  | 			typedef glm_128 type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct storage<unsigned int, 16, true> | ||||||
|  | 		{ | ||||||
|  | 			typedef glm_128 type; | ||||||
|  | 		}; | ||||||
|  | */ | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | #	if (GLM_ARCH & GLM_ARCH_AVX_BIT) | ||||||
|  | 		template <> | ||||||
|  | 		struct storage<double, 32, true> | ||||||
|  | 		{ | ||||||
|  | 			typedef glm_dvec4 type; | ||||||
|  | 		}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | #	if (GLM_ARCH & GLM_ARCH_AVX2_BIT) | ||||||
|  | 		template <> | ||||||
|  | 		struct storage<int64, 32, true> | ||||||
|  | 		{ | ||||||
|  | 			typedef glm_i64vec4 type; | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		struct storage<uint64, 32, true> | ||||||
|  | 		{ | ||||||
|  | 			typedef glm_u64vec4 type; | ||||||
|  | 		}; | ||||||
|  | #	endif | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> struct tvec1; | ||||||
|  | 	template <typename T, precision P> struct tvec2; | ||||||
|  | 	template <typename T, precision P> struct tvec3; | ||||||
|  | 	template <typename T, precision P> struct tvec4; | ||||||
|  |  | ||||||
|  | 	typedef tvec1<float, highp>		highp_vec1_t; | ||||||
|  | 	typedef tvec1<float, mediump>	mediump_vec1_t; | ||||||
|  | 	typedef tvec1<float, lowp>		lowp_vec1_t; | ||||||
|  | 	typedef tvec1<double, highp>	highp_dvec1_t; | ||||||
|  | 	typedef tvec1<double, mediump>	mediump_dvec1_t; | ||||||
|  | 	typedef tvec1<double, lowp>		lowp_dvec1_t; | ||||||
|  | 	typedef tvec1<int, highp>		highp_ivec1_t; | ||||||
|  | 	typedef tvec1<int, mediump>		mediump_ivec1_t; | ||||||
|  | 	typedef tvec1<int, lowp>		lowp_ivec1_t; | ||||||
|  | 	typedef tvec1<uint, highp>		highp_uvec1_t; | ||||||
|  | 	typedef tvec1<uint, mediump>	mediump_uvec1_t; | ||||||
|  | 	typedef tvec1<uint, lowp>		lowp_uvec1_t; | ||||||
|  | 	typedef tvec1<bool, highp>		highp_bvec1_t; | ||||||
|  | 	typedef tvec1<bool, mediump>	mediump_bvec1_t; | ||||||
|  | 	typedef tvec1<bool, lowp>		lowp_bvec1_t; | ||||||
|  |  | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of high single-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<float, highp>		highp_vec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of medium single-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<float, mediump>	mediump_vec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of low single-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<float, lowp>		lowp_vec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of high double-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<double, highp>	highp_dvec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of medium double-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<double, mediump>	mediump_dvec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of low double-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<double, lowp>		lowp_dvec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of high precision signed integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<int, highp>		highp_ivec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of medium precision signed integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<int, mediump>		mediump_ivec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of low precision signed integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<int, lowp>		lowp_ivec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of high precision unsigned integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<uint, highp>		highp_uvec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of medium precision unsigned integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<uint, mediump>	mediump_uvec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of low precision unsigned integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<uint, lowp>		lowp_uvec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of high precision bool numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<bool, highp>		highp_bvec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of medium precision bool numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<bool, mediump>	mediump_bvec2; | ||||||
|  |  | ||||||
|  | 	/// 2 components vector of low precision bool numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec2<bool, lowp>		lowp_bvec2; | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  |  | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of high single-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<float, highp>		highp_vec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of medium single-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<float, mediump>	mediump_vec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of low single-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<float, lowp>		lowp_vec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of high double-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<double, highp>	highp_dvec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of medium double-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<double, mediump>	mediump_dvec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of low double-precision floating-point numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<double, lowp>		lowp_dvec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of high precision signed integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<int, highp>		highp_ivec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of medium precision signed integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<int, mediump>		mediump_ivec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of low precision signed integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<int, lowp>		lowp_ivec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of high precision unsigned integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<uint, highp>		highp_uvec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of medium precision unsigned integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<uint, mediump>	mediump_uvec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of low precision unsigned integer numbers. | ||||||
|  | 	/// There is no guarantee on the actual precision. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<uint, lowp>		lowp_uvec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of high precision bool numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<bool, highp>		highp_bvec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of medium precision bool numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<bool, mediump>	mediump_bvec3; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of low precision bool numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec3<bool, lowp>		lowp_bvec3; | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  |  | ||||||
|  | 	/// @addtogroup core_precision | ||||||
|  | 	/// @{ | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of high single-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<float, highp>		highp_vec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of medium single-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<float, mediump>	mediump_vec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of low single-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<float, lowp>		lowp_vec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of high double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<double, highp>	highp_dvec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of medium double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<double, mediump>	mediump_dvec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of low double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<double, lowp>		lowp_dvec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of high precision signed integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<int, highp>		highp_ivec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of medium precision signed integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<int, mediump>		mediump_ivec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of low precision signed integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<int, lowp>		lowp_ivec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of high precision unsigned integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<uint, highp>		highp_uvec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of medium precision unsigned integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<uint, mediump>	mediump_uvec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of low precision unsigned integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<uint, lowp>		lowp_uvec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of high precision bool numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<bool, highp>		highp_bvec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of medium precision bool numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<bool, mediump>	mediump_bvec4; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of low precision bool numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> | ||||||
|  | 	typedef tvec4<bool, lowp>		lowp_bvec4; | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  |  | ||||||
|  | 	/// @addtogroup core_types | ||||||
|  | 	/// @{ | ||||||
|  |  | ||||||
|  | 	// -- Default float definition -- | ||||||
|  |  | ||||||
|  | #if(defined(GLM_PRECISION_LOWP_FLOAT)) | ||||||
|  | 	typedef lowp_vec2			vec2; | ||||||
|  | 	typedef lowp_vec3			vec3; | ||||||
|  | 	typedef lowp_vec4			vec4; | ||||||
|  | #elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) | ||||||
|  | 	typedef mediump_vec2		vec2; | ||||||
|  | 	typedef mediump_vec3		vec3; | ||||||
|  | 	typedef mediump_vec4		vec4; | ||||||
|  | #else //defined(GLM_PRECISION_HIGHP_FLOAT) | ||||||
|  | 	/// 2 components vector of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_vec2			vec2; | ||||||
|  |  | ||||||
|  | 	//! 3 components vector of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_vec3			vec3; | ||||||
|  |  | ||||||
|  | 	//! 4 components vector of floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_vec4			vec4; | ||||||
|  | #endif//GLM_PRECISION | ||||||
|  |  | ||||||
|  | 	// -- Default double definition -- | ||||||
|  |  | ||||||
|  | #if(defined(GLM_PRECISION_LOWP_DOUBLE)) | ||||||
|  | 	typedef lowp_dvec2			dvec2; | ||||||
|  | 	typedef lowp_dvec3			dvec3; | ||||||
|  | 	typedef lowp_dvec4			dvec4; | ||||||
|  | #elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE)) | ||||||
|  | 	typedef mediump_dvec2		dvec2; | ||||||
|  | 	typedef mediump_dvec3		dvec3; | ||||||
|  | 	typedef mediump_dvec4		dvec4; | ||||||
|  | #else //defined(GLM_PRECISION_HIGHP_DOUBLE) | ||||||
|  | 	/// 2 components vector of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_dvec2			dvec2; | ||||||
|  |  | ||||||
|  | 	//! 3 components vector of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_dvec3			dvec3; | ||||||
|  |  | ||||||
|  | 	//! 4 components vector of double-precision floating-point numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_dvec4			dvec4; | ||||||
|  | #endif//GLM_PRECISION | ||||||
|  |  | ||||||
|  | 	// -- Signed integer definition -- | ||||||
|  |  | ||||||
|  | #if(defined(GLM_PRECISION_LOWP_INT)) | ||||||
|  | 	typedef lowp_ivec2			ivec2; | ||||||
|  | 	typedef lowp_ivec3			ivec3; | ||||||
|  | 	typedef lowp_ivec4			ivec4; | ||||||
|  | #elif(defined(GLM_PRECISION_MEDIUMP_INT)) | ||||||
|  | 	typedef mediump_ivec2		ivec2; | ||||||
|  | 	typedef mediump_ivec3		ivec3; | ||||||
|  | 	typedef mediump_ivec4		ivec4; | ||||||
|  | #else //defined(GLM_PRECISION_HIGHP_INT) | ||||||
|  | 	/// 2 components vector of signed integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_ivec2			ivec2; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of signed integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_ivec3			ivec3; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of signed integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_ivec4			ivec4; | ||||||
|  | #endif//GLM_PRECISION | ||||||
|  |  | ||||||
|  | 	// -- Unsigned integer definition -- | ||||||
|  |  | ||||||
|  | #if(defined(GLM_PRECISION_LOWP_UINT)) | ||||||
|  | 	typedef lowp_uvec2			uvec2; | ||||||
|  | 	typedef lowp_uvec3			uvec3; | ||||||
|  | 	typedef lowp_uvec4			uvec4; | ||||||
|  | #elif(defined(GLM_PRECISION_MEDIUMP_UINT)) | ||||||
|  | 	typedef mediump_uvec2		uvec2; | ||||||
|  | 	typedef mediump_uvec3		uvec3; | ||||||
|  | 	typedef mediump_uvec4		uvec4; | ||||||
|  | #else //defined(GLM_PRECISION_HIGHP_UINT) | ||||||
|  | 	/// 2 components vector of unsigned integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_uvec2			uvec2; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of unsigned integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_uvec3			uvec3; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of unsigned integer numbers. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_uvec4			uvec4; | ||||||
|  | #endif//GLM_PRECISION | ||||||
|  |  | ||||||
|  | 	// -- Boolean definition -- | ||||||
|  |  | ||||||
|  | #if(defined(GLM_PRECISION_LOWP_BOOL)) | ||||||
|  | 	typedef lowp_bvec2			bvec2; | ||||||
|  | 	typedef lowp_bvec3			bvec3; | ||||||
|  | 	typedef lowp_bvec4			bvec4; | ||||||
|  | #elif(defined(GLM_PRECISION_MEDIUMP_BOOL)) | ||||||
|  | 	typedef mediump_bvec2		bvec2; | ||||||
|  | 	typedef mediump_bvec3		bvec3; | ||||||
|  | 	typedef mediump_bvec4		bvec4; | ||||||
|  | #else //defined(GLM_PRECISION_HIGHP_BOOL) | ||||||
|  | 	/// 2 components vector of boolean. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_bvec2			bvec2; | ||||||
|  |  | ||||||
|  | 	/// 3 components vector of boolean. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_bvec3			bvec3; | ||||||
|  |  | ||||||
|  | 	/// 4 components vector of boolean. | ||||||
|  | 	/// | ||||||
|  | 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> | ||||||
|  | 	typedef highp_bvec4			bvec4; | ||||||
|  | #endif//GLM_PRECISION | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										2
									
								
								lib/glm/detail/type_vec.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								lib/glm/detail/type_vec.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_vec.inl | ||||||
							
								
								
									
										302
									
								
								lib/glm/detail/type_vec1.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										302
									
								
								lib/glm/detail/type_vec1.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,302 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_vec1.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "../fwd.hpp" | ||||||
|  | #include "type_vec.hpp" | ||||||
|  | #if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | #	if GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #		include "_swizzle.hpp" | ||||||
|  | #	else | ||||||
|  | #		include "_swizzle_func.hpp" | ||||||
|  | #	endif | ||||||
|  | #endif //GLM_SWIZZLE | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tvec1 | ||||||
|  | 	{ | ||||||
|  | 		// -- Implementation detail -- | ||||||
|  |  | ||||||
|  | 		typedef T value_type; | ||||||
|  | 		typedef tvec1<T, P> type; | ||||||
|  | 		typedef tvec1<bool, P> bool_type; | ||||||
|  |  | ||||||
|  | 		// -- Data -- | ||||||
|  |  | ||||||
|  | #		if GLM_HAS_ONLY_XYZW | ||||||
|  | 			T x; | ||||||
|  |  | ||||||
|  | #		elif GLM_HAS_ALIGNED_TYPE | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_GCC | ||||||
|  | #				pragma GCC diagnostic push | ||||||
|  | #				pragma GCC diagnostic ignored "-Wpedantic" | ||||||
|  | #			endif | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_CLANG | ||||||
|  | #				pragma clang diagnostic push | ||||||
|  | #				pragma clang diagnostic ignored "-Wgnu-anonymous-struct" | ||||||
|  | #				pragma clang diagnostic ignored "-Wnested-anon-types" | ||||||
|  | #			endif | ||||||
|  | 		 | ||||||
|  | 			union | ||||||
|  | 			{ | ||||||
|  | 				T x; | ||||||
|  | 				T r; | ||||||
|  | 				T s; | ||||||
|  | /* | ||||||
|  | #				if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | 					_GLM_SWIZZLE1_2_MEMBERS(T, P, tvec2, x) | ||||||
|  | 					_GLM_SWIZZLE1_2_MEMBERS(T, P, tvec2, r) | ||||||
|  | 					_GLM_SWIZZLE1_2_MEMBERS(T, P, tvec2, s) | ||||||
|  | 					_GLM_SWIZZLE1_3_MEMBERS(T, P, tvec3, x) | ||||||
|  | 					_GLM_SWIZZLE1_3_MEMBERS(T, P, tvec3, r) | ||||||
|  | 					_GLM_SWIZZLE1_3_MEMBERS(T, P, tvec3, s) | ||||||
|  | 					_GLM_SWIZZLE1_4_MEMBERS(T, P, tvec4, x) | ||||||
|  | 					_GLM_SWIZZLE1_4_MEMBERS(T, P, tvec4, r) | ||||||
|  | 					_GLM_SWIZZLE1_4_MEMBERS(T, P, tvec4, s) | ||||||
|  | #				endif//GLM_SWIZZLE*/ | ||||||
|  | 			}; | ||||||
|  | 		 | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_CLANG | ||||||
|  | #				pragma clang diagnostic pop | ||||||
|  | #			endif | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_GCC | ||||||
|  | #				pragma GCC diagnostic pop | ||||||
|  | #			endif | ||||||
|  | #		else | ||||||
|  | 			union {T x, r, s;}; | ||||||
|  | /* | ||||||
|  | #			if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | 				GLM_SWIZZLE_GEN_VEC_FROM_VEC1(T, P, tvec2, tvec2, tvec3, tvec4) | ||||||
|  | #			endif//GLM_SWIZZLE*/ | ||||||
|  | #		endif | ||||||
|  |  | ||||||
|  | 		// -- Component accesses -- | ||||||
|  |  | ||||||
|  | 		/// Return the count of components of the vector | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 1;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL T & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL T const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Implicit basic constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec1() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec1(tvec1<T, P> const & v) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec1(tvec1<T, Q> const & v); | ||||||
|  |  | ||||||
|  | 		// -- Explicit basic constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec1(ctor); | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec1(T scalar); | ||||||
|  |  | ||||||
|  | 		// -- Conversion vector constructors -- | ||||||
|  |  | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec1(tvec2<U, Q> const & v); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec1(tvec3<U, Q> const & v); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec1(tvec4<U, Q> const & v); | ||||||
|  |  | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec1(tvec1<U, Q> const & v); | ||||||
|  |  | ||||||
|  | 		// -- Swizzle constructors -- | ||||||
|  | /* | ||||||
|  | #		if(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)) | ||||||
|  | 			template <int E0> | ||||||
|  | 			GLM_FUNC_DECL tvec1(detail::_swizzle<1, T, P, tvec1, E0, -1,-2,-3> const & that) | ||||||
|  | 			{ | ||||||
|  | 				*this = that(); | ||||||
|  | 			} | ||||||
|  | #		endif//(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)) | ||||||
|  | */ | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator=(tvec1<T, P> const & v) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator+=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator+=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator-=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator-=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator*=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator*=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator/=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator/=(tvec1<U, P> const & v); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator++(); | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator--(); | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> operator--(int); | ||||||
|  |  | ||||||
|  | 		// -- Unary bit operators -- | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator%=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator%=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator&=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator&=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator|=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator|=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator^=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator^=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator<<=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator<<=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator>>=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec1<T, P> & operator>>=(tvec1<U, P> const & v); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator+(tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator-(tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator+(tvec1<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator+(T scalar, tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator+(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator-(tvec1<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator-(T scalar, tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator-	(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator*(tvec1<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator*(T scalar, tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator*(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator/(tvec1<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator/(T scalar, tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator/(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator%(tvec1<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator%(T scalar, tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator%(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator&(tvec1<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator&(T scalar, tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator&(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator|(tvec1<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator|(T scalar, tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator|(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator^(tvec1<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator^(T scalar, tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator^(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator<<(tvec1<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator<<(T scalar, tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator<<(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator>>(tvec1<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator>>(T scalar, tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator>>(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<T, P> operator~(tvec1<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tvec1<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<bool, P> operator&&(tvec1<bool, P> const & v1, tvec1<bool, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec1<bool, P> operator||(tvec1<bool, P> const & v1, tvec1<bool, P> const & v2); | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_vec1.inl" | ||||||
|  | #endif//GLM_EXTERNAL_TEMPLATE | ||||||
							
								
								
									
										558
									
								
								lib/glm/detail/type_vec1.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										558
									
								
								lib/glm/detail/type_vec1.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,558 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_vec1.inl | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	// -- Implicit basic constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1() | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT | ||||||
|  | 				: x(0) | ||||||
|  | #			endif | ||||||
|  | 		{} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec1<T, P> const & v) | ||||||
|  | 			: x(v.x) | ||||||
|  | 		{} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec1<T, Q> const & v) | ||||||
|  | 		: x(v.x) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	// -- Explicit basic constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(T scalar) | ||||||
|  | 		: x(scalar) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	// -- Conversion vector constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec1<U, Q> const & v) | ||||||
|  | 		: x(static_cast<T>(v.x)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec2<U, Q> const & v) | ||||||
|  | 		: x(static_cast<T>(v.x)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec3<U, Q> const & v) | ||||||
|  | 		: x(static_cast<T>(v.x)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec4<U, Q> const & v) | ||||||
|  | 		: x(static_cast<T>(v.x)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	// -- Component accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER T & tvec1<T, P>::operator[](typename tvec1<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i >= 0 && i < this->length()); | ||||||
|  | 		return (&x)[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER T const & tvec1<T, P>::operator[](typename tvec1<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i >= 0 && i < this->length()); | ||||||
|  | 		return (&x)[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator=(tvec1<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			this->x = v.x; | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x = static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator+=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x += static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator+=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x += static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator-=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x -= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator-=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x -= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator*=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x *= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator*=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x *= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator/=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x /= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator/=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x /= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->x; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->x; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> tvec1<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tvec1<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> tvec1<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tvec1<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary bit operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator%=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x %= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator%=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x %= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator&=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x &= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator&=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x &= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator|=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x |= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator|=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x |= U(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator^=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x ^= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator^=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x ^= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator<<=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x <<= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator<<=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x <<= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator>>=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x >>= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator>>=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x >>= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary constant operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator+(tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator-(tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			-v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator+(tvec1<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v.x + scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator+(T scalar, tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			scalar + v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator+(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v1.x + v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	//operator- | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator-(tvec1<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v.x - scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator-(T scalar, tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			scalar - v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator-(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v1.x - v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator*(tvec1<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v.x * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator*(T scalar, tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			scalar * v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator*(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v1.x * v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator/(tvec1<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v.x / scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator/(T scalar, tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			scalar / v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator/(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v1.x / v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary bit operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator%(tvec1<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v.x % scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator%(T scalar, tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			scalar % v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator%(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v1.x % v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator&(tvec1<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v.x & scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator&(T scalar, tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			scalar & v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator&(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v1.x & v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator|(tvec1<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v.x | scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator|(T scalar, tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			scalar | v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator|(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v1.x | v2.x); | ||||||
|  | 	} | ||||||
|  | 		 | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator^(tvec1<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v.x ^ scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator^(T scalar, tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			scalar ^ v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator^(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v1.x ^ v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator<<(tvec1<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v.x << scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator<<(T scalar, tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			scalar << v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator<<(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v1.x << v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator>>(tvec1<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v.x >> scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator>>(T scalar, tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			scalar >> v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator>>(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			v1.x >> v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<T, P> operator~(tvec1<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<T, P>( | ||||||
|  | 			~v.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return (v1.x == v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tvec1<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return (v1.x != v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<bool, P> operator&&(tvec1<bool, P> const & v1, tvec1<bool, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<bool, P>(v1.x && v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec1<bool, P> operator||(tvec1<bool, P> const & v1, tvec1<bool, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec1<bool, P>(v1.x || v2.x); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										388
									
								
								lib/glm/detail/type_vec2.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										388
									
								
								lib/glm/detail/type_vec2.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,388 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_vec2.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "type_vec.hpp" | ||||||
|  | #if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | #	if GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #		include "_swizzle.hpp" | ||||||
|  | #	else | ||||||
|  | #		include "_swizzle_func.hpp" | ||||||
|  | #	endif | ||||||
|  | #endif //GLM_SWIZZLE | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tvec2 | ||||||
|  | 	{ | ||||||
|  | 		// -- Implementation detail -- | ||||||
|  |  | ||||||
|  | 		typedef T value_type; | ||||||
|  | 		typedef tvec2<T, P> type; | ||||||
|  | 		typedef tvec2<bool, P> bool_type; | ||||||
|  |  | ||||||
|  | 		// -- Data -- | ||||||
|  |  | ||||||
|  | #		if GLM_HAS_ONLY_XYZW | ||||||
|  | 			T x, y; | ||||||
|  |  | ||||||
|  | #		elif GLM_HAS_ALIGNED_TYPE | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_GCC | ||||||
|  | #				pragma GCC diagnostic push | ||||||
|  | #				pragma GCC diagnostic ignored "-Wpedantic" | ||||||
|  | #			endif | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_CLANG | ||||||
|  | #				pragma clang diagnostic push | ||||||
|  | #				pragma clang diagnostic ignored "-Wgnu-anonymous-struct" | ||||||
|  | #				pragma clang diagnostic ignored "-Wnested-anon-types" | ||||||
|  | #			endif | ||||||
|  | 		 | ||||||
|  | 			union | ||||||
|  | 			{ | ||||||
|  | 				struct{ T x, y; }; | ||||||
|  | 				struct{ T r, g; }; | ||||||
|  | 				struct{ T s, t; }; | ||||||
|  |  | ||||||
|  | #				if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | 					_GLM_SWIZZLE2_2_MEMBERS(T, P, glm::tvec2, x, y) | ||||||
|  | 					_GLM_SWIZZLE2_2_MEMBERS(T, P, glm::tvec2, r, g) | ||||||
|  | 					_GLM_SWIZZLE2_2_MEMBERS(T, P, glm::tvec2, s, t) | ||||||
|  | 					_GLM_SWIZZLE2_3_MEMBERS(T, P, glm::tvec3, x, y) | ||||||
|  | 					_GLM_SWIZZLE2_3_MEMBERS(T, P, glm::tvec3, r, g) | ||||||
|  | 					_GLM_SWIZZLE2_3_MEMBERS(T, P, glm::tvec3, s, t) | ||||||
|  | 					_GLM_SWIZZLE2_4_MEMBERS(T, P, glm::tvec4, x, y) | ||||||
|  | 					_GLM_SWIZZLE2_4_MEMBERS(T, P, glm::tvec4, r, g) | ||||||
|  | 					_GLM_SWIZZLE2_4_MEMBERS(T, P, glm::tvec4, s, t) | ||||||
|  | #				endif//GLM_SWIZZLE | ||||||
|  |  | ||||||
|  | 			}; | ||||||
|  | 		 | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_CLANG | ||||||
|  | #				pragma clang diagnostic pop | ||||||
|  | #			endif | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_GCC | ||||||
|  | #				pragma GCC diagnostic pop | ||||||
|  | #			endif | ||||||
|  | #		else | ||||||
|  | 			union {T x, r, s;}; | ||||||
|  | 			union {T y, g, t;}; | ||||||
|  |  | ||||||
|  | #			if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | 				GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P, tvec2, tvec2, tvec3, tvec4) | ||||||
|  | #			endif//GLM_SWIZZLE | ||||||
|  | #		endif | ||||||
|  |  | ||||||
|  | 		// -- Component accesses -- | ||||||
|  |  | ||||||
|  | 		/// Return the count of components of the vector | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 2;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL T & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL T const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Implicit basic constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec2() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec2(tvec2<T, P> const& v) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec2(tvec2<T, Q> const& v); | ||||||
|  |  | ||||||
|  | 		// -- Explicit basic constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec2(ctor); | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec2(T scalar); | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec2(T s1, T s2); | ||||||
|  |  | ||||||
|  | 		// -- Conversion constructors -- | ||||||
|  |  | ||||||
|  | 		/// Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec2(A x, B y); | ||||||
|  | 		template <typename A, typename B> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec2(tvec1<A, P> const & v1, tvec1<B, P> const & v2); | ||||||
|  |  | ||||||
|  | 		// -- Conversion vector constructors -- | ||||||
|  |  | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec2(tvec3<U, Q> const & v); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec2(tvec4<U, Q> const & v); | ||||||
|  |  | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec2(tvec2<U, Q> const & v); | ||||||
|  |  | ||||||
|  | 		// -- Swizzle constructors -- | ||||||
|  | #		if GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED) | ||||||
|  | 			template <int E0, int E1> | ||||||
|  | 			GLM_FUNC_DECL tvec2(detail::_swizzle<2, T, P, glm::tvec2, E0, E1,-1,-2> const& that) | ||||||
|  | 			{ | ||||||
|  | 				*this = that(); | ||||||
|  | 			} | ||||||
|  | #		endif// GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED) | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator=(tvec2<T, P> const & v) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator=(tvec2<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator+=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator+=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator+=(tvec2<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator-=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator-=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator-=(tvec2<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator*=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator*=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator*=(tvec2<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator/=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator/=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P>& operator/=(tvec2<U, P> const & v); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator++(); | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator--(); | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> operator--(int); | ||||||
|  |  | ||||||
|  | 		// -- Unary bit operators -- | ||||||
|  |  | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator%=(U scalar); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator%=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator%=(tvec2<U, P> const & v); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator&=(U scalar); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator&=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator&=(tvec2<U, P> const & v); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator|=(U scalar); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator|=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator|=(tvec2<U, P> const & v); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator^=(U scalar); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator^=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator^=(tvec2<U, P> const & v); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator<<=(U scalar); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator<<=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator<<=(tvec2<U, P> const & v); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator>>=(U scalar); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator>>=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U>  | ||||||
|  | 		GLM_FUNC_DECL tvec2<T, P> & operator>>=(tvec2<U, P> const & v); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator+(T scalar, tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator+(tvec1<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator-(T scalar, tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator-(tvec1<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator*(T scalar, tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator*(tvec1<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator/(T scalar, tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator/(tvec1<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator%(T scalar, tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator%(tvec1<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator&(T scalar, tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator&(tvec1<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator|(T scalar, tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator|(tvec1<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator^(T scalar, tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator^(tvec1<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator<<(T scalar, tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator<<(tvec1<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator>>(T scalar, tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator>>(tvec1<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<T, P> operator~(tvec2<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tvec2<T, P> const & v1, tvec2<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<bool, P> operator&&(tvec2<bool, P> const & v1, tvec2<bool, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec2<bool, P> operator||(tvec2<bool, P> const & v1, tvec2<bool, P> const & v2); | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_vec2.inl" | ||||||
|  | #endif//GLM_EXTERNAL_TEMPLATE | ||||||
							
								
								
									
										894
									
								
								lib/glm/detail/type_vec2.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										894
									
								
								lib/glm/detail/type_vec2.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,894 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/core/type_tvec2.inl | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | #	ifdef GLM_STATIC_CONST_MEMBERS | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	const tvec2<T, P> tvec2<T, P>::ZERO(static_cast<T>(0), static_cast<T>(0)); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	const tvec2<T, P> tvec2<T, P>::X(static_cast<T>(1), static_cast<T>(0)); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	const tvec2<T, P> tvec2<T, P>::Y(static_cast<T>(0), static_cast<T>(1)); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	const tvec2<T, P> tvec2<T, P>::XY(static_cast<T>(1), static_cast<T>(1)); | ||||||
|  | #	endif | ||||||
|  | 	// -- Implicit basic constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2() | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT | ||||||
|  | 				: x(0), y(0) | ||||||
|  | #			endif | ||||||
|  | 		{} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec2<T, P> const & v) | ||||||
|  | 			: x(v.x), y(v.y) | ||||||
|  | 		{} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec2<T, Q> const & v) | ||||||
|  | 		: x(v.x), y(v.y) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	// -- Explicit basic constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(T scalar) | ||||||
|  | 		: x(scalar), y(scalar) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(T s1, T s2) | ||||||
|  | 		: x(s1), y(s2) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	// -- Conversion scalar constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(A a, B b) | ||||||
|  | 		: x(static_cast<T>(a)) | ||||||
|  | 		, y(static_cast<T>(b)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec1<A, P> const & a, tvec1<B, P> const & b) | ||||||
|  | 		: x(static_cast<T>(a.x)) | ||||||
|  | 		, y(static_cast<T>(b.x)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	// -- Conversion vector constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec2<U, Q> const & v) | ||||||
|  | 		: x(static_cast<T>(v.x)) | ||||||
|  | 		, y(static_cast<T>(v.y)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec3<U, Q> const & v) | ||||||
|  | 		: x(static_cast<T>(v.x)) | ||||||
|  | 		, y(static_cast<T>(v.y)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec4<U, Q> const & v) | ||||||
|  | 		: x(static_cast<T>(v.x)) | ||||||
|  | 		, y(static_cast<T>(v.y)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	// -- Component accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER T & tvec2<T, P>::operator[](typename tvec2<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i >= 0 && i < this->length()); | ||||||
|  | 		return (&x)[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER T const & tvec2<T, P>::operator[](typename tvec2<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i >= 0 && i < this->length()); | ||||||
|  | 		return (&x)[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator=(tvec2<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			this->x = v.x; | ||||||
|  | 			this->y = v.y; | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator=(tvec2<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x = static_cast<T>(v.x); | ||||||
|  | 		this->y = static_cast<T>(v.y); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator+=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x += static_cast<T>(scalar); | ||||||
|  | 		this->y += static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator+=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x += static_cast<T>(v.x); | ||||||
|  | 		this->y += static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator+=(tvec2<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x += static_cast<T>(v.x); | ||||||
|  | 		this->y += static_cast<T>(v.y); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator-=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x -= static_cast<T>(scalar); | ||||||
|  | 		this->y -= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator-=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x -= static_cast<T>(v.x); | ||||||
|  | 		this->y -= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator-=(tvec2<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x -= static_cast<T>(v.x); | ||||||
|  | 		this->y -= static_cast<T>(v.y); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator*=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x *= static_cast<T>(scalar); | ||||||
|  | 		this->y *= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator*=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x *= static_cast<T>(v.x); | ||||||
|  | 		this->y *= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator*=(tvec2<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x *= static_cast<T>(v.x); | ||||||
|  | 		this->y *= static_cast<T>(v.y); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator/=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x /= static_cast<T>(scalar); | ||||||
|  | 		this->y /= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator/=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x /= static_cast<T>(v.x); | ||||||
|  | 		this->y /= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator/=(tvec2<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x /= static_cast<T>(v.x); | ||||||
|  | 		this->y /= static_cast<T>(v.y); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->x; | ||||||
|  | 		++this->y; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->x; | ||||||
|  | 		--this->y; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> tvec2<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tvec2<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> tvec2<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tvec2<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary bit operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator%=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x %= static_cast<T>(scalar); | ||||||
|  | 		this->y %= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator%=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x %= static_cast<T>(v.x); | ||||||
|  | 		this->y %= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator%=(tvec2<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x %= static_cast<T>(v.x); | ||||||
|  | 		this->y %= static_cast<T>(v.y); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator&=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x &= static_cast<T>(scalar); | ||||||
|  | 		this->y &= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator&=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x &= static_cast<T>(v.x); | ||||||
|  | 		this->y &= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator&=(tvec2<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x &= static_cast<T>(v.x); | ||||||
|  | 		this->y &= static_cast<T>(v.y); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator|=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x |= static_cast<T>(scalar); | ||||||
|  | 		this->y |= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator|=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x |= static_cast<T>(v.x); | ||||||
|  | 		this->y |= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator|=(tvec2<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x |= static_cast<T>(v.x); | ||||||
|  | 		this->y |= static_cast<T>(v.y); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator^=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x ^= static_cast<T>(scalar); | ||||||
|  | 		this->y ^= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator^=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x ^= static_cast<T>(v.x); | ||||||
|  | 		this->y ^= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator^=(tvec2<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x ^= static_cast<T>(v.x); | ||||||
|  | 		this->y ^= static_cast<T>(v.y); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator<<=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x <<= static_cast<T>(scalar); | ||||||
|  | 		this->y <<= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator<<=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x <<= static_cast<T>(v.x); | ||||||
|  | 		this->y <<= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator<<=(tvec2<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x <<= static_cast<T>(v.x); | ||||||
|  | 		this->y <<= static_cast<T>(v.y); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator>>=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		this->x >>= static_cast<T>(scalar); | ||||||
|  | 		this->y >>= static_cast<T>(scalar); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator>>=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x >>= static_cast<T>(v.x); | ||||||
|  | 		this->y >>= static_cast<T>(v.x); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator>>=(tvec2<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x >>= static_cast<T>(v.x); | ||||||
|  | 		this->y >>= static_cast<T>(v.y); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			-v.x,  | ||||||
|  | 			-v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec2<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v.x + scalar, | ||||||
|  | 			v.y + scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec2<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x + v2.x, | ||||||
|  | 			v1.y + v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator+(T scalar, tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			scalar + v.x, | ||||||
|  | 			scalar + v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec1<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x + v2.x, | ||||||
|  | 			v1.x + v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x + v2.x, | ||||||
|  | 			v1.y + v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec2<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v.x - scalar, | ||||||
|  | 			v.y - scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec2<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x - v2.x, | ||||||
|  | 			v1.y - v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator-(T scalar, tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			scalar - v.x, | ||||||
|  | 			scalar - v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec1<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x - v2.x, | ||||||
|  | 			v1.x - v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x - v2.x, | ||||||
|  | 			v1.y - v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator*(tvec2<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v.x * scalar, | ||||||
|  | 			v.y * scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator*(tvec2<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x * v2.x, | ||||||
|  | 			v1.y * v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator*(T scalar, tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			scalar * v.x, | ||||||
|  | 			scalar * v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator*(tvec1<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x * v2.x, | ||||||
|  | 			v1.x * v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator*(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x * v2.x, | ||||||
|  | 			v1.y * v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator/(tvec2<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v.x / scalar, | ||||||
|  | 			v.y / scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator/(tvec2<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x / v2.x, | ||||||
|  | 			v1.y / v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator/(T scalar, tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			scalar / v.x, | ||||||
|  | 			scalar / v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator/(tvec1<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x / v2.x, | ||||||
|  | 			v1.x / v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator/(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x / v2.x, | ||||||
|  | 			v1.y / v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary bit operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator%(tvec2<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v.x % scalar, | ||||||
|  | 			v.y % scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator%(tvec2<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x % v2.x, | ||||||
|  | 			v1.y % v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator%(T scalar, tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			scalar % v.x, | ||||||
|  | 			scalar % v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator%(tvec1<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x % v2.x, | ||||||
|  | 			v1.x % v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator%(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x % v2.x, | ||||||
|  | 			v1.y % v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator&(tvec2<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v.x & scalar, | ||||||
|  | 			v.y & scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator&(tvec2<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x & v2.x, | ||||||
|  | 			v1.y & v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator&(T scalar, tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			scalar & v.x, | ||||||
|  | 			scalar & v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator&(tvec1<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x & v2.x, | ||||||
|  | 			v1.x & v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator&(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x & v2.x, | ||||||
|  | 			v1.y & v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator|(tvec2<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v.x | scalar, | ||||||
|  | 			v.y | scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator|(tvec2<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x | v2.x, | ||||||
|  | 			v1.y | v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator|(T scalar, tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			scalar | v.x, | ||||||
|  | 			scalar | v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator|(tvec1<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x | v2.x, | ||||||
|  | 			v1.x | v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator|(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x | v2.x, | ||||||
|  | 			v1.y | v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator^(tvec2<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v.x ^ scalar, | ||||||
|  | 			v.y ^ scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator^(tvec2<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x ^ v2.x, | ||||||
|  | 			v1.y ^ v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator^(T scalar, tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			scalar ^ v.x, | ||||||
|  | 			scalar ^ v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator^(tvec1<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x ^ v2.x, | ||||||
|  | 			v1.x ^ v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator^(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x ^ v2.x, | ||||||
|  | 			v1.y ^ v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator<<(tvec2<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v.x << scalar, | ||||||
|  | 			v.y << scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator<<(tvec2<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x << v2.x, | ||||||
|  | 			v1.y << v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator<<(T scalar, tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			scalar << v.x, | ||||||
|  | 			scalar << v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator<<(tvec1<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x << v2.x, | ||||||
|  | 			v1.x << v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator<<(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x << v2.x, | ||||||
|  | 			v1.y << v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator>>(tvec2<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v.x >> scalar, | ||||||
|  | 			v.y >> scalar); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator>>(tvec2<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x >> v2.x, | ||||||
|  | 			v1.y >> v2.x); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator>>(T scalar, tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			scalar >> v.x, | ||||||
|  | 			scalar >> v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator>>(tvec1<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x >> v2.x, | ||||||
|  | 			v1.x >> v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator>>(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			v1.x >> v2.x, | ||||||
|  | 			v1.y >> v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<T, P> operator~(tvec2<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<T, P>( | ||||||
|  | 			~v.x, | ||||||
|  | 			~v.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return (v1.x == v2.x) && (v1.y == v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tvec2<T, P> const & v1, tvec2<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return (v1.x != v2.x) || (v1.y != v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<bool, P> operator&&(tvec2<bool, P> const & v1, tvec2<bool, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<bool, P>(v1.x && v2.x, v1.y && v2.y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec2<bool, P> operator||(tvec2<bool, P> const & v1, tvec2<bool, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec2<bool, P>(v1.x || v2.x, v1.y || v2.y); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										409
									
								
								lib/glm/detail/type_vec3.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										409
									
								
								lib/glm/detail/type_vec3.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,409 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_vec3.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "type_vec.hpp" | ||||||
|  | #if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | #	if GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #		include "_swizzle.hpp" | ||||||
|  | #	else | ||||||
|  | #		include "_swizzle_func.hpp" | ||||||
|  | #	endif | ||||||
|  | #endif //GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tvec3 | ||||||
|  | 	{ | ||||||
|  | 		// -- Implementation detail -- | ||||||
|  |  | ||||||
|  | 		typedef T value_type; | ||||||
|  | 		typedef tvec3<T, P> type; | ||||||
|  | 		typedef tvec3<bool, P> bool_type; | ||||||
|  |  | ||||||
|  | 		// -- Data -- | ||||||
|  |  | ||||||
|  | #		if GLM_HAS_ONLY_XYZW | ||||||
|  | 			T x, y, z; | ||||||
|  |  | ||||||
|  | #		elif GLM_HAS_ALIGNED_TYPE | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_GCC | ||||||
|  | #				pragma GCC diagnostic push | ||||||
|  | #				pragma GCC diagnostic ignored "-Wpedantic" | ||||||
|  | #			endif | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_CLANG | ||||||
|  | #				pragma clang diagnostic push | ||||||
|  | #				pragma clang diagnostic ignored "-Wgnu-anonymous-struct" | ||||||
|  | #				pragma clang diagnostic ignored "-Wnested-anon-types" | ||||||
|  | #			endif | ||||||
|  |  | ||||||
|  | 			union | ||||||
|  | 			{ | ||||||
|  | 				struct{ T x, y, z; }; | ||||||
|  | 				struct{ T r, g, b; }; | ||||||
|  | 				struct{ T s, t, p; }; | ||||||
|  |  | ||||||
|  | #				if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | 					_GLM_SWIZZLE3_2_MEMBERS(T, P, glm::tvec2, x, y, z) | ||||||
|  | 					_GLM_SWIZZLE3_2_MEMBERS(T, P, glm::tvec2, r, g, b) | ||||||
|  | 					_GLM_SWIZZLE3_2_MEMBERS(T, P, glm::tvec2, s, t, p) | ||||||
|  | 					_GLM_SWIZZLE3_3_MEMBERS(T, P, glm::tvec3, x, y, z) | ||||||
|  | 					_GLM_SWIZZLE3_3_MEMBERS(T, P, glm::tvec3, r, g, b) | ||||||
|  | 					_GLM_SWIZZLE3_3_MEMBERS(T, P, glm::tvec3, s, t, p) | ||||||
|  | 					_GLM_SWIZZLE3_4_MEMBERS(T, P, glm::tvec4, x, y, z) | ||||||
|  | 					_GLM_SWIZZLE3_4_MEMBERS(T, P, glm::tvec4, r, g, b) | ||||||
|  | 					_GLM_SWIZZLE3_4_MEMBERS(T, P, glm::tvec4, s, t, p) | ||||||
|  | #				endif//GLM_SWIZZLE | ||||||
|  | 			}; | ||||||
|  | 		 | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_CLANG | ||||||
|  | #				pragma clang diagnostic pop | ||||||
|  | #			endif | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_GCC | ||||||
|  | #				pragma GCC diagnostic pop | ||||||
|  | #			endif | ||||||
|  | #		else | ||||||
|  | 			union { T x, r, s; }; | ||||||
|  | 			union { T y, g, t; }; | ||||||
|  | 			union { T z, b, p; }; | ||||||
|  |  | ||||||
|  | #			if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | 				GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, P, tvec3, tvec2, tvec3, tvec4) | ||||||
|  | #			endif//GLM_SWIZZLE | ||||||
|  | #		endif//GLM_LANG | ||||||
|  |  | ||||||
|  | 		// -- Component accesses -- | ||||||
|  |  | ||||||
|  | 		/// Return the count of components of the vector | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 3;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL T & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL T const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Implicit basic constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec3<T, P> const & v) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec3<T, Q> const & v); | ||||||
|  |  | ||||||
|  | 		// -- Explicit basic constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec3(ctor); | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec3(T scalar); | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(T a, T b, T c); | ||||||
|  |  | ||||||
|  | 		// -- Conversion scalar constructors -- | ||||||
|  |  | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, typename C> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(A a, B b, C c); | ||||||
|  | 		template <typename A, typename B, typename C> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec1<A, P> const & a, tvec1<B, P> const & b, tvec1<C, P> const & c); | ||||||
|  |  | ||||||
|  | 		// -- Conversion vector constructors -- | ||||||
|  |  | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec2<A, Q> const & a, B b); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec2<A, Q> const & a, tvec1<B, Q> const & b); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(A a, tvec2<B, Q> const & b); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec1<A, Q> const & a, tvec2<B, Q> const & b); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec3(tvec4<U, Q> const & v); | ||||||
|  |  | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec3(tvec3<U, Q> const & v); | ||||||
|  |  | ||||||
|  | 		// -- Swizzle constructors -- | ||||||
|  | #		if GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED) | ||||||
|  | 			template <int E0, int E1, int E2> | ||||||
|  | 			GLM_FUNC_DECL tvec3(detail::_swizzle<3, T, P, glm::tvec3, E0, E1, E2, -1> const & that) | ||||||
|  | 			{ | ||||||
|  | 				*this = that(); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			template <int E0, int E1> | ||||||
|  | 			GLM_FUNC_DECL tvec3(detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v, T const & scalar) | ||||||
|  | 			{ | ||||||
|  | 				*this = tvec3<T, P>(v(), scalar); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			template <int E0, int E1> | ||||||
|  | 			GLM_FUNC_DECL tvec3(T const & scalar, detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v) | ||||||
|  | 			{ | ||||||
|  | 				*this = tvec3<T, P>(scalar, v()); | ||||||
|  | 			} | ||||||
|  | #		endif// GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED) | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator=(tvec3<T, P> const & v) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator=(tvec3<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator+=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator+=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator+=(tvec3<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator-=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator-=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator-=(tvec3<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator*=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator*=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator*=(tvec3<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator/=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator/=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator/=(tvec3<U, P> const & v); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator++(); | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator--(); | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> operator--(int); | ||||||
|  |  | ||||||
|  | 		// -- Unary bit operators -- | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator%=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator%=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator%=(tvec3<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator&=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator&=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator&=(tvec3<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator|=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator|=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator|=(tvec3<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator^=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator^=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator^=(tvec3<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator<<=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator<<=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator<<=(tvec3<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator>>=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator>>=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec3<T, P> & operator>>=(tvec3<U, P> const & v); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator+(tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator-(tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator+(tvec3<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator+(tvec3<T, P> const & v, tvec1<T, P> const & scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator+(T scalar, tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator+(tvec1<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator+(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator-(tvec3<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator-(tvec3<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator-(T scalar, tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator-(tvec1<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator-(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator*(T scalar, tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator*(tvec1<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator/(tvec3<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator/(tvec3<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator/(T scalar, tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator/(tvec1<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator/(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator%(tvec3<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator%(tvec3<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator%(T const & scalar, tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator%(tvec1<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator%(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator&(tvec3<T, P> const & v1, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator&(tvec3<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator&(T scalar, tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator&(tvec1<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator&(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator|(tvec3<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator|(tvec3<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator|(T scalar, tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator|(tvec1<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator|(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator^(tvec3<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator^(tvec3<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator^(T scalar, tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator^(tvec1<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator^(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator<<(tvec3<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator<<(tvec3<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator<<(T scalar, tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator<<(tvec1<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator<<(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator>>(tvec3<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator>>(tvec3<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator>>(T scalar, tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator>>(tvec1<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator>>(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_DECL tvec3<T, P> operator~(tvec3<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tvec3<T, P> const & v1, tvec3<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<bool, P> operator&&(tvec3<bool, P> const & v1, tvec3<bool, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec3<bool, P> operator||(tvec3<bool, P> const & v1, tvec3<bool, P> const & v2); | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_vec3.inl" | ||||||
|  | #endif//GLM_EXTERNAL_TEMPLATE | ||||||
							
								
								
									
										1022
									
								
								lib/glm/detail/type_vec3.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1022
									
								
								lib/glm/detail/type_vec3.inl
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										454
									
								
								lib/glm/detail/type_vec4.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										454
									
								
								lib/glm/detail/type_vec4.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,454 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_vec4.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "type_vec.hpp" | ||||||
|  | #if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | #	if GLM_HAS_UNRESTRICTED_UNIONS | ||||||
|  | #		include "_swizzle.hpp" | ||||||
|  | #	else | ||||||
|  | #		include "_swizzle_func.hpp" | ||||||
|  | #	endif | ||||||
|  | #endif //GLM_SWIZZLE | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P = defaultp> | ||||||
|  | 	struct tvec4 | ||||||
|  | 	{ | ||||||
|  | 		// -- Implementation detail -- | ||||||
|  |  | ||||||
|  | 		typedef T value_type; | ||||||
|  | 		typedef tvec4<T, P> type; | ||||||
|  | 		typedef tvec4<bool, P> bool_type; | ||||||
|  |  | ||||||
|  | 		// -- Data -- | ||||||
|  |  | ||||||
|  | #		if GLM_HAS_ONLY_XYZW | ||||||
|  | 			T x, y, z, w; | ||||||
|  |  | ||||||
|  | #		elif GLM_HAS_ALIGNED_TYPE | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_GCC | ||||||
|  | #				pragma GCC diagnostic push | ||||||
|  | #				pragma GCC diagnostic ignored "-Wpedantic" | ||||||
|  | #			endif | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_CLANG | ||||||
|  | #				pragma clang diagnostic push | ||||||
|  | #				pragma clang diagnostic ignored "-Wgnu-anonymous-struct" | ||||||
|  | #				pragma clang diagnostic ignored "-Wnested-anon-types" | ||||||
|  | #			endif | ||||||
|  |  | ||||||
|  | 			union | ||||||
|  | 			{ | ||||||
|  | 				struct { T x, y, z, w;}; | ||||||
|  | 				struct { T r, g, b, a; }; | ||||||
|  | 				struct { T s, t, p, q; }; | ||||||
|  |  | ||||||
|  | 				typename detail::storage<T, sizeof(T) * 4, detail::is_aligned<P>::value>::type data; | ||||||
|  |  | ||||||
|  | #				if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | 					_GLM_SWIZZLE4_2_MEMBERS(T, P, glm::tvec2, x, y, z, w) | ||||||
|  | 					_GLM_SWIZZLE4_2_MEMBERS(T, P, glm::tvec2, r, g, b, a) | ||||||
|  | 					_GLM_SWIZZLE4_2_MEMBERS(T, P, glm::tvec2, s, t, p, q) | ||||||
|  | 					_GLM_SWIZZLE4_3_MEMBERS(T, P, glm::tvec3, x, y, z, w) | ||||||
|  | 					_GLM_SWIZZLE4_3_MEMBERS(T, P, glm::tvec3, r, g, b, a) | ||||||
|  | 					_GLM_SWIZZLE4_3_MEMBERS(T, P, glm::tvec3, s, t, p, q) | ||||||
|  | 					_GLM_SWIZZLE4_4_MEMBERS(T, P, glm::tvec4, x, y, z, w) | ||||||
|  | 					_GLM_SWIZZLE4_4_MEMBERS(T, P, glm::tvec4, r, g, b, a) | ||||||
|  | 					_GLM_SWIZZLE4_4_MEMBERS(T, P, glm::tvec4, s, t, p, q) | ||||||
|  | #				endif//GLM_SWIZZLE | ||||||
|  | 			}; | ||||||
|  |  | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_CLANG | ||||||
|  | #				pragma clang diagnostic pop | ||||||
|  | #			endif | ||||||
|  | #			if GLM_COMPILER & GLM_COMPILER_GCC | ||||||
|  | #				pragma GCC diagnostic pop | ||||||
|  | #			endif | ||||||
|  | #		else | ||||||
|  | 			union { T x, r, s; }; | ||||||
|  | 			union { T y, g, t; }; | ||||||
|  | 			union { T z, b, p; }; | ||||||
|  | 			union { T w, a, q; }; | ||||||
|  |  | ||||||
|  | #			if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | 				GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P, tvec4, tvec2, tvec3, tvec4) | ||||||
|  | #			endif//GLM_SWIZZLE | ||||||
|  | #		endif | ||||||
|  |  | ||||||
|  | 		// -- Component accesses -- | ||||||
|  |  | ||||||
|  | 		/// Return the count of components of the vector | ||||||
|  | 		typedef length_t length_type; | ||||||
|  | 		GLM_FUNC_DECL static length_type length(){return 4;} | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL T & operator[](length_type i); | ||||||
|  | 		GLM_FUNC_DECL T const & operator[](length_type i) const; | ||||||
|  |  | ||||||
|  | 		// -- Implicit basic constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_SIMD tvec4() GLM_DEFAULT_CTOR; | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_SIMD tvec4(tvec4<T, P> const& v) GLM_DEFAULT; | ||||||
|  | 		template <precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_SIMD tvec4(tvec4<T, Q> const& v); | ||||||
|  |  | ||||||
|  | 		// -- Explicit basic constructors -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_SIMD explicit tvec4(ctor); | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_SIMD explicit tvec4(T scalar); | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_SIMD tvec4(T a, T b, T c, T d); | ||||||
|  |  | ||||||
|  | 		// -- Conversion scalar constructors -- | ||||||
|  |  | ||||||
|  | 		/// Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, typename C, typename D> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_SIMD tvec4(A a, B b, C c, D d); | ||||||
|  | 		template <typename A, typename B, typename C, typename D> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec1<A, P> const& a, tvec1<B, P> const& b, tvec1<C, P> const& c, tvec1<D, P> const& d); | ||||||
|  |  | ||||||
|  | 		// -- Conversion vector constructors -- | ||||||
|  |  | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, typename C, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec2<A, Q> const & a, B b, C c); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, typename C, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec2<A, Q> const & a, tvec1<B, Q> const & b, tvec1<C, Q> const & c); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, typename C, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(A a, tvec2<B, Q> const & b, C c); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, typename C, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec1<A, Q> const & a, tvec2<B, Q> const & b, tvec1<C, Q> const & c); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, typename C, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(A a, B b, tvec2<C, Q> const & c); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, typename C, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec1<A, Q> const & a, tvec1<B, Q> const & b, tvec2<C, Q> const & c); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec3<A, Q> const & a, B b); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec3<A, Q> const & a, tvec1<B, Q> const & b); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(A a, tvec3<B, Q> const & b); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec1<A, Q> const & a, tvec3<B, Q> const & b); | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename A, typename B, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec2<A, Q> const & a, tvec2<B, Q> const & b); | ||||||
|  |  | ||||||
|  | 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) | ||||||
|  | 		template <typename U, precision Q> | ||||||
|  | 		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec4(tvec4<U, Q> const& v); | ||||||
|  |  | ||||||
|  | 		// -- Swizzle constructors -- | ||||||
|  | #		if GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED) | ||||||
|  | 			template <int E0, int E1, int E2, int E3> | ||||||
|  | 			GLM_FUNC_DECL tvec4(detail::_swizzle<4, T, P, glm::tvec4, E0, E1, E2, E3> const & that) | ||||||
|  | 			{ | ||||||
|  | 				*this = that(); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			template <int E0, int E1, int F0, int F1> | ||||||
|  | 			GLM_FUNC_DECL tvec4(detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v, detail::_swizzle<2, T, P, glm::tvec2, F0, F1, -1, -2> const & u) | ||||||
|  | 			{ | ||||||
|  | 				*this = tvec4<T, P>(v(), u()); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			template <int E0, int E1> | ||||||
|  | 			GLM_FUNC_DECL tvec4(T const & x, T const & y, detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v) | ||||||
|  | 			{ | ||||||
|  | 				*this = tvec4<T, P>(x, y, v()); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			template <int E0, int E1> | ||||||
|  | 			GLM_FUNC_DECL tvec4(T const & x, detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v, T const & w) | ||||||
|  | 			{ | ||||||
|  | 				*this = tvec4<T, P>(x, v(), w); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			template <int E0, int E1> | ||||||
|  | 			GLM_FUNC_DECL tvec4(detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v, T const & z, T const & w) | ||||||
|  | 			{ | ||||||
|  | 				*this = tvec4<T, P>(v(), z, w); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			template <int E0, int E1, int E2> | ||||||
|  | 			GLM_FUNC_DECL tvec4(detail::_swizzle<3, T, P, glm::tvec3, E0, E1, E2, -1> const & v, T const & w) | ||||||
|  | 			{ | ||||||
|  | 				*this = tvec4<T, P>(v(), w); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			template <int E0, int E1, int E2> | ||||||
|  | 			GLM_FUNC_DECL tvec4(T const & x, detail::_swizzle<3, T, P, glm::tvec3, E0, E1, E2, -1> const & v) | ||||||
|  | 			{ | ||||||
|  | 				*this = tvec4<T, P>(x, v()); | ||||||
|  | 			} | ||||||
|  | #		endif// GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED) | ||||||
|  |  | ||||||
|  | 		// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator=(tvec4<T, P> const & v) GLM_DEFAULT; | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator=(tvec4<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator+=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator+=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator+=(tvec4<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator-=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator-=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator-=(tvec4<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator*=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator*=(tvec1<U, P> const& v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator*=(tvec4<U, P> const& v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator/=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator/=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator/=(tvec4<U, P> const & v); | ||||||
|  |  | ||||||
|  | 		// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator++(); | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator--(); | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> operator++(int); | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> operator--(int); | ||||||
|  |  | ||||||
|  | 		// -- Unary bit operators -- | ||||||
|  |  | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator%=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator%=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator%=(tvec4<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator&=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator&=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator&=(tvec4<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator|=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator|=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator|=(tvec4<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator^=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator^=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator^=(tvec4<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator<<=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator<<=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator<<=(tvec4<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator>>=(U scalar); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator>>=(tvec1<U, P> const & v); | ||||||
|  | 		template <typename U> | ||||||
|  | 		GLM_FUNC_DECL tvec4<T, P> & operator>>=(tvec4<U, P> const & v); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	// -- Unary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	// -- Binary operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator+(T scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator+(tvec1<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator-(T scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator-(tvec1<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator*(T scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator*(tvec1<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const & v1, tvec1<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator/(T scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator/(tvec1<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const & v, tvec1<T, P> const & scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator%(T scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator%(tvec1<T, P> const & scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const & v, tvec1<T, P> const & scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator&(T scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator&(tvec1<T, P> const & scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const & v, tvec1<T, P> const & scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator|(T scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator|(tvec1<T, P> const & scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const & v, tvec1<T, P> const & scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator^(T scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator^(tvec1<T, P> const & scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const & v, tvec1<T, P> const & scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator<<(T scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator<<(tvec1<T, P> const & scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const & v, T scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const & v, tvec1<T, P> const & scalar); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator>>(T scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator>>(tvec1<T, P> const & scalar, tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_DECL tvec4<T, P> operator~(tvec4<T, P> const & v); | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator==(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL bool operator!=(tvec4<T, P> const & v1, tvec4<T, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<bool, P> operator&&(tvec4<bool, P> const & v1, tvec4<bool, P> const & v2); | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_DECL tvec4<bool, P> operator||(tvec4<bool, P> const & v1, tvec4<bool, P> const & v2); | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #ifndef GLM_EXTERNAL_TEMPLATE | ||||||
|  | #include "type_vec4.inl" | ||||||
|  | #endif//GLM_EXTERNAL_TEMPLATE | ||||||
							
								
								
									
										969
									
								
								lib/glm/detail/type_vec4.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										969
									
								
								lib/glm/detail/type_vec4.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,969 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_tvec4.inl | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <typename T> | ||||||
|  | 	struct is_int | ||||||
|  | 	{ | ||||||
|  | 		enum test {value = 0}; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	struct is_int<uint32> | ||||||
|  | 	{ | ||||||
|  | 		enum test {value = ~0}; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	struct is_int<int32> | ||||||
|  | 	{ | ||||||
|  | 		enum test {value = ~0}; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	struct is_int<uint64> | ||||||
|  | 	{ | ||||||
|  | 		enum test {value = ~0}; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	struct is_int<int64> | ||||||
|  | 	{ | ||||||
|  | 		enum test {value = ~0}; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_vec4_add | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_vec4_sub | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_vec4_mul | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_vec4_div | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, bool Aligned> | ||||||
|  | 	struct compute_vec4_mod | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(a.x % b.x, a.y % b.y, a.z % b.z, a.w % b.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> | ||||||
|  | 	struct compute_vec4_and | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(a.x & b.x, a.y & b.y, a.z & b.z, a.w & b.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> | ||||||
|  | 	struct compute_vec4_or | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(a.x | b.x, a.y | b.y, a.z | b.z, a.w | b.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> | ||||||
|  | 	struct compute_vec4_xor | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(a.x ^ b.x, a.y ^ b.y, a.z ^ b.z, a.w ^ b.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> | ||||||
|  | 	struct compute_vec4_shift_left | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(a.x << b.x, a.y << b.y, a.z << b.z, a.w << b.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> | ||||||
|  | 	struct compute_vec4_shift_right | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(a.x >> b.x, a.y >> b.y, a.z >> b.z, a.w >> b.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> | ||||||
|  | 	struct compute_vec4_equal | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static bool call(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			return (v1.x == v2.x) && (v1.y == v2.y) && (v1.z == v2.z) && (v1.w == v2.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> | ||||||
|  | 	struct compute_vec4_nequal | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static bool call(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			return (v1.x != v2.x) || (v1.y != v2.y) || (v1.z != v2.z) || (v1.w != v2.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> | ||||||
|  | 	struct compute_vec4_bitwise_not | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(~v.x, ~v.y, ~v.z, ~v.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | 	// -- Implicit basic constructors -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4() | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT | ||||||
|  | 				: x(0), y(0), z(0), w(0) | ||||||
|  | #			endif | ||||||
|  | 		{} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(tvec4<T, P> const & v) | ||||||
|  | 			: x(v.x), y(v.y), z(v.z), w(v.w) | ||||||
|  | 		{} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(tvec4<T, Q> const & v) | ||||||
|  | 		: x(v.x), y(v.y), z(v.z), w(v.w) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	// -- Explicit basic constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(ctor) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(T scalar) | ||||||
|  | 		: x(scalar), y(scalar), z(scalar), w(scalar) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(T a, T b, T c, T d) | ||||||
|  | 		: x(a), y(b), z(c), w(d) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	// -- Conversion scalar constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, typename C, typename D> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(A a, B b, C c, D d) : | ||||||
|  | 		x(static_cast<T>(a)), | ||||||
|  | 		y(static_cast<T>(b)), | ||||||
|  | 		z(static_cast<T>(c)), | ||||||
|  | 		w(static_cast<T>(d)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, typename C, typename D> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec1<A, P> const & a, tvec1<B, P> const & b, tvec1<C, P> const & c, tvec1<D, P> const & d) : | ||||||
|  | 		x(static_cast<T>(a.x)), | ||||||
|  | 		y(static_cast<T>(b.x)), | ||||||
|  | 		z(static_cast<T>(c.x)), | ||||||
|  | 		w(static_cast<T>(d.x)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	// -- Conversion vector constructors -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, typename C, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec2<A, Q> const & a, B b, C c) : | ||||||
|  | 		x(static_cast<T>(a.x)), | ||||||
|  | 		y(static_cast<T>(a.y)), | ||||||
|  | 		z(static_cast<T>(b)), | ||||||
|  | 		w(static_cast<T>(c)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, typename C, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec2<A, Q> const & a, tvec1<B, Q> const & b, tvec1<C, Q> const & c) : | ||||||
|  | 		x(static_cast<T>(a.x)), | ||||||
|  | 		y(static_cast<T>(a.y)), | ||||||
|  | 		z(static_cast<T>(b.x)), | ||||||
|  | 		w(static_cast<T>(c.x)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, typename C, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(A s1, tvec2<B, Q> const & v, C s2) : | ||||||
|  | 		x(static_cast<T>(s1)), | ||||||
|  | 		y(static_cast<T>(v.x)), | ||||||
|  | 		z(static_cast<T>(v.y)), | ||||||
|  | 		w(static_cast<T>(s2)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, typename C, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec1<A, Q> const & a, tvec2<B, Q> const & b, tvec1<C, Q> const & c) : | ||||||
|  | 		x(static_cast<T>(a.x)), | ||||||
|  | 		y(static_cast<T>(b.x)), | ||||||
|  | 		z(static_cast<T>(b.y)), | ||||||
|  | 		w(static_cast<T>(c.x)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, typename C, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(A s1, B s2, tvec2<C, Q> const & v) : | ||||||
|  | 		x(static_cast<T>(s1)), | ||||||
|  | 		y(static_cast<T>(s2)), | ||||||
|  | 		z(static_cast<T>(v.x)), | ||||||
|  | 		w(static_cast<T>(v.y)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, typename C, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec1<A, Q> const & a, tvec1<B, Q> const & b, tvec2<C, Q> const & c) : | ||||||
|  | 		x(static_cast<T>(a.x)), | ||||||
|  | 		y(static_cast<T>(b.x)), | ||||||
|  | 		z(static_cast<T>(c.x)), | ||||||
|  | 		w(static_cast<T>(c.y)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec3<A, Q> const & a, B b) : | ||||||
|  | 		x(static_cast<T>(a.x)), | ||||||
|  | 		y(static_cast<T>(a.y)), | ||||||
|  | 		z(static_cast<T>(a.z)), | ||||||
|  | 		w(static_cast<T>(b)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec3<A, Q> const & a, tvec1<B, Q> const & b) : | ||||||
|  | 		x(static_cast<T>(a.x)), | ||||||
|  | 		y(static_cast<T>(a.y)), | ||||||
|  | 		z(static_cast<T>(a.z)), | ||||||
|  | 		w(static_cast<T>(b.x)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(A a, tvec3<B, Q> const & b) : | ||||||
|  | 		x(static_cast<T>(a)), | ||||||
|  | 		y(static_cast<T>(b.x)), | ||||||
|  | 		z(static_cast<T>(b.y)), | ||||||
|  | 		w(static_cast<T>(b.z)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec1<A, Q> const & a, tvec3<B, Q> const & b) : | ||||||
|  | 		x(static_cast<T>(a.x)), | ||||||
|  | 		y(static_cast<T>(b.x)), | ||||||
|  | 		z(static_cast<T>(b.y)), | ||||||
|  | 		w(static_cast<T>(b.z)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename A, typename B, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec2<A, Q> const & a, tvec2<B, Q> const & b) : | ||||||
|  | 		x(static_cast<T>(a.x)), | ||||||
|  | 		y(static_cast<T>(a.y)), | ||||||
|  | 		z(static_cast<T>(b.x)), | ||||||
|  | 		w(static_cast<T>(b.y)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U, precision Q> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec4<U, Q> const & v) : | ||||||
|  | 		x(static_cast<T>(v.x)), | ||||||
|  | 		y(static_cast<T>(v.y)), | ||||||
|  | 		z(static_cast<T>(v.z)), | ||||||
|  | 		w(static_cast<T>(v.w)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	// -- Component accesses -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER T & tvec4<T, P>::operator[](typename tvec4<T, P>::length_type i) | ||||||
|  | 	{ | ||||||
|  | 		assert(i >= 0 && i < this->length()); | ||||||
|  | 		return (&x)[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER T const & tvec4<T, P>::operator[](typename tvec4<T, P>::length_type i) const | ||||||
|  | 	{ | ||||||
|  | 		assert(i >= 0 && i < this->length()); | ||||||
|  | 		return (&x)[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary arithmetic operators -- | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <typename T, precision P> | ||||||
|  | 		GLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator=(tvec4<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			this->x = v.x; | ||||||
|  | 			this->y = v.y; | ||||||
|  | 			this->z = v.z; | ||||||
|  | 			this->w = v.w; | ||||||
|  | 			return *this; | ||||||
|  | 		} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator=(tvec4<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		this->x = static_cast<T>(v.x); | ||||||
|  | 		this->y = static_cast<T>(v.y); | ||||||
|  | 		this->z = static_cast<T>(v.z); | ||||||
|  | 		this->w = static_cast<T>(v.w); | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator+=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_add<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator+=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_add<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v.x))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator+=(tvec4<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_add<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator-=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_sub<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator-=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_sub<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v.x))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator-=(tvec4<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_sub<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator*=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_mul<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator*=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_mul<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v.x))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator*=(tvec4<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_mul<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator/=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_div<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator/=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_div<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v.x))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator/=(tvec4<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_div<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Increment and decrement operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator++() | ||||||
|  | 	{ | ||||||
|  | 		++this->x; | ||||||
|  | 		++this->y; | ||||||
|  | 		++this->z; | ||||||
|  | 		++this->w; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator--() | ||||||
|  | 	{ | ||||||
|  | 		--this->x; | ||||||
|  | 		--this->y; | ||||||
|  | 		--this->z; | ||||||
|  | 		--this->w; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> tvec4<T, P>::operator++(int) | ||||||
|  | 	{ | ||||||
|  | 		tvec4<T, P> Result(*this); | ||||||
|  | 		++*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> tvec4<T, P>::operator--(int) | ||||||
|  | 	{ | ||||||
|  | 		tvec4<T, P> Result(*this); | ||||||
|  | 		--*this; | ||||||
|  | 		return Result; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary bit operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator%=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_mod<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator%=(tvec1<U, P> const& v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_mod<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator%=(tvec4<U, P> const& v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_mod<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator&=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_and<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator&=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_and<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator&=(tvec4<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_and<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator|=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_or<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator|=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_or<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator|=(tvec4<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_or<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator^=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_xor<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator^=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_xor<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator^=(tvec4<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_xor<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator<<=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_shift_left<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator<<=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_shift_left<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator<<=(tvec4<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_shift_left<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator>>=(U scalar) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_shift_right<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator>>=(tvec1<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_shift_right<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	template <typename U>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator>>=(tvec4<U, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return (*this = detail::compute_vec4_shift_right<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Unary constant operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(0) -= v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary arithmetic operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec4<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) += scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec4<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) += v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator+(T scalar, tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) += scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec1<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v2) += v1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) += v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec4<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) -= scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec4<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) -= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator-(T scalar, tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(scalar) -= v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec1<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1.x) -= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) -= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec4<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) *= scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec4<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) *= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator*(T scalar, tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) *= scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec1<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v2) *= v1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) *= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator/(tvec4<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) /= scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator/(tvec4<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) /= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator/(T scalar, tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(scalar) /= v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator/(tvec1<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1.x) /= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator/(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) /= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Binary bit operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator%(tvec4<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) %= scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator%(tvec4<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) %= v2.x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator%(T scalar, tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(scalar) %= v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator%(tvec1<T, P> const & scalar, tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(scalar.x) %= v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator%(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) %= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator&(tvec4<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) &= scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator&(tvec4<T, P> const & v, tvec1<T, P> const & scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) &= scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator&(T scalar, tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(scalar) &= v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator&(tvec1<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1.x) &= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator&(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) &= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator|(tvec4<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) |= scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator|(tvec4<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) |= v2.x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator|(T scalar, tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(scalar) |= v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator|(tvec1<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1.x) |= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator|(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) |= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator^(tvec4<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) ^= scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator^(tvec4<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) ^= v2.x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator^(T scalar, tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(scalar) ^= v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator^(tvec1<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1.x) ^= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator^(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) ^= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator<<(tvec4<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) <<= scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator<<(tvec4<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) <<= v2.x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator<<(T scalar, tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(scalar) <<= v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator<<(tvec1<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1.x) <<= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator<<(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) <<= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator>>(tvec4<T, P> const & v, T scalar) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v) >>= scalar; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator>>(tvec4<T, P> const & v1, tvec1<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) >>= v2.x; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator>>(T scalar, tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(scalar) >>= v; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator>>(tvec1<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1.x) >>= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator>>(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<T, P>(v1) >>= v2; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P>  | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<T, P> operator~(tvec4<T, P> const & v) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_vec4_bitwise_not<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// -- Boolean operators -- | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator==(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_vec4_equal<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(v1, v2); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER bool operator!=(tvec4<T, P> const & v1, tvec4<T, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_vec4_nequal<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(v1, v2); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<bool, P> operator&&(tvec4<bool, P> const & v1, tvec4<bool, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<bool, P>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z, v1.w && v2.w); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<bool, P> operator||(tvec4<bool, P> const & v1, tvec4<bool, P> const & v2) | ||||||
|  | 	{ | ||||||
|  | 		return tvec4<bool, P>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z, v1.w || v2.w); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_ALIGNED_TYPE | ||||||
|  | #	include "type_vec4_simd.inl" | ||||||
|  | #endif | ||||||
							
								
								
									
										481
									
								
								lib/glm/detail/type_vec4_simd.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										481
									
								
								lib/glm/detail/type_vec4_simd.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,481 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/detail/type_tvec4_simd.inl | ||||||
|  |  | ||||||
|  | #if GLM_ARCH & GLM_ARCH_SSE2_BIT | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | #	if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  | 	template <precision P, int E0, int E1, int E2, int E3> | ||||||
|  | 	struct _swizzle_base1<4, float, P, glm::tvec4, E0,E1,E2,E3, true> : public _swizzle_base0<float, 4> | ||||||
|  | 	{  | ||||||
|  | 		GLM_FUNC_QUALIFIER tvec4<float, P> operator ()()  const | ||||||
|  | 		{ | ||||||
|  | 			__m128 data = *reinterpret_cast<__m128 const*>(&this->_buffer); | ||||||
|  |  | ||||||
|  | 			tvec4<float, P> Result(uninitialize); | ||||||
|  | #			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 <precision P, int E0, int E1, int E2, int E3> | ||||||
|  | 	struct _swizzle_base1<4, int32, P, glm::tvec4, E0,E1,E2,E3, true> : public _swizzle_base0<int32, 4> | ||||||
|  | 	{  | ||||||
|  | 		GLM_FUNC_QUALIFIER tvec4<int32, P> operator ()()  const | ||||||
|  | 		{ | ||||||
|  | 			__m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer); | ||||||
|  |  | ||||||
|  | 			tvec4<int32, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0)); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P, int E0, int E1, int E2, int E3> | ||||||
|  | 	struct _swizzle_base1<4, uint32, P, glm::tvec4, E0,E1,E2,E3, true> : public _swizzle_base0<uint32, 4> | ||||||
|  | 	{  | ||||||
|  | 		GLM_FUNC_QUALIFIER tvec4<uint32, P> operator ()()  const | ||||||
|  | 		{ | ||||||
|  | 			__m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer); | ||||||
|  |  | ||||||
|  | 			tvec4<uint32, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0)); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif// GLM_SWIZZLE == GLM_SWIZZLE_ENABLED | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_add<float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<float, P> call(tvec4<float, P> const & a, tvec4<float, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_add_ps(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_AVX_BIT | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_add<double, P, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<double, P> call(tvec4<double, P> const & a, tvec4<double, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<double, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm256_add_pd(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_sub<float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<float, P> call(tvec4<float, P> const & a, tvec4<float, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_sub_ps(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_AVX_BIT | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_sub<double, P, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<double, P> call(tvec4<double, P> const & a, tvec4<double, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<double, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm256_sub_pd(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_mul<float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<float, P> call(tvec4<float, P> const & a, tvec4<float, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_mul_ps(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_AVX_BIT | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_mul<double, P, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<double, P> call(tvec4<double, P> const & a, tvec4<double, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<double, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm256_mul_pd(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_div<float, P, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<float, P> call(tvec4<float, P> const & a, tvec4<float, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_div_ps(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	#	if GLM_ARCH & GLM_ARCH_AVX_BIT | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_div<double, P, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<double, P> call(tvec4<double, P> const & a, tvec4<double, P> const & b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<double, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm256_div_pd(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	struct compute_vec4_div<float, aligned_lowp, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<float, aligned_lowp> call(tvec4<float, aligned_lowp> const & a, tvec4<float, aligned_lowp> const & b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<float, aligned_lowp> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_mul_ps(a.data, _mm_rcp_ps(b.data)); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_and<T, P, true, 32, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_and_si128(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_AVX2_BIT | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_and<T, P, true, 64, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm256_and_si256(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_or<T, P, true, 32, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_or_si128(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_AVX2_BIT | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_or<T, P, true, 64, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm256_or_si256(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_xor<T, P, true, 32, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_xor_si128(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_AVX2_BIT | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_xor<T, P, true, 64, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm256_xor_si256(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_shift_left<T, P, true, 32, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_sll_epi32(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_AVX2_BIT | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_shift_left<T, P, true, 64, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm256_sll_epi64(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_shift_right<T, P, true, 32, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_srl_epi32(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_AVX2_BIT | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_shift_right<T, P, true, 64, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm256_srl_epi64(a.data, b.data); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_bitwise_not<T, P, true, 32, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm_xor_si128(v.data, _mm_set1_epi32(-1)); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_AVX2_BIT | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_vec4_bitwise_not<T, P, true, 64, true> | ||||||
|  | 	{ | ||||||
|  | 		static tvec4<T, P> call(tvec4<T, P> const & v) | ||||||
|  | 		{ | ||||||
|  | 			tvec4<T, P> Result(uninitialize); | ||||||
|  | 			Result.data = _mm256_xor_si256(v.data, _mm_set1_epi32(-1)); | ||||||
|  | 			return Result; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_equal<float, P, false, 32, true> | ||||||
|  | 	{ | ||||||
|  | 		static bool call(tvec4<float, P> const & v1, tvec4<float, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			return _mm_movemask_ps(_mm_cmpeq_ps(v1.data, v2.data)) != 0; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_equal<int32, P, true, 32, true> | ||||||
|  | 	{ | ||||||
|  | 		static bool call(tvec4<int32, P> const & v1, tvec4<int32, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			return _mm_movemask_epi8(_mm_cmpeq_epi32(v1.data, v2.data)) != 0; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_nequal<float, P, false, 32, true> | ||||||
|  | 	{ | ||||||
|  | 		static bool call(tvec4<float, P> const & v1, tvec4<float, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			return _mm_movemask_ps(_mm_cmpneq_ps(v1.data, v2.data)) != 0; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <precision P> | ||||||
|  | 	struct compute_vec4_nequal<int32, P, true, 32, true> | ||||||
|  | 	{ | ||||||
|  | 		static bool call(tvec4<int32, P> const & v1, tvec4<int32, P> const & v2) | ||||||
|  | 		{ | ||||||
|  | 			return _mm_movemask_epi8(_mm_cmpneq_epi32(v1.data, v2.data)) != 0; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | #	if !GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  | 		template <> | ||||||
|  | 		GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_lowp>::tvec4() | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT | ||||||
|  | 				: data(_mm_setzero_ps()) | ||||||
|  | #			endif | ||||||
|  | 		{} | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_mediump>::tvec4() | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT | ||||||
|  | 			: data(_mm_setzero_ps()) | ||||||
|  | #			endif | ||||||
|  | 		{} | ||||||
|  |  | ||||||
|  | 		template <> | ||||||
|  | 		GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_highp>::tvec4() | ||||||
|  | #			ifndef GLM_FORCE_NO_CTOR_INIT | ||||||
|  | 			: data(_mm_setzero_ps()) | ||||||
|  | #			endif | ||||||
|  | 		{} | ||||||
|  | #	endif//!GLM_HAS_DEFAULTED_FUNCTIONS | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_lowp>::tvec4(float s) : | ||||||
|  | 		data(_mm_set1_ps(s)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_mediump>::tvec4(float s) : | ||||||
|  | 		data(_mm_set1_ps(s)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_highp>::tvec4(float s) : | ||||||
|  | 		data(_mm_set1_ps(s)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_AVX_BIT | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<double, aligned_lowp>::tvec4(double s) : | ||||||
|  | 		data(_mm256_set1_pd(s)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<double, aligned_mediump>::tvec4(double s) : | ||||||
|  | 		data(_mm256_set1_pd(s)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<double, aligned_highp>::tvec4(double s) : | ||||||
|  | 		data(_mm256_set1_pd(s)) | ||||||
|  | 	{} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_lowp>::tvec4(int32 s) : | ||||||
|  | 		data(_mm_set1_epi32(s)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_mediump>::tvec4(int32 s) : | ||||||
|  | 		data(_mm_set1_epi32(s)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_highp>::tvec4(int32 s) : | ||||||
|  | 		data(_mm_set1_epi32(s)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | #	if GLM_ARCH & GLM_ARCH_AVX2_BIT | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int64, aligned_lowp>::tvec4(int64 s) : | ||||||
|  | 		data(_mm256_set1_epi64x(s)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int64, aligned_mediump>::tvec4(int64 s) : | ||||||
|  | 		data(_mm256_set1_epi64x(s)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int64, aligned_highp>::tvec4(int64 s) : | ||||||
|  | 		data(_mm256_set1_epi64x(s)) | ||||||
|  | 	{} | ||||||
|  | #	endif | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_lowp>::tvec4(float a, float b, float c, float d) : | ||||||
|  | 		data(_mm_set_ps(d, c, b, a)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_mediump>::tvec4(float a, float b, float c, float d) : | ||||||
|  | 		data(_mm_set_ps(d, c, b, a)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_highp>::tvec4(float a, float b, float c, float d) : | ||||||
|  | 		data(_mm_set_ps(d, c, b, a)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_lowp>::tvec4(int32 a, int32 b, int32 c, int32 d) : | ||||||
|  | 		data(_mm_set_epi32(d, c, b, a)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_mediump>::tvec4(int32 a, int32 b, int32 c, int32 d) : | ||||||
|  | 		data(_mm_set_epi32(d, c, b, a)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_highp>::tvec4(int32 a, int32 b, int32 c, int32 d) : | ||||||
|  | 		data(_mm_set_epi32(d, c, b, a)) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_lowp>::tvec4(int32 a, int32 b, int32 c, int32 d) : | ||||||
|  | 		data(_mm_castsi128_ps(_mm_set_epi32(d, c, b, a))) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_mediump>::tvec4(int32 a, int32 b, int32 c, int32 d) : | ||||||
|  | 		data(_mm_castsi128_ps(_mm_set_epi32(d, c, b, a))) | ||||||
|  | 	{} | ||||||
|  |  | ||||||
|  | 	template <> | ||||||
|  | 	template <> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_highp>::tvec4(int32 a, int32 b, int32 c, int32 d) : | ||||||
|  | 		data(_mm_castsi128_ps(_mm_set_epi32(d, c, b, a))) | ||||||
|  | 	{} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #endif//GLM_ARCH & GLM_ARCH_SSE2_BIT | ||||||
							
								
								
									
										6
									
								
								lib/glm/exponential.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								lib/glm/exponential.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/exponential.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "detail/func_exponential.hpp" | ||||||
							
								
								
									
										119
									
								
								lib/glm/ext.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								lib/glm/ext.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | |||||||
|  | /// @file glm/ext.hpp | ||||||
|  | /// | ||||||
|  | /// @ref core (Dependence) | ||||||
|  | ///  | ||||||
|  | /// @defgroup gtc GTC Extensions (Stable) | ||||||
|  | /// | ||||||
|  | /// @brief Functions and types that the GLSL specification doesn't define, but useful to have for a C++ program. | ||||||
|  | ///  | ||||||
|  | /// GTC extensions aim to be stable.  | ||||||
|  | ///  | ||||||
|  | /// Even if it's highly unrecommended, it's possible to include all the extensions at once by | ||||||
|  | /// including <glm/ext.hpp>. Otherwise, each extension needs to be included  a specific file. | ||||||
|  | ///  | ||||||
|  | /// @defgroup gtx GTX Extensions (Experimental) | ||||||
|  | ///  | ||||||
|  | /// @brief Functions and types that the GLSL specification doesn't define, but  | ||||||
|  | /// useful to have for a C++ program. | ||||||
|  | ///  | ||||||
|  | /// 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 <glm/ext.hpp>. Otherwise, each extension needs to be  | ||||||
|  | /// included  a specific file. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "glm.hpp" | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_EXT_INCLUDED_DISPLAYED) | ||||||
|  | #	define GLM_MESSAGE_EXT_INCLUDED_DISPLAYED | ||||||
|  | #	pragma message("GLM: All extensions included (not recommanded)") | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | #include "./gtc/bitfield.hpp" | ||||||
|  | #include "./gtc/color_space.hpp" | ||||||
|  | #include "./gtc/constants.hpp" | ||||||
|  | #include "./gtc/epsilon.hpp" | ||||||
|  | #include "./gtc/functions.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_aligned.hpp" | ||||||
|  | #include "./gtc/type_precision.hpp" | ||||||
|  | #include "./gtc/type_ptr.hpp" | ||||||
|  | #include "./gtc/ulp.hpp" | ||||||
|  | #include "./gtc/vec1.hpp" | ||||||
|  | #if GLM_HAS_ALIGNED_TYPE | ||||||
|  | #	include "./gtc/type_aligned.hpp" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include "./gtx/associated_min_max.hpp" | ||||||
|  | #include "./gtx/bit.hpp" | ||||||
|  | #include "./gtx/closest_point.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/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/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 | ||||||
							
								
								
									
										2570
									
								
								lib/glm/fwd.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2570
									
								
								lib/glm/fwd.hpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										6
									
								
								lib/glm/geometric.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								lib/glm/geometric.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/geometric.hpp | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "detail/func_geometric.hpp" | ||||||
							
								
								
									
										88
									
								
								lib/glm/glm.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								lib/glm/glm.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | /// @ref core | ||||||
|  | /// @file glm/glm.hpp | ||||||
|  | /// | ||||||
|  | /// @defgroup core GLM Core | ||||||
|  | /// | ||||||
|  | /// @brief The core of GLM, which implements exactly and only the GLSL specification to the degree possible. | ||||||
|  | /// | ||||||
|  | /// The GLM core consists of @ref core_types "C++ types that mirror GLSL types" and | ||||||
|  | /// C++ functions that mirror the GLSL functions. It also includes  | ||||||
|  | /// @ref core_precision "a set of precision-based types" that can be used in the appropriate | ||||||
|  | /// functions. The C++ types are all based on a basic set of @ref core_template "template types". | ||||||
|  | /// | ||||||
|  | /// The best documentation for GLM Core is the current GLSL specification, | ||||||
|  | /// <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.clean.pdf">version 4.2 | ||||||
|  | /// (pdf file)</a>. | ||||||
|  | /// | ||||||
|  | /// GLM core functionnalities require <glm/glm.hpp> to be included to be used. | ||||||
|  | /// | ||||||
|  | /// @defgroup core_types Types | ||||||
|  | /// | ||||||
|  | /// @brief The standard types defined by the specification. | ||||||
|  | /// | ||||||
|  | /// These types are all typedefs of more generalized, template types. To see the definition | ||||||
|  | /// of these template types, go to @ref core_template. | ||||||
|  | /// | ||||||
|  | /// @ingroup core | ||||||
|  | /// | ||||||
|  | /// @defgroup core_precision Precision types | ||||||
|  | /// | ||||||
|  | /// @brief Non-GLSL types that are used to define precision-based types. | ||||||
|  | /// | ||||||
|  | /// The GLSL language allows the user to define the precision of a particular variable. | ||||||
|  | /// In OpenGL's GLSL, these precision qualifiers have no effect; they are there for compatibility | ||||||
|  | /// with OpenGL ES's precision qualifiers, where they @em do have an effect. | ||||||
|  | /// | ||||||
|  | /// C++ has no language equivalent to precision qualifiers. So GLM provides the next-best thing: | ||||||
|  | /// a number of typedefs of the @ref core_template that use a particular precision. | ||||||
|  | /// | ||||||
|  | /// None of these types make any guarantees about the actual precision used. | ||||||
|  | /// | ||||||
|  | /// @ingroup core | ||||||
|  | /// | ||||||
|  | /// @defgroup core_template Template types | ||||||
|  | /// | ||||||
|  | /// @brief The generic template types used as the basis for the core types.  | ||||||
|  | /// | ||||||
|  | /// These types are all templates used to define the actual @ref core_types. | ||||||
|  | /// These templetes are implementation details of GLM types and should not be used explicitly. | ||||||
|  | /// | ||||||
|  | /// @ingroup core | ||||||
|  |  | ||||||
|  | #include "detail/_fixes.hpp" | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <cmath> | ||||||
|  | #include <climits> | ||||||
|  | #include <cfloat> | ||||||
|  | #include <limits> | ||||||
|  | #include <cassert> | ||||||
|  | #include "fwd.hpp" | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_CORE_INCLUDED_DISPLAYED) | ||||||
|  | #	define GLM_MESSAGE_CORE_INCLUDED_DISPLAYED | ||||||
|  | #	pragma message("GLM: Core library included") | ||||||
|  | #endif//GLM_MESSAGES | ||||||
|  |  | ||||||
|  | #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" | ||||||
							
								
								
									
										207
									
								
								lib/glm/gtc/bitfield.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								lib/glm/gtc/bitfield.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,207 @@ | |||||||
|  | /// @ref gtc_bitfield | ||||||
|  | /// @file glm/gtc/bitfield.hpp | ||||||
|  | /// | ||||||
|  | /// @see core (dependence) | ||||||
|  | /// @see gtc_bitfield (dependence) | ||||||
|  | /// | ||||||
|  | /// @defgroup gtc_bitfield GLM_GTC_bitfield | ||||||
|  | /// @ingroup gtc | ||||||
|  | ///  | ||||||
|  | /// @brief Allow to perform bit operations on integer values | ||||||
|  | ///  | ||||||
|  | /// <glm/gtc/bitfield.hpp> need to be included to use these functionalities. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | // Dependencies | ||||||
|  | #include "../detail/setup.hpp" | ||||||
|  | #include "../detail/precision.hpp" | ||||||
|  | #include "../detail/type_int.hpp" | ||||||
|  | #include "../detail/_vectorize.hpp" | ||||||
|  | #include <limits> | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !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 <typename genIUType> | ||||||
|  | 	GLM_FUNC_DECL genIUType mask(genIUType Bits); | ||||||
|  | 	 | ||||||
|  | 	/// Build a mask of 'count' bits | ||||||
|  | 	/// | ||||||
|  | 	/// @see gtc_bitfield | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecIUType> | ||||||
|  | 	GLM_FUNC_DECL vecIUType<T, P> mask(vecIUType<T, P> 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 <typename genIUType> | ||||||
|  | 	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. | ||||||
|  | 	/// | ||||||
|  | 	/// @see gtc_bitfield | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> bitfieldRotateRight(vecType<T, P> 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 <typename genIUType> | ||||||
|  | 	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. | ||||||
|  | 	/// | ||||||
|  | 	/// @see gtc_bitfield | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> bitfieldRotateLeft(vecType<T, P> const & In, int Shift); | ||||||
|  |  | ||||||
|  | 	/// Set to 1 a range of bits. | ||||||
|  | 	/// | ||||||
|  | 	/// @see gtc_bitfield | ||||||
|  | 	template <typename genIUType> | ||||||
|  | 	GLM_FUNC_DECL genIUType bitfieldFillOne(genIUType Value, int FirstBit, int BitCount); | ||||||
|  |  | ||||||
|  | 	/// Set to 1 a range of bits. | ||||||
|  | 	/// | ||||||
|  | 	/// @see gtc_bitfield | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> bitfieldFillOne(vecType<T, P> const & Value, int FirstBit, int BitCount); | ||||||
|  |  | ||||||
|  | 	/// Set to 0 a range of bits. | ||||||
|  | 	/// | ||||||
|  | 	/// @see gtc_bitfield | ||||||
|  | 	template <typename genIUType> | ||||||
|  | 	GLM_FUNC_DECL genIUType bitfieldFillZero(genIUType Value, int FirstBit, int BitCount); | ||||||
|  |  | ||||||
|  | 	/// Set to 0 a range of bits. | ||||||
|  | 	/// | ||||||
|  | 	/// @see gtc_bitfield | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> bitfieldFillZero(vecType<T, P> 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 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 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, 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" | ||||||
							
								
								
									
										515
									
								
								lib/glm/gtc/bitfield.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										515
									
								
								lib/glm/gtc/bitfield.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,515 @@ | |||||||
|  | /// @ref gtc_bitfield | ||||||
|  | /// @file glm/gtc/bitfield.inl | ||||||
|  |  | ||||||
|  | #include "../simd/integer.h" | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <typename PARAM, typename RET> | ||||||
|  | 	GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y); | ||||||
|  |  | ||||||
|  | 	template <typename PARAM, typename RET> | ||||||
|  | 	GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z); | ||||||
|  |  | ||||||
|  | 	template <typename PARAM, typename RET> | ||||||
|  | 	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) & glm::uint16(0x0F0F); | ||||||
|  | 		REG2 = ((REG2 <<  4) | REG2) & glm::uint16(0x0F0F); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  2) | REG1) & glm::uint16(0x3333); | ||||||
|  | 		REG2 = ((REG2 <<  2) | REG2) & glm::uint16(0x3333); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  1) | REG1) & glm::uint16(0x5555); | ||||||
|  | 		REG2 = ((REG2 <<  1) | REG2) & glm::uint16(0x5555); | ||||||
|  |  | ||||||
|  | 		return REG1 | (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) & glm::uint32(0x00FF00FF); | ||||||
|  | 		REG2 = ((REG2 <<  8) | REG2) & glm::uint32(0x00FF00FF); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  4) | REG1) & glm::uint32(0x0F0F0F0F); | ||||||
|  | 		REG2 = ((REG2 <<  4) | REG2) & glm::uint32(0x0F0F0F0F); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  2) | REG1) & glm::uint32(0x33333333); | ||||||
|  | 		REG2 = ((REG2 <<  2) | REG2) & glm::uint32(0x33333333); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  1) | REG1) & glm::uint32(0x55555555); | ||||||
|  | 		REG2 = ((REG2 <<  1) | REG2) & glm::uint32(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) & glm::uint64(0x0000FFFF0000FFFFull); | ||||||
|  | 		REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFFull); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  8) | REG1) & glm::uint64(0x00FF00FF00FF00FFull); | ||||||
|  | 		REG2 = ((REG2 <<  8) | REG2) & glm::uint64(0x00FF00FF00FF00FFull); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0Full); | ||||||
|  | 		REG2 = ((REG2 <<  4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0Full); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  2) | REG1) & glm::uint64(0x3333333333333333ull); | ||||||
|  | 		REG2 = ((REG2 <<  2) | REG2) & glm::uint64(0x3333333333333333ull); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  1) | REG1) & glm::uint64(0x5555555555555555ull); | ||||||
|  | 		REG2 = ((REG2 <<  1) | REG2) & glm::uint64(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) & glm::uint32(0x00FF0000FF0000FF); | ||||||
|  | 		REG2 = ((REG2 << 16) | REG2) & glm::uint32(0x00FF0000FF0000FF); | ||||||
|  | 		REG3 = ((REG3 << 16) | REG3) & glm::uint32(0x00FF0000FF0000FF); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  8) | REG1) & glm::uint32(0xF00F00F00F00F00F); | ||||||
|  | 		REG2 = ((REG2 <<  8) | REG2) & glm::uint32(0xF00F00F00F00F00F); | ||||||
|  | 		REG3 = ((REG3 <<  8) | REG3) & glm::uint32(0xF00F00F00F00F00F); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  4) | REG1) & glm::uint32(0x30C30C30C30C30C3); | ||||||
|  | 		REG2 = ((REG2 <<  4) | REG2) & glm::uint32(0x30C30C30C30C30C3); | ||||||
|  | 		REG3 = ((REG3 <<  4) | REG3) & glm::uint32(0x30C30C30C30C30C3); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  2) | REG1) & glm::uint32(0x9249249249249249); | ||||||
|  | 		REG2 = ((REG2 <<  2) | REG2) & glm::uint32(0x9249249249249249); | ||||||
|  | 		REG3 = ((REG3 <<  2) | REG3) & glm::uint32(0x9249249249249249); | ||||||
|  |  | ||||||
|  | 		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) & glm::uint64(0xFFFF00000000FFFFull); | ||||||
|  | 		REG2 = ((REG2 << 32) | REG2) & glm::uint64(0xFFFF00000000FFFFull); | ||||||
|  | 		REG3 = ((REG3 << 32) | REG3) & glm::uint64(0xFFFF00000000FFFFull); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x00FF0000FF0000FFull); | ||||||
|  | 		REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x00FF0000FF0000FFull); | ||||||
|  | 		REG3 = ((REG3 << 16) | REG3) & glm::uint64(0x00FF0000FF0000FFull); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  8) | REG1) & glm::uint64(0xF00F00F00F00F00Full); | ||||||
|  | 		REG2 = ((REG2 <<  8) | REG2) & glm::uint64(0xF00F00F00F00F00Full); | ||||||
|  | 		REG3 = ((REG3 <<  8) | REG3) & glm::uint64(0xF00F00F00F00F00Full); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  4) | REG1) & glm::uint64(0x30C30C30C30C30C3ull); | ||||||
|  | 		REG2 = ((REG2 <<  4) | REG2) & glm::uint64(0x30C30C30C30C30C3ull); | ||||||
|  | 		REG3 = ((REG3 <<  4) | REG3) & glm::uint64(0x30C30C30C30C30C3ull); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  2) | REG1) & glm::uint64(0x9249249249249249ull); | ||||||
|  | 		REG2 = ((REG2 <<  2) | REG2) & glm::uint64(0x9249249249249249ull); | ||||||
|  | 		REG3 = ((REG3 <<  2) | REG3) & glm::uint64(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) & glm::uint64(0xFFFF00000000FFFFull); | ||||||
|  | 		REG2 = ((REG2 << 32) | REG2) & glm::uint64(0xFFFF00000000FFFFull); | ||||||
|  | 		REG3 = ((REG3 << 32) | REG3) & glm::uint64(0xFFFF00000000FFFFull); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x00FF0000FF0000FFull); | ||||||
|  | 		REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x00FF0000FF0000FFull); | ||||||
|  | 		REG3 = ((REG3 << 16) | REG3) & glm::uint64(0x00FF0000FF0000FFull); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  8) | REG1) & glm::uint64(0xF00F00F00F00F00Full); | ||||||
|  | 		REG2 = ((REG2 <<  8) | REG2) & glm::uint64(0xF00F00F00F00F00Full); | ||||||
|  | 		REG3 = ((REG3 <<  8) | REG3) & glm::uint64(0xF00F00F00F00F00Full); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  4) | REG1) & glm::uint64(0x30C30C30C30C30C3ull); | ||||||
|  | 		REG2 = ((REG2 <<  4) | REG2) & glm::uint64(0x30C30C30C30C30C3ull); | ||||||
|  | 		REG3 = ((REG3 <<  4) | REG3) & glm::uint64(0x30C30C30C30C30C3ull); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  2) | REG1) & glm::uint64(0x9249249249249249ull); | ||||||
|  | 		REG2 = ((REG2 <<  2) | REG2) & glm::uint64(0x9249249249249249ull); | ||||||
|  | 		REG3 = ((REG3 <<  2) | REG3) & glm::uint64(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) & glm::uint32(0x000F000F000F000F); | ||||||
|  | 		REG2 = ((REG2 << 12) | REG2) & glm::uint32(0x000F000F000F000F); | ||||||
|  | 		REG3 = ((REG3 << 12) | REG3) & glm::uint32(0x000F000F000F000F); | ||||||
|  | 		REG4 = ((REG4 << 12) | REG4) & glm::uint32(0x000F000F000F000F); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  6) | REG1) & glm::uint32(0x0303030303030303); | ||||||
|  | 		REG2 = ((REG2 <<  6) | REG2) & glm::uint32(0x0303030303030303); | ||||||
|  | 		REG3 = ((REG3 <<  6) | REG3) & glm::uint32(0x0303030303030303); | ||||||
|  | 		REG4 = ((REG4 <<  6) | REG4) & glm::uint32(0x0303030303030303); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  3) | REG1) & glm::uint32(0x1111111111111111); | ||||||
|  | 		REG2 = ((REG2 <<  3) | REG2) & glm::uint32(0x1111111111111111); | ||||||
|  | 		REG3 = ((REG3 <<  3) | REG3) & glm::uint32(0x1111111111111111); | ||||||
|  | 		REG4 = ((REG4 <<  3) | REG4) & glm::uint32(0x1111111111111111); | ||||||
|  |  | ||||||
|  | 		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) & glm::uint64(0x000000FF000000FFull); | ||||||
|  | 		REG2 = ((REG2 << 24) | REG2) & glm::uint64(0x000000FF000000FFull); | ||||||
|  | 		REG3 = ((REG3 << 24) | REG3) & glm::uint64(0x000000FF000000FFull); | ||||||
|  | 		REG4 = ((REG4 << 24) | REG4) & glm::uint64(0x000000FF000000FFull); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 << 12) | REG1) & glm::uint64(0x000F000F000F000Full); | ||||||
|  | 		REG2 = ((REG2 << 12) | REG2) & glm::uint64(0x000F000F000F000Full); | ||||||
|  | 		REG3 = ((REG3 << 12) | REG3) & glm::uint64(0x000F000F000F000Full); | ||||||
|  | 		REG4 = ((REG4 << 12) | REG4) & glm::uint64(0x000F000F000F000Full); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  6) | REG1) & glm::uint64(0x0303030303030303ull); | ||||||
|  | 		REG2 = ((REG2 <<  6) | REG2) & glm::uint64(0x0303030303030303ull); | ||||||
|  | 		REG3 = ((REG3 <<  6) | REG3) & glm::uint64(0x0303030303030303ull); | ||||||
|  | 		REG4 = ((REG4 <<  6) | REG4) & glm::uint64(0x0303030303030303ull); | ||||||
|  |  | ||||||
|  | 		REG1 = ((REG1 <<  3) | REG1) & glm::uint64(0x1111111111111111ull); | ||||||
|  | 		REG2 = ((REG2 <<  3) | REG2) & glm::uint64(0x1111111111111111ull); | ||||||
|  | 		REG3 = ((REG3 <<  3) | REG3) & glm::uint64(0x1111111111111111ull); | ||||||
|  | 		REG4 = ((REG4 <<  3) | REG4) & glm::uint64(0x1111111111111111ull); | ||||||
|  |  | ||||||
|  | 		return REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3); | ||||||
|  | 	} | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | 	template <typename genIUType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genIUType mask(genIUType Bits) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'mask' accepts only integer values"); | ||||||
|  |  | ||||||
|  | 		return Bits >= sizeof(genIUType) * 8 ? ~static_cast<genIUType>(0) : (static_cast<genIUType>(1) << Bits) - static_cast<genIUType>(1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecIUType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecIUType<T, P> mask(vecIUType<T, P> const& v) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'mask' accepts only integer values"); | ||||||
|  |  | ||||||
|  | 		return detail::functor1<T, T, P, vecIUType>::call(mask, v); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genIType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genIType bitfieldRotateRight(genIType In, int Shift) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genIType>::is_integer, "'bitfieldRotateRight' accepts only integer values"); | ||||||
|  |  | ||||||
|  | 		int const BitSize = static_cast<genIType>(sizeof(genIType) * 8); | ||||||
|  | 		return (In << static_cast<genIType>(Shift)) | (In >> static_cast<genIType>(BitSize - Shift)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> bitfieldRotateRight(vecType<T, P> const & In, int Shift) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'bitfieldRotateRight' accepts only integer values"); | ||||||
|  |  | ||||||
|  | 		int const BitSize = static_cast<int>(sizeof(T) * 8); | ||||||
|  | 		return (In << static_cast<T>(Shift)) | (In >> static_cast<T>(BitSize - Shift)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genIType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genIType bitfieldRotateLeft(genIType In, int Shift) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<genIType>::is_integer, "'bitfieldRotateLeft' accepts only integer values"); | ||||||
|  |  | ||||||
|  | 		int const BitSize = static_cast<genIType>(sizeof(genIType) * 8); | ||||||
|  | 		return (In >> static_cast<genIType>(Shift)) | (In << static_cast<genIType>(BitSize - Shift)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> bitfieldRotateLeft(vecType<T, P> const& In, int Shift) | ||||||
|  | 	{ | ||||||
|  | 		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'bitfieldRotateLeft' accepts only integer values"); | ||||||
|  |  | ||||||
|  | 		int const BitSize = static_cast<int>(sizeof(T) * 8); | ||||||
|  | 		return (In >> static_cast<T>(Shift)) | (In << static_cast<T>(BitSize - Shift)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genIUType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genIUType bitfieldFillOne(genIUType Value, int FirstBit, int BitCount) | ||||||
|  | 	{ | ||||||
|  | 		return Value | static_cast<genIUType>(mask(BitCount) << FirstBit); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> bitfieldFillOne(vecType<T, P> const& Value, int FirstBit, int BitCount) | ||||||
|  | 	{ | ||||||
|  | 		return Value | static_cast<T>(mask(BitCount) << FirstBit); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genIUType> | ||||||
|  | 	GLM_FUNC_QUALIFIER genIUType bitfieldFillZero(genIUType Value, int FirstBit, int BitCount) | ||||||
|  | 	{ | ||||||
|  | 		return Value & static_cast<genIUType>(~(mask(BitCount) << FirstBit)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> bitfieldFillZero(vecType<T, P> const& Value, int FirstBit, int BitCount) | ||||||
|  | 	{ | ||||||
|  | 		return Value & static_cast<T>(~(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<uint8, uint16>(x, y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	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<uint16, uint32>(x, y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	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<uint32, uint64>(x, y); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	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<uint8, uint32>(x, y, 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<uint32, uint64>(x, y, 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<uint32, uint64>(x, y, 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<uint8, uint32>(x, y, z, 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<uint16, uint64>(x, y, z, w); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										65
									
								
								lib/glm/gtc/color_encoding.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								lib/glm/gtc/color_encoding.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | |||||||
|  | /// @ref gtc_color_encoding | ||||||
|  | /// @file glm/gtc/color_encoding.inl | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> convertLinearSRGBToD65XYZ(tvec3<T, P> const& ColorLinearSRGB) | ||||||
|  | 	{ | ||||||
|  | 		tvec3<T, P> const M(0.490f, 0.17697f, 0.2f); | ||||||
|  | 		tvec3<T, P> const N(0.31f,  0.8124f, 0.01063f); | ||||||
|  | 		tvec3<T, P> const O(0.490f, 0.01f, 0.99f); | ||||||
|  |  | ||||||
|  | 		return (M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB) * static_cast<T>(5.650675255693055f); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> convertD65XYZToLinearSRGB(tvec3<T, P> const& ColorD65XYZ) | ||||||
|  | 	{ | ||||||
|  | 		tvec3<T, P> const M(0.41847f, -0.091169f, 0.0009209f); | ||||||
|  | 		tvec3<T, P> const N(-0.15866f, 0.25243f, 0.015708f); | ||||||
|  | 		tvec3<T, P> const O(0.0009209f, -0.0025498f, 0.1786f); | ||||||
|  |  | ||||||
|  | 		return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> convertLinearSRGBToD50XYZ(tvec3<T, P> const& ColorLinearSRGB) | ||||||
|  | 	{ | ||||||
|  | 		tvec3<T, P> const M(0.436030342570117f, 0.222438466210245f, 0.013897440074263f); | ||||||
|  | 		tvec3<T, P> const N(0.385101860087134f, 0.716942745571917f, 0.097076381494207f); | ||||||
|  | 		tvec3<T, P> const O(0.143067806654203f, 0.060618777416563f, 0.713926257896652f); | ||||||
|  |  | ||||||
|  | 		return M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> convertD50XYZToLinearSRGB(tvec3<T, P> const& ColorD50XYZ) | ||||||
|  | 	{ | ||||||
|  | 		tvec3<T, P> const M(); | ||||||
|  | 		tvec3<T, P> const N(); | ||||||
|  | 		tvec3<T, P> const O(); | ||||||
|  |  | ||||||
|  | 		return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> convertD65XYZToD50XYZ(tvec3<T, P> const& ColorD65XYZ) | ||||||
|  | 	{ | ||||||
|  | 		tvec3<T, P> const M(+1.047844353856414f, +0.029549007606644f, -0.009250984365223f); | ||||||
|  | 		tvec3<T, P> const N(+0.022898981050086f, +0.990508028941971f, +0.015072338237051f); | ||||||
|  | 		tvec3<T, P> const O(-0.050206647741605f, -0.017074711360960f, +0.751717835079977f); | ||||||
|  |  | ||||||
|  | 		return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec3<T, P> convertD50XYZToD65XYZ(tvec3<T, P> const& ColorD50XYZ) | ||||||
|  | 	{ | ||||||
|  | 		tvec3<T, P> const M(); | ||||||
|  | 		tvec3<T, P> const N(); | ||||||
|  | 		tvec3<T, P> const O(); | ||||||
|  |  | ||||||
|  | 		return M * ColorD50XYZ + N * ColorD50XYZ + O * ColorD50XYZ; | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										56
									
								
								lib/glm/gtc/color_space.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								lib/glm/gtc/color_space.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||||
|  | /// | ||||||
|  | /// @brief Allow to perform bit operations on integer values | ||||||
|  | /// | ||||||
|  | /// <glm/gtc/color.hpp> need to be included to use these functionalities. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | // Dependencies | ||||||
|  | #include "../detail/setup.hpp" | ||||||
|  | #include "../detail/precision.hpp" | ||||||
|  | #include "../exponential.hpp" | ||||||
|  | #include "../vec3.hpp" | ||||||
|  | #include "../vec4.hpp" | ||||||
|  | #include <limits> | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !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 specification https://www.w3.org/Graphics/Color/srgb | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> convertLinearToSRGB(vecType<T, P> const & ColorLinear); | ||||||
|  |  | ||||||
|  | 	/// Convert a linear color to sRGB color using a custom gamma correction. | ||||||
|  | 	/// IEC 61966-2-1:1999 specification https://www.w3.org/Graphics/Color/srgb | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> convertLinearToSRGB(vecType<T, P> const & ColorLinear, T Gamma); | ||||||
|  |  | ||||||
|  | 	/// Convert a sRGB color to linear color using a standard gamma correction. | ||||||
|  | 	/// IEC 61966-2-1:1999 specification https://www.w3.org/Graphics/Color/srgb | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> convertSRGBToLinear(vecType<T, P> const & ColorSRGB); | ||||||
|  |  | ||||||
|  | 	/// Convert a sRGB color to linear color using a custom gamma correction. | ||||||
|  | 	// IEC 61966-2-1:1999 specification https://www.w3.org/Graphics/Color/srgb | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<T, P> convertSRGBToLinear(vecType<T, P> const & ColorSRGB, T Gamma); | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | } //namespace glm | ||||||
|  |  | ||||||
|  | #include "color_space.inl" | ||||||
							
								
								
									
										75
									
								
								lib/glm/gtc/color_space.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								lib/glm/gtc/color_space.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | |||||||
|  | /// @ref gtc_color_space | ||||||
|  | /// @file glm/gtc/color_space.inl | ||||||
|  |  | ||||||
|  | namespace glm{ | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	struct compute_rgbToSrgb | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const& ColorRGB, T GammaCorrection) | ||||||
|  | 		{ | ||||||
|  | 			vecType<T, P> const ClampedColor(clamp(ColorRGB, static_cast<T>(0), static_cast<T>(1))); | ||||||
|  |  | ||||||
|  | 			return mix( | ||||||
|  | 				pow(ClampedColor, vecType<T, P>(GammaCorrection)) * static_cast<T>(1.055) - static_cast<T>(0.055), | ||||||
|  | 				ClampedColor * static_cast<T>(12.92), | ||||||
|  | 				lessThan(ClampedColor, vecType<T, P>(static_cast<T>(0.0031308)))); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_rgbToSrgb<T, P, tvec4> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const& ColorRGB, T GammaCorrection) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(compute_rgbToSrgb<T, P, tvec3>::call(tvec3<T, P>(ColorRGB), GammaCorrection), ColorRGB.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	struct compute_srgbToRgb | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const& ColorSRGB, T Gamma) | ||||||
|  | 		{ | ||||||
|  | 			return mix( | ||||||
|  | 				pow((ColorSRGB + static_cast<T>(0.055)) * static_cast<T>(0.94786729857819905213270142180095), vecType<T, P>(Gamma)), | ||||||
|  | 				ColorSRGB * static_cast<T>(0.07739938080495356037151702786378), | ||||||
|  | 				lessThanEqual(ColorSRGB, vecType<T, P>(static_cast<T>(0.04045)))); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	struct compute_srgbToRgb<T, P, tvec4> | ||||||
|  | 	{ | ||||||
|  | 		GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const& ColorSRGB, T Gamma) | ||||||
|  | 		{ | ||||||
|  | 			return tvec4<T, P>(compute_srgbToRgb<T, P, tvec3>::call(tvec3<T, P>(ColorSRGB), Gamma), ColorSRGB.w); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | }//namespace detail | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> convertLinearToSRGB(vecType<T, P> const& ColorLinear) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_rgbToSrgb<T, P, vecType>::call(ColorLinear, static_cast<T>(0.41666)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> convertLinearToSRGB(vecType<T, P> const& ColorLinear, T Gamma) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_rgbToSrgb<T, P, vecType>::call(ColorLinear, static_cast<T>(1) / Gamma); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> convertSRGBToLinear(vecType<T, P> const& ColorSRGB) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_srgbToRgb<T, P, vecType>::call(ColorSRGB, static_cast<T>(2.4)); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<T, P> convertSRGBToLinear(vecType<T, P> const& ColorSRGB, T Gamma) | ||||||
|  | 	{ | ||||||
|  | 		return detail::compute_srgbToRgb<T, P, vecType>::call(ColorSRGB, Gamma); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										176
									
								
								lib/glm/gtc/constants.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								lib/glm/gtc/constants.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | |||||||
|  | /// @ref gtc_constants | ||||||
|  | /// @file glm/gtc/constants.hpp | ||||||
|  | /// | ||||||
|  | /// @see core (dependence) | ||||||
|  | /// @see gtc_half_float (dependence) | ||||||
|  | /// | ||||||
|  | /// @defgroup gtc_constants GLM_GTC_constants | ||||||
|  | /// @ingroup gtc | ||||||
|  | ///  | ||||||
|  | /// @brief Provide a list of constants and precomputed useful values. | ||||||
|  | ///  | ||||||
|  | /// <glm/gtc/constants.hpp> need to be included to use these features. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | // Dependencies | ||||||
|  | #include "../detail/setup.hpp" | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) | ||||||
|  | #	pragma message("GLM: GLM_GTC_constants extension included") | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	/// @addtogroup gtc_constants | ||||||
|  | 	/// @{ | ||||||
|  |  | ||||||
|  | 	/// Return the epsilon constant for floating point types. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon(); | ||||||
|  |  | ||||||
|  | 	/// Return 0. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType zero(); | ||||||
|  |  | ||||||
|  | 	/// Return 1. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType one(); | ||||||
|  |  | ||||||
|  | 	/// Return the pi constant. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType pi(); | ||||||
|  |  | ||||||
|  | 	/// Return pi * 2. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType two_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return square root of pi. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType root_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return pi / 2. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType half_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return pi / 2 * 3. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType three_over_two_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return pi / 4. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType quarter_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return 1 / pi. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return 1 / (pi * 2). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_two_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return 2 / pi. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return 4 / pi. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType four_over_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return 2 / sqrt(pi). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_root_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return 1 / sqrt(2). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_root_two(); | ||||||
|  |  | ||||||
|  | 	/// Return sqrt(pi / 2). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType root_half_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return sqrt(2 * pi). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType root_two_pi(); | ||||||
|  |  | ||||||
|  | 	/// Return sqrt(ln(4)). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType root_ln_four(); | ||||||
|  |  | ||||||
|  | 	/// Return e constant. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType e(); | ||||||
|  |  | ||||||
|  | 	/// Return Euler's constant. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType euler(); | ||||||
|  |  | ||||||
|  | 	/// Return sqrt(2). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType root_two(); | ||||||
|  |  | ||||||
|  | 	/// Return sqrt(3). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType root_three(); | ||||||
|  |  | ||||||
|  | 	/// Return sqrt(5). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType root_five(); | ||||||
|  |  | ||||||
|  | 	/// Return ln(2). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType ln_two(); | ||||||
|  |  | ||||||
|  | 	/// Return ln(10). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ten(); | ||||||
|  |  | ||||||
|  | 	/// Return ln(ln(2)). | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ln_two(); | ||||||
|  |  | ||||||
|  | 	/// Return 1 / 3. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType third(); | ||||||
|  |  | ||||||
|  | 	/// Return 2 / 3. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType two_thirds(); | ||||||
|  |  | ||||||
|  | 	/// Return the golden ratio constant. | ||||||
|  | 	/// @see gtc_constants | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL GLM_CONSTEXPR genType golden_ratio(); | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | } //namespace glm | ||||||
|  |  | ||||||
|  | #include "constants.inl" | ||||||
							
								
								
									
										181
									
								
								lib/glm/gtc/constants.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								lib/glm/gtc/constants.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,181 @@ | |||||||
|  | /// @ref gtc_constants | ||||||
|  | /// @file glm/gtc/constants.inl | ||||||
|  |  | ||||||
|  | #include <limits> | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType epsilon() | ||||||
|  | 	{ | ||||||
|  | 		return std::numeric_limits<genType>::epsilon(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType zero() | ||||||
|  | 	{ | ||||||
|  | 		return genType(0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one() | ||||||
|  | 	{ | ||||||
|  | 		return genType(1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(3.14159265358979323846264338327950288); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(6.28318530717958647692528676655900576); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(1.772453850905516027); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType half_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(1.57079632679489661923132169163975144); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType three_over_two_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(4.71238898038468985769396507491925432);            | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType quarter_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(0.785398163397448309615660845819875721); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(0.318309886183790671537767526745028724); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_two_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(0.159154943091895335768883763372514362); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(0.636619772367581343075535053490057448); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType four_over_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(1.273239544735162686151070106980114898); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_root_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(1.12837916709551257389615890312154517); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_root_two() | ||||||
|  | 	{ | ||||||
|  | 		return genType(0.707106781186547524400844362104849039); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_half_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(1.253314137315500251); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two_pi() | ||||||
|  | 	{ | ||||||
|  | 		return genType(2.506628274631000502); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_ln_four() | ||||||
|  | 	{ | ||||||
|  | 		return genType(1.17741002251547469); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType e() | ||||||
|  | 	{ | ||||||
|  | 		return genType(2.71828182845904523536); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType euler() | ||||||
|  | 	{ | ||||||
|  | 		return genType(0.577215664901532860606); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two() | ||||||
|  | 	{ | ||||||
|  | 		return genType(1.41421356237309504880168872420969808); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_three() | ||||||
|  | 	{ | ||||||
|  | 		return genType(1.73205080756887729352744634150587236); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_five() | ||||||
|  | 	{ | ||||||
|  | 		return genType(2.23606797749978969640917366873127623); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_two() | ||||||
|  | 	{ | ||||||
|  | 		return genType(0.693147180559945309417232121458176568); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_ten() | ||||||
|  | 	{ | ||||||
|  | 		return genType(2.30258509299404568401799145468436421); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_ln_two() | ||||||
|  | 	{ | ||||||
|  | 		return genType(-0.3665129205816643); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType third() | ||||||
|  | 	{ | ||||||
|  | 		return genType(0.3333333333333333333333333333333333333333); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_thirds() | ||||||
|  | 	{ | ||||||
|  | 		return genType(0.666666666666666666666666666666666666667); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType golden_ratio() | ||||||
|  | 	{ | ||||||
|  | 		return genType(1.61803398874989484820458683436563811); | ||||||
|  | 	} | ||||||
|  | } //namespace glm | ||||||
							
								
								
									
										73
									
								
								lib/glm/gtc/epsilon.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								lib/glm/gtc/epsilon.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | |||||||
|  | /// @ref gtc_epsilon | ||||||
|  | /// @file glm/gtc/epsilon.hpp | ||||||
|  | ///  | ||||||
|  | /// @see core (dependence) | ||||||
|  | /// @see gtc_half_float (dependence) | ||||||
|  | /// @see gtc_quaternion (dependence) | ||||||
|  | /// | ||||||
|  | /// @defgroup gtc_epsilon GLM_GTC_epsilon | ||||||
|  | /// @ingroup gtc | ||||||
|  | ///  | ||||||
|  | /// @brief Comparison functions for a user defined epsilon values. | ||||||
|  | ///  | ||||||
|  | /// <glm/gtc/epsilon.hpp> need to be included to use these functionalities. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | // Dependencies | ||||||
|  | #include "../detail/setup.hpp" | ||||||
|  | #include "../detail/precision.hpp" | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !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 <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_DECL vecType<bool, P> epsilonEqual( | ||||||
|  | 		vecType<T, P> const & x, | ||||||
|  | 		vecType<T, P> const & y, | ||||||
|  | 		T const & epsilon); | ||||||
|  |  | ||||||
|  | 	/// Returns the component-wise comparison of |x - y| < epsilon. | ||||||
|  | 	/// True if this expression is satisfied. | ||||||
|  | 	/// | ||||||
|  | 	/// @see gtc_epsilon | ||||||
|  | 	template <typename genType> | ||||||
|  | 	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 <typename genType> | ||||||
|  | 	GLM_FUNC_DECL typename genType::boolType epsilonNotEqual( | ||||||
|  | 		genType const & x, | ||||||
|  | 		genType const & y, | ||||||
|  | 		typename genType::value_type const & epsilon); | ||||||
|  |  | ||||||
|  | 	/// Returns the component-wise comparison of |x - y| >= epsilon. | ||||||
|  | 	/// True if this expression is not satisfied. | ||||||
|  | 	/// | ||||||
|  | 	/// @see gtc_epsilon | ||||||
|  | 	template <typename genType> | ||||||
|  | 	GLM_FUNC_DECL bool epsilonNotEqual( | ||||||
|  | 		genType const & x, | ||||||
|  | 		genType const & y, | ||||||
|  | 		genType const & epsilon); | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #include "epsilon.inl" | ||||||
							
								
								
									
										125
									
								
								lib/glm/gtc/epsilon.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								lib/glm/gtc/epsilon.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | |||||||
|  | /// @ref gtc_epsilon | ||||||
|  | /// @file glm/gtc/epsilon.inl | ||||||
|  |  | ||||||
|  | // Dependency: | ||||||
|  | #include "quaternion.hpp" | ||||||
|  | #include "../vector_relational.hpp" | ||||||
|  | #include "../common.hpp" | ||||||
|  | #include "../vec2.hpp" | ||||||
|  | #include "../vec3.hpp" | ||||||
|  | #include "../vec4.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 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 <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> epsilonEqual | ||||||
|  | 	( | ||||||
|  | 		vecType<T, P> const & x, | ||||||
|  | 		vecType<T, P> const & y, | ||||||
|  | 		T const & epsilon | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		return lessThan(abs(x - y), vecType<T, P>(epsilon)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> epsilonEqual | ||||||
|  | 	( | ||||||
|  | 		vecType<T, P> const & x, | ||||||
|  | 		vecType<T, P> const & y, | ||||||
|  | 		vecType<T, P> const & epsilon | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		return lessThan(abs(x - y), vecType<T, P>(epsilon)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> epsilonNotEqual | ||||||
|  | 	( | ||||||
|  | 		vecType<T, P> const & x, | ||||||
|  | 		vecType<T, P> const & y, | ||||||
|  | 		T const & epsilon | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		return greaterThanEqual(abs(x - y), vecType<T, P>(epsilon)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P, template <typename, precision> class vecType> | ||||||
|  | 	GLM_FUNC_QUALIFIER vecType<bool, P> epsilonNotEqual | ||||||
|  | 	( | ||||||
|  | 		vecType<T, P> const & x, | ||||||
|  | 		vecType<T, P> const & y, | ||||||
|  | 		vecType<T, P> const & epsilon | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		return greaterThanEqual(abs(x - y), vecType<T, P>(epsilon)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<bool, P> epsilonEqual | ||||||
|  | 	( | ||||||
|  | 		tquat<T, P> const & x, | ||||||
|  | 		tquat<T, P> const & y, | ||||||
|  | 		T const & epsilon | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		tvec4<T, P> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); | ||||||
|  | 		return lessThan(abs(v), tvec4<T, P>(epsilon)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER tvec4<bool, P> epsilonNotEqual | ||||||
|  | 	( | ||||||
|  | 		tquat<T, P> const & x, | ||||||
|  | 		tquat<T, P> const & y, | ||||||
|  | 		T const & epsilon | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		tvec4<T, P> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); | ||||||
|  | 		return greaterThanEqual(abs(v), tvec4<T, P>(epsilon)); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
							
								
								
									
										53
									
								
								lib/glm/gtc/functions.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								lib/glm/gtc/functions.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | /// @ref gtc_functions | ||||||
|  | /// @file glm/gtc/functions.hpp | ||||||
|  | ///  | ||||||
|  | /// @see core (dependence) | ||||||
|  | /// @see gtc_half_float (dependence) | ||||||
|  | /// @see gtc_quaternion (dependence) | ||||||
|  | /// | ||||||
|  | /// @defgroup gtc_functions GLM_GTC_functions | ||||||
|  | /// @ingroup gtc | ||||||
|  | ///  | ||||||
|  | /// @brief List of useful common functions. | ||||||
|  | ///  | ||||||
|  | /// <glm/gtc/functions.hpp> need to be included to use these functionalities. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | // Dependencies | ||||||
|  | #include "../detail/setup.hpp" | ||||||
|  | #include "../detail/precision.hpp" | ||||||
|  | #include "../detail/type_vec2.hpp" | ||||||
|  |  | ||||||
|  | #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) | ||||||
|  | #	pragma message("GLM: GLM_GTC_functions extension included") | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	/// @addtogroup gtc_functions | ||||||
|  | 	/// @{ | ||||||
|  |  | ||||||
|  | 	/// 1D gauss function | ||||||
|  | 	/// | ||||||
|  | 	/// @see gtc_epsilon | ||||||
|  | 	template <typename T> | ||||||
|  | 	GLM_FUNC_DECL T gauss( | ||||||
|  | 		T x, | ||||||
|  | 		T ExpectedValue, | ||||||
|  | 		T StandardDeviation); | ||||||
|  |  | ||||||
|  | 	/// 2D gauss function | ||||||
|  | 	/// | ||||||
|  | 	/// @see gtc_epsilon | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_DECL T gauss( | ||||||
|  | 		tvec2<T, P> const& Coord, | ||||||
|  | 		tvec2<T, P> const& ExpectedValue, | ||||||
|  | 		tvec2<T, P> const& StandardDeviation); | ||||||
|  |  | ||||||
|  | 	/// @} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
|  | #include "functions.inl" | ||||||
|  |  | ||||||
							
								
								
									
										31
									
								
								lib/glm/gtc/functions.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								lib/glm/gtc/functions.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | /// @ref gtc_functions | ||||||
|  | /// @file glm/gtc/functions.inl | ||||||
|  |  | ||||||
|  | #include "../detail/func_exponential.hpp" | ||||||
|  |  | ||||||
|  | namespace glm | ||||||
|  | { | ||||||
|  | 	template <typename T> | ||||||
|  | 	GLM_FUNC_QUALIFIER T gauss | ||||||
|  | 	( | ||||||
|  | 		T x, | ||||||
|  | 		T ExpectedValue, | ||||||
|  | 		T StandardDeviation | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		return exp(-((x - ExpectedValue) * (x - ExpectedValue)) / (static_cast<T>(2) * StandardDeviation * StandardDeviation)) / (StandardDeviation * sqrt(static_cast<T>(6.28318530717958647692528676655900576))); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	template <typename T, precision P> | ||||||
|  | 	GLM_FUNC_QUALIFIER T gauss | ||||||
|  | 	( | ||||||
|  | 		tvec2<T, P> const& Coord, | ||||||
|  | 		tvec2<T, P> const& ExpectedValue, | ||||||
|  | 		tvec2<T, P> const& StandardDeviation | ||||||
|  | 	) | ||||||
|  | 	{ | ||||||
|  | 		tvec2<T, P> const Squared = ((Coord - ExpectedValue) * (Coord - ExpectedValue)) / (static_cast<T>(2) * StandardDeviation * StandardDeviation); | ||||||
|  | 		return exp(-(Squared.x + Squared.y)); | ||||||
|  | 	} | ||||||
|  | }//namespace glm | ||||||
|  |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 izenynn
					izenynn